package Ġio . horizontal systems . bank wallet . core . managers Ċ Ċ import Ġio . horizontal systems . bank wallet . core . IN etwork Manager Ċ import Ġio . horizontal systems . bank wallet . core . IR ate Storage Ċ import Ġio . horizontal systems . bank wallet . entities . Rate Ċ import Ġio . horizontal systems . bank wallet . modules . transactions . Coin Code Ċ import Ġio . reactivex . Maybe Ċ import Ġio . reactivex . android . schedul ers . Android Schedulers Ċ import Ġio . reactivex . dis pos ables . Composite Disposable Ċ import Ġio . reactivex . schedul ers . Schedulers Ċ import Ġretrofit 2 . HttpException Ċ import Ġjava . math . BigDecimal Ċ import Ġjava . net . Socket TimeoutException Ċ Ċ class ĠRate Manager ( private Ġval Ġstorage : ĠI Rate Storage , Ġprivate Ġval Ġnetwork Manager : ĠIN etwork Manager ) Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġrefresh Dis pos ables : ĠComposite Disposable Ġ= ĠComposite Disposable () ĊĠĠĠ Ġprivate Ġval Ġlatest Rate Fallback Threshold InSeconds Ġ= Ġ 6 0 0 Ġ// Ġ 1 0 Ġminutes ĊĊĠĠĠ Ġfun Ġrefresh Latest Rates ( coin Codes : ĠList < String >, Ġcurrency Code : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrefresh Dis pos ables . clear () ĊĊĠĠĠĠĠĠĠ Ġrefresh Dis pos ables . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork Manager . get Latest Rate Data ( Service Exchange Api . Host Type . MAIN , Ġcurrency Code ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. onError Resume Next ( network Manager . get Latest Rate Data ( Service Exchange Api . Host Type . FALL BACK , Ġcurrency Code )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ({ Ġlatest Rate Data Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoin Codes . forEach Ġ{ Ġcoin Code Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlatest Rate Data . rates [ coin Code ]?. to BigDecimal OrNull ()?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrate Ġ= ĠRate ( coin Code , Ġlatest Rate Data . currency , Ġit , Ġlatest Rate Data . timestamp , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstorage . save Latest ( rate ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// request Ġfailed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Latest Rate Fallback Flow able ( coin Code : ĠCoin Code , Ġcurrency Code : ĠString , Ġtimestamp : ĠLong ): ĠMaybe < BigDecimal > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( timestamp Ġ< Ġ(( System . currentTimeMillis () Ġ/ Ġ 1 0 0 0 ) Ġ- Ġlatest Rate Fallback Threshold InSeconds )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMaybe . empty () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġstorage . latest Rate Observable ( coin Code , Ġcurrency Code ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first Element () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . expired ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMaybe . empty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMaybe . just ( it . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrate Value Observable ( coin Code : ĠCoin Code , Ġcurrency Code : ĠString , Ġtimestamp : ĠLong ): ĠMaybe < BigDecimal > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġstorage . rate Maybe ( coin Code , Ġcurrency Code , Ġtimestamp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . value Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. switch If Empty ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork Manager . get Rate By Hour ( Service Exchange Api . Host Type . MAIN , Ġcoin Code , Ġcurrency Code , Ġtimestamp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. onError Resume Next Ġ{ Ġt : ĠThrowable Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( t ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSocket TimeoutException Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork Manager . get Rate By Hour ( Service Exchange Api . Host Type . FALL BACK , Ġcoin Code , Ġcurrency Code , Ġtimestamp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. onError Resume Next ( network Manager . get Rate By Day ( Service Exchange Api . Host Type . FALL BACK , Ġcoin Code , Ġcurrency Code , Ġtimestamp )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠHttp Exception Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork Manager . get Rate By Day ( Service Exchange Api . Host Type . MAIN , Ġcoin Code , Ġcurrency Code , Ġtimestamp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. onError Resume Next ( network Manager . get Rate By Day ( Service Exchange Api . Host Type . FALL BACK , Ġcoin Code , Ġcurrency Code , Ġtimestamp )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow Ġt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Success Ġ{ Ġrate From Network Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstorage . save ( Rate ( coin Code , Ġcurrency Code , Ġrate From Network , Ġtimestamp , Ġfalse )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. onError Resume Next ( get Latest Rate Fallback Flow able ( coin Code , Ġcurrency Code , Ġtimestamp )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear () Ġ{ ĊĠĠĠĠĠĠĠ Ġstorage . delete All () ĊĠĠĠ Ġ} Ċ Ċ } Ċ