package Ġnet . h ax . ni at ool . updater Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . net . Connectivity Manager Ċ import Ġandroid . util . Log Ċ import Ġnet . h ax . ni at ool . Build Config Ċ Ċ class ĠUpdate Manager ( val Ġcontext : ĠContext , Ġvar Ġlistener : ĠEvent Listener ? Ġ= Ġnull ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" Update Manager " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠP REF _ LAST _ UPDATE _ CHECK _ KEY Ġ= Ġ" last _ update _ check _ time " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠP REF _ LAST _ UPDATE _ CHECK _ DEFAULT Ġ= Ġ 0 L ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠRELEASE _ ENDPOINT _ URI Ġ= Ġif Ġ( Build Config . DEBUG ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" http :// prime . lan / latest . json " Ġelse Ġ" https :// api . github . com / repos / lc zx / watcher / releases / latest " ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠWe Ġmay Ġwant Ġlet Ġthe Ġuser Ġconfigure Ġthese ĊĠĠĠĠĠĠĠ Ġ// ĠFor Ġnow , Ġsince Ġthis Ġapp Ġwill Ġprimarily Ġbe Ġused Ġon Ġthe Ġgo , Ġit Ġis Ġpoint less Ġto Ġcheck Ġfor Ġupdates Ġon ĠWiFi ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠUPDATE _ ONLY _ ON _ WIFI Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠUPDATE _ CHECK _ INTERVAL _ MS : ĠLong Ġ= Ġ 3 6 0 0 0 0 0 Ġ* Ġ 2 4 Ġ* Ġ 3 Ġ// ĠCheck Ġfor Ġupdate Ġevery Ġ 3 Ġdays ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġconnectivity Manager Ġ= Ġcontext . getSystem Service ( Context . CONNECT IVITY _ SERVICE ) Ġas ĠConnect ivity Manager ĊĊĠĠĠ Ġprivate Ġval Ġupdater DataStore Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . get SharedPreferences ( context . packageName Ġ+ Ġ". updater _ preferences ", ĠContext . MODE _ PRIVATE ) ĊĊĠĠĠ Ġprivate Ġvar Ġlast Update Check Time : ĠLong ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġupdater DataStore . getLong ( PRE F _ LAST _ UPDATE _ CHECK _ KEY , ĠP REF _ LAST _ UPDATE _ CHECK _ DEFAULT ) ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ= Ġupdater DataStore . edit (). put Long ( PRE F _ LAST _ UPDATE _ CHECK _ KEY , Ġvalue ). apply () ĊĊĠĠĠ Ġval Ġcan Download : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġconnectivity Manager . active Network Info . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit ?. isConnected Ġ== Ġtrue Ġ&& Ġ(! UPDATE _ ONLY _ ON _ WIFI Ġ|| Ġit . type Ġ== ĠConnect ivity Manager . TYPE _ WIFI ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrun ( force : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( force Ġ|| Ġshould Check For Update ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Fetching Ġlatest Ġrelease Ġmetadata ...") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUp dater Task ( this , Ġforce ). execute ( RELEASE _ ENDPOINT _ URI ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Better Ġstay Ġoffline Ġand Ġcheck Ġif Ġwe Ġremember Ġabout Ġan Ġavailable Ġupdate ...") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Cached Update ( force ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshould Check For Update (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! can Download ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Should n 't Ġcheck Ġfor Ġupdate : Ġoffline Ġor Ġwrong Ġnetwork Ġtype ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(( System . currentTimeMillis () Ġ- Ġlast Update Check Time ) Ġ< ĠUPDATE _ CHECK _ INTERVAL _ MS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Should n 't Ġcheck Ġfor Ġupdate : Ġnot Ġenough Ġtime Ġpassed Ġsince Ġlast Ġcheck ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" It Ġis Ġtime Ġto Ġcheck Ġfor Ġupdates !") ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Update ( update Data : ĠUpdate Data ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠReturns Ġ` true ` Ġif Ġthe Ġgiven Ġupdate Ġversion Ġis Ġgreater Ġthan Ġour Ġown . ĠIf Ġwe Ġhave Ġproblems Ġinterpre ting Ġour ĊĠĠĠĠĠĠĠ Ġ// Ġcurrent Ġversion Ġname Ġfor Ġcomparison , Ġthis Ġstill Ġreturns Ġ` true ` Ġin Ġthe Ġhope Ġthat Ġthe Ġupdate Ġwill Ġfix Ġthat . ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Version Name Ġ= Ġcontext . package Manager . get Package Info ( context . packageName , Ġ 0 ). version Name ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Version Ġ= ĠVersion . fromString OrNull ( current Version Name ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcurrent Version Ġ== Ġnull Ġ|| Ġupdate Data . version Ġ> Ġcurrent Version ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Cached Update ( forced : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġwe Ġremember Ġabout Ġhaving Ġan Ġupdate Ġavailable Ġ( and Ġit Ġit Ġactually Ġan Ġupdate ), Ġshow Ġit Ġwithout Ġgoing Ġon ĊĠĠĠĠĠĠĠ Ġ// Ġthe Ġinternet Ġ( prob ably Ġcan Download Ġis Ġfalse Ġhere , Ġbut Ġwe Ġcan Ġbe Ġonline Ġand Ġgot Ġa Ġlocal Ġerror ) ĊĠĠĠĠĠĠĠ ĠUpdate Data . load ( updater DataStore ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ== Ġnull Ġ|| Ġ! is Update ( it )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ?. on No Update ( this , Ġtrue , Ġforced ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" I Ġremember Ġabout Ġfinding Ġan Ġupdate Ġto Ġversion Ġ${ it . version } !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ?. on Update Available ( this , Ġit , Ġtrue , Ġforced ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠUp dater Task ( val Ġmgr : ĠUpdate Manager , Ġval Ġis For ced : ĠBoolean ) Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRelease Meta Download Task ( mgr . context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Post Execute ( result : ĠUpdate Data ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( TAG , Ġ" Got Ġa Ġproblem Ġon Ġupdate Ġcheck , Ġproceed ing Ġas Ġif Ġwe Ġare Ġoffline Ġand Ġuse Ġcached ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmgr . process Cached Update ( is For ced ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġfound Ġa Ġrelease Ġ( update Ġor Ġnot ), Ġupdate Ġthe Ġlast Ġcheck Ġtime ... ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmgr . last Update Check Time Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ... then Ġwe Ġcheck Ġif Ġwe Ġactually Ġhave Ġan Ġupdate Ġand Ġin Ġthat Ġcase Ġnotify Ġand Ġpersist Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mgr . is Update ( result )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" We Ġhave Ġan Ġupdate Ġto Ġ${ result . version } Ġavailable ! ĠH ur ry Ġup Ġand ĠDL Ġthat Ġthing !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . persist ( mgr . updater DataStore ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmgr . listener ?. on Update Available ( mgr , Ġresult , Ġfalse , Ġis For ced ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmgr . listener ?. on No Update ( mgr , Ġfalse , Ġis For ced ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠEvent Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġfun ĠonUpdate Available ( update Manager : ĠUpdate Manager , Ġupdate Data : ĠUpdate Data , Ġcached : ĠBoolean , Ġforced : ĠBoolean ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġon No Update ( update Manager : ĠUpdate Manager , Ġcached : ĠBoolean , Ġforced : ĠBoolean ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ