package Ġex po . modules . updates . db Ċ Ċ import Ġandroid . net . Uri Ċ import Ġex po . modules . json utils . get Nullable Ċ import Ġex po . modules . updates . Updates Configuration Ċ import Ġorg . json . JSONObject Ċ Ċ /** Ċ Ġ* ĠThe Ġbuild Ġdata Ġstored Ġby Ġthe Ġconfiguration Ġis Ġsubject Ġto Ġchange Ġwhen Ċ Ġ* Ġa Ġuser Ġupdates Ġthe Ġbinary . Ċ Ġ* Ċ Ġ* ĠThis Ġcan Ġlead Ġto Ġinconsistent Ġupdate Ġloading Ġbehavior , Ġfor Ċ Ġ* Ġexample : Ġhttps :// github . com / expo / expo / issues / 1 4 3 7 2 Ċ Ġ* Ċ Ġ* ĠThis Ġsingleton Ġw ip es Ġthe Ġupdates Ġwhen Ġany Ġof Ġthe Ġtracked Ġbuild Ġdata Ċ Ġ* Ġchanges . ĠThis Ġleaves Ġthe Ġuser Ġin Ġthe Ġsame Ġsituation Ġas Ġa Ġfresh Ġinstall . Ċ Ġ* Ċ Ġ* ĠSo Ġfar Ġwe Ġonly Ġknow Ġthat Ġ` release Channel ` Ġand Ċ Ġ* Ġ` request Headers [ expo - channel - name ]` Ġare Ġdangerous Ġto Ġchange , Ġbut Ġhave Ċ Ġ* Ġincluded Ġa Ġfew Ġmore Ġthat Ġboth Ġseem Ġunlikely Ġto Ġchange Ġ( so Ġwe Ġclear Ċ Ġ* Ġthe Ġupdates Ġcache Ġrare ly ) Ġand Ġlikely Ġto Ċ Ġ* Ġcause Ġbugs Ġwhen Ġthey Ġdo . ĠThe Ġtracked Ġfields Ġare : Ċ Ġ* Ċ Ġ* ĠĠ ĠUP DAT ES _ CONFIGURATION _ RELEASE _ CHANNEL _ KEY Ċ Ġ* ĠĠ ĠUP DAT ES _ CONFIGURATION _ UPDATE _ URL _ KEY Ċ Ġ* Ċ Ġ* Ġand Ġall Ġof Ġthe Ġvalues Ġin Ġjson Ċ Ġ* Ċ Ġ* ĠĠ ĠUP DAT ES _ CONFIGURATION _ REQUEST _ HEADERS _ KEY Ċ Ġ*/ Ċ object ĠBuild Data Ġ{ ĊĠ Ġprivate Ġvar Ġstatic Build Data Key Ġ= Ġ" static Build Data " ĊĊĠ Ġfun Ġensure Build Data Is Cons istent ( ĊĠĠĠ Ġupdates Configuration : ĠUpdates Configuration , ĊĠĠĠ Ġdatabase : ĠUpdates Database , ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġval Ġscope Key Ġ= Ġupdates Configuration . scope Key ĊĠĠĠĠĠ Ġ?: Ġthrow ĠAssertionError (" expo - updates Ġis Ġenabled , Ġbut Ġno Ġvalid ĠURL Ġis Ġconfigured Ġin ĠAndroid Manifest . xml . ĠIf Ġyou Ġare Ġmaking Ġa Ġrelease Ġbuild Ġfor Ġthe Ġfirst Ġtime , Ġmake Ġsure Ġyou Ġhave Ġrun Ġ` expo Ġpublish ` Ġat Ġleast Ġonce .") ĊĠĠĠ Ġval Ġbuild JSON Ġ= Ġget Build Data From Database ( database , Ġscope Key ) ĊĠĠĠ Ġif Ġ( build JSON Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġset Build Data In Database ( database , Ġupdates Configuration ) ĊĠĠĠ Ġ} Ġelse Ġif Ġ(! is Build Data Cons istent ( updates Configuration , Ġbuild JSON )) Ġ{ ĊĠĠĠĠĠ Ġclear All Updates From Database ( database ) ĊĠĠĠĠĠ Ġset Build Data In Database ( database , Ġupdates Configuration ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġclear All Updates From Database ( database : ĠUpdates Database ) Ġ{ ĊĠĠĠ Ġval Ġall Updates Ġ= Ġdatabase . update Dao (). load All Updates () ĊĠĠĠ Ġdatabase . update Dao (). delete Updates ( all Updates ) ĊĠ Ġ} ĊĊĠ Ġfun Ġis Build Data Cons istent ( ĊĠĠĠ Ġupdates Configuration : ĠUpdates Configuration , ĊĠĠĠ Ġdatabase Build Data : ĠJSONObject ĊĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġconfig Build Data Ġ= Ġget Build Data From Config ( updates Configuration ) ĊĊĠĠĠ Ġval Ġrelease Channel Key Ġ= ĠUpdates Configuration . UP DAT ES _ CONFIGURATION _ RELEASE _ CHANNEL _ KEY ĊĠĠĠ Ġval Ġupdate Url Key Ġ= ĠUpdates Configuration . UP DAT ES _ CONFIGURATION _ UPDATE _ URL _ KEY ĊĠĠĠ Ġval Ġrequest Headers Key Ġ= ĠUpdates Configuration . UP DAT ES _ CONFIGURATION _ REQUEST _ HEADERS _ KEY ĊĊĠĠĠ Ġ// Ġcheck Ġequality Ġof Ġthe Ġtwo ĠJSON Objects . ĠThe Ġbuild Ġdata Ġobject Ġis Ġstring Ġval ued Ġwith Ġthe ĊĠĠĠ Ġ// Ġexception Ġof Ġ" request Headers " Ġwhich Ġis Ġa Ġstring Ġval ued Ġobject . ĊĠĠĠ Ġreturn Ġmutable ListOf < Boolean >(). apply Ġ{ ĊĠĠĠĠĠ Ġadd ( database Build Data . get Nullable < String >( release Channel Key ) Ġ== Ġconfig Build Data . get ( release Channel Key )) ĊĠĠĠĠĠ Ġadd ( database Build Data . get ( update Url Key ). let Ġ{ ĠUri . parse ( it . toString ()) Ġ} Ġ== Ġconfig Build Data . get ( update Url Key )) ĊĊĠĠĠĠĠ Ġ// Ġloop Ġthrough Ġkeys Ġfrom Ġboth Ġrequest Headers Ġobjects . ĊĠĠĠĠĠ Ġfor Ġ( key Ġin Ġconfig Build Data . getJSONObject ( request Headers Key ). keys ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd ( database Build Data . getJSONObject ( request Headers Key ). get Nullable < String >( key ) Ġ== Ġconfig Build Data . getJSONObject ( request Headers Key ). get Nullable ( key )) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġfor Ġ( key Ġin Ġdatabase Build Data . getJSONObject ( request Headers Key ). keys ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd ( database Build Data . getJSONObject ( request Headers Key ). get Nullable < String >( key ) Ġ== Ġconfig Build Data . getJSONObject ( request Headers Key ). get Nullable ( key )) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}. all Ġ{ Ġit Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġset Build Data In Database ( ĊĠĠĠ Ġdatabase : ĠUpdates Database , ĊĠĠĠ Ġupdates Configuration : ĠUpdates Configuration , ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġval Ġbuild Data JSON Ġ= Ġget Build Data From Config ( updates Configuration ) ĊĠĠĠ Ġdatabase . json Data Dao ()?. set JSON String ForKey ( static Build Data Key , Ġbuild Data JSON . toString (), Ġupdates Configuration . scope Key Ġas ĠString ) ĊĠ Ġ} ĊĊĠ Ġfun Ġget Build Data From Database ( database : ĠUpdates Database , Ġscope Key : ĠString ): ĠJSONObject ? Ġ{ ĊĠĠĠ Ġval Ġbuild JSON String Ġ= Ġdatabase . json Data Dao ()?. load JSON String ForKey ( static Build Data Key , Ġscope Key ) ĊĠĠĠ Ġreturn Ġif Ġ( build JSON String Ġ== Ġnull ) Ġnull Ġelse ĠJSONObject ( build JSON String ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġget Build Data From Config ( updates Configuration : ĠUpdates Configuration ): ĠJSONObject Ġ{ ĊĠĠĠ Ġval Ġrequest Headers JSON Ġ= ĠJSONObject (). apply Ġ{ ĊĠĠĠĠĠ Ġfor Ġ(( key , Ġvalue ) Ġin Ġupdates Configuration . request Headers ) Ġput ( key , Ġvalue ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġbuild Data Ġ= ĠJSONObject (). apply Ġ{ ĊĠĠĠĠĠ Ġput ( Updates Configuration . UP DAT ES _ CONFIGURATION _ RELEASE _ CHANNEL _ KEY , Ġupdates Configuration . release Channel ) ĊĠĠĠĠĠ Ġput ( Updates Configuration . UP DAT ES _ CONFIGURATION _ UPDATE _ URL _ KEY , Ġupdates Configuration . update Url ) ĊĠĠĠĠĠ Ġput ( Updates Configuration . UP DAT ES _ CONFIGURATION _ REQUEST _ HEADERS _ KEY , Ġrequest Headers JSON ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġbuild Data ĊĠ Ġ} Ċ } Ċ