/** Ċ Ġ* ĠB read Wallet Ċ Ġ* Ċ Ġ* ĠCreated Ġby ĠM ih ail ĠG ut an Ġ< mi h ail @ bread wallet . com > Ġon Ġ 7 / 2 2 / 1 5 . Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 6 Ġb read wallet ĠLLC Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ċ Ġ* Ġall Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN Ċ Ġ* ĠTHE ĠSOFTWARE . Ċ Ġ*/ Ċ package Ġcom . bread wallet . tools . manager Ċ Ċ import Ġandroid . content . Context Ċ import Ġcom . bread wallet . Build Config Ċ import Ġcom . bread wallet . legacy . presenter . entities . Currency Entity Ċ import Ġcom . bread wallet . logger . log Debug Ċ import Ġcom . bread wallet . logger . log Error Ċ import Ġcom . bread wallet . model . Price Change Ċ import Ġcom . bread wallet . model . Price DataPoint Ċ import Ġcom . bread wallet . repository . Rates Repository Ċ import Ġcom . bread wallet . tools . util . Token Util Ċ import Ġcom . bread wallet . ui . wallet . Interval Ċ import Ġcom . google . firebase . k tx . Firebase Ċ import Ġcom . google . firebase . remote config . k tx . remote Config Ċ import Ġcom . platform . interfaces . Account MetaData Provider Ċ import Ġcom . platform . util . getDouble OrNull Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . delay Ċ import Ġkotlinx . coroutines . flow . combine Ċ import Ġkotlinx . coroutines . flow . distinct Until Changed Ċ import Ġkotlinx . coroutines . flow . filter Ċ import Ġkotlinx . coroutines . flow . launch In Ċ import Ġkotlinx . coroutines . flow . map Ċ import Ġkotlinx . coroutines . flow . on Each Ċ import Ġkotlinx . coroutines . flow . onStart Ċ import Ġkotlinx . coroutines . flow . retry Ċ import Ġkotlinx . coroutines . flow . transform Latest Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġokhttp 3 . Ok HttpClient Ċ import Ġokhttp 3 . Request Ċ import Ġorg . json . JSONObject Ċ import Ġjava . math . BigDecimal Ċ import Ġjava . util . Date Ċ import Ġjava . util . Locale Ċ Ċ /** ĠDelay Ġbetween Ġeach Ġdata Ġrequest . Ġ*/ Ċ private Ġconst Ġval ĠREF RESH _ DELAY _ MS Ġ= Ġ 6 0 _ 0 0 0 L Ċ private Ġconst Ġval ĠREF RESH _ ERROR _ DELAY _ MS Ġ= Ġ 2 _ 0 0 0 L Ċ Ċ /** ĠDefault Ġfi at Ġc urrencies Ġto Ġretrieve Ġexchange Ġrates Ġfor . Ġ*/ Ċ private Ġconst Ġval ĠUSD Ġ= Ġ" USD " Ċ private Ġconst Ġval ĠEUR Ġ= Ġ" EUR " Ċ private Ġval ĠDEFAULT _ FI ATS Ġ= ĠlistOf ( USD , ĠEUR ) Ċ Ċ /** ĠHard - coded ĠA VM Ġc urrencies Ġand Ġrelated Ġremote Ġconfig Ġkeys . Ġ*/ Ċ private Ġconst Ġval ĠA VM _ CUR RE NCY _ CODE Ġ= Ġ" avm " Ċ private Ġconst Ġval ĠEUR _ AV M _ CUR RE NCY _ CODE Ġ= Ġ" eur . avm " Ċ private Ġconst Ġval ĠA VM _ TO _ EUR _ KEY Ġ= Ġ" AV M _ TO _ EUR " Ċ private Ġconst Ġval ĠEUR _ AV M _ TO _ EUR _ KEY Ġ= Ġ" EUR _ AV M _ TO _ EUR " Ċ Ċ private Ġconst Ġval ĠCO INGE CK O _ API _ URL Ġ= Ġ" https :// api . co inge cko . com / api / v 3 /" Ċ Ċ class ĠR ates Fetcher ( ĊĠĠĠ Ġprivate Ġval Ġaccount MetaData : ĠAccount MetaData Provider , ĊĠĠĠ Ġprivate Ġval Ġokhttp : ĠOk HttpClient , ĊĠĠĠ Ġprivate Ġval Ġcontext : ĠContext Ċ ) Ġ{ ĊĠĠĠ Ġ/** ĠUpdates Ġthe Ġtoken Ġand Ġexchange Ġrate Ġdata Ġfor Ġthe Ġcurrent Ġlist Ġof Ġcurrency Ġids . Ġ*/ ĊĠĠĠ Ġfun Ġstart ( scope : ĠCor outine Scope ) Ġ{ ĊĠĠĠĠĠĠĠ Ġaccount MetaData . enabled Wallet s () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. onStart Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Rates () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . isNotEmpty () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIgnore Ġemission s Ġfrom Ġorder Ġchanges ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. distinct Until Changed Ġ{ Ġold , Ġnew Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold . size Ġ== Ġnew . size Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold . contains All ( new ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew . contains All ( old ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġcurrency Ids Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrency Ids . map NotNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken Util . token For Currency Id ( it )?. symbol ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRepeat Ġthe Ġlatest Ġlist Ġevery Ġ 6 0 Ġseconds ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. transform Latest Ġ{ Ġcodes Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( codes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( REFRESH _ DELAY _ MS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. combine ( BR Shared Prefs . preferred Fi at Iso Changes ()) Ġ{ Ġcodes , Ġ_ Ġ-> Ġcodes Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Each Ġ{ Ġcodes Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Debug (" Updating Ġcurrency Ġand Ġrate Ġdata ", Ġcodes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Rates ( codes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. retry Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Error (" Failed Ġto Ġupdate Ġcurrency Ġand Ġrate Ġdata ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( REFRESH _ ERROR _ DELAY _ MS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. launch In ( scope ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġupdate Rates ( codes : ĠList < String >? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrates Repo Ġ= ĠR ates Repository . getInstance ( context ) ĊĠĠĠĠĠĠĠ Ġval Ġcode List Ġ= Ġcodes Ġ?: Ġrates Repo . all Currency Codes Possible ĊĊĠĠĠĠĠĠĠ Ġval Ġpreferred Fi at Ġ= ĠBR Shared Prefs . get Preferred Fi at Iso () ĊĠĠĠĠĠĠĠ Ġval Ġfetch Fi ats Ġ= Ġ( DEFAULT _ FI ATS Ġ+ Ġpreferred Fi at . toUpperCase ( Locale . ROOT )). distinct () ĊĊĠĠĠĠĠĠĠ Ġval Ġrates Ġ= Ġfetch Rates ( code List , Ġfetch Fi ats ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcurrency Entities Ġ= Ġmutable Set Of < Currency Entity >() ĊĠĠĠĠĠĠĠ Ġval Ġprice Changes Ġ= Ġmutable Map Of < String , ĠPrice Change >() ĊĊĠĠĠĠĠĠĠ Ġrates . forEach Ġ{ Ġ( currency Code , Ġcoin Price ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( currency Code . isEmpty ()) Ġreturn @ forEach ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfetch Fi ats . forEach Ġ{ Ġfi at Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcrypto Symbol Ġ= Ġcurrency Code . toUpperCase ( Locale . ROOT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrate Ġ= Ġcoin Price . opt Double ( fi at . toLowerCase ( Locale . ROOT ), Ġ 0 . 0 ). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrency Entities . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCurrency Entity ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġfi at , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcode Ġ= Ġfi at . toUpperCase ( Locale . ROOT ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrate Ġ= Ġrate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiso Ġ= Ġcrypto Symbol ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchange Pct Ġ= Ġcoin Price . opt Double ("${ fi at }_ 2 4 h _ change ". toLowerCase ( Locale . ROOT ), Ġ 0 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchange Amount Ġ= Ġrate Ġ* Ġchange Pct Ġ* Ġ 0 . 0 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprice Changes [ crypto Symbol ] Ġ= ĠPrice Change ( change Pct , Ġchange Amount ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Build Config . USE _ REMOTE _ CONFIG ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrency Entities . addAll ( get Fixed Rates ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( currency Entities . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrates Repo . put Currency Rates ( currency Entities ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( price Changes . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrates Repo . update Price Changes ( price Changes ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠPull Ġhard - coded Ġrates Ġfrom Ġremote Ġconfig . Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Fixed Rates (): ĠList < Currency Entity > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġremote Config Ġ= ĠFirebase . remote Config ĊĠĠĠĠĠĠĠ Ġreturn Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠA VM _ CUR RE NCY _ CODE Ġto Ġremote Config . getDouble ( AV M _ TO _ EUR _ KEY ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEUR _ AV M _ CUR RE NCY _ CODE Ġto Ġremote Config . getDouble ( EUR _ AV M _ TO _ EUR _ KEY ) ĊĠĠĠĠĠĠĠ Ġ). entries ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . value Ġ!= Ġ 0 . 0 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ( currency Code , Ġprice ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCurrency Entity ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠEUR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcode Ġ= ĠEUR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrate Ġ= Ġprice . toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiso Ġ= Ġcurrency Code ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġfetch Rates ( ĊĠĠĠĠĠĠĠ Ġcodes : ĠList < String >, ĊĠĠĠĠĠĠĠ Ġfi ats : ĠList < String > ĊĠĠĠ Ġ): ĠMap < String , ĠJSONObject > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġids Ġ= Ġcodes . map NotNull Ġ{ Ġcurrency Code Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToken Util . co inge cko Id For Code ( currency Code ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġbuild String Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( CO INGE CK O _ API _ URL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" simple / price ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" ? ids =${ ids . join ToString (",") }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ("& vs _ currencies =${ fi ats . join ToString (",") }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ("& include _ 2 4 hr _ change = true ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠRequest . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. url ( url ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġokhttp . new Call ( request ). execute () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. on Failure Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Error (" Failed Ġto Ġfetch Ġdata ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. get OrNull () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( res Ġ== Ġnull Ġ|| Ġ! res . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġempty Map () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson Ġ= Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody String Ġ= ĠcheckNotNull ( res . body ). string () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJSONObject ( body String ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. on Failure Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Error (" Failed Ġto Ġparse Ġresponse Ġbody ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. get OrNull () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( json Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty Map () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġids . associate With Ġ{ Ġjson . getJSONObject ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Keys Ġ{ Ġ( key , Ġ_) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken Util . token For Co inge cko Id ( key )?. symbol Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Keys Ġ{ Ġit . isNotBlank () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġget H istorical Data ( ĊĠĠĠĠĠĠĠ Ġfrom Currency : ĠString , ĊĠĠĠĠĠĠĠ Ġto Currency : ĠString , ĊĠĠĠĠĠĠĠ Ġinterval : ĠInterval ĊĠĠĠ Ġ): ĠList < Price DataPoint > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= ĠToken Util . co inge cko Id For Code ( from Currency ) Ġ?: Ġreturn Ġempty List () ĊĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġbuild String Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( CO INGE CK O _ API _ URL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" coins /$ id / market _ chart ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" ? vs _ currency =$ to Currency ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ("& days =${ interval . days }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠRequest . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. url ( url ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġokhttp . new Call ( request ). execute () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. on Failure Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Error (" Failed Ġto Ġfetch Ġdata ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. get OrNull () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( res Ġ== Ġnull Ġ|| Ġ! res . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġempty List () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson Ġ= Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody String Ġ= ĠcheckNotNull ( res . body ). string () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJSONObject ( body String ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. on Failure Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Error (" Failed Ġto Ġparse Ġresponse Ġbody ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. get OrNull () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( json Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprices Ġ= Ġjson . get JSONArray (" prices ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( 0 Ġuntil Ġprices . length ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġinterval . keep Every Ġ== Ġ 0 Ġ|| Ġit Ġ% Ġinterval . keep Every Ġ== Ġ 0 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġi Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġprices . get JSONArray ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPrice DataPoint ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Ġ= ĠDate ( data . getLong ( 0 )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose Price Ġ= Ġdata . getDouble ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġget Market Data ( ĊĠĠĠĠĠĠĠ Ġfrom Currency : ĠString , ĊĠĠĠĠĠĠĠ Ġto Currency : ĠString ĊĠĠĠ Ġ): ĠMarket Data Result Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= ĠToken Util . co inge cko Id For Code ( from Currency ) Ġ?: Ġreturn ĠMarket Data Result . Failure . Unsupported Currency ĊĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġbuild String Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ( CO INGE CK O _ API _ URL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" coins /$ id /") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" ? market _ data = true ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ("& localization = false ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ("& tick ers = false ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ("& community _ data = false ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ("& developer _ data = false ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠRequest . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. url ( url ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġokhttp . new Call ( request ). execute () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. on Failure Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Error (" Failed Ġto Ġfetch Ġdata ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. get OrNull () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( res Ġ== Ġnull Ġ|| Ġ! res . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMarket Data Result . Failure . Fetch ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson Ġ= Ġrun Catch ing Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody String Ġ= ĠcheckNotNull ( res . body ). string () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJSONObject ( body String ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. on Failure Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Error (" Failed Ġto Ġparse Ġresponse Ġbody ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. get OrNull () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( json Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMarket Data Result . Failure . Bad Data ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmarket Data Ġ= Ġjson . getJSONObject (" market _ data ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlower To Currency Ġ= Ġto Currency . toLowerCase ( Locale . ROOT ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmarket Cap Ġ= Ġmarket Data . getJSONObject (" market _ cap "). getDouble OrNull ( lower To Currency )?. to BigDecimal () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtotal Volume Ġ= Ġmarket Data . getJSONObject (" total _ volume "). getDouble OrNull ( lower To Currency )?. to BigDecimal () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhigh Ġ= Ġmarket Data . getJSONObject (" high _ 2 4 h "). getDouble OrNull ( lower To Currency )?. to BigDecimal () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlow Ġ= Ġmarket Data . getJSONObject (" low _ 2 4 h "). getDouble OrNull ( lower To Currency )?. to BigDecimal () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMarket Data Result . Success ( market Cap , Ġtotal Volume , Ġhigh , Ġlow ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ sealed Ġclass ĠMarket Data Result Ġ Ġ{ ĊĠĠĠ Ġdata Ġclass ĠSuccess ( ĊĠĠĠĠĠĠĠ Ġval Ġmarket Cap : ĠBigDecimal ?, ĊĠĠĠĠĠĠĠ Ġval Ġtotal Volume : ĠBigDecimal ?, ĊĠĠĠĠĠĠĠ Ġval Ġhigh 2 4 h : ĠBigDecimal ?, ĊĠĠĠĠĠĠĠ Ġval Ġlow 2 4 h : ĠBigDecimal ? ĊĠĠĠ Ġ) Ġ: ĠMarket Data Result () ĊĊĠĠĠ Ġsealed Ġclass ĠFailure Ġ: ĠMarket Data Result () Ġ{ ĊĠĠĠĠĠĠĠ Ġobject ĠFetch Ġ: ĠFailure () ĊĠĠĠĠĠĠĠ Ġobject ĠBad Data Ġ: ĠFailure () ĊĠĠĠĠĠĠĠ Ġobject ĠUnsupported Currency Ġ: ĠFailure () ĊĠĠĠ Ġ} Ċ } ĊĊ