/* Ċ Ġ* Ġ ĠCopyright Ġ( c ) Ġ 2 0 2 1 ĠSer ge y ĠKom l ach Ġa ka ĠSal at - Cx 6 5 ; ĠOriginal Ġproject : Ġhttps :// github . com / Sal at - Cx 6 5 / Advanced Bio metric Prompt Compat Ċ Ġ* Ġ ĠAll Ġrights Ġreserved . Ċ Ġ* Ċ Ġ* ĠĠ ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* ĠĠ Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠĠ ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠĠ ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* ĠĠ Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠĠ ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠĠ ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* ĠĠ Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġdev . sk om l ach . common . permissions Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . app . App Ops Manager Ċ import Ġandroid . app . Notification Manager Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . content . pm . Permission Group Info Ċ import Ġandroid . content . pm . Permission Info Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Build . VERSION Ċ import Ġandroid . os . Process Ċ import Ġandroid . provider . Settings Ċ import Ġandroidx . annotation . Requires Api Ċ import Ġandroidx . core . app . App Ops Manager Compat Ċ import Ġandroidx . core . app . Notification Manager Compat Ċ import Ġandroidx . core . content . Permission Checker Ċ import Ġdev . sk om l ach . common . context provider . Android Context . app Context Ċ import Ġdev . sk om l ach . common . logging . Log Cat . log Error Ċ import Ġdev . sk om l ach . common . logging . Log Cat . log Exception Ċ import Ġdev . sk om l ach . common . misc . Executor Helper Ċ import Ġjava . util .* Ċ Ċ object ĠPermission Utils Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġapp Op Cache : ĠMutable Map < String , ĠBoolean > Ġ= ĠHashMap () ĊĊĠĠĠ Ġprivate Ġvar Ġis Allowed Overlay Permission Flag : ĠBoolean ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġis Allowed Usage Stat Permission Flag : ĠBoolean ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġall Ġgiven Ġpermissions Ġhave Ġbeen Ġgranted . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġgrant Results Ġresults ĊĠĠĠĠ Ġ* Ġ@ return Ġreturns Ġtrue Ġif Ġall Ġpermissions Ġhave Ġbeen Ġgranted . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġverify Permissions ( var arg Ġgrant Results : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( grant Results . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( result : ĠInt Ġin Ġgrant Results ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Enabled Dont Keep Activities ( context : ĠContext ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSettings . System . getInt ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . content Resolver , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSettings . System . ALWAYS _ FIN ISH _ ACTIV ITIES , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ!= Ġ 0 Ġ|| Ġ( VERSION . SDK _ INT Ġ>= Ġ 1 7 Ġ&& ĠSettings . Global . getInt ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . content Resolver , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSettings . Global . ALWAYS _ FIN ISH _ ACTIV ITIES , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ!= Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Exception ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġtrue Ġif Ġthe ĠActivity Ġor ĠFragment Ġhas Ġaccess Ġto Ġall Ġgiven Ġpermissions . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġpermissions Ġpermission Ġlist ĊĠĠĠĠ Ġ* Ġ@ return Ġreturns Ġtrue Ġif Ġthe ĠActivity Ġor ĠFragment Ġhas Ġaccess Ġto Ġall Ġgiven Ġpermissions . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġhas Self Permissions ( permissions : ĠList < String >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġhas Self Permissions (* permissions . to Typed Array ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhas Self Permissions ( var arg Ġpermissions : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( permission : ĠString Ġin Ġpermissions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Permission Exists InThe System ( permission )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Permission Granted ( permission )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Permission Exists InThe System ( permission : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlst Groups Ġ= Ġapp Context . package Manager . getAll Permission Groups ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlst Groups . add ( null ) Ġ// Ġun grouped Ġpermissions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( pg i : ĠPermission Group Info ? Ġin Ġlst Groups ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp gi ?. name ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlst Permissions Ġ= Ġapp Context . package Manager . query Permissions By Group ( it , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( pi : ĠPermission Info Ġin Ġlst Permissions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( pi . name Ġ== Ġpermission )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Exception ( ex ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDetermine Ġcontext Ġhas Ġaccess Ġto Ġthe Ġgiven Ġpermission . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġis Ġa Ġworkaround Ġfor ĠRuntimeException Ġof ĠParcel # read Exception . ĊĠĠĠĠ Ġ* ĠFor Ġmore Ġdetail , Ġcheck Ġthis Ġissue Ġhttps :// github . com / hot che mi / Permissions Dispatcher / issues / 1 0 7 ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġpermission Ġpermission ĊĠĠĠĠ Ġ* Ġ@ return Ġreturns Ġtrue Ġif Ġcontext Ġhas Ġaccess Ġto Ġthe Ġgiven Ġpermission , Ġfalse Ġotherwise . ĊĠĠĠĠ Ġ* Ġ@ see Ġ. has Self Permissions ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġis Permission Granted ( permission : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġgranted : ĠBoolean ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpermission To Op : ĠString Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp Op Compat Constants . getApp Op From Permission ( permission ) Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// below ĠAndroid Ġ 6 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( permission To Op . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġin Ġcase Ġof Ġnormal Ġpermissions ( e . g . ĠINTER NET ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgranted Ġ= ĠPermission Checker . check Self Permission ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpermission ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ== ĠPermission Checker . PERMISSION _ GRAN TED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Error (" Permission Utils . is Permission Granted Ġ- Ġnormal Ġpermission Ġ- Ġ$ permission Ġ- Ġ$ gr anted ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġgranted ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnote Op : ĠInt Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp Ops Manager Compat . note Op No Throw ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpermission To Op , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProcess . my Uid (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp Context . packageName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . KIT K AT ) Ġapp Op Permissions Check Mi ui ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpermission To Op , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProcess . my Uid (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp Context . packageName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġelse ĠApp Ops Manager Compat . MODE _ IG NO RED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġapp Op Allowed Ġ= Ġnote Op Ġ== ĠApp Ops Manager Compat . MODE _ ALLOWED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapp Op Ignored Ġ= Ġnote Op Ġ== ĠApp Ops Manager Compat . MODE _ IG NO RED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( app Op Ignored Ġ&& Ġapp Op Cache . containsKey ( permission )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp Op Cache [ permission ]?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp Op Allowed Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp Op Cache [ permission ] Ġ= Ġapp Op Allowed ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( is App Op Permission ( permission )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgranted Ġ= Ġapp Op Allowed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Error (" Permission Utils . is Permission Granted Ġ- Ġapp Op Ġpermission Ġ- Ġ$ permission Ġ- Ġ$ permission To Op Ġ- Ġ$ gr anted ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgranted ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgranted Ġ= Ġapp Op Allowed Ġ&& ĠPermission Checker . check Self Permission ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpermission ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ== ĠPermission Checker . PERMISSION _ GRAN TED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Error (" Permission Utils . is Permission Granted Ġ- Ġdanger Ġpermission Ġ- Ġ$ permission Ġ- Ġ$ permission To Op Ġ- Ġ$ gr anted ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgranted ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Exception ( t ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġgranted Ġ= ĠPermission Checker . check Self Permission ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp Context , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermission ĊĠĠĠĠĠĠĠ Ġ) Ġ== ĠPermission Checker . PERMISSION _ GRAN TED ĊĠĠĠĠĠĠĠ Ġlog Error (" Permission Utils . is Permission Granted Ġ- Ġnormal Ġpermission Ġ- Ġ$ permission Ġ- Ġ$ gr anted ") ĊĠĠĠĠĠĠĠ Ġreturn Ġgranted ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis App Op Permission ( manifest Permission : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinfo Ġ= Ġapp Context . package Manager . get Permission Info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmanifest Permission , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPackage Manager . GET _ META _ DATA ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Error (" Permission Utils . is App Op Permission Ġ- Ġ$ manifest Permission Ġ$ info ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// https :// developer . android . com / reference / android / content / pm / Permission Info . html # get Protection () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( VERSION . SDK _ INT Ġ>= Ġ 2 8 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( info . protection Ġand ĠPermission Info . PRO TE CTION _ FLAG _ AP POP ) Ġ!= Ġ 0 Ġ|| Ġ( info . protection Level Ġand ĠPermission Info . PRO TE CTION _ FLAG _ AP POP ) Ġ!= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVERSION . SDK _ INT Ġ>= Ġ 2 1 Ġ&& Ġ( info . protection Level Ġand ĠPermission Info . PRO TE CTION _ FLAG _ AP POP ) Ġ!= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Exception ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Permissions ( target Permissions K es : ĠList < String ?> ): ĠHashMap < String , ĠString > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( target Permissions K es . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Provide Ġat Ġleast Ġone Ġpermission Ġstring ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġpermissions List Ġ= ĠHashMap < String , ĠString >() ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmanifest Permissions Ġ= Ġapp Context . package Manager . get Package Info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp Context . packageName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPackage Manager . GET _ PERMISSION S ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). requested Permissions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( manifest Permission : ĠString Ġin Ġmanifest Permissions ) Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! target Permissions K es . contains ( manifest Permission )) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinfo Ġ= Ġapp Context . package Manager . get Permission Info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmanifest Permission , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPackage Manager . GET _ META _ DATA ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Error (" Permission Utils . get Permissions : Ġ" Ġ+ Ġmanifest Permission Ġ+ Ġ" Ġ" Ġ+ Ġ( if Ġ( VERSION . SDK _ INT Ġ>= Ġ 2 8 ) Ġinfo . protection Ġelse Ġinfo . protection Level )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// https :// developer . android . com / reference / android / content / pm / Permission Info . html # get Protection () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( VERSION . SDK _ INT Ġ>= Ġ 2 8 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( info . protection Ġ== ĠPermission Info . PRO TE CTION _ NORMAL Ġ|| Ġinfo . protection Level Ġ== ĠPermission Info . PRO TE CTION _ NORMAL ) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( info . protection Level Ġ== ĠPermission Info . PRO TE CTION _ NORMAL ) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Self Permissions ( manifest Permission )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġperm Name Ġ= Ġinfo . load Label ( app Context . package Manager ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpermissions List [ manifest Permission ] Ġ= Ġperm Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Exception ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġpermissions List ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Notification Ġpermissions ĊĠĠĠ Ġval Ġis Allowed Notifications Permission : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠNotification Manager Compat . from ( app Context ). are Notifications Enabled () ĊĊĠĠĠ Ġ// Notification Ġchannel Ġpermissions ĊĠĠĠ Ġfun Ġis Allowed Notifications Channel Permission ( channelId : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( VERSION . SDK _ INT Ġ< Ġ 2 6 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnotification Manager Ġ= Ġapp Context . getSystem Service ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Manager :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnotification Channel Ġ= Ġnotification Manager . get Notification Channel ( channelId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Error (" Permission Utils . Notification Channel Ġ" Ġ+ Ġchannel Id Ġ+ Ġ":" Ġ+ Ġnotification Channel . import ance ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Channel . import ance Ġ!= ĠNotification Manager . IMPORT ANCE _ NONE ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Exception ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġis Allowed Overlay Permission : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( VERSION . SDK _ INT Ġ>= Ġ 1 9 Ġ&& Ġis Allowed Overlay Permission Flag Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġis Allowed Overlay Permission Flag Ġ== Ġtrue Ġ|| Ġis Overlay Granted Use Check Op ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġis Overlay Granted Use Check Op . also Ġ{ Ġis Allowed Overlay Permission Flag Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( VERSION . SDK _ INT Ġ>= Ġ 1 9 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Watch ing By Permission ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . SYSTEM _ ALERT _ WINDOW ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Allowed Overlay Permission Flag Ġ= Ġis Overlay Granted Use Check Op ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġis Overlay Granted Use Check Op : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( VERSION . SDK _ INT Ġ>= Ġ 2 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Self Permissions ( Manifest . permission . SYSTEM _ ALERT _ WINDOW ) Ġ|| ĠSettings . can Draw Overlay s ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp Context ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Self Permissions ( Manifest . permission . SYSTEM _ ALERT _ WINDOW ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . KIT K AT ) ĊĠĠĠ Ġprivate Ġfun Ġstart Watch ing By Permission ( permission : ĠString , Ġrunnable : ĠRunnable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is App Op Permission ( permission )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpermission To Op Ġ= ĠApp Op Compat Constants . getApp Op From Permission ( permission ) Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapp Ops Manager Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp Context . getSystem Service ( Context . APP _ OPS _ SERVICE ) Ġas ĠApp Ops Manager ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpkg Name Ġ= Ġapp Context . packageName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp Ops Manager . start Watch ingMode ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( permission To Op ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpkg Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġop , ĠpackageName Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( permission To Op Ġ== Ġop Ġ&& Ġpkg Name Ġ== ĠpackageName ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Error (" Permission Utils . on Op Changed Ġ- Ġ$ op Ġ- Ġ$ packageName ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// https :// stackoverflow . com / a / 4 0 6 4 9 6 3 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExecutor Helper . post Delayed ( run nable , Ġ 2 5 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Exception ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġis Allowed Permission For Usage Stat : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( VERSION . SDK _ INT Ġ>= Ġ 2 3 Ġ&& Ġis Allowed Usage Stat Permission Flag Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġis Allowed Usage Stat Permission Flag Ġ== Ġtrue Ġ|| Ġis Usage Stat Granted Use Check Op ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġis Usage Stat Granted Use Check Op . also Ġ{ Ġis Allowed Usage Stat Permission Flag Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( VERSION . SDK _ INT Ġ>= Ġ 2 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Watch ing By Permission ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . PACKAGE _ USAGE _ STATS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġis Allowed Usage Stat Permission Flag Ġ= Ġis Usage Stat Granted Use Check Op Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġis Usage Stat Granted Use Check Op : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( VERSION . SDK _ INT Ġ< Ġ 2 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Self Permissions ( Manifest . permission . GET _ TASK S ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Self Permissions ( Manifest . permission . PACKAGE _ USAGE _ STATS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . KIT K AT ) ĊĠĠĠ Ġfun Ġapp Op Permissions Check Mi ui ( op Code : ĠString ?, Ġuid : ĠInt , Ġpkg : ĠString ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmanager Ġ= Ġapp Context . getSystem Service ( Context . APP _ OPS _ SERVICE ) Ġas ĠApp Ops Manager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclazz : ĠClass < *> Ġ= ĠApp Ops Manager :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdispatch Method Ġ= Ġclazz . getMethod ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" note Op No Throw ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString :: class . java , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInt :: class . java Primitive Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdispatch Method . invoke ( manager , Ġ* array Of < Any ? >( op Code , Ġuid , Ġpkg )) Ġas ĠInt ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e . cause Ġis ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠApp Ops Manager Compat . MODE _ ALLOWED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Exception ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠApp Ops Manager Compat . MODE _ IG NO RED ĊĠĠĠ Ġ} Ċ }