package Ġcom . k to pen c age Ċ Ċ import Ġcom . google . gson . Gson Ċ import Ġcom . google . gson . Gson Builder Ċ import Ġcom . k to pen c age . model . Open C age Request Ċ import Ġcom . k to pen c age . model . Open C age Response Ċ import Ġio . reactivex . Observable Ċ import Ġokhttp 3 . Http Url Ċ import Ġokhttp 3 . Ok HttpClient Ċ import Ġokhttp 3 . Request Ċ import Ġjava . io . IOException Ċ Ċ class ĠOpen C age Geo Coder ( val ĠapiKey : ĠString ) Ġ{ ĊĠ Ġprivate Ġval Ġgson : ĠGson ĊĠ Ġprivate Ġval Ġok HttpClient : ĠOk HttpClient Ġ= ĠOk HttpClient () ĊĊĠ Ġinit Ġ{ ĊĠĠĠ Ġval Ġgson Builder Ġ= ĠGson Builder () ĊĠĠĠ Ġval Ġserializer Ġ= ĠBoolean Serializer () ĊĠĠĠ Ġgson Builder . register Type Adapter ( Boolean :: class . java , Ġserializer ) ĊĠĠĠ Ġgson Builder . register Type Adapter ( Boolean :: class . java Primitive Type , Ġserializer ) ĊĠĠĠ Ġgson Ġ= Ġgson Builder . create () ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* Ġreturns Ġan Ġobservable Ġfor Ġthe Ġgeo coding Ġrequest ĊĠĠ Ġ*/ ĊĠ Ġfun Ġrequest Observable ( request : ĠOpen C age Request ): ĠObservable < Open C age Response > Ġ{ ĊĠĠĠ Ġreturn ĠObservable . create Ġ{ Ġemitter Ġ-> ĊĠĠĠĠĠ Ġval Ġresponse Ġ= Ġhandle Re qu st ( request ) ĊĠĠĠĠĠ Ġemitter . onNext ( response ) ĊĠĠĠĠĠ Ġemitter . onComplete () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġgen en rate Url ( open C age Request : ĠOpen C age Request ): ĠHttp Url Ġ{ ĊĠĠĠ Ġval Ġurl Builder Ġ= ĠHttp Url . Builder (). scheme (" https ") ĊĠĠĠĠĠĠĠ Ġ. host (" api . openc age data . com ") ĊĠĠĠĠĠĠĠ Ġ. add Path Segment (" geo code ") ĊĠĠĠĠĠĠĠ Ġ. add Path Segment (" v 1 ") ĊĠĠĠĠĠĠĠ Ġ. add Path Segment (" json ") ĊĠĠĠĠĠĠĠ Ġ. add QueryParameter (" key ", ĠapiKey ) ĊĊĠĠĠ Ġval Ġparams Ġ= Ġopen C age Request . generate Request Params () ĊĠĠĠ Ġval Ġit Ġ= Ġparams . entries . iterator () ĊĊĠĠĠ Ġwhile Ġ( it . hasNext ()) Ġ{ ĊĠĠĠĠĠ Ġval Ġpair Ġ= Ġit . next () ĊĠĠĠĠĠ Ġurl Builder . add QueryParameter ( pair . key , Ġpair . value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġurl Builder . build () ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* Ġhandle Ġa Ġgeo coding Ġrequest , Ġcan Ġhandle Ġboth Ġforward Ġand Ġreverse Ġrequests . ĊĠĠ Ġ*/ ĊĠ Ġ@ Throws ( Response Exception :: class , ĠIOException :: class ) ĊĠ Ġpublic Ġfun Ġhandle Re qu st ( open C age Request : ĠOpen C age Request ): ĠOpen C age Response Ġ{ ĊĠĠĠ Ġval Ġurl Ġ= Ġgen en rate Url ( open C age Request ) ĊĠĠĠ Ġval Ġrequest Builder Ġ= ĠRequest . Builder () ĊĊĠĠĠ Ġrequest Builder . url ( url ) ĊĠĠĠ Ġrequest Builder . header (" User - Agent ", Ġ" kotlin - sdk - agent ") ĊĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġval Ġresponse Ġ= Ġok HttpClient . new Call ( request Builder . build ()). execute () ĊĊĠĠĠĠĠ Ġif Ġ( response . code () Ġ!= Ġ 2 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠResponse Exception ( response . code (), Ġ" HttpException ") ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġif Ġ( response . body () Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġresponse . body () !!. string () ĊĠĠĠĠĠĠĠ Ġval Ġopen C age Response Ġ= Ġgson . fromJson ( body , ĠOpen C age Response :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġopen C age Response Code Ġ= Ġopen C age Response . status !!. code ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( open C age Response Code Ġ== Ġ 2 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġopen C age Response ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( open C age Response Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 0 0 Ġ-> Ġthrow ĠResponse Exception ( open C age Response Code , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Invalid Ġrequest Ġ( bad Ġrequest ; Ġa Ġrequired Ġparameter Ġis Ġmissing ; Ġinvalid Ġcoordinates )") ĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 0 2 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠResponse Exception ( open C age Response Code , Ġ" Valid Ġrequest Ġbut Ġquota Ġexceeded Ġ( payment Ġrequired )") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 0 3 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠResponse Exception ( open C age Response Code , Ġ" Invalid Ġor Ġmissing Ġapi Ġkey Ġ( for bidden )") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 0 4 Ġ-> Ġthrow ĠResponse Exception ( open C age Response Code , Ġ" Invalid ĠAPI Ġendpoint ") ĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 0 5 Ġ-> Ġthrow ĠResponse Exception ( open C age Response Code , Ġ" Method Ġnot Ġallowed Ġ( non - GET Ġrequest )") ĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 0 8 Ġ-> Ġthrow ĠResponse Exception ( open C age Response Code , Ġ" Timeout ; Ġyou Ġcan Ġtry Ġagain ") ĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 1 0 Ġ-> Ġthrow ĠResponse Exception ( open C age Response Code , Ġ" Request Ġtoo Ġlong ") ĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 2 9 Ġ-> Ġthrow ĠResponse Exception ( open C age Response Code , Ġ" Too Ġmany Ġrequests Ġ( too Ġquickly , Ġrate Ġlimiting )") ĊĠĠĠĠĠĠĠĠĠĠĠĠ 5 0 3 Ġ-> Ġthrow ĠResponse Exception ( open C age Response Code , Ġ" Internal Ġserver Ġerror ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠResponse Exception ( open C age Response Code , Ġopen C age Response . status !!. message !! ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠResponse Exception (- 1 , Ġ" Empty Ġresponse Ġbody ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ