package Ġby . res liv . weather monitor . locations . list Ċ Ċ import Ġandroid . app . Application Ċ import Ġandroid . content . SharedPreferences Ċ import Ġandroidx . h ilt . lifecycle . ViewModel Inject Ċ import Ġandroidx . lifecycle .* Ċ import Ġby . res liv . weather monitor . data . Repository Ċ import Ġby . res liv . weather monitor . model . Current Forecast Ċ import Ġby . res liv . weather monitor . model . Location Ċ import Ġby . res liv . weather monitor . settings .* Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ Ċ type alias ĠLocation Forecast Ġ= ĠPair < Location , ĠCurrent Forecast > Ċ Ċ /** Ċ Ġ* Ġ@ author ĠE pic Dim a Ċ Ġ*/ Ċ class ĠLoc ations List ViewModel Ġ@ ViewModel Inject Ġconstructor ( ĊĠĠĠ Ġapplication : ĠApplication , ĊĠĠĠ Ġprivate Ġval Ġrepository : ĠRepository , ĊĠĠĠ Ġprivate Ġval Ġpreferences : ĠSharedPreferences Ċ ) Ġ: ĠAndroid ViewModel ( application ), ĠSharedPreferences . On Shared Preference ChangeListener Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġ_ locations Ġ= Ġrepository . observe All Locations (). map Ġ{ Ġit . reversed () Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġ_ forecast s Ġ= ĠTransform ations . switch Map (_ locations ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlive Data Ġ= ĠMutable LiveData < List < Current Forecast >>( emptyList ()) ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġmutable ListOf < Current Forecast >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( location Ġin Ġit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( repository . getCurrent Forecast ( location . id )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlive Data . post Value ( list ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlive Data ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġ_ items Ġ= ĠTransform ations . map (_ forecast s ) Ġ{ Ġ_ locations . value !!. zip ( it ) Ġ} ĊĠĠĠ Ġval Ġitems : ĠLive Data < List < Location Forecast >> Ġ= Ġ_ items ĊĊĠĠĠ Ġprivate Ġval Ġ_ measurement Units Ġ= ĠMutable LiveData ( preferences . get Measurement Units ()) ĊĠĠĠ Ġval Ġmeasurement Units : ĠLive Data < Measurement Units > Ġ= Ġ_ measurement Units ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġpreferences . register On Shared Preference ChangeListener ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Shared Preference Changed ( shared Preferences : ĠSharedPreferences ?, Ġkey : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ measurement Units . value Ġ= Ġpreferences . get Measurement Units () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Cle ared () Ġ{ ĊĠĠĠĠĠĠĠ Ġpreferences . unregister On Shared Preference ChangeListener ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Location ( location : ĠLocation ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . remove Location ( location ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( Dispatch ers . Default ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( preferences . getInt ( CH OO SED _ KEY ) Ġ== Ġlocation . id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchoose Location (_ locations . value ?. first OrNull ()?. id Ġ?: Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġchoose Location ( location : ĠLocation ) Ġ{ ĊĠĠĠĠĠĠĠ Ġchoose Location ( location . id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġchoose Location ( location Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpreferences . set ( CH OO SED _ KEY , Ġlocation Id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Current Location ( location : Ġandroid . location . Location , Ġcallback : ĠRunnable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodel Location Ġ= ĠLocation ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlatitude Ġ= Ġlocation . latitude , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlongitude Ġ= Ġlocation . longitude , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauto Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġrepository . refresh Forecast ( model Location , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchoose Location ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . run () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }