package Ġcom . the wiz rd . simple weather . updates Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Sender Ċ import Ġandroid . os . Build Ċ import Ġandroid . util . Log Ċ import Ġandroidx . annotation . Requires Api Ċ import Ġcom . google . android . play . core . app update . App Update Info Ċ import Ġcom . google . android . play . core . app update . App Update ManagerFactory Ċ import Ġcom . google . android . play . core . install . Install Exception Ċ import Ġcom . google . android . play . core . install . model . App Update Type Ċ import Ġcom . google . android . play . core . install . model . Install ErrorCode Ċ import Ġcom . google . android . play . core . install . model . Update Availability Ċ import Ġcom . google . android . play . core . k tx . request App Update Info Ċ import Ġcom . google . firebase . remote config . Firebase Remote Config Ċ import Ġcom . google . gson . reflect . Type Token Ċ import Ġcom . the wiz rd . shared _ resources . preferences . Feature Settings Ċ import Ġcom . the wiz rd . shared _ resources . utils . Analytics Logger Ċ import Ġcom . the wiz rd . shared _ resources . utils . JSONParser Ċ import Ġcom . the wiz rd . shared _ resources . utils . Logger Ċ import Ġcom . the wiz rd . shared _ resources . utils . Settings Manager Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . tasks . await Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġjava . util . ArrayList Ċ Ċ @ Requires Api ( api Ġ= ĠBuild . VERSION _ CODES . LO L LI POP ) Ċ class ĠIn App Update Manager Ġprivate Ġconstructor ( context : ĠContext ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" In App Update Manager " ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġcreate ( context : ĠContext ): ĠIn App Update Manager Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠIn App Update Manager ( context ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġsettings Manager Ġ= ĠSettings Manager ( context . application Context ) ĊĠĠĠ Ġprivate Ġval Ġapp Update Manager Ġ= ĠApp Update ManagerFactory . create ( context . application Context ) ĊĠĠĠ Ġprivate Ġvar Ġapp Update Info : ĠApp Update Info ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġconfig Update info : ĠUpdate Info ? Ġ= Ġnull ĊĊĠĠĠ Ġsuspend Ġfun Ġcheck If Update Available (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠReturns Ġan Ġintent Ġobject Ġthat Ġyou Ġuse Ġto Ġcheck Ġfor Ġan Ġupdate . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Update Info Ġ= Ġapp Update Manager . request App Update Info () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠChecks Ġthat Ġthe Ġplatform Ġwill Ġallow Ġthe Ġspecified Ġtype Ġof Ġupdate . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( app Update Info ?. update Availability () Ġ== ĠUpdate Availability . UPDATE _ AVAILABLE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFeature Settings . set Update Available ( true ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġpriority Ġof Ġupdate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremote Update Info Ġ= Ġget Remote Update Info () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfig Update info Ġ= Ġremote Update Info . find Ġ{ Ġinput Ġ-> Ġinput . version Code Ġ== Ġapp Update Info ?. available Version Code () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( config Update info Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInstall Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e . errorCode Ġ== ĠInstall ErrorCode . ERROR _ APP _ NOT _ OWN ED Ġ|| Ġe . errorCode Ġ== ĠInstall ErrorCode . ERROR _ PLAY _ STORE _ NOT _ FOUND ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . write Line ( Log . INFO , Ġ" Checking Ġfor Ġupdate Ġusing Ġfallback ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcheck If Update Available Fallback () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . write Line ( Log . ERROR , Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e . cause Ġis ĠInstall Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠerrorCode Ġ= Ġ( e . cause Ġas ĠInstall Exception ). errorCode ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( errorCode Ġ== ĠInstall ErrorCode . ERROR _ APP _ NOT _ OWN ED Ġ|| ĠerrorCode Ġ== ĠInstall ErrorCode . ERROR _ PLAY _ STORE _ NOT _ FOUND ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . write Line ( Log . INFO , Ġ" Checking Ġfor Ġupdate Ġusing Ġfallback ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcheck If Update Available Fallback () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTODO : Ġuntil Ġthis Ġis Ġimplemented Ġin ĠPlay ĠConsole , Ġuse ĠFirebase ĠRemote Config ĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġget Remote Update Info (): ĠList < Update Info > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm Config Ġ= ĠFirebase Remote Config . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Config . fetch And Activate (). await () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson Ġ= Ġm Config . getString (" android _ updates ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdate Type Token Ġ= Ġobject Ġ: ĠType Token < ArrayList < Update Info > ?> () Ġ{} . type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context ĠJSON Parser . de serializer ( json , Ġupdate Type Token ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġcheck If Update Available Fallback (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremote Update Info Ġ= Ġget Remote Update Info () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Update Ġ= Ġremote Update Info . last OrNull () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Update Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsettings Manager . getVersion Code () Ġ< Ġlast Update . version Code ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . write Line ( Log . ERROR , Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMust Ġcall Ġ[ In App Update Manager . check If Update Available ] Ġbefore Ġthis . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠIf Ġupdate Ġavailable Ġreturn Ġpriority Ġ( 1 Ġ-> Ġ 5 , Ġwith Ġ 5 Ġas Ġhigh Ġpriority ); ĠReturns Ġ- 1 Ġif Ġupdate Ġnot Ġavailable ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġupdate Priority : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġconfig Update info ?. update Priority Ġ?: Ġ- 1 ĊĊĠĠĠ Ġfun Ġshould Start Immediate Update (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( app Update Info Ġ!= Ġnull Ġ&& Ġconfig Update info Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġapp Update Info !!. is Update Type Allowed ( App Update Type . IM MEDI ATE ) Ġ&& Ġconfig Update info !!. update Priority Ġ> Ġ 3 ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġshould Start Immediate Update Flow (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck If Update Available () Ġ&& Ġshould Start Immediate Update () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstart Immediate Update Flow ( activity : ĠActivity , Ġrequest Code : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠAnalytics Logger . log Event ("$ TAG : Ġstart Im med Update Flow ") ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Update Manager . start Update Flow For Result ( Ġ// ĠPass Ġthe Ġintent Ġthat Ġis Ġreturned Ġby Ġ' getApp Update Info () '. ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp Update Info !! , Ġ Ġ// ĠOr Ġ' App Update Type . FLEX IBLE ' Ġfor Ġflexible Ġupdates . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp Update Type . IM MEDI ATE , Ġ Ġ// ĠThe Ġcurrent Ġactivity Ġmaking Ġthe Ġupdate Ġrequest . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity , Ġ Ġ// ĠInclude Ġa Ġrequest Ġcode Ġto Ġlater Ġmonitor Ġthis Ġupdate Ġrequest . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Code ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIntent Sender . Send Intent Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . write Line ( Log . ERROR , Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġresume Update If Started ( activity : ĠActivity , Ġrequest Code : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġapp Update Manager . app Update Info . add On Success Listener Ġ{ Ġinfo Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Update Info Ġ= Ġinfo ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( info . update Availability () Ġ== ĠUpdate Availability . DE VELO PER _ TRIGGER ED _ UPDATE _ IN _ PROGRESS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġan Ġin - app Ġupdate Ġis Ġalready Ġrunning , Ġresume Ġthe Ġupdate . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAnalytics Logger . log Event ("$ TAG : Ġres uming Ġupdate Ġflow ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp Update Manager . start Update Flow For Result ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinfo , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp Update Type . IM MEDI ATE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Code ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIntent Sender . Send Intent Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . write Line ( Log . ERROR , Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( info . update Availability () Ġ== ĠUpdate Availability . UPDATE _ AVAILABLE Ġ&& Ġshould Start Immediate Update ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFeature Settings . set Update Available ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! activity . is Destroyed Ġ&& Ġ! activity . is Finish ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Immediate Update Flow ( activity , Ġrequest Code ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }