package Ġcom . sh z labs . permissions manager Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroidx . annotation . NonNull Ċ import Ġandroidx . annotation . String Res Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġjava . lang . ref . Weak Reference Ċ Ċ class ĠPermission Manager Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠREQUEST _ CODE Ġ= Ġ 3 0 0 ĊĠĠĠ Ġ@ String Res ĊĠĠĠ Ġprivate Ġvar Ġdesc Res : ĠInt Ġ= ĠR . string . pm x _ default _ description ; ĊĊĠĠĠ Ġprivate Ġvar Ġbottom Sheet Menu : ĠBottom Sheet Menu ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġpermissions : ĠArrayList < String > Ġ= Ġarray ListOf () ĊĠĠĠ Ġprivate Ġvar Ġcallback : ĠPermission Callback ? Ġ= Ġnull ; ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġcontext Weak Ref : ĠWeak Reference < AppCompatActivity >? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġpermission Manager Weak Ref : ĠWeak Reference < Permission Manager >? Ġ= Ġnull ĊĊĊĠĠĠĠĠĠĠ Ġfun Ġwith ( context : ĠAppCompatActivity ): ĠPermission Manager Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Weak Ref Ġ= ĠWeak Reference ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermission Manager Weak Ref Ġ= ĠWeak Reference ( Permission Manager ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget Permission Manager () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Permission Manager (): ĠPermission Manager Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpermission Manager Weak Ref ?. get () !! ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠgetActivity (): ĠAppCompatActivity Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcontext Weak Ref ?. get () !! ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrequest ( permission : ĠString ): ĠPermission Manager Ġ{ ĊĠĠĠĠĠĠĠ Ġpermissions . add ( permission ) ĊĠĠĠĠĠĠĠ Ġreturn Ġget Permission Manager () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrequest ( permission Arr : ĠArray < String >): ĠPermission Manager Ġ{ ĊĠĠĠĠĠĠĠ Ġpermissions . addAll ( permission Arr ) ĊĠĠĠĠĠĠĠ Ġreturn Ġget Permission Manager () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Description (@ String Res Ġdesc Res : ĠInt ): ĠPermission Manager Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . desc Res Ġ= Ġdesc Res ĊĠĠĠĠĠĠĠ Ġreturn Ġget Permission Manager () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġask () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// TODO ĠChange Ġcallback Ġto Ġlambda Ġ? ĊĠĠĠĠĠĠĠ Ġbottom Sheet Menu Ġ= ĠBottom Sheet Menu ( getActivity () Ġas ĠContext , Ġobject Ġ: ĠBottom Sheet Menu . Custom Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Pro ceed To Ask Permission () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Sheet Menu ?. hide () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Permission () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġbottom Sheet Menu ?. setDescription ( desc Res ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! Permission Util . should Ask For Permission ( getActivity (), Ġpermissions . to Typed Array ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbottom Sheet Menu ?. show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Callbacks ( callback : ĠPermission Callback ) Ġ: ĠPermission Manager { ĊĠĠĠĠĠĠĠ Ġthis . callback Ġ= Ġcallback ; ĊĠĠĠĠĠĠĠ Ġreturn Ġget Permission Manager () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Request Permission Result ( request Code : ĠInt , Ġ@ NonNull Ġpermissions : ĠArray < out ĠString >, Ġ@ NonNull Ġgrant Results : ĠArray < Int >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ!= ĠREQUEST _ CODE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġpermissions . forEach Indexed Ġ{ Ġindex , Ġperm Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( grant Results [ index ] Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ) Ġcallback ?. on Permission Accepted ( perm ) Ġelse Ġcallback ?. on Permission Rejected ( perm ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Permission () Ġ{ ĊĠĠĠĠĠĠĠ ĠPermission Util . request Permission ( getActivity (), Ġpermissions . to Typed Array (), ĠREQUEST _ CODE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠPermission Callback Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġon Permission Accepted ( permission : ĠString ) ĊĠĠĠĠĠĠĠ Ġfun Ġon Permission Rejected ( permission : ĠString ) ĊĠĠĠ Ġ} ĊĊ Ċ }