package Ġcom . se mis on fire . cloud gallery . core . per mis son Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . DialogInterface Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . net . Uri . from Parts Ċ import Ġandroid . provider . Settings . ACTION _ APPLICATION _ DETAILS _ SETTINGS Ċ import Ġandroidx . appcompat . app . AlertDialog Ċ import Ġandroidx . core . app . Activity Compat Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġjavax . inject . Inject Ċ Ċ interface ĠPermission Result Callback Ġ{ ĊĠĠĠ Ġfun Ġon Permission Granted () ĊĠĠĠ Ġfun Ġon Permission Denied ( permission List : ĠArray < String >) ĊĠĠĠ Ġfun Ġon Permission Per manently Denied ( permission : ĠString ) Ċ } Ċ Ċ private Ġdata Ġclass ĠPermission Entity ( ĊĠĠĠ Ġval Ġpermission : ĠString Ġ= Ġ"", ĊĠĠĠ Ġval Ġper manently Denied : ĠBoolean Ġ= Ġfalse Ċ ) Ċ Ċ data Ġclass ĠAlert Button ( ĊĠĠĠ Ġval Ġtitle : ĠString Ġ= Ġ"", ĊĠĠĠ Ġval Ġclick Listener : Ġ(() Ġ-> ĠUnit )? Ġ= Ġnull Ċ ) Ġ{ ĊĠĠĠ Ġfun ĠisEmpty (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtitle . isEmpty () Ġ&& Ġclick Listener Ġ== Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis NotEmpty (): ĠBoolean Ġ= Ġ! isEmpty () Ċ } Ċ Ċ class ĠPermission Manager Ġ@ Inject Ġconstructor () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPER MISSION _ REQUEST _ CODE Ġ= Ġ 1 0 0 2 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġpermission Result Callback : ĠPermission Result Callback ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġon Request Permissions Result ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠActivity , ĊĠĠĠĠĠĠĠ Ġrequest Code : ĠInt , ĊĠĠĠĠĠĠĠ Ġpermissions : ĠArray < out ĠString >, ĊĠĠĠĠĠĠĠ Ġgrant Results : ĠInt Array ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== ĠPER MISSION _ REQUEST _ CODE ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpermission Result Ġ= Ġmutable ListOf < Permission Entity >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Check Ġpermission Ġresults ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgrant Results . forEach Indexed Ġ{ Ġi , Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ== ĠPackage Manager . PERMISSION _ DEN IED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpermission Ġ= Ġpermissions [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġper manently Denied Ġ= Ġis Permission Pre manently Denied ( context , Ġpermission ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpermission Entity Ġ= ĠPermission Entity ( permission , Ġper manently Denied ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpermission Result . add ( permission Entity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpermission Result . isEmpty () Ġ&& Ġgrant Results . isNotEmpty () Ġ-> Ġpermission Result Callback ?. on Permission Granted () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdenied Permissions Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpermission Result . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . per manently Denied ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdenied Permissions . add ( it . permission ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpermission Result Callback ?. on Permission Per manently Denied ( it . permission ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpermission Result Callback ?. on Permission Denied ( den ied Permissions . to Typed Array ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcheck Permissions ( ĊĠĠĠĠĠĠĠ Ġfragment : ĠFragment , ĊĠĠĠĠĠĠĠ Ġpermission Result Callback : ĠPermission Result Callback , ĊĠĠĠĠĠĠĠ Ġvar arg Ġpermissions : ĠString ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( permissions . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . permission Result Callback Ġ= Ġpermission Result Callback ĊĊĠĠĠĠĠĠĠ Ġval Ġis Granted Ġ= Ġis Granted ( permissions , Ġfragment . require Activity ()) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! is Granted ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragment . request Permissions ( permissions , ĠPER MISSION _ REQUEST _ CODE ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermission Result Callback . on Permission Granted () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcheck Permissions ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠActivity , ĊĠĠĠĠĠĠĠ Ġpermission Result Callback : ĠPermission Result Callback , ĊĠĠĠĠĠĠĠ Ġvar arg Ġpermissions : ĠString ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( permissions . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . permission Result Callback Ġ= Ġpermission Result Callback ĊĊĠĠĠĠĠĠĠ Ġval Ġis Granted Ġ= Ġis Granted ( permissions , Ġcontext ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! is Granted ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠActivity Compat . request Permissions ( context , Ġpermissions , ĠPER MISSION _ REQUEST _ CODE ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermission Result Callback . on Permission Granted () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Permission Pre manently Denied ( activity : ĠActivity , Ġpermission : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ! should Show R ationale ( activity , Ġpermission ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshould Show R ationale ( activity : ĠActivity , Ġpermission : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠActivity Compat . should Show Request Permission R ationale ( activity , Ġpermission ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpermission AlertDialog ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠ Ġtitle : ĠString Ġ= Ġ"", ĊĠĠĠĠĠĠĠ Ġmessage : ĠString Ġ= Ġ"", ĊĠĠĠĠĠĠĠ Ġpositive : ĠAlert Button Ġ= ĠAlert Button (), ĊĠĠĠĠĠĠĠ Ġneutral : ĠAlert Button Ġ= ĠAlert Button (), ĊĠĠĠĠĠĠĠ Ġnegative : ĠAlert Button Ġ= ĠAlert Button () ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠAlertDialog . Builder ( context ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( title . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . setTitle ( title ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( message . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . setMessage ( message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdialog Listener Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDialog Interface . OnClickListener Ġ{ Ġdialog : ĠDialog Interface , Ġwhich : ĠInt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( which ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAlertDialog . BUTTON _ POSITIVE Ġ-> Ġpositive . click Listener ?. invoke () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAlertDialog . BUTTON _ NEGATIVE Ġ-> Ġnegative . click Listener ?. invoke () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAlertDialog . BUTTON _ NE UT R AL Ġ-> Ġneutral . click Listener ?. invoke () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( positive . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . set Positive Button ( positive . title , Ġdialog Listener ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( negative . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . set Negative Button ( negative . title , Ġdialog Listener ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( neutral . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . set Neutral Button ( neutral . title , Ġdialog Listener ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbuilder . create (). show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġopen Application Settings ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ APPLICATION _ DETAILS _ SETTINGS , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Parts (" package ", Ġcontext . packageName , Ġnull ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġintent . add Category ( Intent . CATEGORY _ DEFAULT ) ĊĠĠĠĠĠĠĠ Ġintent . add Flags ( Intent . FLAG _ ACTIVITY _ SINGLE _ TOP ) ĊĠĠĠĠĠĠĠ Ġcontext . startActivity ( intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Permission Granted ( context : ĠActivity , Ġpermission : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠContext Compat . check Self Permission ( context , Ġpermission ) Ġ== ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPackage Manager . PERMISSION _ GRAN TED ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Granted ( ĊĠĠĠĠĠĠĠ Ġpermissions : ĠArray < out ĠString >, ĊĠĠĠĠĠĠĠ Ġcontext : ĠActivity ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġis Granted Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġpermissions . forEach Ġ{ Ġpermission Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! check Permission Granted ( context , Ġpermission )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Granted Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ forEach ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġis Granted ĊĠĠĠ Ġ} Ċ }