package Ġca . all an wang . android . github . releases Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . content . Broadcast Receiver Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Build Ċ import Ġandroid . provider . Settings Ċ import Ġandroidx . core . content . File Provider Ċ import Ġjava . io . File Ċ Ċ class ĠGithub Installer Receiver Ġ: ĠBroadcast Receiver (), ĠGithub Log gable Ġ{ ĊĊĠĠĠ Ġoverride Ġvar Ġdebug : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġval Ġlog Tag : ĠString Ġ= Ġ" Github Installer Receiver " ĊĊĠĠĠ Ġoverride Ġfun Ġon Receive ( context : ĠContext , Ġintent : ĠIntent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( intent . action Ġ!= ĠACTION ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠĠĠĠĠ Ġdebug Ġ= Ġintent . getBoolean Extra ( DEBUG , Ġfalse ) ĊĊĠĠĠĠĠĠĠ Ġval Ġnot if Id Ġ= Ġintent . getInt Extra ( NOT IF _ ID , Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. take If Ġ{ Ġit Ġ!= Ġ- 1 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġlo ge Ġ{ Ġ" No Ġnot if Ġid Ġfound " Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġintent . getString Extra ( FILE _ PATH ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġlo ge Ġ{ Ġ" No Ġpath Ġfound " Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( path ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! file . isFile ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlog i Ġ{ Ġ" File Ġ${ file . name } Ġno Ġlonger Ġexists " Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcontent Uri Ġ= ĠFile Provider . get Uri For File ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . getString ( R . string . github _ release _ file _ provider _ authority ), ĠFile ( path ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( install ( context , Ġcontent Uri )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnot if Manager Ġ= Ġcontext . notification Manager Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnot if Manager . cancel ( notif Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAttempt Ġto Ġinstall Ġapk Ġat Ġuri . ĊĠĠĠĠ Ġ* ĠReturn Ġtrue Ġif Ġcompleted , Ġfalse Ġotherwise . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġinstall ( context : ĠContext , Ġuri : ĠUri ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġlog i Ġ{ Ġ" Found Ġinstall Ġrequest Ġfor Ġ$ uri " Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġpackage Manager Ġ= Ġcontext . package Manager ĊĊĠĠĠĠĠĠĠ Ġfun Ġfallback (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog d Ġ{ Ġ" Fallback " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( Intent . ACTION _ VIEW ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflags Ġ= ĠIntent . FLAG _ ACTIVITY _ NEW _ TASK Ġor ĠIntent . FLAG _ GRANT _ READ _ URI _ PERMISSION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġuri ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . startActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġinstall (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog d Ġ{ Ġ" Installer " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( Intent . ACTION _ INSTALL _ PACKAGE ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflags Ġ= ĠIntent . FLAG _ ACTIVITY _ NEW _ TASK Ġor ĠIntent . FLAG _ GRANT _ READ _ URI _ PERMISSION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetData And Type ( uri , Ġ" application / vnd . android . package - archive ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . startActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠNo Ġfurther Ġpermissions Ġrequired ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ< ĠBuild . VERSION _ CODES . O ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġinstall () ĊĊĠĠĠĠĠĠĠ Ġval ĠpackageName Ġ= Ġcontext . packageName ĊĊĠĠĠĠĠĠĠ Ġ// ĠCannot Ġinstall Ġapps ĊĠĠĠĠĠĠĠ Ġif Ġ( Manifest . permission . REQUEST _ INSTALL _ PACK AGES Ġ! in ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpackage Manager . get Package Info ( packageName , ĠPackage Manager . GET _ PERMISSION S ). requested Permissions ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog d Ġ{ Ġ" REQUEST _ INSTALL _ PACK AGES Ġpermission Ġnot Ġfound Ġin Ġmanifest " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfallback () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠCan Ġinstall Ġapps Ġif Ġgranted Ġby Ġuser ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( package Manager . can Request Package Install s ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstall () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog d Ġ{ Ġ" En abler " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( Settings . ACTION _ MANAGE _ UNKNOWN _ APP _ SOURCES ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflags Ġ= ĠIntent . FLAG _ ACTIVITY _ NEW _ TASK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= ĠUri . parse (" package :$ packageName ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . startActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠACTION Ġ= Ġ" ca . all an wang . android . github . releases . INSTALL " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠNOT IF _ ID Ġ= Ġ" notif _ id " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠFILE _ PATH Ġ= Ġ" file _ path " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDEBUG Ġ= Ġ" debug " ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Intent ( context : ĠContext , Ġnot if Id : ĠInt , Ġfile : ĠFile , Ġdebug : ĠBoolean ): ĠIntent Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIntent ( context , ĠGithub Installer Receiver :: class . java ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= ĠACTION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( NOT IF _ ID , Ġnot if Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( FILE _ PATH , Ġfile . absolute Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( DEBUG , Ġdebug ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }