package Ġcz . covid 1 9 cz . erous ka . ui . dashboard Ċ Ċ import Ġandroid . app . Application Ċ import Ġandroid . bluetooth . Bluetooth Adapter Ċ import Ġandroid . content . Broadcast Receiver Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . Intent Filter Ċ import Ġandroid . location . Location Manager Ċ import Ġandroidx . lifecycle . Lifecycle Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . On Lifecycle Event Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġarch . li ved ata . Safe Mutable LiveData Ċ import Ġcom . google . android . gms . common . api . ApiException Ċ import Ġcom . google . android . gms . near by . ex posure notification . Daily Summary Ċ import Ġcom . google . firebase . auth . Firebase Auth Ċ import Ġcz . covid 1 9 cz . erous ka . R Ċ import Ġcz . covid 1 9 cz . erous ka . db . Shared Prefs Repository Ċ import Ġcz . covid 1 9 cz . erous ka . ex posure notifications . Exposure Notifications Repository Ċ import Ġcz . covid 1 9 cz . erous ka . ext . is Bt Enabled Ċ import Ġcz . covid 1 9 cz . erous ka . ext . is Location Enabled Ċ import Ġcz . covid 1 9 cz . erous ka . net . Exposure Server Repository Ċ import Ġcz . covid 1 9 cz . erous ka . ui . base . Base VM Ċ import Ġcz . covid 1 9 cz . erous ka . ui . dashboard . event . Dashboard Command Event Ċ import Ġcz . covid 1 9 cz . erous ka . ui . dashboard . event . G ms ApiError Event Ċ import Ġcz . covid 1 9 cz . erous ka . utils . L Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util .* Ċ Ċ class ĠDashboard VM ( ĊĠĠĠ Ġprivate Ġval Ġexposure Notifications Repository : ĠEx posure Notifications Repository , ĊĠĠĠ Ġprivate Ġval Ġexposure Notifications Server Repository : ĠEx posure Server Repository , ĊĠĠĠ Ġprivate Ġval Ġprefs : ĠShared Prefs Repository , ĊĠĠĠ Ġprivate Ġval Ġapp : ĠApplication Ċ ) Ġ: ĠBase VM () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġauth : ĠFirebase Auth Ġ= ĠFirebase Auth . getInstance () ĊĠĠĠ Ġval Ġexposure Notifications Enabled Ġ= ĠSafe Mutable LiveData ( prefs . is Exposure Notifications Enabled ()) ĊĠĠĠ Ġval Ġlast Update Date Ġ= ĠMutable LiveData < String >() ĊĠĠĠ Ġval Ġlast UpdateTime Ġ= ĠMutable LiveData < String >() ĊĊĠĠĠ Ġprivate Ġval Ġbt Receiver : ĠBroadcast Receiver Ġ= Ġobject Ġ: ĠBroadcast Receiver () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Receive ( context : ĠContext ?, Ġintent : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . is Bt Enabled () Ġ|| Ġ! it . is Location Enabled ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnavigate ( R . id . action _ nav _ dashboard _ to _ nav _ permission _ disabled ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . unregister Receiver ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . unregister Receiver ( location Receiver ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġlocation Receiver : ĠBroadcast Receiver Ġ= Ġobject Ġ: ĠBroadcast Receiver () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Receive ( context : ĠContext ?, Ġintent : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . is Bt Enabled () Ġ|| Ġ! it . is Location Enabled ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnavigate ( R . id . action _ nav _ dashboard _ to _ nav _ permission _ disabled ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . unregister Receiver ( bt Receiver ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . unregister Receiver ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ On Lifecycle Event ( Lifecycle . Event . ON _ CREATE ) ĊĠĠĠ Ġfun ĠonCreate () Ġ{ ĊĠĠĠĠĠĠĠ Ġprefs . last Key Import Live . observe Fore ver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ!= Ġ 0 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Update Date . value Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSimpleDateFormat (" d . M . yyyy ", ĠLocale . getDefault ()). format ( Date ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast UpdateTime . value Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSimpleDateFormat (" H : mm ", ĠLocale . getDefault ()). format ( Date ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck For Obsolete Data () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġexposure Notifications Enabled . observe Fore ver Ġ{ Ġenabled Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck For R is ky Exposure () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ On Lifecycle Event ( Lifecycle . Event . ON _ START ) ĊĠĠĠ Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! app . is Bt Enabled () Ġ|| Ġ! app . is Location Enabled ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnavigate ( R . id . action _ nav _ dashboard _ to _ nav _ permission _ disabled ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġapp . register Receiver ( bt Receiver , ĠIntent Filter ( Bluetooth Adapter . ACTION _ STATE _ CHANGED )) ĊĠĠĠĠĠĠĠ Ġapp . register Receiver ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Receiver , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIntent Filter ( Location Manager . PRO VID ERS _ CHANGED _ ACTION ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ On Lifecycle Event ( Lifecycle . Event . ON _ RE SU ME ) ĊĠĠĠ Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( auth . currentUser Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpublish ( Dashboard Command Event ( Dashboard Command Event . Command . NOT _ ACTIV ATED )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġexposure Notifications Server Repository . schedule Key Download () ĊĠĠĠĠĠĠĠ Ġexposure Notifications Repository . schedule Self Checker () ĊĠĠĠĠĠĠĠ Ġcheck For Obsolete Data () ĊĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkotlin . run Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ run Catch ing Ġexposure Notifications Repository . isEnabled () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. on Success Ġ{ Ġenabled Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL . d (" Exposure ĠNotifications Ġenabled Ġ$ enabled ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Exposure Notifications StateChanged ( enabled ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. on Failure Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġis ĠApiException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublish ( G ms ApiError Event ( it . status )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL . e ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstop () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkotlin . run Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexposure Notifications Repository . stop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. on Success Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Exposure Notifications StateChanged ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL . d (" Exposure ĠNotifications Ġstopped ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublish ( Dashboard Command Event ( Dashboard Command Event . Command . T URN _ OFF )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. on Failure Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL . e ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstart () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbt Disabled Ġ= Ġ! app . is Bt Enabled () ĊĠĠĠĠĠĠĠ Ġval Ġlocation Disabled Ġ= Ġ! app . is Location Enabled () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( bt Disabled Ġ|| Ġlocation Disabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnavigate ( R . id . action _ nav _ dashboard _ to _ nav _ permission _ disabled ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkotlin . run Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexposure Notifications Repository . start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. on Success Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Exposure Notifications StateChanged ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL . d (" Exposure ĠNotifications Ġstarted ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. on Failure Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Exposure Notifications StateChanged ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġis ĠApiException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublish ( G ms ApiError Event ( it . status )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL . e ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Exposure Notifications StateChanged ( enabled : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġexposure Notifications Enabled . value Ġ= Ġenabled ĊĠĠĠĠĠĠĠ Ġprefs . set Exposure Notifications Enabled ( enabled ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck For R is ky Exposure () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexposure Notifications Repository . getLast R is ky Exposure () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. on Success Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Exposure ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. on Failure Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL . e ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck For Obsolete Data () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( prefs . has Out dated Key Data ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpublish ( Dashboard Command Event ( Dashboard Command Event . Command . DATA _ OB SO LETE )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpublish ( Dashboard Command Event ( Dashboard Command Event . Command . DATA _ UP _ TO _ DATE )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Exposure ( daily Summary : ĠDaily Summary ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( prefs . getLast In App Not ified Exposure () Ġ!= Ġdaily Summary . days Since Epoch ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpublish ( Dashboard Command Event ( Dashboard Command Event . Command . REC ENT _ EX POS URE )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġaccept Last Exposure () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexposure Notifications Repository . getLast R is ky Exposure () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. on Success Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . set Last In App Not ified Exposure ( it ?. days Since Epoch Ġ?: Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. on Failure Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL . e ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġunregister () Ġ{ ĊĠĠĠĠĠĠĠ ĠFirebase Auth . getInstance (). sign Out () ĊĠĠĠ Ġ} Ċ } Ċ