package Ġio . android al atan . request . permission Ċ Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġio . android al atan . request . permission . api . Permission Explanation Ċ import Ġio . android al atan . request . permission . api . Permission Explanation Builder Ċ import Ġio . android al atan . request . permission . api . Permission Explanation BuilderFactory Ċ import Ġio . android al atan . request . permission . api . Permission Handler Ċ import Ġio . android al atan . request . permission . api . Permission Result Ċ import Ġio . android al atan . request . permission . api . exception . Permission Grant Exception Ċ Ċ internal Ġclass ĠPermission Handler Impl ( ĊĠĠĠ Ġprivate Ġval Ġpermission Invoker : ĠPermission Invoker , ĊĠĠĠ Ġprivate Ġval Ġpermission Explanation BuilderFactory : ĠPermission Explanation BuilderFactory Ċ ) Ġ: ĠPermission Handler Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġfail Callback Ġ= Ġmutable Map Of < Int , Ġ( Exception ) Ġ-> ĠUnit >() ĊĠĠĠ Ġprivate Ġval Ġsuccess Callback Ġ= Ġmutable Map Of < Int , Ġ( Permission Result ) Ġ-> ĠUnit >() ĊĊĠĠĠ Ġoverride Ġfun Ġrequest ( ĊĠĠĠĠĠĠĠ Ġpermissions : ĠArray < String >, ĊĠĠĠĠĠĠĠ Ġreq Code : ĠInt , ĊĠĠĠĠĠĠĠ Ġexplanation : Ġ(( Permission Explanation Builder ) Ġ-> ĠPermission Explanation )? , ĊĠĠĠĠĠĠĠ Ġfail : Ġ( Exception ) Ġ-> ĠUnit , ĊĠĠĠĠĠĠĠ Ġsuccess : Ġ( Permission Result ) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġall Granted Ġ= Ġpermissions . all Ġ{ Ġpermission Invoker . check Permission ( it ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( all Granted ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess ( Permission Result ( req Code , Ġpermissions . map Ġ{ Ġit Ġto Ġtrue Ġ})) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Permissions ( permissions , Ġreq Code , Ġexplanation , Ġfail ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfail Callback [ req Code ] Ġ= Ġfail ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess Callback [ req Code ] Ġ= Ġsuccess ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Result ( request Code : ĠInt , Ġpermissions : ĠArray < String >, Ġgrant Results : ĠInt Array ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġpermissions . map Indexed Ġ{ Ġindex , Ġpermission Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermission Ġto Ġ( grant Results [ index ] Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPermission Result ( request Code , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġall Granted Ġ= Ġresult . result . all Ġ{ Ġit . second Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( all Granted ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess Callback . remove ( request Code ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . invoke ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfail Callback . remove ( request Code ) ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequired Explanation List Ġ= Ġresult . result . filter Ġ{ Ġ! permission Invoker . should Show Permission Explanation ( it . first ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . first Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( required Explanation List . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġassume Ġdeny Ġforever ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfail Callback . remove ( request Code ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . invoke ( Permission Grant Exception ( required Explanation List , Ġresult )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess Callback . remove ( request Code ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġonce Ġdenied ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess Callback . remove ( request Code ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . invoke ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfail Callback . remove ( request Code ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrequest Permissions ( ĊĠĠĠĠĠĠĠ Ġpermissions : ĠArray < String >, ĊĠĠĠĠĠĠĠ Ġreq Code : ĠInt , ĊĠĠĠĠĠĠĠ Ġexplanation : Ġ(( Permission Explanation Builder ) Ġ-> ĠPermission Explanation )? , ĊĠĠĠĠĠĠĠ Ġfail : Ġ( Exception ) Ġ-> ĠUnit Ġ= Ġ{}, ĊĠĠĠĠĠĠĠ Ġwait T ill Answer : Ġ() Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġrequest Permission ( permission Invoker : ĠPermission Invoker , Ġreq Code : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermission Invoker . request Permission ( permissions , Ġreq Code ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġneed Explain Ġ= Ġpermissions . any Ġ{ Ġpermission Invoker . should Show Permission Explanation ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( need Explain ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( explanation Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= Ġpermission Explanation BuilderFactory . explanation Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpermission Explanation Ġ= Ġexplanation . invoke ( builder ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpermission Explanation . show Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Permission ( permission Invoker , Ġreq Code ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwait T ill Answer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfail ( IllegalStateException (" It Ġrequires ĠEx planation . ĠPlease Ġcomplete Ġar ug ment Ġof ĠPermission Explanation BuilderFactory ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Permission ( permission Invoker , Ġreq Code ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwait T ill Answer () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }