package Ġcom . bir be ck . lib dark sky Ċ Ċ import Ġokhttp 3 . Cache Ċ import Ġokhttp 3 . Ok HttpClient Ċ import Ġokhttp 3 . logging . Http Logging Interceptor Ċ import Ġretrofit 2 . Call Ċ import Ġretrofit 2 . Ret rofit Ċ import Ġretrofit 2 . converter . mos hi . M oshi Converter Factory Ċ import Ġretrofit 2 . http . GET Ċ import Ġretrofit 2 . http . Path Ċ import Ġretrofit 2 . http . Query Ċ import Ġjava . io . File Ċ Ċ private Ġconst Ġval ĠCACHE _ SIZE Ġ= Ġ 1 Ġ* Ġ 1 0 2 4 Ġ* Ġ 1 0 2 4 L Ġ// Ġ 1 ĠM iB Ċ Ċ private Ġinterface ĠDark Sky Api Ġ{ ĊĠĠĠ Ġ@ GET (" forecast /{ key }/{ latitude },{ longitude }") ĊĠĠĠ Ġfun Ġforecast (@ Path (" key ") Ġkey : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Path (" latitude ") Ġlatitude : ĠDouble , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Path (" longitude ") Ġlongitude : ĠDouble , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Query (" exclude ") Ġexclude : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Query (" extend ") Ġextend : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Query (" lang ") Ġlanguage : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Query (" units ") Ġunits : ĠString ? Ġ= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ: ĠCall < Forecast > Ċ } Ċ Ċ class ĠDark Sky Client Ġprivate Ġconstructor ( private Ġval Ġapi : ĠDark Sky Api , Ġprivate Ġval ĠapiKey : ĠApi Key ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġdebug Logging Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġcache Dir : ĠFile ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠINST AN CES Ġ= ĠHashMap < ApiKey , ĠDark Sky Client >() ĊĊĠĠĠĠĠĠĠ Ġfun ĠgetInstance ( apiKey : ĠApi Key ): ĠDark Sky Client Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! INST AN CES . containsKey ( apiKey )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinterceptor Ġ= ĠHttp Logging Interceptor () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ Ġif Ġ( debug Logging ) Ġlevel Ġ= ĠHttp Logging Interceptor . Level . BODY Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclient Ġ= ĠOk HttpClient . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Interceptor ( interceptor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cacheDir Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient . cache ( Cache ( cacheDir , ĠCACHE _ SIZE )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapi Ġ= ĠRet rofit . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. baseUrl (" https :// api . dark sky . net /") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. client ( client . build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Converter Factory ( M oshi Converter Factory . create ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. create ( Dark Sky Api :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠINST AN CES [ apiKey ] Ġ= ĠDark Sky Client ( api , ĠapiKey ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠINST AN CES [ apiKey ] !! ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġforecast ( request : ĠFore cast Request ): ĠFore cast Response Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcall Ġ= Ġapi . forecast ( apiKey . value , Ġrequest . latitude , Ġrequest . longitude , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexclude Ġ= Ġrequest . exclude ?. join ToString (",", Ġtransform Ġ= Ġ{ Ġit . value Ġ}), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextend Ġ= Ġrequest . extend ?. join ToString (",", Ġtransform Ġ= Ġ{ Ġit . value Ġ}), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlanguage Ġ= Ġrequest . language ?. value , Ġunits Ġ= Ġrequest . units ?. value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. execute () ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . is Successful Ġ-> ĠSuccess ( call . body () !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠError ( call . message ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠApi Key ( val Ġvalue : ĠString ) Ċ