package Ġcom . lp ir ro . tile demo Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Build Ċ import Ġandroid . widget . ImageView Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . core . graphics . drawable . Drawable Compat Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . android . schedul ers . Android Schedulers Ċ import Ġio . reactivex . schedul ers . Schedulers Ċ import Ġjava . io . Data OutputStream Ċ import Ġjava . io . IOException Ċ import Ġjava . lang . reflect . Invocation TargetException Ċ import Ġjava . lang . reflect . Method Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ object ĠUtils Ġ{ ĊĊĠĠĠ Ġval ĠQ SETTING _ CONFIG Ġ= Ġ" Q SETTING _ CONFIG " ĊĠĠĠ Ġval ĠNOT IFICATION _ PACKAGE _ LIST Ġ= Ġ" NOTIFICATION _ PACKAGE _ LIST " ĊĠĠĠ Ġval ĠlistOf allowed Notification Package Ġ= Ġarray ListOf < String >() ĊĊĠĠĠ Ġvar Ġdisable StatusBar Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Tint ( view : ĠImageView , Ġcolor : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠDrawable Compat . set Tint ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDrawable Compat . wrap ( view . drawable ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContext Compat . getColor ( view . context , Ġcolor ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgrant Notification Access () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġp Ġ= ĠRuntime . get Runtime (). exec (" su ") ĊĠĠĠĠĠĠĠ Ġval Ġos Ġ= ĠData OutputStream ( p . output Stream ) ĊĠĠĠĠĠĠĠ Ġos . write Bytes (" pm Ġgrant Ġcom . lp ir ro . tile demo Ġandroid . permission . BIND _ NOTIFICATION _ LIST ENER _ SERVICE " Ġ+ Ġ"\ n ") ĊĠĠĠĠĠĠĠ Ġos . write Bytes (" exit \ n ") ĊĠĠĠĠĠĠĠ Ġos . flush () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġexecute Command Via Su ( option : ĠString , Ġcommand : ĠString , Ġstate listener : Ġ( Boolean ) Ġ-> ĠUnit , Ġenable Or Disable : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġsuccess Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġsu Ġ= Ġ" su " ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDefault Ġ" su " Ġcommand Ġexecuted Ġsuccessfully , Ġthen Ġquit . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( success ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠElse , Ġexecute Ġother Ġ" su " Ġcommands . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsu Ġ= Ġ"/ system / x bin / su " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( i Ġ== Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsu Ġ= Ġ"/ system / bin / su " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠExecute Ġcommand Ġas Ġ" su ". ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRuntime . get Runtime (). exec ( array Of ( su , Ġoption , Ġcommand )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠO ops ! ĠCannot Ġexecute Ġ` su ` Ġfor Ġsome Ġreason . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLog Ġerror Ġhere . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate listener ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate listener ( enable Or Disable ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdisable StatusBar ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( disable StatusBar ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose StatusBar ( context ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclose StatusBar ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ ĠObservable . timer ( 2 0 0 , ĠTimeUnit . MILLISECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollapse ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisable StatusBar ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, {}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcollapse ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠUse Ġreflection Ġto Ġtrigger Ġa Ġmethod Ġfrom Ġ' StatusBar Manager ' ĊĠĠĠĠĠĠĠ Ġval Ġstatus Bar Service Ġ= Ġcontext . getSystem Service (" status bar ") ĊĠĠĠĠĠĠĠ Ġvar Ġstatus Bar Manager : ĠClass < *> ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Bar Manager Ġ= ĠClass . forName (" android . app . StatusBar Manager ") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠClass NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġcollapse StatusBar : ĠMethod ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPri or Ġto ĠAPI Ġ 1 7 , Ġthe Ġmethod Ġto Ġcall Ġis Ġ' collapse ()' ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAPI Ġ 1 7 Ġon wards , Ġthe Ġmethod Ġto Ġcall Ġis Ġ` collapse Panels ()` ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcollapse StatusBar Ġ= Ġif Ġ( Build . VERSION . SDK _ INT Ġ> Ġ 1 6 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Bar Manager !!. getMethod (" collapse Panels ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Bar Manager !!. getMethod (" collapse ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNoSuch Method Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcollapse StatusBar ?. is Accessible Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcollapse StatusBar ?. invoke ( status Bar Service ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegal AccessException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInvocation TargetException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }