package Ġcom . oct ac ores oft wares . k ud if x . ui Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . Adapter View Ċ import Ġandroidx . lifecycle . Lifecycle Owner Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġcom . google . android . material . button . Material Button Toggle Group Ċ import Ġcom . oct ac ores oft wares . k ud if x . R Ċ import Ġcom . oct ac ores oft wares . k ud if x . local . Latest Ċ import Ġcom . oct ac ores oft wares . k ud if x . local . Rates Ċ import Ġcom . oct ac ores oft wares . k ud if x . repo . Repository Ċ import Ġcom . oct ac ores oft wares . k ud if x . repo . Repository Impl Ċ import Ġcom . oct ac ores oft wares . k ud if x . repo . Results Ċ import Ġcom . oct ac ores oft wares . k ud if x . ui . spinner . Country Adapter Ċ import Ġcom . oct ac ores oft wares . k ud if x . utils . format Currency Ċ import Ġcom . oct ac ores oft wares . k ud if x . utils . generate Countries Ċ import Ġkotlinx . coroutines . delay Ċ import Ġkotlinx . coroutines . isActive Ċ import Ġkotlinx . coroutines . launch Ċ Ċ private Ġconst Ġval ĠTAG Ġ= Ġ" MainActivity Presenter " Ċ Ċ class ĠMainActivity Presenter ( ĊĠĠĠ Ġprivate Ġval Ġmodel : ĠMainActivity ViewModel , ĊĠĠĠ Ġprivate Ġval Ġrepo : ĠRepository , ĊĠĠĠ Ġprivate Ġval Ġowner : ĠLifecycle Owner , ĊĠĠĠ Ġprivate Ġval Ġcontext : ĠContext Ċ ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġorigin Countries Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnames Ġ= Ġcontext . resources . getString Array ( R . array . origin _ entries ) ĊĠĠĠĠĠĠĠ Ġgenerate Countries ( names , ĠR . array . origin _ currency _ icons , Ġcontext ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġdestination Countries Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnames Ġ= Ġcontext . resources . getString Array ( R . array . destination _ entries ) ĊĠĠĠĠĠĠĠ Ġgenerate Countries ( names , ĠR . array . destination _ currency _ icons , Ġcontext ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġorigin Adapter Ġ= ĠCountry Adapter ( context , ĠR . layout . currency _ spinner , Ġorigin Countries ) ĊĠĠĠ Ġval Ġdestination Adapter Ġ= ĠCountry Adapter ( context , ĠR . layout . currency _ spinner , Ġdestination Countries ) ĊĠĠĠ Ġval Ġspinner Listener Ġ= Ġobject Ġ: ĠAdapter View . On ItemSelected Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon ItemSelected ( parent : ĠAdapter View < *> ?, Ġview : ĠView ?, Ġposition : ĠInt , Ġid : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( parent ?. id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . current _ selection Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . origin Country Selected Ġ= Ġorigin Countries [ position ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . destination _ selection Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . destination Country Selected Ġ= Ġdestination Countries [ position ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Nothing Selected ( p 0 : ĠAdapter View < *> ?) Ġ{} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġbutton Group Listener Ġ= ĠMaterial Button Toggle Group . On Button Checked Listener Ġ{ Ġ_, Ġchecked Id , Ġis Checked Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( isChecked ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( checked Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . th irty _ days Ġ-> Ġmodel . numberOf History Days Ġ= Ġ 3 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . nin ety _ days Ġ-> Ġmodel . numberOf History Days Ġ= Ġ 9 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . numberOf History Days Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġbutton Click Lister Ġ= ĠView . OnClickListener Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( model . answer . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . destination Rate Text Ġ= Ġformat Currency ( model . answer . to BigDecimal ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetAll Latest Rate () Ġ= Ġmodel . viewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ( isActive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġresult Ġ= Ġrepo . getAll Latest Rate ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResults . Success < LiveData < List < Latest >>> Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . data . observe ( owner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . all Rates Available Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResults . Error Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w tf ( TAG , Ġresult . exception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 6 0 . times ( 1 0 0 0 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġget Most Recent Rate () Ġ= Ġmodel . viewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ( isActive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġresult Ġ= Ġrepo . get Most Recent Rate ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResults . Success < LiveData < Latest >> Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . data . observe ( owner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . latest Rate Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResults . Error Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w tf ( TAG , Ġresult . exception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 5 . times ( 1 0 0 0 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun ĠgetAll Rates () Ġ= Ġmodel . viewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ( isActive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġresult Ġ= Ġrepo . getAll Rates ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResults . Success < LiveData < List < Rates >>> Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . data . observe ( owner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . all Rates Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠResults . Error Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w tf ( TAG , Ġresult . exception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 6 0 . times ( 1 0 0 0 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }