package Ġcom . react native aud i ow ave form . permission Ċ Ċ import Ġjava . lang . ref . Reference Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Build Ċ import Ġandroid . provider . Settings Ċ import Ġandroidx . core . app . Activity Compat Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġcom . facebook . react . modules . core . Permission Aware Activity Ċ import Ġcom . facebook . react . modules . core . Permission Listener Ċ import Ġcom . react native aud i ow ave form . permission . callback .* Ċ import Ġjava . lang . ref . Weak Reference Ċ import Ġjava . util . ArrayList Ċ import Ġjava . util . Arrays Ċ Ċ class ĠRuntime Permission ( activity : ĠActivity ?, Ġval Ġlistener : ĠPermission Listener ) Ġ{ ĊĠ Ġprivate Ġval Ġactivity Reference : ĠReference < Activity > ĊĠ Ġprivate Ġval Ġpermissions To Request Ġ= ĠArrayList < String >() ĊĊĠ Ġprivate Ġvar Ġis R ationale Ġ= Ġfalse ĊĠ Ġprivate Ġval Ġaccepted Callbacks Ġ= ĠArrayList <( Accepted Callback ) Ġ-> ĠUnit >() ĊĠ Ġprivate Ġval Ġdenied Callbacks Ġ= ĠArrayList <( Denied Callback ) Ġ-> ĠUnit >() ĊĠ Ġprivate Ġval Ġforever Denied Callbacks Ġ= ĠArrayList <( Fore ver Denied Callback ) Ġ-> ĠUnit >() ĊĠ Ġprivate Ġval Ġresponse Callbacks Ġ= ĠArrayList <( Permission Callback ) Ġ-> ĠUnit >() ĊĠ Ġprivate Ġval Ġlistener Callbacks Ġ= ĠArrayList <( Listener Callback ) Ġ-> ĠUnit >() ĊĊĠ Ġinit Ġ{ ĊĠĠĠ Ġif Ġ( activity Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġthis . activity Reference Ġ= ĠWeak Reference ( activity ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġthis . activity Reference Ġ= ĠWeak Reference ( null ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġgo To Settings () Ġ{ ĊĠĠĠ Ġval Ġfragment Activity Ġ= Ġthis . activity Reference . get () ĊĠĠĠ Ġfragment Activity ?. startActivity ( ĊĠĠĠĠĠ ĠIntent ( ĊĠĠĠĠĠĠĠ ĠSettings . ACTION _ APPLICATION _ DETAILS _ SETTINGS , ĊĠĠĠĠĠĠĠ ĠUri . from Parts (" package ", Ġfragment Activity . packageName , Ġnull ) ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġon Received Permission Result ( ĊĠĠĠ Ġaccepted Permissions : ĠList < String >, ĊĠĠĠ Ġrefused Permissions : ĠList < String > ?, ĊĠĠĠ Ġask Again Permissions : ĠList < String >? ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġval Ġpermission Result Ġ= ĠPermission Callback ( ĊĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠ Ġaccepted Permissions , ĊĠĠĠĠĠ Ġrefused Permissions , ĊĠĠĠĠĠ Ġask Again Permissions ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġif Ġ( permission Result . has Accepted ()) Ġ{ ĊĠĠĠĠĠ Ġfor Ġ( callback Ġin Ġaccepted Callbacks ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcallback . invoke ( Accepted Callback ( permission Result . accepted )) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( permission Result . has Denied () Ġ&& Ġ! is R ationale ) Ġ{ ĊĠĠĠĠĠ Ġfor Ġ( callback Ġin Ġdenied Callbacks ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcallback . invoke ( Denied Callback ( this , Ġpermission Result . den ied )) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( permission Result . has Fore ver Denied ()) Ġ{ ĊĠĠĠĠĠ Ġfor Ġ( callback Ġin Ġforever Denied Callbacks ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcallback . invoke ( Fore ver Denied Callback ( this , Ġpermission Result . fore ver Denied )) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( permission Result . has Denied () Ġ|| Ġpermission Result . has Fore ver Denied ()) Ġ{ ĊĠĠĠĠĠ Ġfor Ġ( callback Ġin Ġlistener Callbacks ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! permission Result . has Denied ()){ ĊĠĠĠĠĠĠĠĠĠ Ġcallback . invoke ( Listener Callback ( this , Ġpermission Result . fore ver Denied , Ġpermission Result . den ied )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif (! is R ationale ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġcallback . invoke ( Listener Callback ( this , Ġpermission Result . fore ver Denied , Ġpermission Result . den ied )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfor Ġ( callback Ġin Ġresponse Callbacks ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ(! permission Result . has Denied ()){ ĊĠĠĠĠĠĠĠ Ġcallback . invoke ( permission Result ) ĊĠĠĠĠĠ Ġ} Ġelse Ġif (! is R ationale ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcallback . invoke ( permission Result ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġrequest ( permissions : ĠList < String >? ): ĠRuntime Permission Ġ{ ĊĠĠĠ Ġif Ġ( permissions Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġpermissions To Request . clear () ĊĠĠĠĠĠ Ġpermissions To Request . addAll ( permissions ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġthis ĊĠ Ġ} ĊĊĠ Ġfun Ġrequest ( var arg Ġpermissions : ĠString ): ĠRuntime Permission Ġ{ ĊĠĠĠ Ġreturn Ġthis . request ( Arrays . asList (* permissions )) ĊĠ Ġ} ĊĊĠ Ġfun Ġon Accepted ( accepted : Ġ( Accepted Callback ) Ġ-> ĠUnit ): ĠRuntime Permission Ġ{ ĊĠĠĠ Ġaccepted Callbacks . add ( accepted ) ĊĠĠĠ Ġreturn Ġthis ĊĠ Ġ} ĊĊĠ Ġfun Ġon Denied ( den ied : Ġ( Denied Callback ) Ġ-> ĠUnit ): ĠRuntime Permission Ġ{ ĊĠĠĠ Ġdenied Callbacks . add ( den ied ) ĊĠĠĠ Ġreturn Ġthis ĊĠ Ġ} ĊĊĠ Ġfun Ġon Fore ver Denied ( fore ver Denied : Ġ( Fore ver Denied Callback ) Ġ-> ĠUnit ): ĠRuntime Permission Ġ{ ĊĠĠĠ Ġforever Denied Callbacks . add ( fore ver Denied ) ĊĠĠĠ Ġreturn Ġthis ĊĠ Ġ} ĊĊĠ Ġfun Ġon Response ( callback : Ġ( Permission Callback ) Ġ-> ĠUnit ): ĠRuntime Permission Ġ{ ĊĠĠĠ Ġresponse Callbacks . add ( callback ) ĊĠĠĠ Ġreturn Ġthis ĊĠ Ġ} ĊĊĠ Ġfun Ġon Listener ( accepted : Ġ( Accepted Callback ) Ġ-> ĠUnit , Ġdenied : Ġ( Listener Callback ) Ġ-> ĠUnit ): ĠRuntime Permission Ġ{ ĊĠĠĠ Ġaccepted Callbacks . add ( accepted ) ĊĠĠĠ Ġlistener Callbacks . add ( den ied ) ĊĠĠĠ Ġreturn Ġthis ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġfind Needed Permissions ( context : ĠContext ): ĠList < String > Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ( permissions To Request . isEmpty ()) Ġ{ ĊĠĠĠĠĠ ĠPermission Manifest Finder . find Needed Permissions From Manifest ( context ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġpermissions To Request ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġask () Ġ{ ĊĠĠĠ Ġval Ġactivity Ġ= Ġactivity Reference . get () ĊĠĠĠ Ġif Ġ( activity Ġ== Ġnull Ġ|| Ġactivity . is Finish ing ) Ġ{ ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġpermissions Ġ= Ġfind Needed Permissions ( activity ) ĊĠĠĠ Ġif Ġ( permissions . isEmpty () Ġ|| ĠBuild . VERSION . SDK _ INT Ġ< ĠBuild . VERSION _ CODES . M Ġ|| Ġare Permissions Already Accepted ( activity , Ġpermissions )) Ġ{ ĊĠĠĠĠĠ Ġon All Accepted ( permissions ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġis R ationale Ġ= Ġare Permissions Already R ationale ( activity , Ġpermissions ) ĊĠĠĠĠĠ Ġval Ġpermission Aware Activity : ĠPermission Aware Activity Ġ= Ġget Permission Aware Activity ( activity ) ĊĠĠĠĠĠ Ġpermission Aware Activity . request Permissions ( permissions . to Typed Array (), Ġ 5 0 0 0 , Ġlistener ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġon Request Permissions Result ( request Code : ĠInt , Ġpermissions : ĠArray < String >, Ġgrant Results : ĠInt Array ) Ġ{ ĊĠĠĠ Ġval Ġactivity Ġ= Ġactivity Reference . get () ĊĠĠĠ Ġif Ġ( activity Ġ== Ġnull Ġ|| Ġactivity . is Finish ing ) Ġ{ ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġaccepted Permissions Ġ= ĠArrayList < String >() ĊĠĠĠ Ġval Ġask Again Permissions Ġ= ĠArrayList < String >() ĊĠĠĠ Ġval Ġrefused Permissions Ġ= ĠArrayList < String >() ĊĊĠĠĠ Ġfor Ġ( i Ġin Ġpermissions . indices ) Ġ{ ĊĠĠĠĠĠ Ġval Ġpermission Name Ġ= Ġpermissions [ i ] ĊĠĠĠĠĠ Ġif Ġ( grant Results [ i ] Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠ Ġaccepted Permissions . add ( permission Name ) ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( activity . should Show Request Permission R ationale ( permission Name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġask Again Permissions . add ( permission Name ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġrefused Permissions . add ( permission Name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġon Received Permission Result ( accepted Permissions , Ġrefused Permissions , Ġask Again Permissions ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġare Permissions Already Accepted ( context : ĠContext , Ġpermissions : ĠList < String >): ĠBoolean Ġ{ ĊĠĠĠ Ġfor Ġ( permission Ġin Ġpermissions ) Ġ{ ĊĠĠĠĠĠ Ġval Ġpermission State Ġ= ĠContext Compat . check Self Permission ( context , Ġpermission ) ĊĠĠĠĠĠ Ġif Ġ( permission State Ġ== ĠPackage Manager . PERMISSION _ DEN IED ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtrue ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġare Permissions Already R ationale ( context : ĠContext , Ġpermissions : ĠList < String >): ĠBoolean Ġ{ ĊĠĠĠ Ġfor Ġ( permission Ġin Ġpermissions ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ(! Activity Compat . should Show Request Permission R ationale ( context Ġas ĠActivity , Ġpermission )) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtrue ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġon All Accepted ( permissions : ĠList < String >) Ġ{ ĊĠĠĠ Ġon Received Permission Result ( permissions , Ġnull , Ġnull ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġget Permission Aware Activity ( activity : ĠActivity ?): ĠPermission Aware Activity Ġ{ ĊĠĠĠ ĠcheckNotNull ( activity ) Ġ{ Ġ" Tri ed Ġto Ġuse Ġpermissions ĠAPI Ġwhile Ġnot Ġattached Ġto Ġan ĠActivity ." Ġ} ĊĠĠĠ Ġcheck ( activity Ġis ĠPermission Aware Activity ) Ġ{ ĊĠĠĠĠĠ Ġ" Tri ed Ġto Ġuse Ġpermissions ĠAPI Ġbut Ġthe Ġhost ĠActivity Ġdoesn 't Ġimplement ĠPermission Aware Activity ." ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġactivity ĊĠ Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" PERMISSION _ FRAGMENT " ĊĊĠĠĠ Ġfun Ġask Permission ( activity : ĠActivity ?, Ġlistener : ĠPermission Listener , Ġvar arg Ġpermissions : ĠString ): ĠRuntime Permission Ġ{ ĊĠĠĠĠĠ Ġreturn ĠRuntime Permission ( activity , Ġlistener ). request (* permissions ) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ