/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠRe think DNS Ġand Ġits Ġauthors Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttps :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġcom . cel zero . br aved ns Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . util . Log Ċ import Ġcom . cel zero . br aved ns . service . App Updater Ċ import Ġcom . cel zero . br aved ns . service . Persistent State Ċ import Ġcom . cel zero . br aved ns . util . Constants . Companion . INIT _ TIME _ MS Ċ import Ġcom . cel zero . br aved ns . util . Constants . Companion . JSON _ LATE ST Ċ import Ġcom . cel zero . br aved ns . util . Constants . Companion . JSON _ UPDATE Ċ import Ġcom . cel zero . br aved ns . util . Constants . Companion . JSON _ VERSION Ċ import Ġcom . cel zero . br aved ns . util . Constants . Companion . UPDATE _ CHECK _ RESPONSE _ VERSION Ċ import Ġcom . cel zero . br aved ns . util . Logger Constants . Companion . LOG _ TAG _ APP _ UPDATE Ċ import Ġokhttp 3 .* Ċ import Ġokhttp 3 . Http Url . Companion . to Http Url Ċ import Ġokhttp 3 . dn so ver https . Dns Over Https Ċ import Ġorg . json . JSONObject Ċ import Ġjava . io . IOException Ċ import Ġjava . net . Inet Address Ċ Ċ class ĠNon Store App Updater ( private Ġval ĠbaseUrl : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġpersistent State : ĠPersistent State ) Ġ: ĠApp Updater Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġcheck For App Update ( is Interactive : ĠApp Updater . User Present , Ġactivity : ĠActivity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener : ĠApp Updater . Install State Listener ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . i ( LOG _ TAG _ APP _ UPDATE , Ġ" Beginning Ġupdate Ġcheck ") ĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= ĠbaseUrl Ġ+ ĠBuild Config . VERSION _ CODE ĊĊĠĠĠĠĠĠĠ Ġval Ġbootstrap Client Ġ= ĠOk HttpClient () ĊĠĠĠĠĠĠĠ Ġ// ĠFIXME : ĠUse Ġuser Ġset Ġdo h Ġprovider ĊĠĠĠĠĠĠĠ Ġ// Ġusing Ġquad 9 Ġdo h Ġprovider ĊĠĠĠĠĠĠĠ Ġval Ġdns Ġ= ĠD ns Over Https . Builder (). client ( bootstrap Client ). url ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" https :// dns . quad 9 . net / dns - query ". to Http Url ()). bootstrap Dns Hosts ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInet Address . get ByName (" 9 . 9 . 9 . 9 "), ĠInet Address . get ByName (" 1 4 9 . 1 1 2 . 1 1 2 . 1 1 2 "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInet Address . get ByName (" 2 6 2 0 : fe :: 9 "), ĠInet Address . get ByName (" 2 6 2 0 : fe :: fe ")). build () ĊĊĠĠĠĠĠĠĠ Ġval Ġclient Ġ= Ġbootstrap Client . newBuilder (). dns ( dns ). build () ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠRequest . Builder (). url ( url ). build () ĊĊĠĠĠĠĠĠĠ Ġclient . new Call ( request ). enqueue ( object Ġ: ĠCallback Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( call : ĠCall , Ġe : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( LOG _ TAG _ APP _ UPDATE , Ġ" on Failure Ġ- Ġ Ġ${ call . is Canceled ()}, Ġ${ call . is Executed () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Update Check Failed ( App Updater . Install Source . OTHER , Ġis Interactive ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Response ( call : ĠCall , Ġresponse : ĠResponse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġresponse . body ?. string () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( res . isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Update Check Failed ( App Updater . Install Source . OTHER , Ġis Interactive ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson Ġ= ĠJSONObject ( res ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġversion Ġ= Ġjson . opt Int ( JSON _ VERSION , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshould Update Ġ= Ġjson . opt Boolean ( JSON _ UPDATE , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlatest Ġ= Ġjson . opt Long ( JSON _ LATE ST , ĠINIT _ TIME _ MS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpersistent State . last App Update Check Ġ= ĠSystem . currentTimeMillis () Ġ// ĠFIXME Ġmove Ġto ĠN TP ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient . connection Pool . ev ict All () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( LOG _ TAG _ APP _ UPDATE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Server Ġresponse Ġfor Ġthe Ġnew Ġversion Ġdownload Ġis Ġ$ should Update Ġ( json Ġversion : Ġ$ version ), Ġversion Ġnumber : Ġ Ġ$ latest ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( version Ġ!= ĠUPDATE _ CHECK _ RESPONSE _ VERSION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Update Check Failed ( App Updater . Install Source . OTHER , Ġis Interactive ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġno - op Ġ- ĠIf Ġthe Ġresponse Ġversion Ġis Ġcorrect , Ġproceed Ġwith Ġfurther Ġchecks . Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! should Update ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Up ToDate ( App Updater . Install Source . OTHER , Ġis Interactive ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Update Available ( App Updater . Install Source . OTHER ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Update Check Failed ( App Updater . Install Source . OTHER , Ġis Interactive ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcomplete Update () Ġ{ ĊĠĠĠĠĠĠĠ Ġ/* Ġno - op Ġ*/ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġunregister Listener ( listener : ĠApp Updater . Install State Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ/* Ġno - op Ġ*/ ĊĠĠĠ Ġ} Ċ } Ċ