package Ġcom . h library . utils . permission Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroidx . annotation . NonNull Ċ import Ġandroidx . core . app . Activity Compat Ċ import Ġcom . h library . utils . Logger ĊĊ Ċ class ĠPermission Manager ( ĊĠĠĠ Ġprivate Ġval Ġactivity : ĠActivity , ĊĠĠĠ Ġprivate Ġval Ġpermission Grant : ĠPermission Grant Ċ ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" Permission Utils " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCODE _ MULTI _ PERMISSION Ġ= Ġ 1 0 0 ĊĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġshould Show R ationale ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity : ĠActivity , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Code : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Permission : ĠString ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠActivity Compat . request Permissions ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( request Permission ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Code ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . d ( TAG , Ġ" showMessage OK Cancel Ġrequest Permissions :$ request Permission ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġactivity ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġis Should R ationale Ġtrue : Ġreturn Ġno Ġgranted Ġand Ġshould Show Request Permission R ationale Ġpermissions , Ġfalse : return Ġno Ġgranted Ġand Ġ! should Show Request Permission R ationale ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget No Granted Permission ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity : ĠActivity , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermissions : ĠArray < String >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Should R ationale : ĠBoolean ĊĠĠĠĠĠĠĠ Ġ): ĠArrayList < String >? Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġno Grant Permissions Ġ= ĠArrayList < String >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermissions . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// TODO Ġcheck Self Permission ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcheck Self Permission Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Self Permission Ġ= ĠActivity Compat . check Self Permission ( activity , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠRuntimeException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . e ( TAG , Ġ" RuntimeException :" Ġ+ Ġe . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( check Self Permission Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . i ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" get No Granted Permission ĠActivity Compat . check Self Permission Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED :$ it " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Activity Compat . should Show Request Permission R ationale ( activity , Ġit )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . d ( TAG , Ġ" should Show Request Permission R ationale Ġif ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Should R ationale ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġno Grant Permissions . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Should R ationale ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġno Grant Permissions . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . d ( TAG , Ġ" should Show Request Permission R ationale Ġelse ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġno Grant Permissions ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRequests Ġpermission . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġactivity ĊĠĠĠĠ Ġ* Ġ@ param Ġrequest Code Ġrequest Ġcode , Ġe . g . Ġif Ġyou Ġneed Ġrequest ĠCAM ERA Ġpermission , parameters Ġis ĠPermission Utils . CODE _ CAMERA ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġrequest Permission ( request Code : ĠInt , Ġpermission : ĠString ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( activity Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠLogger . i ( TAG , Ġ" request Permission Ġrequest Code :$ request Code Ġpermission :$ permission ") ĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . w ( TAG , Ġ" request Permission Ġillegal Ġrequest Code :$ request Code ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermission Grant ?. on Permission Error ( Exception (" request Permission Ġillegal Ġrequest Code :$ request Code ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcheck Self Permission : ĠInt ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Self Permission Ġ= ĠActivity Compat . check Self Permission ( activity !! , Ġpermission ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠRuntimeException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . e ( TAG , Ġ" RuntimeException :" Ġ+ Ġe . message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermission Grant ?. on Permission Error ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( check Self Permission Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . i ( TAG , Ġ" Activity Compat . check Self Permission Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Activity Compat . should Show Request Permission R ationale ( activity !! , Ġpermission )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . i ( TAG , Ġ" request Permission Ġshould Show Request Permission R ationale ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshould Show R ationale ( activity !! , Ġrequest Code , Ġpermission ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . d ( TAG , Ġ" request Camera Permission Ġelse ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠActivity Compat . request Permissions ( activity !! , ĠarrayOf ( permission ), Ġrequest Code ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . d ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Activity Compat . check Self Permission Ġ=== = ĠPackage Manager . PERMISSION _ GRAN TED " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermission Grant ?. on Permission Granted ( permission ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ ä¸Ģæ¬¡ çĶ³è¯· å¤ļä¸ª æĿĥéĻĲ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġrequest Multi Permissions ( permissions : ĠArray < String >) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġpermissions List Ġ= Ġget No Granted Permission ( activity !! , Ġpermissions , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġval Ġshould R ationale Permissions List Ġ= Ġget No Granted Permission ( activity !! , Ġpermissions , Ġtrue ) ĊĊĠĠĠĠĠĠĠ Ġ// TODO Ġcheck Self Permission ĊĠĠĠĠĠĠĠ Ġif Ġ( permissions List Ġ== Ġnull Ġ|| Ġshould R ationale Permissions List Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermission Grant ?. on Permission Error ( Exception (" Please ĠCheck Sel Permission ! ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠLogger . d ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" request Multi Permissions Ġpermissions List :${ permissions List . size } Ġ, should R ationale Permissions List :${ should R ationale Permissions List . size }" ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( permissions List . size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠActivity Compat . request Permissions ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity !! , Ġpermissions List . to Typed Array (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCODE _ MULTI _ PERMISSION ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . d ( TAG , Ġ" showMessage OK Cancel Ġrequest Permissions ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( should R ationale Permissions List . size Ġ> Ġ 0 ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġshow Message OK Cancel ( activity !! , Ġ" should Ġopen Ġthose Ġpermission ", Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDialog Interface . OnClickListener Ġ{ Ġdialog , Ġwhich Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠActivity Compat . request Permissions ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity !! , Ġshould R ationale Permissions List . to Typed Array (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCODE _ MULTI _ PERMISSION ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . d ( TAG , Ġ" showMessage OK Cancel Ġrequest Permissions ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermission Grant ?. on Permission Granted ( CODE _ MULTI _ PERMISSION . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Request Permissions Result ( ĊĠĠĠĠĠĠĠ Ġrequest Code : ĠInt , ĊĠĠĠĠĠĠĠ Ġ@ NonNull Ġpermissions : ĠArray < String >, ĊĠĠĠĠĠĠĠ Ġ@ NonNull Ġgrant Results : ĠInt Array ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( activity Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠLogger . d ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" request Permissions Result Ġpermission :$ permissions , grant Results :$ grant Results " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġif Ġ( permissions . size Ġ== Ġ 1 Ġ&& Ġgrant Results [ 0 ] Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . i ( TAG , Ġ" on Request Permissions Result ĠPER MISSION _ GRAN TED ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// TODO Ġsuccess , Ġdo Ġsomething , Ġcan Ġuse Ġcallback ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermission Grant ?. on Permission Granted ( permissions [ 0 ]) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ċ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġpermission Error Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġpermission Errors Ġ= ĠArrayList < String >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġpermissions . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( grant Results [ i ] Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( permission Error . count () Ġ> Ġ 0 ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpermission Error . append ("\ n ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpermission Errors . add ( permissions [ i ]. replace (" android . permission .", Ġ"")) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpermission Error . append ( activity ?. resources ?. getString ( R . string . permission _ hint , Ġpermissions [ i ]. replace (" android . permission .", Ġ" "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// TODO Ġhint Ġuser Ġthis Ġpermission Ġfunction ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . i ( TAG , Ġ" on Request Permissions Result Ġpermission Errors Ġ$ permission Errors ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( permission Errors . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpermission Grant ?. on Permission Granted ( request Code . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpermission Grant ?. on Permission Denied ( permission Errors ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen Setting Activity ( activity !! , Ġpermission Error . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } ĊĊ