package Ġcom . pop da . weather for cast . ui . weather _ screen Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . location .* Ċ import Ġandroid . util . Log Ċ import Ġandroidx . core . app . Activity Compat Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġcom . google . android . gms . location . Location Services Ċ import Ġcom . pop da . weather for cast . data . datasource . Weather Remote DataSource Ċ import Ġcom . pop da . weather for cast . data . entity . Base Response Ċ import Ġcom . pop da . weather for cast . data . entity . Weather Forecast Ċ import Ġretrofit 2 . Call Ċ import Ġretrofit 2 . Callback Ċ import Ġretrofit 2 . Response Ċ Ċ import Ġjavax . inject . Inject Ċ Ċ private Ġval ĠTAG Ġ= ĠWeather Forecast ViewModel :: class . simple Name Ċ Ċ class ĠWeather Forecast ViewModel Ġ@ Inject Ġconstructor ( private Ġval Ġweather DataSource : ĠWeather Remote DataSource ) Ġ: ĠViewModel () Ġ{ ĊĠĠĠ Ġvar Ġcurr City Ġ= Ġ"" ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcur Lat Long : ĠPair < Double , ĠDouble > ĊĠĠĠ Ġval Ġcallback Ġ= Ġobject Ġ: ĠCallback < Base Response > Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( call : ĠCall < Base Response >, Ġt : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" get Weather By City Name Ġfailed : Ġ${ t . message }") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Response ( call : ĠCall < Base Response >, Ġresponse : ĠResponse < Base Response >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . body ()?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmutable Weather LiveData . value Ġ= Ġdaily ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" response Ġ= Ġ$ this ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġmutable Weather LiveData : ĠMutable LiveData < List < Weather Forecast >> Ġ= ĠMutable LiveData () ĊĠĠĠ Ġval Ġweather LiveData : ĠLive Data < List < Weather Forecast >> Ġget () Ġ= Ġmutable Weather LiveData ĊĊĠĠĠ Ġfun Ġload Weather Forecast ( activity : ĠActivity ){ ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurr City . isNotBlank () Ġ-> Ġweather DataSource . get Weather By City Name ( curr City , Ġactivity ). enqueue ( callback ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ:: cur Lat Long . isInitialized Ġ-> Ġweather DataSource . get Weather By Geo ( cur Lat Long . first , Ġcur Lat Long . second ). enqueue ( callback ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠLog . e (" Weather Forecast ViewModel ", Ġ" No Ġdata Ġto Ġsearch Ġfor Ġweather ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Curr Location ( activity : ĠActivity ){ ĊĠĠĠĠĠĠĠ Ġval Ġf used Location Client Ġ= ĠLocation Services . getF used Location Provider Client ( activity ) ĊĠĠĠĠĠĠĠ Ġif Ġ( Activity Compat . check Self Permission ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity , ĠManifest . permission . ACCESS _ F INE _ LOCATION ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ== ĠPackage Manager . PERMISSION _ GRAN TED Ġ&& ĠActivity Compat . check Self Permission ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity , ĠManifest . permission . ACCESS _ CO AR SE _ LOCATION ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ĊĠĠĠĠĠĠĠ Ġ) Ġf used Location Client . last Location ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Success Listener Ġ{ Ġlocation Ġ: ĠLocation ? Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( location != null ) Ġlocation . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcur Lat Long Ġ= ĠPair ( it . latitude , Ġit . longitude ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurr City Ġ= ĠGeo coder ( activity ). get From Location ( it . latitude , Ġit . longitude , Ġ 1 )[ 0 ]. locality ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Weather Forecast ( activity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġget Curr Location ( activity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }