package Ġcom . jo er ac osta . covid tracker . data Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġcom . jo er ac osta . covid tracker . addTo Composite Ċ import Ġcom . jo er ac osta . covid tracker . data . db . Cov id Data Dao Ċ import Ġio . reactivex . Flow able Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . Single Ċ import Ġio . reactivex . android . schedul ers . Android Schedulers Ċ import Ġio . reactivex . dis pos ables . Composite Disposable Ċ import Ġio . reactivex . functions . Function 4 Ċ import Ġio . reactivex . schedul ers . Schedulers Ċ import Ġio . reactivex . subjects . Behavior Subject Ċ import Ġokhttp 3 . ResponseBody Ċ import Ġorg . joda . time . DateTime Ċ import Ġorg . joda . time . Days Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util .* Ċ Ċ class ĠC ov id Data Repo ( ĊĠĠĠ Ġprivate Ġval Ġcov id Tracking Project Api : ĠC ov id Tracking Project Api , ĊĠĠĠ Ġprivate Ġval Ġour World In Data Api : ĠOur World In Data Api , ĊĠĠĠ Ġprivate Ġval Ġcomposite Disposable : ĠComposite Disposable , ĊĠĠĠ Ġprivate Ġval Ġcov id Data Dao : ĠC ov id Data Dao Ċ ) Ġ{ ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠF etches Ġdata Ġfrom Ġserver , Ġreturns Ġa Ġstream Ġthat Ġindicates Ġwhether Ġwe Ġsucceeded Ġgather ing Ġand ĊĠĠĠĠ Ġ* Ġstoring Ġlatest Ġdata ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfetch Latest Cov id Data (): ĠObservable < Boolean > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsuccess Observable Ġ= ĠBehavior Subject . create < Boolean >() ĊĊĠĠĠĠĠĠĠ ĠFlow able . zip ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcov id Tracking Project Api . getState Data (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcov id Tracking Project Api . get US Data (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġour World In Data Api . v acc ination US Data (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġour World In Data Api . v acc ination State Data (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFunction 4 Ġ{ Ġstate Data : ĠC ov id Raw Response , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġus Response : ĠUS Raw Response , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġus V acc ination Response : ĠResponse Body , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate V acc ination Response : ĠResponse Body Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġus Data With V acc inations Ġ= Ġadd V acc inations ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġraw V accine Response Ġ= Ġus V acc ination Response , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcov id Data Ġ= Ġus Response . us Data . map NotNull Ġ{ Ġit . to Cov id Data () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Country Data Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Data With V acc inations Ġ= Ġadd V acc inations ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġraw V accine Response Ġ= Ġstate V acc ination Response , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcov id Data Ġ= Ġstate Data . covid Data . map Ġ{ Ġit . to Cov id Data () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Country Data Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// combine Ġstate Ġdata Ġwith ĠUS ĠData ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Data With V acc inations , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġus Data With V acc inations ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). flatten () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ Ġcov id Data : ĠList < Cov id Data > Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata With Av gs Ġ= Ġcalculate Se ven Day Average s ( covid Data ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Database Data ( data With Av gs ). subscribe ({ Ġsuccess Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess Observable . onNext ( success ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess Observable . onNext ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess Observable . onNext ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}). addTo Composite ( composite Disposable ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsuccess Observable ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" SimpleDateFormat ") ĊĠĠĠ Ġprivate Ġfun Ġadd V acc inations ( ĊĠĠĠĠĠĠĠ Ġraw V accine Response : ĠResponse Body , ĊĠĠĠĠĠĠĠ Ġcov id Data : ĠList < Cov id Data >, ĊĠĠĠĠĠĠĠ Ġis Country Data : ĠBoolean ĊĠĠĠ Ġ): ĠList < Cov id Data > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuffered Source Ġ= Ġraw V accine Response . source () ĊĊĠĠĠĠĠĠĠ Ġval Ġheader Ġ= Ġbuffered Source . read Utf 8 Line () ĊĠĠĠĠĠĠĠ Ġval Ġheader Titles Ġ= Ġheader ?. split ( Regex (", (? =( ?: [^ \"] * \" [^ \"] *\ ") * [^ \"] *$ ) ")) ĊĊĠĠĠĠĠĠĠ Ġval Ġdate Index Ġ= Ġheader Titles ?. indexOf ( V ACC INE _ DATA _ DATE _ HEADER _ TITLE ) Ġ?: Ġreturn Ġcov id Data ĊĠĠĠĠĠĠĠ Ġval Ġtotal People V acc inated Index Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheader Titles . indexOf ( V ACC INE _ DATA _ TOTAL _ PE OP LE _ V ACC IN ATED _ HEADER _ TITLE ) ĊĠĠĠĠĠĠĠ Ġval Ġpercent V acc inated Index Ġ= Ġheader Titles . indexOf ( V ACC INE _ DATA _ PE OP LE _ V ACC IN ATED _ PERCENT ) ĊĠĠĠĠĠĠĠ Ġval Ġlocation Index Ġ= Ġheader Titles . indexOf ( V ACC INE _ DATA _ LOCATION _ HEADER _ TITLE ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtemporary V acc ination Data Ġ= Ġmutable Map Of < Location , ĠMutable List < Cov id Data >>() ĊĊĠĠĠĠĠĠĠ Ġvar Ġcsv Line Ġ= Ġbuffered Source . read Utf 8 Line () ĊĠĠĠĠĠĠĠ Ġwhile Ġ( csv Line Ġ!= Ġnull ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalues Array Ġ= Ġcsv Line . split ( Regex (", (? =( ?: [^ \"] * \" [^ \"] *\ ") * [^ \"] *$ ) ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdate String Ġ= Ġvalues Array . get OrNull ( date Index ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠdateFormat Ġ= ĠSimpleDateFormat (" yyyy - MM - dd ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdate Ġ= Ġdate String ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdateFormat . parse ( date String ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocation String Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Country Data ) ĠLocation . UNIT ED _ STAT ES . toString () Ġelse Ġvalues Array . get OrNull ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpeople V acc inated Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues Array . get OrNull ( total People V acc inated Index )?. toDouble OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpercent V acc inated Ġ= Ġif Ġ( is Country Data ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( people V acc inated Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( people V acc inated ) Ġ/ ĠUS _ POP UL ATION ) Ġ* Ġ 1 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues Array . get OrNull ( percent V acc inated Index )?. toDouble OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocation Ġ= ĠLocation . getLocation FromString ( location String ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprevious Day WithData Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( location Ġ!= Ġnull ) Ġtemporary V acc ination Data [ location ]?. find Last Ġ{ Ġit . total People V acc inated Ġ!= Ġnull Ġ} Ġelse Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// estimate Ġnew Ġv acc inations Ġby Ġdiv iding Ġby Ġdays Ġbetween Ġv accine Ġdata Ġsince Ġthere Ġare Ġg aps Ġin Ġthe Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdays Between V accine Data Ġ= Ġif Ġ( previous Day WithData Ġ!= Ġnull ) Ġdays Between ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Day WithData . date , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew V acc inations Ġ= Ġpeople V acc inated ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( people V acc inated Ġ- Ġ( previous Day WithData ?. total People V acc inated ?. toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġ 0 . 0 )) Ġ/ Ġ( days Between V accine Data Ġ?: Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( date Ġ!= Ġnull Ġ&& Ġlocation Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( temporary V acc ination Data [ location ] Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemporary V acc ination Data [ location ] Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemporary V acc ination Data [ location ]?. add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC ov id Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate Ġ= Ġdate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Ġ= Ġlocation , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal People V acc inated Ġ= Ġpeople V acc inated ?. to Long (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew People V acc inated Ġ= Ġnew V acc inations ?. to Long (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpercent Of Population V acc inated Ġ= Ġpercent V acc inated ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcsv Line Ġ= Ġbuffered Source . read Utf 8 Line () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// add Ġfill er Ġdata Ġfor Ġprevious Ġdays . ĠV acc inations Ġstarted Ġon Ġ 1 2 / 1 4 Ġbut Ġwe Ġdon 't Ġhave Ġdata Ġuntil Ġlater Ġ( for Ġthe Ġstates Ġalmost Ġa Ġmonth Ġlater ) ĊĠĠĠĠĠĠĠ Ġ// so Ġdaily Ġv acc ination Ġdata Ġat Ġthe Ġstart Ġis Ġwrong . ĠWe 'll Ġdivide Ġit Ġup Ġbetween Ġthe Ġdays Ġto Ġget Ġa Ġmore Ġaccurate Ġgraph Ġof Ġnew Ġv acc inations ĊĠĠĠĠĠĠĠ Ġtemporary V acc ination Data . keys . forEach Ġ{ Ġlocation Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsorted Data Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemporary V acc ination Data [ location ]?. sorted By Ġ{ Ġit . date Ġ} Ġ// sort Ġjust Ġin Ġcase ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst Day WithData Ġ= Ġsorted Data ?. first OrNull Ġ{ Ġit . new People V acc inated Ġ!= Ġnull Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdays Between Data Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdays Between ( getFirst Day Of V acc inations (). time , Ġfirst Day WithData ?. date ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( days Between Data Ġ== Ġ- 1 ) Ġreturn @ forEach ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdays To Calculate With Ġ= Ġdays Between Data Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdaily V acc inations Spread Between Days Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( first Day WithData ?. new People V acc inated Ġ?: Ġ 0 ) Ġ/ Ġdays To Calculate With ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// remove Ġfirst day Ġof Ġdata Ġbecause Ġwe 're Ġgoing Ġto Ġadd Ġit Ġback Ġwith Ġthe Ġnew Ġdaily Ġv acc inations ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtemporary V acc ination Data [ location ]?. removeAll Ġ{ Ġit . date Ġ== Ġfirst Day WithData ?. date Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdays Between Ġ= Ġdays Between Data ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( days Between Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Date Ġ= Ġsubtract Days ( first Day WithData ?. date , Ġdays Between ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Date Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemporary V acc ination Data [ location ]?. add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC ov id Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdate Ġ= Ġnew Date , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Ġ= Ġlocation , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal People V acc inated Ġ= Ġif Ġ( new Date Ġ== Ġfirst Day WithData ?. date ) Ġfirst Day WithData . total People V acc inated Ġelse Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew People V acc inated Ġ= Ġdaily V acc inations Spread Between Days , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpercent Of Population V acc inated Ġ= Ġif Ġ( new Date Ġ== Ġfirst Day WithData ?. date ) Ġfirst Day WithData . percent Of Population V acc inated Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdays Between -- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// sort Ġback Ġinto Ġplace ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtemporary V acc ination Data [ location ]?. sortBy Ġ{ Ġit . date Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġ// combine Ġdata ĊĠĠĠĠĠĠĠ Ġreturn Ġcov id Data . map Ġ{ Ġdata Without V acc inations Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatching V acc ination Data Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemporary V acc ination Data [ data Without V acc inations . location ]?. find Ġ{ Ġit . date Ġ== Ġdata Without V acc inations . date Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( matching V acc ination Data Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ map Ġdata Without V acc inations . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal People V acc inated Ġ= Ġmatching V acc ination Data . total People V acc inated , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew People V acc inated Ġ= Ġmatching V acc ination Data . new People V acc inated , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpercent Of Population V acc inated Ġ= Ġmatching V acc ination Data . percent Of Population V acc inated ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ map Ġdata Without V acc inations ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalculate Se ven Day Average s ( covid Data : ĠList < Cov id Data >): ĠList < Cov id Data > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġmap Of Location Data Ġ= Ġhash Map Of < Location , ĠArrayList < Cov id Data >>() ĊĊĠĠĠĠĠĠĠ Ġcov id Data . forEach Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġloc Ġ= Ġit . location Ġ?: Ġreturn @ forEach ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// add Ġempty Ġlist Ġof Ġneeded ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! map Of Location Data . containsKey ( loc )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of Location Data [ loc ] Ġ= Ġarray ListOf () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of Location Data [ loc ]?. add ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval ĠlistOf Location Data With Average s Ġ= Ġmap Of Location Data . values . map Ġ{ Ġlist Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// sort Ġby Ġdate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist . sortBy Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . date ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// calculate Ġaverage s ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Data With Se ven Day Av gs Ġ= Ġlist . map Indexed Ġ{ Ġindex , Ġcov id Data Ġ-> ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Se ven Days New V acc inations Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ>= Ġ 6 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . slice ( index Ġ- Ġ 6 .. index ). map Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew V acc inations To Return Ġ= Ġit . new People V acc inated ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew V acc inations To Return ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// this Ġis Ġalso Ġnecessary Ġbecause Ġsome Ġdates Ġdon 't Ġhave Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew V acc inations From Actual Days WithData From Last Se ven Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Se ven Days New V acc inations ?. filter NotNull () ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew V acc inations Se ven Day Avg Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new V acc inations From Actual Days WithData From Last Se ven ?. isNotEmpty () Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew V acc inations From Actual Days WithData From Last Se ven . sum By Double Ġ{ Ġit . toDouble () Ġ} Ġ/ Ġnew V acc inations From Actual Days WithData From Last Se ven . size Ġ// calculate Ġavg Ġwith Ġdata Ġwe Ġhave Ġ( not Ġall Ġdays Ġhave Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcov id Data . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew V acc inations Se ven Day Avg Ġ= Ġnew V acc inations Se ven Day Avg ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist Data With Se ven Day Av gs ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠlistOf Location Data With Average s . flatten () ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Database Data ( data : ĠList < Cov id Data >): ĠObservable < Boolean > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsuccess Observable Ġ= ĠBehavior Subject . create < Boolean >() ĊĊĠĠĠĠĠĠĠ ĠSingle . from Callable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcov id Data Dao . clear All Data () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSingle . from Callable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcov id Data Dao . insert Data ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess Observable . onNext ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess Observable . onNext ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess Observable . onNext ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}). addTo Composite ( composite Disposable ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsuccess Observable ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdays Between ( d 1 : ĠDate ?, Ġd 2 : ĠDate ?): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( d 1 Ġ== Ġnull Ġ|| Ġd 2 Ġ== Ġnull ) Ġreturn Ġ- 1 ĊĊĠĠĠĠĠĠĠ Ġval Ġdifference Ġ= ĠDays . days Between ( DateTime ( d 1 . time ), ĠDateTime ( d 2 . time )). days ĊĊĊĠĠĠĠĠĠĠ Ġ// val Ġdifference Ġ= Ġ(( d 2 . time Ġ- Ġd 1 . time ) Ġ/ Ġ( 1 0 0 0 Ġ* Ġ 6 0 Ġ* Ġ 6 0 Ġ* Ġ 2 4 )). toInt () ĊĠĠĠĠĠĠĠ Ġreturn Ġdifference ĊĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsubtract Days ( date : ĠDate ?, Ġdays To Subtract : ĠInt ): ĠDate ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( date Ġ== Ġnull ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġcal Ġ= ĠCalendar . getInstance () ĊĠĠĠĠĠĠĠ Ġcal . time Ġ= Ġdate ĊĠĠĠĠĠĠĠ Ġcal . add ( Calendar . DATE , Ġ( days To Subtract Ġ* Ġ- 1 )) ĊĠĠĠĠĠĠĠ Ġreturn Ġcal . time ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġday Ġthat s Ġroughly Ġ 7 Ġdays Ġbefore Ġwe Ġhave Ġdata Ġdepending Ġon Ġif Ġits Ġstates Ġor Ġcountry ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget First Day Of V acc inations (): ĠCalendar Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠCalendar . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset ( 2 0 2 0 , Ġ 1 1 , Ġ 1 4 , Ġ 0 , Ġ 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset ( Calendar . MILLI SECOND , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠV ACC INE _ DATA _ DATE _ HEADER _ TITLE Ġ= Ġ" date " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠV ACC INE _ DATA _ TOTAL _ PE OP LE _ V ACC IN ATED _ HEADER _ TITLE Ġ= Ġ" people _ v acc inated " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠV ACC INE _ DATA _ LOCATION _ HEADER _ TITLE Ġ= Ġ" location " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠV ACC INE _ DATA _ PE OP LE _ V ACC IN ATED _ PERCENT Ġ= Ġ" people _ v acc inated _ per _ h undred " ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠUS _ POP UL ATION Ġ= Ġ 3 2 8 2 0 0 0 0 0 . 0 ĊĠĠĠ Ġ} Ċ Ċ }