package Ġcom . jam ie ad k ins . gw ent . data . update . repository Ċ Ċ import Ġandroid . content . res . Asset Manager Ċ import Ġcom . f 2 pr ate ek . rx . preferences 2 . Rx SharedPreferences Ċ import Ġcom . jam ie ad k ins . gw ent . card . data . Api Mapper Ċ import Ġcom . jam ie ad k ins . gw ent . card . data . Art Api Mapper Ċ import Ġcom . jam ie ad k ins . gw ent . card . data . model . Firebase Card Result Ċ import Ġcom . jam ie ad k ins . gw ent . database . Gw ent Database Ċ import Ġcom . jam ie ad k ins . gw ent . domain . card . repository . Card Repository Ċ import Ġcom . jam ie ad k ins . gw ent . domain . patch . Patch Repository Ċ import Ġio . reactivex . Comp letable Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . Single Ċ import Ġio . reactivex . functions . Bi Function Ċ import Ġio . reactivex . schedul ers . Schedulers Ċ import Ġjava . io . File Ċ import Ġjava . io . InputStream Reader Ċ import Ġjavax . inject . Inject Ċ import Ġjavax . inject . Named Ċ Ċ class ĠCard Update Repository Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġdatabase : ĠG w ent Database , ĊĠĠĠ Ġ@ Named (" files ") Ġfiles Directory : ĠFile , ĊĠĠĠ Ġprivate Ġval Ġpatch Repository : ĠPatch Repository , ĊĠĠĠ Ġprivate Ġval Ġcard Mapper : ĠApi Mapper , ĊĠĠĠ Ġprivate Ġval Ġart Mapper : ĠArt Api Mapper , ĊĠĠĠ Ġprivate Ġval Ġpreferences : ĠRx SharedPreferences , ĊĠĠĠ Ġprivate Ġval Ġasset Manager : ĠAsset Manager , ĊĠĠĠ Ġprivate Ġval Ġcard Repository : ĠCard Repository Ċ ) Ġ: ĠBase Update Repository ( files Directory , Ġpreferences ) Ġ{ ĊĊĠĠĠ Ġoverride Ġval ĠFILE _ NAME Ġ= Ġ" cards . json " ĊĊĠĠĠ Ġoverride Ġfun Ġis Update Available (): ĠObservable < Boolean > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdatabase OutOf Date Ġ= Ġpreferences . getInteger ( LAST _ DATABASE _ VERSION _ KEY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Observable () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. first ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit Ġ< ĠG w ent Database . DATABASE _ VERSION Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. onError Return Item ( false ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcards File OutOf Date Ġ= Ġpatch Repository . get Latest Ro ach Patch () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġpatch Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSingle . zip ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Remote Last Updated ( patch , ĠFILE _ NAME ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Local Last Updated ( patch , ĠFILE _ NAME ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBi Function Ġ{ Ġremote : ĠLong , Ġlocal : ĠLong Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremote Ġ> Ġlocal ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. onError Return Item ( false ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġupdate State Changes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Single Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSingle . zip ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcards File OutOf Date , Ġdatabase OutOf Date , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBi Function Ġ{ Ġcards File Needs Updating : ĠBoolean , Ġdatabase Needs Updating : ĠBoolean Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcards File Needs Updating Ġ|| Ġdatabase Needs Updating ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġinternal Perform First Time Setup (): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSingle . from Callable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( asset Manager . open ( FILE _ NAME )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreader Ġ= ĠInputStreamReader ( this , Ġ" UTF - 8 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgson . fromJson ( reader , ĠFirebase Card Result :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. flatMap Comp letable (:: update Card Database ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġinternal Perform Update (): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġpatch Repository . get Latest Ro ach Patch () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ ĠgetFile From Firebase ( get Storage Reference ( it , ĠFILE _ NAME ), ĠFILE _ NAME ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġparse Json File < Firebase Card Result >( it , ĠFirebase Card Result :: class . java ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Comp letable Ġ{ Ġupdate Card Database ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIn validate Ġthe Ġcard Ġmemory Ġcache Ġthat Ġhas Ġcards Ġfrom Ġthe Ġold Ġpatch . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Complete Ġ{ Ġcard Repository . invalidate Memory Cache () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Then ( update Last Updated ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFinally , Ġnote Ġthat Ġwe Ġare Ġup Ġto Ġdate Ġwith Ġthe Ġdatabase Ġschema . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Complete Ġ{ Ġpreferences . getInteger ( LAST _ DATABASE _ VERSION _ KEY ). set ( Gw ent Database . DATABASE _ VERSION ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhas Done First Time Setup (): ĠObservable < Boolean > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdatabase . card Dao (). count (). to Observable (). map Ġ{ Ġit Ġ> Ġ 0 Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Card Database ( card List : ĠFirebase Card Result ): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠComp letable . from Callable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcards Ġ= Ġcard Mapper . map ( card List ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . card Dao (). insert Cards ( cards ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . art Dao (). insert Art ( art Mapper . map ( card List )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Last Updated (): ĠComp letable Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġpatch Repository . get Latest Ro ach Patch () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Comp letable Ġ{ Ġupdate Local Last Updated ( it , ĠFILE _ NAME ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠLAST _ DATABASE _ VERSION _ KEY Ġ= Ġ" DB _ VERSION _ KEY " ĊĠĠĠ Ġ} Ċ }