/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 1 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* Ġ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 Ġcom . android . system ui . flags Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Broadcast Receiver Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . database . Content Observer Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Handler Ċ import Ġandroid . provider . Settings Ċ import Ġandroidx . concurrent . futures . Callback To Future Adapter Ċ import Ġcom . google . common . util . concurrent . List enable Future Ċ import Ġorg . json . JSONException Ċ import Ġorg . json . JSONObject Ċ Ċ class ĠFlag Manager Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġcontext : ĠContext , ĊĠĠĠ Ġprivate Ġval Ġhandler : ĠHandler Ċ ) Ġ: ĠFlag Reader Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠRE CE IV ING _ PACKAGE Ġ= Ġ" com . android . system ui " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠACTION _ SET _ FLAG Ġ= Ġ" com . android . system ui . action . SET _ FLAG " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠACTION _ GET _ FLAGS Ġ= Ġ" com . android . system ui . action . GET _ FLAGS " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠFLAGS _ PERMISSION Ġ= Ġ" com . android . system ui . permission . FLAGS " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠFIELD _ ID Ġ= Ġ" id " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠFIELD _ VALUE Ġ= Ġ" value " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠFIELD _ TYPE Ġ= Ġ" type " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠFIELD _ FLAGS Ġ= Ġ" flags " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTYPE _ BOOLEAN Ġ= Ġ" boolean " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSET T INGS _ PREFIX Ġ= Ġ" system ui / flags " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġlisteners : ĠMutable Set < Flag Reader . Listener > Ġ= Ġmutable Set Of () ĊĠĠĠ Ġprivate Ġval Ġsettings Observer : ĠContent Observer Ġ= ĠSettings Observer () ĊĊĠĠĠ Ġfun Ġget Flags Future (): ĠList enable Future < Collection < Flag <* >>> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( ACTION _ GET _ FLAGS ) ĊĠĠĠĠĠĠĠ Ġintent . set Package ( RECE IV ING _ PACKAGE ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠCallback To Future Adapter . get Future Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomp leter : ĠCallback To Future Adapter . Comp leter < Any ?> Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . send Ordered Broadcast ( intent , Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠBroadcast Receiver () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Receive ( context : ĠContext , Ġintent : ĠIntent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġextras : ĠBundle ? Ġ= Ġget Result Extras ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠlistOf Flags : Ġjava . util . ArrayList < Flag <* >> ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextras ?. get Parcelable ArrayList ( FIELD _ FLAGS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( listOf Flags Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomp leter . set ( listOf Flags ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomp leter . set Exception ( No Flag Results Exception ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġnull , ĠActivity . RESULT _ OK , Ġ" extra Ġdata ", Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Query ing Flags " ĊĠĠĠĠĠĠĠ Ġ} Ġas ĠList enable Future < Collection < Flag <* >>> ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Flag Value ( id : ĠInt , Ġenabled : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= Ġcreate Intent ( id ) ĊĠĠĠĠĠĠĠ Ġintent . putExtra ( FIELD _ VALUE , Ġenabled ) ĊĊĠĠĠĠĠĠĠ Ġcontext . send Broadcast ( intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġerase Flag ( id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= Ġcreate Intent ( id ) ĊĊĠĠĠĠĠĠĠ Ġcontext . send Broadcast ( intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Enabled ( id : ĠInt , Ġdef : ĠBoolean ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġis Enabled ( id ) Ġ?: Ġdef ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠReturns Ġthe Ġstored Ġvalue Ġor Ġnull Ġif Ġnot Ġset . Ġ Ġ*/ ĊĠĠĠ Ġfun Ġis Enabled ( id : ĠInt ): ĠBoolean ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata : ĠString ? Ġ= ĠSettings . Secure . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . content Resolver , Ġkey To Settings Prefix ( id )) ĊĠĠĠĠĠĠĠ Ġif Ġ( data Ġ== Ġnull Ġ|| Ġdata ?. isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġjson : ĠJSONObject ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjson Ġ= ĠJSONObject ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ(! assert Type ( json , ĠTYPE _ BOOLEAN )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġjson . getBoolean ( FIELD _ VALUE ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠJSON Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Flag Storage Exception () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd Listener ( listener : ĠFlag Reader . Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( listeners ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġregister Needed Ġ= Ġlisteners . isEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlisteners . add ( listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( register Needed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . content Resolver . register Content Observer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSettings . Secure . get Uri For ( SETTINGS _ PREFIX ), Ġtrue , Ġsettings Observer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġremove Listener ( listener : ĠFlag Reader . Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( listeners ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Registered Ġ= Ġ! listeners . isEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlisteners . remove ( listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Registered Ġ&& Ġlisteners . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . content Resolver . unregister Content Observer ( settings Observer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Intent ( id : ĠInt ): ĠIntent Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( ACTION _ SET _ FLAG ) ĊĠĠĠĠĠĠĠ Ġintent . set Package ( RECE IV ING _ PACKAGE ) ĊĠĠĠĠĠĠĠ Ġintent . putExtra ( FIELD _ ID , Ġid ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġintent ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġkey To Settings Prefix ( key : ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSET T INGS _ PREFIX Ġ+ Ġ"/" Ġ+ Ġkey ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġassert Type ( json : ĠJSONObject , Ġtype : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjson . getString ( FIELD _ TYPE ) Ġ== ĠTYPE _ BOOLEAN ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠJSON Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠSettings Observer Ġ: ĠContent Observer ( handler ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonChange ( self Change : ĠBoolean , Ġuri : ĠUri ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( uri Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparts Ġ= Ġuri . path Segments ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Str Ġ= Ġparts [ parts . size Ġ- Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġid Str . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlisteners . forEach Ġ{ Ġl Ġ-> Ġl . on Flag Changed ( id ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNumber FormatException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġno - op ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠInvalid Flag Storage Exception Ġ: ĠException (" Data Ġfound Ġbut Ġis Ġinvalid ") Ċ Ċ class ĠNo Flag Results Exception Ġ: ĠException ( ĊĠĠĠ Ġ" System UI Ġfailed Ġto Ġcommunicate Ġits Ġflags Ġback Ġsuccessfully ")