package Ġapp . ak ile sh . nex . utils Ċ Ċ import Ġandroid . app . Notification Channel Ċ import Ġandroid . app . Notification Manager Ċ import Ġandroid . app . Pending Intent Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . util . Log Ċ import Ġandroidx . core . app . Notification Compat Ċ import Ġapp . ak ile sh . nex . Const . Feature . feature Dir Names Ċ import Ġapp . ak ile sh . nex . Const . Feature . feature Dirs Ċ import Ġapp . ak ile sh . nex . Const . Feature . feature Names Ċ import Ġapp . ak ile sh . nex . Const . File . files Map Ċ import Ġapp . ak ile sh . nex . Const . Path . module Path Ċ import Ġapp . ak ile sh . nex . Const . Path . module Priv Apps Path Ċ import Ġapp . ak ile sh . nex . Const . Url . github Raw Ċ import Ġapp . ak ile sh . nex . Const . Url . platform Ċ import Ġapp . ak ile sh . nex . Const . Url . release Ċ import Ġapp . ak ile sh . nex . R Ċ import Ġcom . github . kit tin un f . fuel . Fuel Ċ import Ġcom . github . kit tin un f . result . failure Ċ import Ġcom . github . kit tin un f . result . success Ċ import Ġcom . top john wu . superuser . Shell Ċ import Ġjava . io . File Ċ import Ġjava . math . Round ingMode Ċ Ċ class ĠManager Util Ġ{ ĊĊĠĠĠ Ġval Ġinstalled Ġ= Ġmutable ListOf < String >() ĊĠĠĠ Ġval Ġnot Installed Ġ= Ġmutable ListOf < String >() ĊĊĠĠĠ Ġfun Ġinit Lists (){ ĊĠĠĠĠĠĠĠ Ġif Ġ( release Ġ!= Ġ" 9 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfeature Dirs . remove (" Game Assistant ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfeature Names . remove (" Game Assistant ", Ġ" Game ĠAssistant ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( platform Ġ== Ġ" sd m 6 6 0 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfeature Dirs . remove (" Gl ance ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfeature Names . remove (" Gl ance ", Ġ" Gl ance ĠScreen ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( platform Ġ!= Ġ" sd m 6 6 0 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfeature Dirs . remove (" Face Plus Service ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfeature Names . remove (" Face Plus Service ", Ġ" Face ĠUn lock ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfeature Dirs . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġmodule Priv Apps Path Ġ+ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutputs Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠĠĠĠĠ ĠShell . su ("[ Ġ- d Ġ$ path Ġ] Ġ&& Ġecho Ġy "). to ( outputs ). exec () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( outputs . isNotEmpty () Ġ&& Ġoutputs . component 1 (). isNotBlank ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstalled . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnot Installed . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutputs . clear () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove ( feature : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġop Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠ Ġval Ġdir Ġ= Ġfeature Dir Names [ feature ]. toString () ĊĠĠĠĠĠĠĠ Ġfiles Map [ dir ]?. forEach Ġ{ ĠfilePath Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠShell . su (" rm Ġ- rf Ġ$ module Path $ filePath "). to ( op ). exec () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠShell . su (" rm Ġ- rf Ġ$ module Priv Apps Path $ dir "). to ( op ). exec () ĊĠĠĠĠĠĠĠ Ġreturn Ġif ( op . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" Remove ", Ġ"$ feature Ġwas Ġremoved ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinstall ( feature : ĠString , Ġcontext : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdir Ġ= Ġfeature Dir Names [ feature ]. toString () ĊĠĠĠĠĠĠĠ Ġval Ġimportance Ġ= ĠNotification Manager . IMPORT ANCE _ DEFAULT ĊĠĠĠĠĠĠĠ Ġval Ġchannel Ġ= ĠNotification Channel (" download ", Ġ" Downloads ", Ġimportance ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ" Download Ġnotification " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġnotification Manager : ĠNotification Manager Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . getSystem Service ( Context . NOTIFICATION _ SERVICE ) Ġas ĠNotification Manager ĊĠĠĠĠĠĠĠ Ġnotification Manager . create Notification Channel ( channel ) ĊĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠNotification Compat . Builder ( context , Ġ" download ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Small Icon ( android . R . drawable . stat _ sys _ download ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Title (" Downloading Ġfiles Ġfor Ġ$ feature ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Priority ( Notification Compat . PRIORITY _ DEFAULT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set O ngo ing ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Only Alert Once ( true ) ĊĊĠĠĠĠĠĠĠ Ġnotification Manager . notify ( 1 , Ġbuilder . build ()) ĊĠĠĠĠĠĠĠ Ġval Ġto MB Ġ= Ġ 1 0 2 4 . 0 Ġ* Ġ 1 0 2 4 . 0 ĊĊĠĠĠĠĠĠĠ Ġfiles Map [ dir ]?. forEach Ġ{ ĠfilePath Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠfilePath . substring ( filePath . lastIndexOf ("/") + 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdirectory Ġ= ĠfilePath . substring ( 0 , ĠfilePath . lastIndexOf ("/ ")) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠF uel . download ( github Raw Ġ+ ĠfilePath ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. file Destination Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( context . files Dir , Ġfile ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. progress Ġ{ Ġread Bytes , Ġtotal Bytes Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremaining Ġ= Ġread Bytes . div ( to MB ). to BigDecimal (). set Scale ( 2 , ĠRound ingMode . HALF _ UP ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtotal Ġ= Ġtotal Bytes . div ( to MB ). to BigDecimal (). set Scale ( 2 , ĠRound ingMode . HALF _ UP ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprogress Ġ= Ġ"${ remaining } MB Ġ/ Ġ${ total } MB " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . setContent Text ( progress ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Progress ( total Bytes . toInt (), Ġread Bytes . toInt (), Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Manager . notify ( 1 , Ġbuilder . build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. response String Ġ{ Ġ_, Ġ_, Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . failure Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠShell . su (" rm Ġ- f Ġ${ context . files Dir }/ $ file "). exec () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . setContent Title ("$ feature Ġcouldn 't Ġbe Ġdownloaded ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Text ( it . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Small Icon ( android . R . drawable . stat _ notify _ error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setStyle ( Notification Compat . Big TextStyle (). big Text ( it . message )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set O ngo ing ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Manager . notify ( 1 , Ġbuilder . build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" Download Ġerror ", Ġit . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . success Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . setContent Title ("$ feature Ġdownloaded ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Small Icon ( android . R . drawable . stat _ sys _ download _ done ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Manager . notify ( 1 , Ġbuilder . build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" Download Ġsuccess ", Ġ"$ file Ġdownload Ġcomplete ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmk Ġ= ĠShell . su (" mkdir Ġ- p Ġ$ module Path $ directory "). exec (). out ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mk . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcp Ġ= ĠShell . su (" cp Ġ- f Ġ${ context . files Dir }/ $ file Ġ$ module Path $ filePath "). exec (). out ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( cp . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( files Map [ dir ]?. indexOf ( filePath ) Ġ== Ġfiles Map [ dir ]?. last Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( context , ĠNotification Reboot Action Service :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setAction (" reboot ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpending Intent Ġ= ĠPending Intent . getService ( context , Ġ 0 , Ġintent , ĠPending Intent . FLAG _ ONE _ SHOT ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . set O ngo ing ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Title ("$ feature Ġinstalled ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Text (" Reboot Ġto Ġapply Ġchanges ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Small Icon ( R . drawable . ic _ tm ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addAction ( R . drawable . ic _ tm , Ġ" Reboot ", Ġpending Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Manager . notify ( 1 , Ġbuilder . build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠShell . su (" rm Ġ- f Ġ${ context . files Dir }/ $ file "). exec () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠShell . su (" rm Ġ- f Ġ${ context . files Dir }/ $ file "). exec () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }