package Ġcom . sq 2 6 . experience . util . permissions Ċ Ċ 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 . os . Bundle Ċ import Ġandroid . provider . Settings Ċ import Ġandroidx . activity . result . contract . Activity Result Contracts Ċ import Ġandroidx . core . app . Activity Compat Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . Fragment Activity Ċ import Ġandroidx . lifecycle .* ĊĊ Ċ /** æĿĥéĻĲ çĶ³è¯· Ċ Ġ* Ċ Ġ*/ Ċ class ĠJ Permissions ( ĊĠĠĠ Ġprivate Ġval Ġcontext : ĠFragment Activity Ċ ) Ġ: ĠLifecycle Observer Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ// æīĵå¼Ģ åºĶçĶ¨ çļĦ ç³»ç»Ł è®¾ç½® ĊĠĠĠĠĠĠĠ Ġfun Ġopen Settings ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . action Ġ= ĠSettings . ACTION _ APPLICATION _ DETAILS _ SETTINGS ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuri : ĠUri Ġ= ĠUri . from Parts (" package ", Ġcontext . packageName , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . data Ġ= Ġuri ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . startActivity ( intent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// åĪ¤æĸŃ æĺ¯åĲ¦ æľī æĿĥéĻĲ ĊĠĠĠĠĠĠĠ Ġfun Ġwhether Permissions ( context : ĠContext , Ġpermissions : ĠArray < String >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// æĹł æĿĥéĻĲ æķ°éĩı ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdenied Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermissions . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// åĪ¤æĸŃ æĺ¯åĲ¦ æĹł æĿĥéĻĲ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Context Compat . check Self Permission ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ== ĠPackage Manager . PERMISSION _ DEN IED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// æĹł æĿĥéĻĲ åĬł 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdenied ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// æĹł æĿĥéĻĲ æķ°éĩı ä¸įæĺ¯ 0 è¡¨ç¤º æĹł æĿĥéĻĲ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdenied Ġ== Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// æĪĲåĬŁ çļĦ åĽŀè°ĥ ĊĠĠĠ Ġprivate Ġvar Ġsuccess Callback : Ġ() Ġ-> ĠUnit Ġ= Ġ{} ĊĊĠĠĠ Ġ// å¤±è´¥ çļĦ åĽŀè°ĥ ĊĠĠĠ Ġ// success List : æĪĲåĬŁ çļĦ åĪĹè¡¨ , failure å¤±è´¥ çļĦ åĪĹè¡¨ , no Prompt : ä¸įèĥ½ ç»§ç»Ń çĶ³è¯· çļĦ æĿĥéĻĲ çļĦ åĪĹè¡¨ ĊĠĠĠ Ġprivate Ġvar Ġfailure Callback : Ġ( success List : ĠList < String >, Ġfailure : ĠList < String >, Ġref use List : ĠList < String >) Ġ-> ĠUnit Ġ= ĊĠĠĠĠĠĠĠ Ġ{ Ġ_, Ġ_, Ġ_ Ġ-> Ġ} ĊĊĠĠĠ Ġ// è®¾ç½® æĪĲåĬŁ çļĦ åĽŀè°ĥ ĊĠĠĠ Ġfun Ġsuccess ( block : Ġ() Ġ-> ĠUnit ): ĠJ Permissions Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . success Callback Ġ= Ġblock ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// è®¾ç½® å¤±è´¥ çļĦ åĽŀè°ĥ ĊĠĠĠ Ġfun Ġfailure ( block : Ġ( success List : ĠList < String >, Ġfailure : ĠList < String >, Ġref use List : ĠList < String >) Ġ-> ĠUnit ): ĠJ Permissions Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . failure Callback Ġ= Ġblock ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// è´Ł è´£ è¯·æ±Ĥ æĿĥéĻĲ çļĦ fragment ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġpermissions Fragment : ĠPermissions Fragment ĊĊĠĠĠ Ġ// å¼Ģå§ĭ ( request Permissions : è¦ģ çĶ³è¯· çļĦ æĿĥéĻĲ ) ĊĠĠĠ Ġfun Ġstart ( request Permissions : ĠArray < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// åı¯ä»¥ åİ» çĶ³è¯· çļĦ æĿĥéĻĲ åĪĹè¡¨ ĊĠĠĠĠĠĠĠ Ġval Ġpending Application List Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠ Ġ// å·² è¢« æĭ Ĵ ç»Ŀ å¹¶ä¸Ķ ä¸į åľ¨ æıĲç¤º çļĦ æĿĥéĻĲ åĪĹè¡¨ ĊĠĠĠĠĠĠĠ Ġval Ġref use List Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠ Ġ// check Self Permission æ£Ģ æĵ ¦ æĺ¯åĲ¦ æľī æĿĥéĻĲ ĊĠĠĠĠĠĠĠ Ġfor Ġ( s Ġin Ġrequest Permissions ) ĊĠĠĠĠĠĠĠ Ġ// PackageManager . PERMISSION _ GRAN TED æľī æĿĥéĻĲ ĊĠĠĠĠĠĠĠ Ġ// PackageManager . PERMISSION _ DEN IED Ġ æĹł æĿĥéĻĲ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Context Compat . check Self Permission ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ== ĠPackage Manager . PERMISSION _ DEN IED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// æľª è¢« æİĪæĿĥ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// éĢĤ éħį Android Ġ 2 3 Ġ 6 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . M ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// should Show Request Permission R ationale åĪ¤æĸŃ æĺ¯åĲ¦ è¢« æĭ Ĵ ç»Ŀ å¼¹ æ¡Ĩ , true æĺ¯ ä¼ļ , false ä¸įä¼ļ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Activity Compat . should Show Request Permission R ationale ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ä¸įä¼ļ å¼¹ æ¡Ĩ , éľĢè¦ģ è§£éĩĬ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġref use List . add ( s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ä¼ļ å¼¹ æ¡Ĩ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpending Application List . add ( s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ä¸įä¼ļ å¼¹ æ¡Ĩ , éľĢè¦ģ è§£éĩĬ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġref use List . add ( s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// åĪ¤æĸŃ æĺ¯åĲ¦ æīĢæľī è¦ģ çĶ³è¯· çļĦ æĿĥéĻĲ éĥ½ éľĢè¦ģ çĶ³è¯· ĊĠĠĠĠĠĠĠ Ġif Ġ( pending Application List . size Ġ== Ġ 0 Ġ&& Ġref use List . size Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// è¦ģ çĶ³è¯· çļĦ æĿĥéĻĲ éĥ½ å·² æĭ¥ æľī æĿĥéĻĲ , åıª æİ¥ è°ĥçĶ¨ æĪĲåĬŁ åĽŀè°ĥ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess Callback () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// æ²¡æľī éľĢè¦ģ çĶ³è¯· çļĦ æĿĥéĻĲ , æľī æĹłæ³ķ çĶ³è¯· çļĦ æĿĥéĻĲ ĊĠĠĠĠĠĠĠ Ġif Ġ( pending Application List . size Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfailure Callback ( listOf (), Ġref use List , Ġref use List ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// çĶ³è¯· æĿĥéĻĲ ĊĠĠĠĠĠĠĠ Ġ// åĪĽå»º çĶ³è¯· æĿĥéĻĲ çļĦ fragment ĊĠĠĠĠĠĠĠ Ġpermissions Fragment Ġ= ĠPermissions Fragment ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Permissions , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess Callback () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Fragment () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġsuccess List , Ġfailure , Ġref use Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfailure Callback ( success List , Ġfailure , Ġref use ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Fragment () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// èİ·åıĸ FragmentManager ĊĠĠĠĠĠĠĠ Ġval Ġfragment Transaction Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . support FragmentManager . beginTransaction () ĊĠĠĠĠĠĠĠ Ġ// å°Ĩ fragment åĬłåħ¥ åĪ° activity ä¸Ń ĊĠĠĠĠĠĠĠ Ġfragment Transaction . add ( permissions Fragment , Ġ" permissions Fragment ") ĊĠĠĠĠĠĠĠ Ġ// æıĲäº¤ Fragment è¿Ľè¡Į çĶ³è¯· ĊĠĠĠĠĠĠĠ Ġfragment Transaction . commit () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ç§»éĻ¤ è¯·æ±Ĥ æĿĥéĻĲ çļĦ fragment ĊĠĠĠ Ġprivate Ġfun Ġremove Fragment () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfragment Transaction Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . support FragmentManager . beginTransaction () ĊĠĠĠĠĠĠĠ Ġ// å°Ĩ fragment ä»İ activity ä¸Ń ç§»éĻ¤ ĊĠĠĠĠĠĠĠ Ġfragment Transaction . remove ( permissions Fragment ) ĊĠĠĠĠĠĠĠ Ġ// æıĲäº¤ ĊĠĠĠĠĠĠĠ Ġfragment Transaction . commit () ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠPermissions Fragment ( ĊĠĠĠ Ġprivate Ġval Ġpermissions Array : ĠArray < String >, ĊĠĠĠ Ġprivate Ġval Ġsuccess : Ġ() Ġ-> ĠUnit , ĊĠĠĠ Ġprivate Ġval Ġfailure : Ġ( success List : ĠList < String >, Ġfailure : ĠList < String >, Ġref use : ĠList < String >) Ġ-> ĠUnit Ċ ) Ġ: ĠFragment () Ġ{ ĊĊĠĠĠ Ġ// å¤ļ æĿĥéĻĲ å£°æĺİ æĿĥéĻĲ çļĦ åĽŀè°ĥ ĊĠĠĠ Ġprivate Ġval Ġrequest Multiple Permissions Ġ= ĊĠĠĠĠĠĠĠ Ġregister For Activity Result ( Activity Result Contracts . Request Multiple Permissions ()) Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// æĪĲåĬŁ çļĦ åĪĹè¡¨ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsuccess List Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// å¤±è´¥ çļĦ åĪĹè¡¨ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfailure List Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// æĭ Ĵ ç»Ŀ çļĦ åĪĹè¡¨ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġref use List Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// éģįåİĨ æĿĥéĻĲ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// åĢ¼ä¸º true è¯´æĺİ å·² æľī æĿĥéĻĲ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess List . add ( it . key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfailure List . add ( it . key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// should Show Request Permission R ationale åĪ¤æĸŃ æĺ¯åĲ¦ è¢« æĭ Ĵ ç»Ŀ å¼¹ æ¡Ĩ , true æĺ¯ ä¼ļ , false ä¸įä¼ļ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Activity Compat . should Show Request Permission R ationale ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Activity (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . key ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġref use List . add ( it . key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// æĪĲåĬŁ çļĦ æķ°éĩı çŃīäºİ æīĢæľīçļĦ æķ°éĩı è¡¨ç¤º æĪĲåĬŁ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( success List . size Ġ== Ġresult . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// å¤±è´¥ , éľĢè¦ģ åĨį æ¬¡ çĶ³è¯· æĪĸ è§£éĩĬ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfailure ( success List , Ġfailure List , Ġref use List ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġ// åıĳ èµ· æĿĥéĻĲ è¯·æ±Ĥ ĊĠĠĠĠĠĠĠ Ġrequest Multiple Permissions . launch ( permissions Array ) ĊĠĠĠ Ġ} Ċ }