package Ġdev . john ore illy . gal way bus . ui . utils Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroidx . activity . Component Activity Ċ import Ġandroidx . activity . result . Activity Result Launcher Ċ import Ġandroidx . activity . result . contract . Activity Result Contracts Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . compose . runtime .* Ċ import Ġandroidx . compose . ui . platform . Local Lifecycle Owner Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . Mutable State Flow Ċ import Ġkotlinx . coroutines . flow . State Flow Ċ import Ġkotlinx . coroutines . flow . filter NotNull Ċ Ċ class ĠPermission State ( ĊĠĠĠĠĠĠĠ Ġval Ġpermission : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġhas Permission : ĠState Flow < Boolean >, ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlauncher : ĠActivity Result Launcher < String > Ċ ) Ġ{ ĊĠĠĠ Ġfun Ġlaunch Permission Request () Ġ= Ġlauncher . launch ( permission ) Ċ } Ċ Ċ @ Experimental Cor outines Api Ċ private Ġclass ĠPermission Result Call ( ĊĠĠĠ Ġkey : ĠString , ĊĠĠĠ Ġprivate Ġval Ġactivity : ĠComponent Activity , ĊĠĠĠ Ġprivate Ġval Ġpermission : ĠString Ċ ) Ġ{ ĊĊĠĠĠ Ġ// Ġdefer Ġthis Ġto Ġallow Ġconstruction Ġbefore ĠonCreate ĊĠĠĠ Ġprivate Ġval Ġhas Permission Ġ= Ġ ĠMutable State Flow < Boolean >( false ) ĊĊĠĠĠ Ġ// ĠDon 't Ġdo Ġthis Ġin ĠonCreate Ġbecause Ġcompose Ġset Content Ġmay Ġbe Ġcalled Ġin ĠActivity Ġusage Ġbefore ĊĠĠĠ Ġ// ĠonCreate Ġis Ġdis patched Ġto Ġthis Ġlifecycle Ġobserver Ġ( as Ġa Ġresult , Ġneed Ġto Ġmanually Ġunregister ) ĊĠĠĠ Ġprivate Ġvar Ġcall Ġ= Ġactivity . activity Result Registry . register ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Location Permissions # ($ key )", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠActivity Result Contracts . Request Permission () ĊĠĠĠ Ġ) Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠ Ġon Permission Result ( result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCall Ġthis Ġafter Ġ[ Activity . onCreate ] Ġto Ġperform Ġthe Ġinitial Ġpermissions Ġchecks ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġinitial Check () Ġ{ ĊĠĠĠĠĠĠĠ Ġhas Permission . value Ġ= Ġcheck Permission () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġunregister () Ġ{ ĊĠĠĠĠĠĠĠ Ġcall . unregister () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcheck Self Permission (): ĠPermission State Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠPermission State ( permission , Ġhas Permission , Ġcall ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Permission (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠContext Compat . check Self Permission ( activity , Ġpermission ) Ġ== ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPackage Manager . PERMISSION _ GRAN TED ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Permission Result ( result : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġhas Permission . value Ġ= Ġresult ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ /** Ċ Ġ* ĠInstantiate Ġand Ġmanage Ġit Ġin Ġcomposition Ġlike Ġthis Ċ Ġ*/ Ċ @ Experimental Compose Api Ċ @ Composable Ċ fun Ġcheck Self Permission State ( activity : ĠComponent Activity , Ġpermission : ĠString ): ĠPermission State Ġ{ ĊĠĠĠ Ġval Ġkey Ġ= Ġ" 1 " Ġ// current Composer . current Compound Key Hash . toString () ĊĠĠĠ Ġval Ġcall Ġ= Ġremember ( activity , Ġpermission ) Ġ{ ĊĠĠĠĠĠĠĠ ĠPermission Result Call ( key , Ġactivity , Ġpermission ) ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠDis posable Effect ( call ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcall . initial Check () ĊĠĠĠĠĠĠĠ Ġon Dispose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . unregister () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġcall . check Self Permission () Ċ } Ċ