package Ġio . mu un . apollo . domain . selector Ċ Ċ import Ġio . mu un . apollo . data . external . Globals Ċ import Ġio . mu un . apollo . data . preferences . Exchange Rate Window Repository Ċ import Ġio . mu un . apollo . data . to A pol lo Model Ċ import Ġio . mu un . apollo . domain . errors . Invalid Exchange Rate Window Ċ import Ġio . mu un . apollo . domain . model . Exchange Rate Window Ċ import Ġio . mu un . common . model . Exchange Rate Provider Ċ import Ġrx . Observable Ċ import Ġtim ber . log . Tim ber Ċ import Ġjavax . inject . Inject Ċ Ċ class ĠExchange Rate Selector Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġexchange Rate Window Repository : ĠExchange Rate Window Repository Ċ ) Ġ{ ĊĊĠĠĠ Ġfun Ġwatch Latest (): ĠObservable < Exchange Rate Provider > Ġ= ĊĠĠĠĠĠĠĠ Ġexchange Rate Window Repository . fetch () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġrate Window Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ map ĠExchange Rate Provider ( rate Window . toJson ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwatch Latest Window (): ĠObservable < Exchange Rate Window > Ġ= ĊĠĠĠĠĠĠĠ Ġexchange Rate Window Repository . fetch () ĊĊĠĠĠ Ġfun Ġget Provider For Window ( rate Window Id : ĠLong ): ĠExchange Rate Provider Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġlatest Provider Ġ= Ġwatch Latest (). to Blocking (). first () ĊĠĠĠĠĠĠĠ Ġval Ġlatest Window Id Ġ= ĠcheckNotNull ( latest Provider . rate Window ?. id ) ĊĊĠĠĠĠĠĠĠ Ġval Ġmaybe Fixed Window Ġ= Ġexchange Rate Window Repository . fixed Window ĊĠĠĠĠĠĠĠ Ġval Ġfixed Window Id Ġ= Ġmaybe Fixed Window . map ( Exchange Rate Window :: window H id ). orElse ( null ) ĊĠĠĠĠĠĠĠ Ġval Ġmatches Fixed Window Id Ġ= Ġmaybe Fixed Window . isPresent Ġ&& Ġfixed Window Id Ġ== Ġrate Window Id ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( latest Window Id Ġ== Ġrate Window Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlatest Provider ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( matches Fixed Window Id Ġ&& Ġ! is Too Old ( maybe Fixed Window . get (), Ġlatest Provider )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExchange Rate Provider ( maybe Fixed Window . get (). toJson ()) ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLet 's Ġtry Ġto Ġdetect Ġerrors Ġearly Ġin Ġdev Ġbut Ġavoid Ġinterrupt ing Ġexecution Ġin Ġpr d ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Ġ= ĠInvalid Exchange Rate Window ( rate Window Id , Ġlatest Window Id , Ġfixed Window Id ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġadd Ġpr d Ġcheck Ġtoo ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Globals . is Release Build ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġerror ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( error ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlatest Provider ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTODO : Ġthis Ġmethod Ġshould Ġbe Ġremoved , Ġinstead Ġusing ĠExchange Rate Provider Ġeverywhere ĊĠĠĠ Ġfun Ġget Latest Window (): ĠExchange Rate Window Ġ= ĊĠĠĠĠĠĠĠ Ġwatch Latest Window (). to Blocking (). first () ĊĊĠĠĠ Ġfun Ġfix Window ( exchange Rate Window : ĠExchange Rate Window ) Ġ= ĊĠĠĠĠĠĠĠ Ġexchange Rate Window Repository . store And Fix ( exchange Rate Window ) ĊĊĠĠĠ Ġprivate Ġfun Ġis Too Old ( rate Window : ĠExchange Rate Window , Ġlatest : ĠExchange Rate Provider ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠInstead Ġof Ġchecking Ġthe Ġrates Ġagainst Ġthe Ġcurrent Ġtime , Ġwe Ġcheck Ġit Ġagainst Ġthe Ġtime ĊĠĠĠĠĠĠĠ Ġ// Ġof Ġthe Ġlast Ġsuccessful Ġfetch Ġof Ġthe Ġrates , Ġso Ġthat Ġwe Ġde grade Ġa Ġlittle Ġbit Ġmore ĊĠĠĠĠĠĠĠ Ġ// Ġgrace fully Ġif Ġthe Ġexchange Ġrates ĠAPI Ġis Ġdown . ĊĠĠĠĠĠĠĠ Ġval Ġlatest Date Ġ= Ġlatest . rate Window !!. fetch Date ĊĠĠĠĠĠĠĠ Ġval Ġlower Limit Ġ= Ġlatest Date . to A pol lo Model () !!. minus Hours ( 1 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġrate Window . fetch Date Ġ<= Ġlower Limit ĊĠĠĠ Ġ} Ċ }