package Ġcom . fm . exchange . view Ċ Ċ import Ġandroid . util . Log Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġcom . fm . exchange . model . Currency Ċ import Ġcom . fm . exchange . network . Api Endpoints Ċ import Ġcom . fm . exchange . network . Ret rofit Factory Ċ import Ġcom . fm . exchange . util . Generic Utils Impl Ċ import Ġcom . fm . exchange . util . number . Number Formatter Util Impl Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . android . schedul ers . Android Schedulers Ċ import Ġio . reactivex . dis pos ables . Disposable Ċ import Ġio . reactivex . schedul ers . Schedulers Ċ import Ġorg . k oin . core . K oin Component Ċ import Ġorg . k oin . core . inject Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ class ĠExchange ViewModel Ġ: ĠViewModel (), ĠK oin Component Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠTAG Ġ= Ġ" Exchange ViewModel " ĊĊĠĠĠ Ġprivate Ġvar Ġm Base Currency Ġ= Ġ" EUR " ĊĠĠĠ Ġprivate Ġvar Ġm Base Rate Ġ= Ġ 1 . 0 ĊĊĠĠĠ Ġprivate Ġval Ġapi : ĠApi Endpoints ĊĊĠĠĠ Ġprivate Ġvar Ġcurrency List Ġ= ĠMutable LiveData < List < Currency >> (). apply Ġ{ Ġempty List < Currency >() Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Network Timer Disposable : ĠDis posable ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Data Fetcher Disposable : ĠDis posable ĊĊĠĠĠ Ġprivate Ġval Ġm Generic Utils : ĠGeneric Utils Impl Ġby Ġinject () ĊĠĠĠ Ġprivate Ġval Ġm Formatter Util : ĠNumber Formatter Util Impl Ġby Ġinject () ĊĠĠĠ Ġprivate Ġval Ġretrofit Factory : ĠRet rofit Factory Ġby Ġinject () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġapi Ġ= Ġretrofit Factory . create () ĊĠĠĠĠĠĠĠ Ġinit Timed API Request () Ċ // ĠĠĠĠĠĠ Ġvar Ġrepository = ĠExchange Repository . instance () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Timed API Request () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Exchange Rates List (): ĠMutable LiveData < List < Currency >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcurrency List ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġinit Timed API Request () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" init Timed API Request () ") ĊĊĠĠĠĠĠĠĠ Ġm Network Timer Disposable Ġ= ĠObservable . interval ( 1 , Ġ 5 , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġcall API End Points On Success () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĠonError ( it ) Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcall API End Points On Success () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" call API End Points On Success () ") ĊĊĠĠĠĠĠĠĠ ĠLog . d ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" call API End Points On Success Ġ{ Ġbase Currency Ġ: Ġ$ m Base Currency Ġ, Ġbase Rate : Ġ$ m Base Rate }" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġobservable Ġ= Ġapi . get Exchange Rates ( m Base Currency ) ĊĊĠĠĠĠĠĠĠ Ġm Data Fetcher Disposable Ġ= Ġobservable . subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġhandle Success ( it . rates ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĠonError ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġhandle Success ( currencies : ĠMap < String , ĠDouble >) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" handle Success () ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( currencies . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ"{ ${ currencies . size }} ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġadjusted Rate : ĠDouble ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġarray ListOf < Currency >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġset Ġbase Ġvalues ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( 0 , Ġm Generic Utils . getC urrency Object ( m Base Currency , Ġm Base Rate )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġc urrencies . forEach Ġ{ Ġ( currency Code , Ġreceived Rate ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadjusted Rate Ġ= Ġm Formatter Util . get Adjust ed Currency Rate ( received Rate Ġ* Ġm Base Rate ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" value : Ġ{$ received Rate } Ġ, Ġvalue Adjust ed : Ġ{$ adjusted Rate }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( m Generic Utils . getC urrency Object ( currency Code , Ġadjusted Rate )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrency List . post Value ( list ) ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" handle Success () Ġ- Ġlist Ġis Ġempty ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠonError ( throwable : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġthrowable . printStackTrace (). toString ()) ĊĠĠĠĠĠĠĠ Ġcurrency List . post Value ( null ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġfree Cached Memory () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Network Timer Disposable . dispose () ĊĠĠĠĠĠĠĠ Ġm Data Fetcher Disposable . dispose () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon Cle ared () Ġ{ ĊĠĠĠĠĠĠĠ Ġfree Cached Memory () ĊĠĠĠĠĠĠĠ Ġsuper . on Cle ared () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġupdate Query ( base Currency : ĠString , Ġbase Value : ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" update Query Ġ{ Ġbase Currency Ġ: Ġ$ base Currency Ġ, Ġbase Rate : Ġ$ base Value }") ĊĊĠĠĠĠĠĠĠ Ġm Base Currency Ġ= Ġbase Currency ĊĠĠĠĠĠĠĠ Ġm Base Rate Ġ= Ġbase Value ĊĊĠĠĠĠĠĠĠ Ġfree Cached Memory () ĊĠĠĠĠĠĠĠ Ġinit Timed API Request () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġon Cle ared () ĊĠĠĠ Ġ} Ċ Ċ }