package Ġcom . example . covid _ 1 9 Ċ Ċ import Ġandroid . widget . TextView Ċ import Ġjava . text . NumberFormat Ċ import Ġjava . text . SimpleDateFormat Ċ Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroidx . annotation . Color Int Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġcom . google . gson . Gson Builder Ċ import Ġcom . ro bin hood . ticker . Ticker Utils Ċ import Ġkotlinx . android . synt hetic . main . activity _ main .* Ċ import Ġretrofit 2 . Call Ċ import Ġretrofit 2 . Callback Ċ import Ġretrofit 2 . Response Ċ import Ġretrofit 2 . Ret rofit Ċ import Ġretrofit 2 . converter . gson . Gson Converter Factory ĊĊ Ċ import Ġjava . util .* Ċ Ċ private Ġconst Ġval ĠBASE _ URL Ġ= Ġ" https :// api . covid tracking . com / v 1 /" Ċ private Ġconst Ġval ĠTAG Ġ= Ġ" MainActivity " Ċ private Ġconst Ġval ĠALL _ STAT ES Ġ= Ġ" All Ġ( National wide )" Ċ Ċ class ĠMainActivity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcurrently Shown Data : ĠList < Cov id Data > ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġadapter : ĠC ov id Spark Adapter ĊĠĠĠ Ġprivate Ġ Ġlateinit Ġvar Ġper State Daily Data : ĠMap < String , ĠList < Cov id Data >> ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġnational Daily Data : ĠList < Cov id Data > ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ main ) ĊĠĠĠĠĠĠĠ Ġsupport ActionBar ?. title Ġ= ĠgetString ( R . string . app _ description ) ĊĊĠĠĠĠĠĠĠ Ġ// Instance Ġof Ġgson ĊĠĠĠĠĠĠĠ Ġval Ġgson Ġ= ĠGson Builder (). set DateFormat (" yyyy - MM - dd ' T ' HH : mm : ss "). create () ĊĠĠĠĠĠĠĠ Ġval Ġretrofit Ġ= ĠRet rofit . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. baseUrl ( BASE _ URL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Converter Factory ( Gson Converter Factory . create ( gson )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġ// instance Ġof ĠC ov id Service ĊĠĠĠĠĠĠĠ Ġval Ġ Ġcov id Service Ġ= Ġretrofit . create ( Cov id Service :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġ// Fetch Ġnational Ġdata ĊĠĠĠĠĠĠĠ Ġcov id Service . get National Data (). enqueue ( object : ĠCallback < List < Cov id Data >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Response ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall : ĠCall < List < Cov id Data >>, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse : ĠResponse < List < Cov id Data >> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" on Response Ġ$ response ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// check Ġif Ġthe Ġdata Ġreceived Ġis Ġvalid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnational Data Ġ= Ġresponse . body () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( national Data Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( TAG , Ġ" Did Ġnot Ġreceive Ġa Ġvalid Ġresponse Ġbody Ġor Ġdata ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsetup Event Listeners () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnational Daily Data Ġ= Ġnational Data . reversed () Ġ// to Ġget Ġthe Ġoldest Ġdata Ġfirst ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Update Ġgraph Ġwith Ġnational Ġdata ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Display WithData ( national Daily Data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( call : ĠCall < List < Cov id Data >>, Ġt : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" on Failure Ġ$ t ") ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ// Fetch Ġstate Ġdata ĊĠĠĠĠĠĠĠ Ġcov id Service . get States Data (). enqueue ( object : ĠCallback < List < Cov id Data >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Response ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall : ĠCall < List < Cov id Data >>, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse : ĠResponse < List < Cov id Data >> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" on Response Ġ$ response ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// check Ġif Ġthe Ġdata Ġreceived Ġis Ġvalid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstates Data Ġ= Ġresponse . body () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( states Data Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( TAG , Ġ" Did Ġnot Ġreceive Ġa Ġvalid Ġresponse Ġbody Ġor Ġdata ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġper State Daily Data Ġ= Ġstates Data . reversed (). groupBy { it . state } Ġ// to Ġget Ġthe Ġoldest Ġdata Ġfirst Ġand Ġgroup Ġthem Ġbased Ġon Ġstate Ġnames ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġspinner Ġ Ġwith Ġstate Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Spinner With State Data ( per State Daily Data . keys ) Ġ// t akes Ġin Ġa Ġmap Ġof Ġeach Ġday Ġdata Ġfrom Ġa Ġparticular Ġstate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( call : ĠCall < List < Cov id Data >>, Ġt : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" on Failure Ġ$ t ") ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Spinner With State Data ( state Names : ĠSet < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// create Ġan Ġordered Ġlist Ġfor Ġstate Ġnames ĊĠĠĠĠĠĠĠ Ġval Ġstate Abbre viation List Ġ= Ġstate Names . to Mutable List () ĊĠĠĠĠĠĠĠ Ġstate Abbre viation List . sort () Ġ// sort Ġstate Ġnames Ġalphabet ically ĊĠĠĠĠĠĠĠ Ġstate Abbre viation List . add ( 0 , ALL _ STAT ES ) Ġ// Ġfirst Ġvalue Ġof Ġthe Ġsorted Ġlist Ġas Ġa Ġentire Ġnational Ġdata ĊĊĠĠĠĠĠĠĠ Ġ// Add Ġstate Ġlist Ġas Ġdata Ġsource Ġfor Ġthe Ġspinner ĊĠĠĠĠĠĠĠ Ġspinner Select . attach DataSource ( state Abbre viation List ) Ġ// drop Ġdown Ġfor Ġthe Ġstates Ġabbre viations ĊĠĠĠĠĠĠĠ Ġspinner Select . setOn Spinner ItemSelected Listener { parent , _, Ġposition ,_ Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġselect State Ġ= Ġparent . getItem At Position ( position ) Ġas ĠString ĊĠĠĠĠĠĠĠ Ġval Ġselected Data Ġ= Ġper State Daily Data [ select State ] Ġ?: Ġnational Daily Data ĊĠĠĠĠĠĠĠ Ġupdate Display WithData ( selected Data )} ĊĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Event Listeners () Ġ{ ĊĠĠĠĠĠĠĠ Ġticker View . set Character Lists ( Ticker Utils . provide Number List ()) ĊĠĠĠĠĠĠĠ Ġ// Add Ġa Ġlistener Ġfor Ġthe Ġuser Ġscr ub bing Ġon Ġthe Ġchart ĊĠĠĠĠĠĠĠ Ġspark View . is Sc rub Enabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġspark View . set Sc rub Listener Ġ{ Ġitem Data Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item Data Ġis ĠC ov id Data ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Info For Date ( item Data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Respond Ġto Ġradio Ġbutton Ġselected Ġevents ĊĠĠĠĠĠĠĠ Ġradio Group Time Selection . setOn Checked ChangeListener Ġ{ Ġ_, Ġchecked Id Ġ-> ĊĠĠĠĠĠĠĠ Ġadapter . days Ago Ġ= Ġwhen Ġ( checked Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . radioButton Week Ġ-> ĠTime Scale . WEEK ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . radioButton Month Ġ-> ĠTime Scale . MONTH ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠTime Scale . MAX ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// notify Ġthe Ġadapter Ġthat Ġdata Ġhave Ġchanged ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . notify DataSet Changed () ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġradio Group Metric Selection . setOn Checked ChangeListener Ġ{ Ġ_, Ġchecked Id -> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( checked Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . radioButton Positive Ġ-> Ġupdate Display Metric ( Metric . POSITIVE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . radioButton Negative Ġ-> Ġupdate Display Metric ( Metric . NEGATIVE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . radioButton Death Ġ-> Ġupdate Display Metric ( Metric . DE ATH ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Display Metric ( metric : ĠMetric ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// update Ġthe Ġcolor Ġof Ġthe Ġchart Ġaccordingly ĊĠĠĠĠĠĠĠ Ġval Ġcolor Resource Ġ= Ġwhen Ġ( metric ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMetric . NEGATIVE Ġ-> ĠR . color . color Negative ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMetric . POSITIVE Ġ-> ĠR . color . color Positive ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMetric . DE ATH Ġ-> ĠR . color . color Death ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ@ Color Int Ġval Ġcolor Int Ġ= ĠContext Compat . getColor ( this , color Resource ) ĊĠĠĠĠĠĠĠ Ġspark View . line Color Ġ= Ġcolor Int ĊĊĠĠĠĠĠĠĠ Ġ// update Ġthe ĠtextView Ġcolor ĊĠĠĠĠĠĠĠ Ġticker View . setTextColor ( color Int ) ĊĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġthe Ġmetric Ġon Ġthe Ġadapter ĊĠĠĠĠĠĠ Ġadapter . metric Ġ= Ġmetric ĊĠĠĠĠĠĠĠ Ġadapter . notify DataSet Changed () ĊĊĠĠĠĠĠĠĠ Ġ// ĠReset Ġdate Ġand Ġnumber Ġof Ġcases Ġshown Ġby Ġthe Ġtwo Ġbottom Ġtext Views ĊĠĠĠĠĠĠĠ Ġupdate Info For Date ( currently Shown Data . last ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Display WithData ( daily Data : ĠList < Cov id Data >) Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrently Shown Data Ġ= Ġdaily Data ĊĠĠĠĠĠĠĠ Ġ// create Ġa Ġnew ĠSpark Adapter Ġwith Ġdata ĊĠĠĠĠĠĠĠ Ġadapter Ġ= ĠC ov id Spark Adapter ( daily Data ) ĊĠĠĠĠĠĠĠ Ġspark View . adapter Ġ= Ġadapter ĊĠĠĠĠĠĠĠ Ġ// Update Ġradio Ġbuttons Ġto Ġselect Ġthe Ġpositive Ġcases Ġand Ġmax Ġtime Ġby Ġdefault ĊĠĠĠĠĠĠĠ Ġradio Button Positive . isChecked Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġradio Button Max . isChecked Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġ// Display Ġmetric Ġfor Ġthe Ġmost Ġrecent Ġdate ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġupdate Display Metric ( Metric . POSITIVE ) Ġ// as Ġdefault ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Info For Date ( covid Data : ĠC ov id Data ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnum Cases Ġ= Ġwhen Ġ( adapter . metric ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMetric . NEGATIVE Ġ-> Ġcov id Data . negative Increase . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMetric . POSITIVE Ġ-> Ġcov id Data . positive Increase . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMetric . DE ATH Ġ-> Ġcov id Data . death Increase . toFloat () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠ Ġticker View . text Ġ= ĠNumber Format . getInstance (). format ( num Cases ) Ġ// show ing Ġbased Ġon Ġmetric ĊĠĠĠĠĠĠĠ Ġval Ġoutput DateFormat Ġ= Ġ ĠSimpleDateFormat (" MM Ġdd , Ġy yyy ", ĠLocale . US ) ĊĠĠĠĠĠĠ Ġtv Date Label . text Ġ= Ġoutput DateFormat . format ( covid Data . date Checked ) ĊĊĠĠĠ Ġ} Ċ }