package Ġcom . or ata k ashi . covid 1 9 . ui . province Ċ Ċ import Ġandroid . database . Cursor Ċ import Ġandroid . util . Log Ċ import Ġandroid . widget . EditText Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġcom . jak ew h art on . r xb ind ing 3 . widget . TextView Text ChangeEvent Ċ import Ġcom . jak ew h art on . r xb ind ing 3 . widget . text Change Events Ċ import Ġcom . or ata k ashi . covid 1 9 . Build Config Ċ import Ġcom . or ata k ashi . covid 1 9 . data . db . Database Ċ import Ġcom . or ata k ashi . covid 1 9 . data . model . local storage . Data Province Ċ import Ġcom . or ata k ashi . covid 1 9 . data . model . local storage . dashboard . Data Local Ċ import Ġcom . or ata k ashi . covid 1 9 . data . model . province . Response Province Ċ import Ġcom . or ata k ashi . covid 1 9 . data . network . Api Endpoint Ċ import Ġcom . or ata k ashi . covid 1 9 . root . App Ċ import Ġcom . or ata k ashi . covid 1 9 . ui . timeline . Timeline State Ċ import Ġio . reactivex . android . schedul ers . Android Schedulers Ċ import Ġio . reactivex . ob servers . Disposable Observer Ċ import Ġio . reactivex . ob servers . Disposable Single Observer Ċ import Ġio . reactivex . schedul ers . Schedulers Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġjavax . inject . Inject Ċ import Ġkotlin . collections . ArrayList Ċ Ċ class ĠPro vince ViewModel Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġval Ġendpoint : ĠApi Endpoint Ċ ) Ġ: ĠViewModel (), ĠPro vince View Ġ{ ĊĊĠĠĠ Ġval Ġcache Province Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠMutable LiveData < List < Data Province >>() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġobserver Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠMutable LiveData < Province State >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġstate : ĠLive Data < Province State > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġobserver ĊĊĠĠĠ Ġoverride Ġfun ĠgetData () Ġ{ ĊĠĠĠĠĠĠĠ Ġendpoint . getData BN PB (" CO VID 1 9 _ Ind onesia _ per _ Prov insi ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map < Province State >( Province State :: Result ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. onError Return ( Province State :: Error ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Flow able () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. start With ( Province State . Loading ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ( observer :: post Value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ ĠApp . dis posable !! :: add Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Cle ared () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Cle ared () ĊĠĠĠĠĠĠĠ ĠApp . dis posable !!. clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcache Data ( response Ġ: ĠResponse Province ){ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠRemove Ġold Ġcache ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĊĠĠĠĠĠĠĠ ĠApp . builder !!. delete ( Database . TABLE _ PROV IN CE ) ĊĊĠĠĠĠĠĠĠ Ġif ( response . data . isNotEmpty ()){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . data . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( it . attributes . prov insi Ġ!= Ġ" Ind onesia " Ġ&& Ġit . attributes . prov insi Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp . builder !!. insert ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Cache ( order Ġ: ĠString Ġ= Ġ"", Ġcolumn Ġ: ĠString Ġ= Ġ"", Ġkeyword Ġ: ĠString Ġ= Ġ""){ ĊĠĠĠĠĠĠĠ Ġval Ġdata Province Ġ: ĠMutable List < Data Province > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠ Ġval Ġdb Ġ: ĠCursor Ġ= Ġwhen ( keyword . isEmpty ()){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp . builder !!. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom ( Database . TABLE _ PROV IN CE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠorderBy ( order , Ġcolumn ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. cursor () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp . builder !!. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom ( Database . TABLE _ PROV IN CE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠorderBy ( order , Ġcolumn ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhere ( Database . province State , Ġkeyword , Ġ" like ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. cursor () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor ( i Ġin Ġ 0 Ġuntil Ġdb . count ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb . moveTo Position ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Province . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData Province ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb . getString ( db . getColumnIndex ( Database . province State )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb . getInt ( db . getColumnIndex ( Database . confirmed )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb . getInt ( db . getColumnIndex ( Database . re covered )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb . getInt ( db . getColumnIndex ( Database . deaths )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb . getString ( db . getColumnIndex ( Database . lat )). toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb . getString ( db . getColumnIndex ( Database . long )). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcache Province . value Ġ= Ġdata Province ĊĊĠĠĠĠĠĠĠ ĠLog . e (" J ml ", Ġ" J ml Ġ: Ġ${ data Province . size }") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġobservable Search () Ġ: ĠDis posable Observer < TextView Text ChangeEvent > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠDis posable Observer < TextView Text ChangeEvent >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Next ( t : ĠTextView Text ChangeEvent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkeyword Ġ= Ġt . text . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( keyword . trim { it Ġ<= Ġ' Ġ' }. isNotEmpty () Ġ&& Ġkeyword . trim { it Ġ<= Ġ' Ġ' }. length Ġ> Ġ 3 ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Cache ("", Ġ"", Ġkeyword ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Cache () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonComplete () Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( e : ĠThrowable ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsetup Instant Search ( edit Text : ĠEditText ){ ĊĠĠĠĠĠĠĠ ĠApp . dis posable !!. add ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġedit Text . text Change Events () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. skip Initial Value () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. de bounce ( 5 0 0 , ĠTimeUnit . MILLISECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe With ( observable Search ()) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcount Data ( province Ġ: ĠString Ġ= Ġ"") Ġ: ĠData Local Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdb Ġ: ĠCursor Ġ= Ġwhen ( province . isEmpty ()){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp . builder !!. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom ( Database . TABLE _ PROV IN CE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. cursor () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp . builder !!. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom ( Database . TABLE _ PROV IN CE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhere ( Database . province State , Ġprovince ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. cursor () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdb . moveTo First () ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠPrepare Ġfor Ġreturn ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġvar Ġconfirmed Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġre covered Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġdeath Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġfor ( i Ġin Ġ 0 Ġuntil Ġdb . count ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb . moveTo Position ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfirmed Ġ+= Ġdb . getInt ( db . getColumnIndex ( Database . confirmed )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre covered Ġ+= Ġdb . getInt ( db . getColumnIndex ( Database . re covered )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeath Ġ+= Ġdb . getInt ( db . getColumnIndex ( Database . deaths )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval ĠcurrentTime : ĠString Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSimpleDateFormat (" dd ĠM MMM Ġy yyy ĠHH : mm ", ĠLocale (" in ", Ġ" ID ")). format ( Date ()) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠData Local ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfirmed , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre covered , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeath , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentTime ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcheck Data () Ġ: ĠBoolean { ĊĠĠĠĠĠĠĠ Ġval Ġdb Ġ: ĠCursor Ġ= ĠApp . builder !!. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfrom ( Database . TABLE _ PROV IN CE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlimit ( 1 , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose () ĊĠĠĠĠĠĠĠ Ġ}. cursor () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdb . count Ġ> Ġ 0 ĊĠĠĠ Ġ} Ċ }