package Ġcom . jo er ac osta . covid tracker . view Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . Adapter View Ċ import Ġandroid . widget . Array Adapter Ċ import Ġandroid . widget . RadioButton Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . databinding . Data Binding Util Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġandroidx . lifecycle . ViewModel Providers Ċ import Ġcom . github . mike phil . chart ing . components . X Axis Ċ import Ġcom . github . mike phil . chart ing . components . Y Axis Ċ import Ġcom . github . mike phil . chart ing . data .* Ċ import Ġcom . github . mike phil . chart ing . interfaces . datasets . IL ine DataSet Ċ import Ġcom . google . android . material . sn ackbar . Snackbar Ċ import Ġcom . jo er ac osta . covid tracker . Cov id App Ċ import Ġcom . jo er ac osta . covid tracker . R Ċ import Ġcom . jo er ac osta . covid tracker . Time Util Ċ import Ġcom . jo er ac osta . covid tracker . addTo Composite Ċ import Ġcom . jo er ac osta . covid tracker . data .* Ċ import Ġcom . jo er ac osta . covid tracker . databinding . Activity Main Binding Ċ import Ġcom . jo er ac osta . covid tracker . view model . Cov id ViewModel Ċ import Ġio . reactivex . android . schedul ers . Android Schedulers Ċ import Ġio . reactivex . dis pos ables . Composite Disposable Ċ import Ġio . reactivex . schedul ers . Schedulers ĊĊ Ċ class ĠC ov id Activity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġprivate Ġvar ĠviewModel : ĠC ov id ViewModel ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġbinding : ĠActivity Main Binding ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġcomposite Disposable Ġ= ĠComposite Disposable () ĊĠĠĠ Ġprivate Ġvar Ġcurrent Chart ed Data : ĠList < Cov id Data >? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġcurrent P lotted DataType : ĠData To Plot ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval ĠviewModel Factory Ġ= Ġobject Ġ: ĠViewModel Provider . Factory Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġ< T Ġ: ĠViewModel ?> Ġcreate ( model Class : ĠClass < T >): ĠT Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠC ov id ViewModel ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcov id Tracking Project Api Ġ= Ġget Cov id App (). covid Tracking Ret rofit . create ( Cov id Tracking Project Api :: class . java ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġour World In Data Api Ġ= Ġget Cov id App (). our World In Data Ret rofit . create ( Our World In Data Api :: class . java ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcov id Data Dao Ġ= Ġget Cov id App (). database Helper . covid Db . covid Data Dao (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Updated Data Ġ= Ġget Cov id App (). last Updated Data , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstring Getter Ġ= Ġget Cov id App (). string Getter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp Resources Ġ= Ġget Cov id App (). resources ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġas ĠT ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠData Binding Util . set ContentView ( this , ĠR . layout . activity _ main ) ĊĠĠĠĠĠĠĠ Ġbinding ?. cor ona Graph ?. set Touch Enabled ( false ) ĊĠĠĠĠĠĠĠ Ġbinding ?. cor ona Graph ?. xAxis ?. position Ġ= ĠX Axis . X Axis Position . BOTTOM ĊĠĠĠĠĠĠĠ Ġbinding ?. cor ona Graph ?. description Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġconfigure Spinner () ĊĊĠĠĠĠĠĠĠ ĠviewModel Ġ= ĠViewModel Providers . of ( this , ĠviewModel Factory ). get ( Cov id ViewModel :: class . java ) ĊĠĠĠĠĠĠĠ Ġbinding ?. viewModel Ġ= ĠviewModel ĊĊĠĠĠĠĠĠĠ ĠviewModel ?. error Display ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . subscribe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Error () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?. addTo Composite ( composite Disposable ) ĊĊĠĠĠĠĠĠĠ ĠviewModel ?. state Subject ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . subscribe Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Selected US State Ġ= Ġbinding ?. state Spinner ?. selected Item ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Selected US State Ġ!= Ġit . selected Us a Location ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition Ġ= ĠLocation . values (). indexOf ( it . selected Us a Location ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding ?. state Spinner ?. setSelection ( position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetData Plot Selector ( it . data To Plot ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Date Selector Based On Time ( it . amount Of Days Ago To Show ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplot Data ( it . chart ed Data , Ġit . data To Plot ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?. addTo Composite ( composite Disposable ) ĊĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠsetData Plot Selector ( data To Plot : ĠData To Plot ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġindex To Select Ġ= Ġwhen Ġ( data To Plot ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠData To Plot . NEW _ CASE S , ĠData To Plot . NEW _ V ACC IN ATIONS Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠData To Plot . NEW _ DE ATH S , ĠData To Plot . TOTAL _ V ACC IN ATIONS Ġ-> Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠData To Plot . PERCENT _ V ACC IN ATED Ġ-> Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ- 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġgroup ToUpdate Ġ= Ġwhen Ġ( data To Plot ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠData To Plot . NEW _ CASE S , ĠData To Plot . NEW _ DE ATH S Ġ-> Ġbinding ?. covid DataTo Plot Picker ĊĠĠĠĠĠĠĠĠĠĠĠ ĠData To Plot . NEW _ V ACC IN ATIONS , ĠData To Plot . TOTAL _ V ACC IN ATIONS , ĠData To Plot . PERCENT _ V ACC IN ATED Ġ-> Ġbinding ?. v accine DataTo Plot Picker ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġgroup To Clear Ġ= Ġwhen Ġ( data To Plot ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠData To Plot . NEW _ CASE S , ĠData To Plot . NEW _ DE ATH S Ġ-> Ġbinding ?. v accine DataTo Plot Picker ĊĠĠĠĠĠĠĠĠĠĠĠ ĠData To Plot . NEW _ V ACC IN ATIONS , ĠData To Plot . TOTAL _ V ACC IN ATIONS , ĠData To Plot . PERCENT _ V ACC IN ATED Ġ-> Ġbinding ?. covid DataTo Plot Picker ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġvar Ġcurrently SelectedIndex : ĠInt ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġcurrently Selected RadioButton Id Ġ= Ġgroup ToUpdate ?. checked RadioButton Id ĊĠĠĠĠĠĠĠ Ġif Ġ( currently Selected RadioButton Id Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrently Selected RadioButton Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup ToUpdate . findViewById < RadioButton >( currently Selected RadioButton Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( currently Selected RadioButton Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrently SelectedIndex Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup ToUpdate . indexOf Child ( currently Selected RadioButton ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( index To Select Ġ!= Ġ- 1 Ġ&& Ġcurrently SelectedIndex Ġ!= Ġindex To Select ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( group ToUpdate ?. getChild At ( index To Select ) Ġas ĠRadio Button ). isChecked Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( group To Clear ?. checked RadioButton Id Ġ!= Ġ- 1 Ġ&& Ġgroup To Clear ?. checked RadioButton Id Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgroup To Clear . clear Check () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Date Selector Based On Time ( amount Of Days Ago To Show : ĠInt ?) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( amount Of Days Ago To Show Ġ== Ġnull ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġindex To Select Ġ= Ġwhen Ġ( amount Of Days Ago To Show ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTime Util . ALL _ TIME _ DAYS Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTime Util . SIX _ MONTH S _ DAYS Ġ-> Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTime Util . TH REE _ MONTH S _ DAYS Ġ-> Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTime Util . ONE _ MONTH _ DAYS Ġ-> Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTime Util . TWO _ W EE KS _ DAYS Ġ-> Ġ 4 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTime Util . FI VE _ DAYS Ġ-> Ġ 5 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ- 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġcurrently SelectedIndex : ĠInt ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġcurrently Selected RadioButton Id Ġ= Ġbinding ?. time Frame ?. checked RadioButton Id ĊĠĠĠĠĠĠĠ Ġif Ġ( currently Selected RadioButton Id Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrently Selected RadioButton Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding ?. time Frame ?. findViewById < RadioButton >( currently Selected RadioButton Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( currently Selected RadioButton Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrently SelectedIndex Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding ?. time Frame ?. indexOf Child ( currently Selected RadioButton ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( index To Select Ġ!= Ġ- 1 Ġ&& Ġcurrently SelectedIndex Ġ!= Ġindex To Select ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( binding ?. time Frame ?. getChild At ( index To Select ) Ġas ĠRadio Button ). isChecked Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconfigure Spinner () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġbinding ?. state Spinner ?. adapter Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠArray Adapter ( this , Ġandroid . R . layout . simple _ spinner _ dropdown _ item , ĠLocation . values ()) ĊĊĠĠĠĠĠĠĠ Ġbinding ?. state Spinner ?. on ItemSelected Listener Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠAdapter View . On ItemSelected Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Nothing Selected ( parent : ĠAdapter View < *> ?) Ġ{} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon ItemSelected ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent : ĠAdapter View < *> ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview : ĠView ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid : ĠLong ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocation . values (). get OrNull ( position )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel ?. setSelected US State ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġplot Data ( covid Datum : ĠList < Cov id Data > ?, Ġdata To Plot : ĠData To Plot ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( covid Datum Ġ!= Ġcurrent Chart ed Data Ġ|| Ġcurrent P lotted DataType Ġ!= Ġdata To Plot ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Chart ed Data Ġ= Ġcov id Datum ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent P lotted DataType Ġ= Ġdata To Plot ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentries Ġ= ĠviewModel ?. get Chart Entries From Datum ( covid Datum , Ġdata To Plot ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠdataSet Ġ= ĠLine DataSet ( entries , Ġ"") ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠdataSet . axis Dependency Ġ= ĠY Axis . Axis Dependency . LEFT ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠdataSet . lineWidth Ġ= Ġ 3 f ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolor Id ToUse Ġ= Ġwhen Ġ( data To Plot ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData To Plot . NEW _ CASE S , ĠData To Plot . NEW _ DE ATH S Ġ-> ĠR . color . color Accent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData To Plot . NEW _ V ACC IN ATIONS , ĠData To Plot . TOTAL _ V ACC IN ATIONS , ĠData To Plot . PERCENT _ V ACC IN ATED Ġ-> ĠR . color . color Accent Blue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠR . color . color Accent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠdataSet . set Circle Color ( Context Compat . getColor ( this , Ġcolor Id ToUse )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠdataSet . circle Hole Color Ġ= ĠContext Compat . getColor ( this , Ġcolor Id ToUse ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠdataSet . color Ġ= ĠContext Compat . getColor ( this , Ġcolor Id ToUse ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠdataSet . set Draw Values ( false ) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding ?. cor ona Graph ?. legend ?. isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding ?. cor ona Graph ?. data Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLine Data ( array ListOf ( data Set ) Ġas ĠList < IL ine DataSet > ?) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding ?. cor ona Graph ?. invalidate () ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Error () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġroot View Ġ= Ġbinding ?. root Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ ĠSn ackbar . make ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot View , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Cov id App (). string Getter . getString ( R . string . error _ fetch ing _ data ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . LENGTH _ SHORT ĊĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġcomposite Disposable . dispose () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Cov id App (): ĠC ov id App Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġapplication Context Ġas ĠC ov id App ĊĠĠĠ Ġ} Ċ } Ċ