package Ġcom . oasis f eng . is land Ċ Ċ import Ġandroid . app . Notification Ċ import Ġandroid . app . Pending Intent Ċ import Ġandroid . app . Pending Intent . FLAG _ UPDATE _ CURRENT Ċ import Ġandroid . app . admin . Device Policy Manager Ċ import Ġandroid . app . admin . Device Policy Manager . DE LEG ATION _ PACKAGE _ ACCESS Ċ import Ġandroid . content . Component Name Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Context . RE STRI CTION S _ SERVICE Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . Intent . EXTRA _ USER Ċ import Ġandroid . content . Intent . FLAG _ ACTIVITY _ NEW _ TASK Ċ import Ġandroid . content . Restrictions Manager Ċ import Ġandroid . content . Restrictions Manager .* Ċ import Ġandroid . content . pm . Application Info Ċ import Ġandroid . content . pm . PackageManager . COMPONENT _ ENABLED _ STATE _ DISABLED Ċ import Ġandroid . content . pm . PackageManager . D ONT _ KILL _ APP Ċ import Ġandroid . content . pm . PackageManager . GET _ META _ DATA Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Build . VERSION . SDK _ INT Ċ import Ġandroid . os . Build . VERSION _ CODES . O Ċ import Ġandroid . os . Persist able Bundle Ċ import Ġandroid . os . User Handle Ċ import Ġandroid . service . re strictions . Restrictions Receiver Ċ import Ġandroid . util . Log Ċ import Ġandroid . widget . Toast Ċ import Ġcom . oasis f eng . android . os . User Handles Ċ import Ġcom . oasis f eng . android . util . Apps Ċ import Ġcom . oasis f eng . is land . notification . Notification Ids Ċ import Ġcom . oasis f eng . is land . open . Build Config Ċ import Ġcom . oasis f eng . is land . open . R Ċ import Ġcom . oasis f eng . is land . util . Device Policies Ċ import Ġcom . oasis f eng . pattern . Pseudo Content Provider Ċ Ċ /** Ċ Ġ* ĠCreated Ġby ĠO asis Ġon Ġ 2 0 1 9 - 6 - 8 . Ċ Ġ*/ Ċ const Ġval ĠACTION _ AUTHOR IZE Ġ= Ġ" AUTHOR IZE " Ċ const Ġval ĠACTION _ REF USE Ġ= Ġ" REF USE " Ċ Ċ class ĠDeleg ated Scope Authorization Ġ: ĠRe strictions Receiver () Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġon Request Permission ( context : ĠContext , Ġpkg : ĠString ?, Ġrequest Type : ĠString ?, ĠrequestId : ĠString ?, Ġrequest : ĠPers ist able Bundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( pkg . isNull OrEmpty ()) Ġreturn Ġlog And Toast ( context , Ġpkg , Ġ" Missing Ġrequest Ġpackage ") ĊĠĠĠĠĠĠĠ Ġif Ġ( requestId . isNull OrEmpty ()) Ġreturn Ġlog And Toast ( context , Ġpkg , Ġ" Missing Ġrequest ĠID ") ĊĠĠĠĠĠĠĠ Ġval Ġdeleg ation Ġ= Ġrequest ?. getString ( REQUEST _ KEY _ DATA ) ĊĠĠĠĠĠĠĠ Ġif Ġ( deleg ation . isNull OrEmpty ()) Ġreturn Ġlog And Toast ( context , Ġpkg , Ġ" Missing Ġdeleg ation Ġ( REQUEST _ KEY _ DATA ) Ġin Ġrequest ") ĊĠĠĠĠĠĠĠ Ġval Ġuser Ġ= ĠUser Handles . of ( request . getInt ( Api Constants . REQUEST _ KEY _ USER _ SERIAL _ NUMBER , Ġ- 2 )) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Build Config . DEBUG Ġ&& Ġrequest Type Ġ== Ġ"-" Ġ+ ĠApi Constants . TYPE _ DE LEG ATION ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDeleg ation Manager . remove Authorized Deleg ation ( Device Policies ( context ), Ġpkg , Ġuser , Ġdeleg ation ) ĊĠĠĠĠĠĠĠ Ġif Ġ( request Type Ġ!= ĠApi Constants . TYPE _ DE LEG ATION ) Ġreturn Ġlog And Toast ( context , Ġpkg , Ġ" Unsupported Ġrequest Ġtype : Ġ$ request Type ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠUse Ġmeta - data Ġinstead Ġof Ġrestrictions ĠXML Ġdeclaration , Ġto Ġavoid Ġdeclared Ġrestriction Ġbeing Ġun int ention ally Ġrecognized Ġby Ġother ĠD PC . ĊĠĠĠĠĠĠĠ Ġval Ġdeclared Deleg ations Ġ= Ġcontext . package Manager . getApplication Info ( pkg , ĠGET _ META _ DATA ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. metaData ?. getString ( Api Constants . TYPE _ DE LEG ATION ) Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġif Ġ(! Ġdeclared Deleg ations . split (',' ). contains ( deleg ation )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlog And Toast ( context , Ġpkg , Ġ" deleg ation Ġis Ġnot Ġdeclared Ġin Ġmeta - data ") ĊĠĠĠĠĠĠĠ Ġval Ġdeleg ation With Label Ġ= Ġget Supported Deleg ated Scope ( deleg ation ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġlog And Toast ( context , Ġpkg , Ġ" Unsupported Ġdeleg ation Ġ( specified Ġby ĠrequestId ): Ġ$ deleg ation ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Deleg ation Manager . is Deleg ation Authorized ( Device Policies ( context ), Ġpkg , Ġuser , Ġdeleg ation )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnotify Authorization Result ( context , Ġpkg , ĠrequestId , ĠRESULT _ APPRO VED ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Notification Ids . Authorization . is Blocked ( context )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . startActivity ( Notification Ids . Authorization . build Channel Settings Intent ( context ). add Flags ( FLAG _ ACTIVITY _ NEW _ TASK )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠToast . makeText ( context , ĠR . string . prompt _ un block _ notification _ for _ auth _ request , ĠToast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( context , Ġjava Class ). setData ( Uri . parse (" request :$ requestId ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putExtra ( EXTRA _ PACKAGE _ NAME , Ġpkg ). putExtra ( EXTRA _ USER , Ġuser ). putExtra ( REQUEST _ KEY _ DATA , Ġdeleg ation ) ĊĠĠĠĠĠĠĠ Ġval Ġauthorize Ġ= ĠPending Intent . get Broadcast ( context , Ġ 0 , Ġintent . setAction ( ACTION _ AUTHOR IZE ), ĠFLAG _ UPDATE _ CURRENT ) ĊĠĠĠĠĠĠĠ Ġval Ġref use Ġ= ĠPending Intent . get Broadcast ( context , Ġ 0 , Ġintent . setAction ( ACTION _ REF USE ), ĠFLAG _ UPDATE _ CURRENT ) ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" DE PREC ATION ") ĊĠĠĠĠĠĠĠ ĠNotification Ids . Authorization . post ( context , ĠrequestId , ĠNotification . Builder ( context ). set Small Icon ( android . R . drawable . ic _ dialog _ alert ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setColor ( context . resources . getColor ( R . color . accent )). setStyle ( Notification . Big TextStyle ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Title ( context . getString ( R . string . notification _ deleg ated _ scope _ auth _ title , ĠApps . of ( context ). get AppName ( pkg ) Ġ?: Ġpkg )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Text ( context . getString ( R . string . notification _ deleg ated _ scope _ auth _ text , Ġcontext . getText ( deleg ation With Label . second ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Delete Intent ( ref use ). addAction ( Notification . Action . Builder ( 0 , Ġcontext . getText ( R . string . action _ authorize ), Ġauthorize ). build ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Receive ( context : ĠContext , Ġintent : ĠIntent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġauthorized Ġ= Ġwhen Ġ( intent . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ AUTHOR IZE Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ REF USE Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn Ġsuper . on Receive ( context , Ġintent ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġpkg Ġ= Ġintent . getString Extra ( EXTRA _ PACKAGE _ NAME ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġuser Ġ: ĠUser Handle Ġ= Ġintent . get Parcelable Extra ( EXTRA _ USER ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġdeleg ation Ġ= Ġintent . getString Extra ( REQUEST _ KEY _ DATA ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval ĠrequestId Ġ= Ġintent . data ?. scheme Specific Part ĊĠĠĠĠĠĠĠ Ġon Request React edBy User ( context , Ġauthorized , ĠrequestId , Ġpkg , Ġuser , Ġdeleg ation ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Request React edBy User ( context : ĠContext , Ġauthorized : ĠBoolean , ĠrequestId : ĠString ?, Ġpkg : ĠString , Ġuser : ĠUser Handle , Ġdeleg ation : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnotify Authorization Result ( context , Ġpkg , ĠrequestId , Ġif Ġ( authorized ) ĠRESULT _ APPRO VED Ġelse ĠRESULT _ DEN IED ) ĊĠĠĠĠĠĠĠ Ġif Ġ( authorized ) ĠDeleg ation Manager . add Authorized Deleg ation ( Device Policies ( context ), Ġpkg , Ġuser , Ġdeleg ation ) ĊĠĠĠĠĠĠĠ ĠNotification Ids . Authorization . cancel ( context , ĠrequestId ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnotify Authorization Result ( context : ĠContext , Ġpkg : ĠString , ĠrequestId : ĠString ?, Ġresult : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ( context . getSystem Service ( RE STRI CTION S _ SERVICE ) Ġas ĠRe strictions Manager ). notify Permission Response ( pkg , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPers ist able Bundle ( 2 ). apply Ġ{ Ġput String ( REQUEST _ KEY _ ID , ĠrequestId ); Ġput Int ( RESPONSE _ KEY _ RESULT , Ġresult ) Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Supported Deleg ated Scope ( deleg ation : ĠString ): ĠPair < String , ĠInt >? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdeleg ation Ġto Ġwhen Ġ( deleg ation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApi Constants . DE LEG ATION _ PACKAGE _ ACCESS Ġ-> ĠĠ ĠR . string . label _ deleg ation _ package _ access ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApi Constants . DE LEG ATION _ PERMISSION _ GRANT Ġ-> ĠR . string . label _ deleg ation _ permission _ grant ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApi Constants . DE LEG ATION _ APP _ OPS Ġ-> ĠĠĠĠĠĠĠĠĠ ĠR . string . label _ deleg ation _ app _ ops ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlog And Toast ( context : ĠContext ?, Ġpkg : ĠString ?, Ġmessage : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . w ( TAG , Ġmessage ) ĊĠĠĠĠĠĠĠ Ġpkg ?. let Ġ{ ĠApps . of ( context ). getApp Info ( it ) Ġ} ?. flags ?. apply Ġ{ Ġand ( Application Info . FLAG _ TEST _ ONLY ) Ġ!= Ġ 0 Ġ} ?. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( context , Ġmessage , ĠToast . LENGTH _ LONG ). show () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠInitial izer Ġ: ĠP seudo Content Provider () Ġ{ Ġoverride Ġfun ĠonCreate (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġcontext (); Ġval Ġpolicies Ġ= ĠDevice Policies ( context ) ĊĠĠĠĠĠĠĠ Ġif Ġ( policies . is Profile Or Device Owner On Calling User ) Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpolicies . execute ( Device Policy Manager :: set Restrictions Provider , ĠComponent Name ( context , ĠDeleg ated Scope Authorization :: class . java )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġallows Ġus Ġ( th us ĠAPI Ġcaller ) Ġto Ġcall ĠDevice Policy Manager ĠAPIs Ġwith Ġnull Ġas Ġadmin Ġcomponent Ġargument . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( SDK _ INT Ġ>= ĠO ) Ġpolicies . execute ( Device Policy Manager :: set Deleg ated Scopes , Ġcontext . packageName , ĠlistOf ( DE LEG ATION _ PACKAGE _ ACCESS )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . package Manager . set Component Enabled Setting ( Component Name ( context , Ġjava Class ), ĠCOMPONENT _ ENABLED _ STATE _ DISABLED , ĠD ONT _ KILL _ APP ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠRuntimeException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Error Ġinitializing ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ}} Ċ } Ċ Ċ private Ġconst Ġval ĠTAG Ġ= Ġ" Is land . D SA "