package Ġcom . the wiz rd . simple weather . controls . view models Ċ Ċ import Ġandroidx . annotation . MainThread Ċ import Ġandroidx . arch . core . util . Function Ċ import Ġandroidx . core . util . Objects Compat Ċ import Ġandroidx . lifecycle .* Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġcom . the wiz rd . shared _ resources . controls . Air Quality ViewModel Ċ import Ġcom . the wiz rd . shared _ resources . controls . Location Query ViewModel Ċ import Ġcom . the wiz rd . shared _ resources . database . Weather Database Ċ import Ġcom . the wiz rd . shared _ resources . location data . Location Data Ċ import Ġcom . the wiz rd . shared _ resources . weather data . model . Air Quality Ċ import Ġcom . the wiz rd . shared _ resources . weather data . model . Forecast s Ċ import Ġcom . the wiz rd . simple weather . App Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġjava . time . LocalDate Ċ import Ġjava . time . Zone Offset Ċ import Ġjava . util .* Ċ Ċ class ĠAir Quality Forecast ViewModel Ġ: ĠViewModel () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġsettings Manager Ġ= ĠApp . instance . settings Manager ĊĊĠĠĠ Ġvar Ġlocation Data : ĠLocation Data ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġweather DAO Ġ= ĠWeather Database . get Weather DAO ( App . instance . app Context ) ĊĊĠĠĠ Ġprivate Ġvar Ġcurrent Forecast s Data : ĠLive Data < Forecast s >? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġa qi Forecast Data Ġ= ĠMutable LiveData < List < Air Quality > ?> () ĊĊĠĠĠ Ġfun Ġget AQ IF ore cast Data (): ĠLive Data < List < Air Quality > ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġa qi Forecast Data ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ MainThread ĊĠĠĠ Ġfun Ġupdate Forecast s ( location : ĠLocation Data ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( location Data Ġ== Ġnull Ġ|| Ġ! Objects Compat . equals ( location Data ?. query , Ġlocation . query )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠClone Ġlocation Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Data Ġ= ĠLocation Data ( Location Query ViewModel ( location )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Forecast s Data ?. remove Observer ( forecast Observer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Forecast s Data Ġ= Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweather DAO . get Live Forecast Data ( location . query ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Forecast s Data !!. observe Fore ver ( forecast Observer ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa qi Forecast Data . post Value ( current Forecast s Data ?. value ?. a qi Forecast ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġforecast Observer Ġ= ĠObserver < Forecast s > Ġ{ Ġforecast Data Ġ-> ĊĠĠĠĠĠĠĠ Ġthis . a qi Forecast Data . post Value ( forecast Data ?. a qi Forecast ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġforecast Mapper Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFunction < List < Air Quality > ?, ĠList < Air Quality ViewModel >> Ġ{ Ġinput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( input Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoday Ġ= ĠLocalDate . now ( location Data ?. tz Offset Ġ?: ĠZone Offset . system Default ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodels Ġ= ĠArrayList < Air Quality ViewModel >( input . size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( it Ġin Ġinput ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . date . is Before ( today )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodels . add ( Air Quality ViewModel ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ Function Ġmodels ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Cle ared () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Cle ared () ĊĊĠĠĠĠĠĠĠ Ġlocation Data Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġcurrent Forecast s Data ?. remove Observer ( forecast Observer ) ĊĠĠĠĠĠĠĠ Ġcurrent Forecast s Data Ġ= Ġnull ĊĠĠĠ Ġ} Ċ }