package Ġcom . kr ake . auto update . core Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . app . Activity Ċ import Ġandroid . app . Download Manager Ċ import Ġandroid . content .* Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Environment Ċ import Ġandroidx . annotation . Requires Permission Ċ import Ġandroidx . fragment . app . Fragment Activity Ċ import Ġandroidx . lifecycle . Lifecycle Ċ import Ġandroidx . lifecycle . Lifecycle Observer Ċ import Ġandroidx . lifecycle . Lifecycle Owner Ċ import Ġandroidx . lifecycle . On Lifecycle Event Ċ import Ġcom . example . auto update . R Ċ import Ġcom . kr ake . auto update . Kr ake Version Checker Ċ import Ġcom . kr ake . core . permission . Permission Listener Ċ import Ġcom . kr ake . core . permission . Permission Manager Ċ import Ġcom . kr ake . core . thread . async Ċ Ċ /** Ċ Ġ* ĠCreates Ġa Ġnew Ġinstance Ġof Ġ[ A pk Version Updater ] Ġto Ġget Ġapk Ġcallbacks . ĊĊ Ġ* Ġ@ param Ġcontext Ġ Ġcurrent Ġ[ Context ] Ċ Ġ* Ġ* Ċ Ġ* Ġ@ param Ġlistener Ġused Ġto Ġhave Ġcallback Ġon Ġapk Ġupdates Ċ Ġ*/ Ċ open Ġclass ĠA pk Version Updater Ġprivate Ġconstructor ( private Ġvar Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġlifecycle Owner : ĠLifecycle Owner , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġversion Checker : ĠVersion Checker , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġvar Ġlistener : ĠListener ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġactivity Startup Class : ĠClass < out ĠActivity >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġcurrent Build Version : ĠLong , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpermission Manager : ĠPermission Manager ) Ġ: ĠPermission Listener , ĊĠĠĠĠĠĠĠ ĠLifecycle Observer Ċ { ĊĊĠĠĠ Ġprivate Ġval Ġdownload Receiver Ġ= ĠDownload Complete Receiver () ĊĠĠĠ Ġprivate Ġvar Ġupdate Url : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġshared Preferences : ĠSharedPreferences Ġby Ġlazy Ġ{ Ġcontext . get SharedPreferences ( PRE FS _ VERSION _ UP DAT ER , ĠContext . MODE _ PRIVATE ) Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġpermission Manager Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġpermission Manager ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. permissions ( Manifest . permission . WRITE _ EXTERNAL _ STORAGE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addListener ( this ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġlifecycle Owner . lifecycle . add Observer ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrequest () ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Downloading Update ()) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ?. on A pk In Download () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregister Callback For Update () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ?. on Init Check A pk Version () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck For Updates () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCheck Ġif Ġthe ĠDownload Manager Ġis Ġdownloading Ġan Ġupdate . ĊĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġthe Ġupdate Ġis Ġbeing Ġdownloaded ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġis Downloading Update (): ĠBoolean ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdownload Id Ġ= Ġshared Preferences . getLong ( PRE FS _ VERSION _ UP DAT ER _ CURRENT _ DOWNLOAD _ ID _ KEY , Ġ- 1 ) ĊĠĠĠĠĠĠĠ Ġif Ġ( download Id Ġ== Ġ- 1 L ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġmanager Ġ= Ġcontext . getSystem Service ( Context . DOWNLOAD _ SERVICE ) Ġas ĠDownload Manager ĊĠĠĠĠĠĠĠ Ġval Ġq Ġ= ĠDownload Manager . Query () ĊĠĠĠĠĠĠĠ Ġq . set Filter ById ( download Id ) ĊĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġmanager . query ( q ) ĊĠĠĠĠĠĠĠ Ġif Ġ( c Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c . moveTo First ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstatus Ġ= Ġc . getInt ( c . getColumnIndex ( Download Manager . COLUMN _ STATUS )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġstatus Ġ== ĠDownload Manager . STATUS _ RUNNING Ġ|| Ġstatus Ġ== ĠDownload Manager . STATUS _ PENDING ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġc . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRegister Ġthe Ġreceiver Ġfor Ġan Ġupdate . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġregister Callback For Update () ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext . register Receiver ( download Receiver , ĠIntent Filter ( Download Manager . ACTION _ DOWNLOAD _ COMPLETE )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCheck Ġfor Ġnew Ġupdates Ġwith Ġa ĠWS Ġrequest . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcheck For Updates () ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġasync Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġversion Checker . load A pk Version () ĊĠĠĠĠĠĠĠ Ġ}. completed Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonLoad Completed ( it ) ĊĠĠĠĠĠĠĠ Ġ}. error Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ?. on Update Request Error () ĊĠĠĠĠĠĠĠ Ġ}. load () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ On Lifecycle Event ( Lifecycle . Event . ON _ DESTROY ) ĊĠĠĠ Ġprotected Ġfun Ġon Destroy () ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġdestroy () ĊĠĠĠĠĠĠĠ Ġlifecycle Owner . lifecycle . remove Observer ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Missing Permission ") ĊĠĠĠ Ġoverride Ġfun Ġon Permissions Handled ( accepted Permissions : ĠArray < out ĠString >) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( accepted Permissions . contains ( Manifest . permission . WRITE _ EXTERNAL _ STORAGE )) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdownload Update () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ?. on Permission Denied () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDestroy Ġthe Ġupdater Ġto Ġavoid Ġmemory Ġleak . ĊĠĠĠĠ Ġ* ĠThe Ġdownload Ġreceiver Ġwill Ġbe Ġun registered . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġdestroy () ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġtry ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . unregister Receiver ( download Receiver ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcatch Ġ( ignored : ĠIllegalArgumentException ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġreceiver Ġwasn 't Ġregistered ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlistener Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠonLoad Completed ( result : ĠA pk Version ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġresult . message ?. let Ġ{ message Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ?. on Message Available ( message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( result . version Code Ġ!= Ġnull Ġ&& Ġresult . version Code !! Ġ> Ġcurrent Build Version ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Url Ġ= Ġresult . apk Url ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermission Manager . request () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ?. on Update Unavailable () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Requires Permission ( value Ġ= ĠManifest . permission . WRITE _ EXTERNAL _ STORAGE ) ĊĠĠĠ Ġprivate Ġfun Ġdownload Update () ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġlistener ?. on A pk Download Started () ĊĠĠĠĠĠĠĠ Ġdownload A pk From Url () ĊĠĠĠĠĠĠĠ Ġregister Callback For Update () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdownload A pk From Url () ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠfileName Ġ= Ġextracted Filename From Url ( update Url !! , ĠA PK _ EXTENSION ) ĊĠĠĠĠĠĠĠ Ġif Ġ( fileName Ġ== Ġnull ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ?. on A pk Download Failed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġcontext . package Manager . getApplication Enabled Setting (" com . android . providers . downloads ") ĊĠĠĠĠĠĠĠ Ġif Ġ( state Ġ== ĠPackage Manager . COMPONENT _ ENABLED _ STATE _ DISABLED Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ== ĠPackage Manager . COMPONENT _ ENABLED _ STATE _ DISABLED _ USER Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ== ĠPackage Manager . COMPONENT _ ENABLED _ STATE _ DISABLED _ UNT IL _ USED ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCannot Ġdownload Ġusing Ġdownload Ġmanager Ġbecause Ġis Ġdisabled ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ?. on A pk Download Failed For Download Manager Issue () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġuse ĠDownload Ġmanager Ġto Ġstart ĠDownload ĊĠĠĠĠĠĠĠ Ġval Ġreq Ġ= ĠDownload Manager . Request ( Uri . parse ( update Url )) ĊĊĠĠĠĠĠĠĠ Ġ// Ġset Ġrequest Ġparameters ĊĠĠĠĠĠĠĠ Ġreq . set Allowed Network Types ( Download Manager . Request . NETWORK _ WIFI Ġor ĠDownload Manager . Request . NETWORK _ MOB ILE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle ( fileName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Allowed Over Roaming ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġshow Ġa Ġnotification Ġwhile Ġdownloading Ġand Ġafter Ġapk Ġis Ġdownloaded ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Notification Visibility ( Download Manager . Request . VIS IBILITY _ VISIBLE _ NOTIFY _ COMPLETED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdestination Ġin Ġdownload Ġfolder ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Destination In External Public Dir ( Environment . DIRECTORY _ DOWNLOAD S , ĠfileName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set MimeType ( AP K _ MIME _ TYPE ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdownload Manager Ġ= Ġcontext . getSystem Service ( Context . DOWNLOAD _ SERVICE ) Ġas ĠDownload Manager ĊĠĠĠĠĠĠĠ Ġ// Ġenqueue Ġthe Ġrequest Ġto Ġstart Ġit ĊĠĠĠĠĠĠĠ Ġval Ġdownload Id Ġ= Ġdownload Manager . enqueue ( req ) ĊĠĠĠĠĠĠĠ Ġ// ĠInsert Ġit Ġin Ġpreferences ĊĠĠĠĠĠĠĠ Ġshared Preferences ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. edit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put Long ( PRE FS _ VERSION _ UP DAT ER _ CURRENT _ DOWNLOAD _ ID _ KEY , Ġdownload Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠManage Ġthe Ġaction Ġadded Ġto Ġthe Ġreceived Ġ[ Intent ]. ĊĊĠĠĠĠ Ġ* Ġ@ param Ġintent Ġ[ Intent ] Ġreceived Ġfrom Ġthe Ġreceiver . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġmanage Action From Intent ( intent : ĠIntent ) ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( ACTION _ DOWNLOAD _ COMPLETED Ġ== Ġintent . action ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Uri Ġ= Ġintent . getString Extra ( ARG _ AP K _ DOWN LOADED _ URI ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapk Intent Ġ= ĠIntent () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapk Intent . action Ġ= ĠIntent . ACTION _ VIEW ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapk Intent . add Flags ( Intent . FLAG _ GRANT _ READ _ URI _ PERMISSION ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapk Intent . setData And Type ( Uri . parse ( file Uri ), ĠA pk Version Updater . AP K _ MIME _ TYPE ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( apk Intent . resolve Activity ( context . package Manager ) Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIntent Ġcan Ġbe Ġhandled . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . startActivity ( apk Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ?. on New A pk Started () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ?. on Unable To Start New A pk () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ?. on A pk Download Failed () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠDownload Complete Receiver Ġ: ĠBroadcast Receiver () ĊĠĠĠ Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Receive ( context : ĠContext , Ġintent : ĠIntent ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġget Ġrequest Ġbundle ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġextras Ġ= Ġintent . extras !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmanager Ġ= Ġcontext . getSystem Service ( Context . DOWNLOAD _ SERVICE ) Ġas ĠDownload Manager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Uri Ġ= Ġmanager . get Uri For Downloaded File ( extras . getLong ( Download Manager . EXTRA _ DOWNLOAD _ ID )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdownload Id Ġ= Ġextras . getLong ( Download Manager . EXTRA _ DOWNLOAD _ ID ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġshared Preferences ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. edit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. remove ( PRE FS _ VERSION _ UP DAT ER _ CURRENT _ DOWNLOAD _ ID _ KEY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaction : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file Uri Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġq Ġ= ĠDownload Manager . Query () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġq . set Filter ById ( download Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġmanager . query ( q ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= Ġif Ġ( c . moveTo First ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstatus Ġ= Ġc . getInt ( c . getColumnIndex ( Download Manager . COLUMN _ STATUS )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( status Ġ== ĠDownload Manager . STATUS _ SUCCESS FUL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ DOWNLOAD _ COMPLETED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ DOWNLOAD _ C ANCE LED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ DOWNLOAD _ C ANCE LED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= ĠACTION _ DOWNLOAD _ C ANCE LED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDownload Ġcanceled ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= ĠACTION _ DOWNLOAD _ C ANCE LED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreceive Intent Ġ= ĠIntent ( context , Ġactivity Startup Class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreceive Intent . action Ġ= Ġaction ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreceive Intent . add Flags ( Intent . FLAG _ ACTIVITY _ CLEAR _ TOP Ġor ĠIntent . FLAG _ ACTIVITY _ SINGLE _ TOP ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( action Ġ== ĠACTION _ DOWNLOAD _ COMPLETED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreceive Intent . putExtra ( ARG _ AP K _ DOWN LOADED _ URI , Ġfile Uri !!. toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . startActivity ( receive Intent ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . unregister Receiver ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcatch Ġ( ignored : ĠIllegalArgumentException ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġreceiver Ġwasn 't Ġregistered ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠListener ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġcalled Ġwhen Ġthe Ġcheck Ġfor Ġthe Ġapk Ġis Ġstarted ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġon Init Check A pk Version () Ġ{ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġcalled Ġwhen Ġan Ġerror Ġoccurred Ġwhile Ġthe Ġ[ version Checker ] Ġis Ġcalled ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun ĠonUpdate Request Error () Ġ{ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġcalled Ġwhen Ġthe Ġversion Ġchecked Ġis Ġlower Ġthen Ġthe Ġcurrent Ġversion ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun ĠonUpdate Unavailable () Ġ{ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġcalled Ġwhen Ġa Ġmessage Ġis Ġavailable Ġwhen Ġthe Ġapk Ġversion Ġis Ġdownloaded ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġon Message Available ( message : ĠString ) Ġ{ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġcalled Ġwhen Ġthe Ġpermissions Ġaren 't Ġgranted ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġon Permission Denied () Ġ{ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġcalled Ġwhen Ġthe Ġapk Ġdownload Ġis Ġstarted ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġon A pk Download Started () Ġ{ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġcalled Ġwhen Ġthe Ġapk Ġis Ġin Ġdownload ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġon A pk In Download () Ġ{ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġcalled Ġwhen Ġthere Ġis Ġan Ġerror Ġin Ġthe Ġdownload ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġon A pk Download Failed () Ġ{ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġcalled Ġwhen Ġthe Ġdownload Manager Ġis Ġdisabled ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġon A pk Download Failed For Download Manager Issue () Ġ{ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġcalled Ġwhen Ġthe Ġapk Ġis Ġdownloaded Ġand Ġlaunched ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġon New A pk Started () Ġ{ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġcalled Ġwhen Ġthe Ġapk Ġis Ġnot Ġlaunched Ġbecause Ġthere Ġaren 't Ġapplication Ġfor Ġstart Ġthe Ġapk ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġon Unable To Start New A pk () Ġ{ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠBuilder ( private Ġval Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġlifecycle Owner : ĠLifecycle Owner , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġlistener : ĠListener , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġcurrent Build Version : ĠLong ) ĊĠĠĠ Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġactivity Startup Class : ĠClass < out ĠActivity >? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġversion Checker : ĠVersion Checker ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġpermission Manager : ĠPermission Manager ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġ[ Activity ] Ġclass Ġthat Ġwill Ġbe Ġlaunch Ġwhen Ġthe Ġapk Ġis Ġdownloaded , ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ default Ġactivity Ġpassed Ġin Ġthe Ġconstructor ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġwith Activity To Start ( activity : ĠClass < out ĠActivity >) Ġ= Ġapply Ġ{ Ġthis . activity Startup Class Ġ= Ġactivity Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġ[ Permission Manager ] Ġused Ġfor Ġask Ġstorage Ġpermission Ġfor Ġstore Ġthe Ġapk Ġto Ġdownload ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġwith Permission Manager ( permission Manager : ĠPermission Manager ) Ġ= Ġapply Ġ{ Ġthis . permission Manager Ġ= Ġpermission Manager Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġ[ Version Checker ] Ġused Ġfor Ġcheck Ġthe Ġversion ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġwith Version Checker ( version Checker : ĠVersion Checker ) Ġ= Ġapply Ġ{ Ġthis . version Checker Ġ= Ġversion Checker Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġbuild (): ĠA pk Version Updater ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( activity Startup Class Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity Startup Class Ġ= Ġ( context Ġas ĠActivity ):: class . java ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( version Checker Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġversion Checker Ġ= ĠK rake Version Checker ( context . getString ( R . string . apk _ version _ url )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( permission Manager Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpermission Manager Ġ= ĠPermission Manager ( context Ġas ĠFragment Activity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. per manently Ref used Msg ( context . getString ( R . string . apk _ d ow loader _ per manently msg )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠA pk Version Updater ( context , Ġlifecycle Owner , Ġversion Checker !! , Ġlistener , Ġactivity Startup Class !! , Ġcurrent Build Version , Ġpermission Manager !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠA PK _ MIME _ TYPE Ġ= Ġ" application / vnd . android . package - archive " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠA PK _ EXTENSION Ġ= Ġ". apk " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠARG _ AP K _ DOWN LOADED _ URI Ġ= Ġ" arg A pk Downloaded Uri " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠACTION _ DOWNLOAD _ COMPLETED Ġ= Ġ" action Download Completed " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠACTION _ DOWNLOAD _ C ANCE LED Ġ= Ġ" action Download Canceled " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠP REF S _ VERSION _ UP DAT ER Ġ= Ġ" PRE FS _ VERSION _ UP DAT ER " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠP REF S _ VERSION _ UP DAT ER _ CURRENT _ DOWNLOAD _ ID _ KEY Ġ= Ġ" PRE FS _ VERSION _ UP DAT ER _ CURRENT _ DOWNLOAD _ ID _ KEY " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġextracted Filename From Url ( url : ĠString , Ġfile Extension : ĠString ): ĠString ? ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpartial Url Ġ= Ġurl . split ("/ ". to Regex ()). drop Last While Ġ{ Ġit . isEmpty () Ġ}. to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( partial Url . isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfinal Url Segment Ġ= Ġpartial Url [ partial Url . size Ġ- Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( final Url Segment . contains ( file Extension )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfinal Url Segment ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ