package Ġcom . t inas he . weather . ui . home Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . Menu Ċ import Ġandroid . view . MenuItem Ċ import Ġandroidx . core . app . Activity Compat Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . google . android . gms . location . F used Location Provider Client Ċ import Ġcom . google . android . gms . location . Location Services Ċ import Ġcom . google . android . libraries . places . api . Places Ċ import Ġcom . google . android . libraries . places . api . model . Place Ċ import Ġcom . google . android . libraries . places . api . net . Fetch Photo Request Ċ import Ġcom . google . android . libraries . places . api . net . Fetch Place Request Ċ import Ġcom . google . android . libraries . places . api . net . Places Client Ċ import Ġcom . google . android . libraries . places . widget . Autocomplete Ċ import Ġcom . google . android . libraries . places . widget . model . Autocomplete Activity Mode Ċ import Ġcom . google . android . material . sn ackbar . Snackbar Ċ import Ġcom . t inas he . weather . R Ċ import Ġcom . t inas he . weather . data . di . ViewModel Factory Ċ import Ġcom . t inas he . weather . data . model . ViewState Ċ import Ġcom . t inas he . weather . data . model . event . Photo Event Ċ import Ġcom . t inas he . weather . extensions .* Ċ import Ġcom . t inas he . weather . ui . about . App Info Activity Ċ import Ġcom . t inas he . weather . ui . base . Billing Aware Activity Ċ import Ġcom . t inas he . weather . ui . home . detail . Detail Fragment Ċ import Ġcom . t inas he . weather . ui . home . place . Place Forecast Activity Ċ import Ġcom . t inas he . weather . ui . splash . Splash Activity Ċ import Ġcom . t inas he . weather . utils . Bitmap Cache Ċ import Ġcom . t inas he . weather . utils . Rx Bus Ċ import Ġcom . t inas he . weather . utils . Weather Util Ċ import Ġcom . t inas he . weather . utils . prefs . App Prefs Ċ import Ġdagger . android . Android Injection Ċ import Ġkotlinx . android . synt hetic . main . activity _ home .* Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . util .* Ċ import Ġjavax . inject . Inject ĊĊ Ċ class ĠHome Activity Ġ: ĠBilling Aware Activity () Ġ{ ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar ĠviewModel Factory : ĠViewModel Factory ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġprefs : ĠApp Prefs ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠviewModel : ĠHome ViewModel ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdata Adapter : ĠWeather Data Adapter ĊĊĠĠĠ Ġprivate Ġvar Ġplaces Client : ĠPl aces Client ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġapp Bar Elevation Ġ= Ġobject Ġ: ĠRecyclerView . On Scroll Listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Sc rolled ( re cyclerView : ĠRecyclerView , Ġdx : ĠInt , Ġdy : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġraise Title Bar Ġ= Ġdy Ġ> Ġ 0 Ġ|| Ġre cyclerView . compute Vertical Scroll Offset () Ġ!= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Bar Layout . is Activated Ġ= Ġraise Title Bar ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠAndroid Injection . inject ( this ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ home ) ĊĊĠĠĠĠĠĠĠ ĠviewModel Ġ= Ġget ViewModel ( this , ĠviewModel Factory ) ĊĊĠĠĠĠĠĠĠ ĠviewModel . view State . observe NonNull ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it . state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠView State . LOADING Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Layout . is Refresh ing Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data Adapter . item Count Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprogressBar . hide () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprogressBar . hide () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠView State . ERROR Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Layout . is Refresh ing Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprogressBar . hide () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . message ?. let Ġ{ Ġmsg Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorMessage . text Ġ= Ġmsg ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data Adapter . item Count Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorMessage . show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . make ( errorMessage , Ġmsg , ĠSn ackbar . LENGTH _ IN DEFIN ITE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setAction ( android . R . string . ok ) Ġ{ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠView State . SUCCESS Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorMessage . text Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorMessage . hide () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Layout . is Refresh ing Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprogressBar . hide () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . latest Forecast . observe NonNull ( this ) Ġ{ Ġforecast Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Name . text Ġ= Ġforecast . currently . location ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġanimate Ġ= Ġdata Adapter . item Count Ġ== Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Adapter . forecast Ġ= Ġforecast ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( animate ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistView . schedule Layout Animation () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . prom ote Prem ium . observe NonNull ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpromote Prem ium () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . saved Places . observe NonNull ( this ) Ġ{ Ġplaces Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Adapter . saved Places Ġ= Ġplaces ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaces . forEach Ġ{ Ġget Photo ( it . place Id ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinit Ui () ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Ui () Ġ{ ĊĠĠĠĠĠĠĠ Ġset Support ActionBar ( toolbar ) ĊĠĠĠĠĠĠĠ Ġtoolbar . set Navigation OnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! viewModel . has Prem ium ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpromote Prem ium () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ set Navigation OnClickListener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity For Result ( place Picker Intent (), ĠRC _ PLACE _ AUTO COMPLETE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrefresh Layout . setColor Scheme Resources ( R . color . theme ) ĊĠĠĠĠĠĠĠ Ġrefresh Layout . setOn Refresh Listener Ġ{ ĠviewModel . refresh Forecast () Ġ} ĊĊĠĠĠĠĠĠĠ Ġdata Adapter Ġ= ĠWeather Data Adapter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragment Ġ= ĠDetail Fragment . view ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragment . show ( support FragmentManager , Ġfragment . tag ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠlistView . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvertical () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= Ġdata Adapter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd On Scroll Listener ( app Bar Elevation ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa ĠPlace ĠP icker Ġintent Ġthat Ġwill Ġreturn Ġa Ġ[ Place ] Ġobject Ġwith Ġthese Ġfields : ĊĠĠĠĠ Ġ* Ġ[ Place . Field . ID ], Ġ[ Place . Field . NAME ], Ġ[ Place . Field . LAT _ L NG ], Ġ[ Place . Field . ADDRESS ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠIntent ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġplace Picker Intent (): ĠIntent Ġ{ ĊĊĠĠĠĠĠĠĠ Ġreturn ĠAuto complete . Intent Builder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAuto complete Activity Mode . OVER LAY , ĠArrays . asList ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlace . Field . ID , ĠPlace . Field . NAME , ĠPlace . Field . LAT _ L NG , ĠPlace . Field . ADDRESS )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onStart () ĊĠĠĠĠĠĠĠ Ġif Ġ( Activity Compat . check Self Permission ( this , ĠLOC _ PERM ) Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Adapter . temperature Unit Ġ= Ġprefs . get Temperature Unit () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf used Location Client : ĠF used Location Provider Client Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocation Services . getF used Location Provider Client ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf used Location Client . last Location . add On Success Listener Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . subscribe ( it , ĠWeather Util . getLocation Name ( this , Ġit )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRequest Ġpermissions ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( Intent ( this , ĠSpl ash Activity :: class . java )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . un Subscribe () ĊĠĠĠĠĠĠĠ Ġsuper . on Stop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġprem ium Unlock ed () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . premium Unlock ed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġmenu Inflater . inflate ( R . menu . menu _ home , Ġmenu ) ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . onCreate Options Menu ( menu ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( item ?. itemId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . action _ info Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( Intent ( this , ĠApp Info Activity :: class . java )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( result Code Ġ== ĠActivity . RESULT _ OK Ġ&& Ġdata Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplace Ġ= ĠAuto complete . get Place From Intent ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" Place : Ġ% s :% s ", Ġplace . name , Ġplace . lat Lng ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠPlace Forecast Activity . view ( this , Ġplace . id !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġget Photo ( place Id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( places Client Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaces Client Ġ= ĠPl aces . create Client ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Bitmap Cache . exists ( place Id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġplace Fields Ġ= ĠArrays . asList ( Place . Field . PH OTO _ MET AD AT AS ) ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠFetch Place Request . builder ( place Id , Ġplace Fields ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġplaces Client ?. fetch Place ( request )?. add On Success Listener Ġ{ Ġresponse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplace Ġ= Ġresponse . place ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( place . photo Met adat as ?. isEmpty () Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ add On Success Listener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġphoto Metadata Ġ= Ġplace . photo Met adat as ?. first () Ġ?: Ġreturn @ add On Success Listener ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġphoto Request Ġ= ĠFetch Photo Request . builder ( photo Metadata ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaces Client ?. fetch Photo ( photo Request )?. add On Success Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġphoto Ġ= Ġit . bitmap ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap Cache . add ( place Id , Ġphoto ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRx Bus . getInstance (). send ( Photo Event ( place Id , Ġphoto )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?. add On Failure Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ?. add On Failure Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠLOC _ PERM Ġ= ĠManifest . permission . ACCESS _ F INE _ LOCATION ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠRC _ PLACE _ AUTO COMPLETE Ġ= Ġ 1 ĊĠĠĠ Ġ} Ċ } Ċ