/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 1 ĠAl berto ĠIr ur ue ta ĠCar ro Ġ( al berto @ ir ur ue ta . com ) Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġcom . ir ur ue ta . android . navigation . in ert ial Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . os . Build Ċ import Ġandroidx . activity . result . Activity Result Caller Ċ import Ġandroidx . activity . result . contract . Activity Result Contracts Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . core . app . Activity Compat Ċ import Ġandroidx . core . content . Context Compat Ċ Ċ /** Ċ Ġ* ĠService Ġto Ġcheck Ġand Ġrequest Ġlocation Ġpermissions . Ċ Ġ* Ċ Ġ* Ġ@ property Ġactivity Ġactivity Ġwhere Ġthis Ġservice Ġis Ġinstantiated Ġfrom . ĠMight Ġnot Ġbe Ġavailable Ġif Ċ Ġ* Ġthis Ġis Ġinstantiated Ġsomewhere Ġelse , Ġsuch Ġas Ġa Ġservice . ĠWhen Ġactivity Ġis Ġavailable , Ġactions Ċ Ġ* Ġrequiring Ġa ĠUI , Ġsuch Ġas Ġrequesting Ġpermission , Ġcan Ġbe Ġused . Ċ Ġ* Ġ@ property Ġcontext Ġcontext Ġwhere Ġthis Ġservice Ġis Ġinstantiated Ġfrom . ĠThis Ġis Ġused Ġto Ġcheck Ċ Ġ* Ġpermissions Ġonly . Ċ Ġ* Ġ@ property Ġon Location Permission Request Result Listener Ġlistener Ġto Ġnotify Ġthe Ġresult Ġof Ġa Ġpermission Ċ Ġ* Ġrequest . Ċ Ġ*/ Ċ class ĠLocation Permission Service Ġprivate Ġconstructor ( ĊĠĠĠ Ġval Ġcontext : ĠContext , ĊĠĠĠ Ġval Ġactivity : ĠAppCompatActivity ? Ġ= Ġnull , ĊĠĠĠ Ġvar Ġon Location Permission Request Result Listener : ĠOn Location Permission Request Result Listener ? Ġ= Ġnull Ċ ) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConstructor . ĊĠĠĠĠ Ġ* ĠThis Ġconstructor Ġmust Ġbe Ġused Ġwhen Ġactions Ġrequiring Ġa ĠUI Ġare Ġneeded , Ġsuch Ġas Ġwhen Ġrequesting ĊĠĠĠĠ Ġ* Ġpermissions . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġactivity Ġactivity Ġwhere Ġthis Ġservice Ġis Ġinstantiated Ġfrom . ĊĠĠĠĠ Ġ* Ġ@ param Ġon Location Permission Request Result Listener Ġlistener Ġto Ġnotify Ġthe Ġresult Ġof Ġa ĊĠĠĠĠ Ġ* Ġpermission Ġrequest . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġactivity : ĠAppCompatActivity , ĊĠĠĠĠĠĠĠ Ġon Location Permission Request Result Listener : ĠOn Location Permission Request Result Listener ? Ġ= Ġnull ĊĠĠĠ Ġ) Ġ: Ġthis ( activity , Ġactivity , Ġon Location Permission Request Result Listener ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConstructor . ĊĠĠĠĠ Ġ* ĠThis Ġconstructor Ġcan Ġbe Ġused Ġif Ġonly Ġpermissions Ġmust Ġbe Ġchecked Ġbut Ġnot Ġbe Ġrequested . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcontext Ġcontext Ġwhere Ġthis Ġservice Ġis Ġinstantiated Ġfrom . ĊĠĠĠĠ Ġ* Ġ@ param Ġon Location Permission Request Result Listener Ġlistener Ġto Ġnotify Ġthe Ġresult Ġof Ġa ĊĠĠĠĠ Ġ* Ġpermission Ġrequest . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠ Ġon Location Permission Request Result Listener : ĠOn Location Permission Request Result Listener ? Ġ= Ġnull ĊĠĠĠ Ġ) Ġ: Ġthis ( context , Ġnull , Ġon Location Permission Request Result Listener ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIndicates Ġwhether Ġapplication Ġhas Ġfine Ġlocation Ġpermission . ĊĠĠĠĠ Ġ* ĠWhen Ġfine Ġlocation Ġpermission Ġis Ġgranted , Ġco arse Ġpermission Ġis Ġalso ĊĠĠĠĠ Ġ* Ġimplicitly Ġgranted . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġfine Ġlocation Ġpermission Ġis Ġavailable , Ġfalse Ġotherwise . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġhas F ine Location Permission (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġhas Permission ( Manifest . permission . ACCESS _ F INE _ LOCATION ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIndicates Ġwhether Ġapplication Ġhas Ġco arse Ġlocation Ġpermission . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġco arse Ġlocation Ġpermission Ġis Ġavailable , Ġfalse Ġotherwise . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġhas Co arse Location Permission (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġhas Permission ( Manifest . permission . ACCESS _ CO AR SE _ LOCATION ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIndicates Ġwhether Ġapplication Ġhas Ġbackground Ġlocation Ġpermission . ĊĠĠĠĠ Ġ* ĠBackground Ġlocation Ġpermission Ġmust Ġbe Ġrequested Ġalong Ġwith Ġeither Ġfine Ġor ĊĠĠĠĠ Ġ* Ġco arse Ġlocation Ġpermission . ĊĠĠĠĠ Ġ* ĠBackground Ġlocation Ġpermission Ġis Ġonly Ġsupported Ġfor ĠSDK Ġ 2 9 Ġor Ġgreater . ĊĠĠĠĠ Ġ* ĠFor Ġolder ĠAndroid Ġversions , Ġwhenever Ġfine Ġor Ġlocation Ġpermission Ġis Ġgranted , ĊĠĠĠĠ Ġ* Ġbackground Ġlocation Ġpermission Ġis Ġalso Ġassumed Ġto Ġbe Ġgranted Ġas Ġwell . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġhas Background Location Permission (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . Q ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhas Permission ( Manifest . permission . ACCESS _ BACKGROUND _ LOCATION ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhas F ine Location Permission () Ġ|| Ġhas Co arse Location Permission () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIndicates Ġwhether Ġa Ġr ationale Ġshould Ġbe Ġdisplayed Ġto Ġthe Ġuser Ġindicating Ġwhy ĊĠĠĠĠ Ġ* Ġfine Ġlocation Ġpermission Ġis Ġneeded . ĊĠĠĠĠ Ġ* ĠThis Ġis Ġtrue Ġif Ġthe Ġuser Ġch oo ses Ġnot Ġto Ġbe Ġasked Ġagain Ġabout Ġfine Ġlocation Ġpermission ĊĠĠĠĠ Ġ* Ġand Ġden ies Ġsuch Ġpermission . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġa Ġr ationale Ġshould Ġbe Ġdisplayed , Ġfalse Ġotherwise . ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalStateException Ġif Ġno Ġactivity Ġhas Ġbeen Ġprovided . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IllegalStateException :: class ) ĊĠĠĠ Ġfun Ġshould Show Request F ine Location Permission R ationale (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġactivity Ġ= Ġthis . activity ĊĠĠĠĠĠĠĠ ĠcheckNotNull ( activity ) ĊĠĠĠĠĠĠĠ Ġreturn ĠActivity Compat . should Show Request Permission R ationale ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . ACCESS _ F INE _ LOCATION ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIndicates Ġwhether Ġa Ġr ationale Ġshould Ġbe Ġdisplayed Ġto Ġthe Ġuser Ġindicating Ġwhy ĊĠĠĠĠ Ġ* Ġco arse Ġlocation Ġpermission Ġis Ġneeded . ĊĠĠĠĠ Ġ* ĠThis Ġis Ġtrue Ġif Ġthe Ġuser Ġch oo ses Ġnot Ġbe Ġasked Ġagain Ġabout Ġco arse Ġlocation Ġpermission ĊĠĠĠĠ Ġ* Ġand Ġden ies Ġsuch Ġpermission . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġa Ġr ationale Ġshould Ġbe Ġdisplayed , Ġfalse Ġotherwise . ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalStateException Ġif Ġno Ġactivity Ġhas Ġbeen Ġprovided . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IllegalStateException :: class ) ĊĠĠĠ Ġfun Ġshould Show Request Co arse Location Permission R ationale (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġactivity Ġ= Ġthis . activity ĊĠĠĠĠĠĠĠ ĠcheckNotNull ( activity ) ĊĠĠĠĠĠĠĠ Ġreturn ĠActivity Compat . should Show Request Permission R ationale ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . ACCESS _ CO AR SE _ LOCATION ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIndicates Ġwhether Ġa Ġr ationale Ġshould Ġbe Ġdisplayed Ġto Ġthe Ġuser Ġindicating Ġwhy ĊĠĠĠĠ Ġ* Ġbackground Ġlocation Ġpermission Ġis Ġneeded . ĊĠĠĠĠ Ġ* ĠThis Ġis Ġtrue Ġif Ġthe Ġuser Ġch oo ses Ġnot Ġto Ġbe Ġasked Ġagain Ġabout Ġbackground Ġlocation Ġpermission ĊĠĠĠĠ Ġ* Ġand Ġden ies Ġsuch Ġpermission . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġa Ġr ationale Ġshould Ġbe Ġdisplayed , Ġfalse Ġotherwise . ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalStateException Ġif Ġno Ġactivity Ġhas Ġbeen Ġprovided . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IllegalStateException :: class ) ĊĠĠĠ Ġfun Ġshould Show Request Background Location Permission R ationale (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . Q ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactivity Ġ= Ġthis . activity ĊĠĠĠĠĠĠĠĠĠĠĠ ĠcheckNotNull ( activity ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠActivity Compat . should Show Request Permission R ationale ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . ACCESS _ BACKGROUND _ LOCATION ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ! has Background Location Permission () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRequests Ġfine Ġlocation Ġpermission Ġin Ġforeground . ĊĠĠĠĠ Ġ* ĠIf Ġbackground Ġlocation Ġpermission Ġis Ġalso Ġneeded , Ġthen ĊĠĠĠĠ Ġ* Ġ[ request Background F ine Location Permission ] Ġmust Ġbe Ġused Ġinstead . ĊĠĠĠĠ Ġ* ĠWh enever Ġfine Ġlocation Ġpermission Ġis Ġgranted , Ġco arse Ġpermission Ġis Ġalso ĊĠĠĠĠ Ġ* Ġimplicitly Ġgranted . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalStateException Ġif Ġno Ġactivity Ġhas Ġbeen Ġprovided . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IllegalStateException :: class ) ĊĠĠĠ Ġfun Ġrequest F ine Location Permission () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġactivity Ġ= Ġthis . activity ĊĠĠĠĠĠĠĠ ĠcheckNotNull ( activity ) ĊĠĠĠĠĠĠĠ Ġrequest F ine Location Permission ( activity , Ġon Location Permission Request Result Listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRequests Ġco arse Ġlocation Ġpermission Ġin Ġforeground . ĊĠĠĠĠ Ġ* ĠIf Ġbackground Ġlocation Ġpermission Ġis Ġalso Ġneeded , Ġthen ĊĠĠĠĠ Ġ* Ġ[ request Background Co arse Location Permission ] Ġmust Ġbe Ġused Ġinstead . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalStateException Ġif Ġno Ġactivity Ġhas Ġbeen Ġprovided . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IllegalStateException :: class ) ĊĠĠĠ Ġfun Ġrequest Co arse Location Permission () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġactivity Ġ= Ġthis . activity ĊĠĠĠĠĠĠĠ ĠcheckNotNull ( activity ) ĊĠĠĠĠĠĠĠ Ġrequest Co arse Location Permission ( activity , Ġon Location Permission Request Result Listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRequests Ġfine Ġlocation Ġpermission Ġin Ġbackground . ĊĠĠĠĠ Ġ* ĠWh enever Ġfine Ġlocation Ġpermission Ġis Ġgranted , Ġco arse Ġpermission Ġis Ġalso ĊĠĠĠĠ Ġ* Ġimplicitly Ġgranted . ĊĠĠĠĠ Ġ* ĠAdditionally , Ġwhenever Ġbackground Ġpermission Ġis Ġgranted , Ġforeground Ġpermission Ġis ĊĠĠĠĠ Ġ* Ġalso Ġimplicitly Ġgranted . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalStateException Ġif Ġno Ġactivity Ġhas Ġbeen Ġprovided . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IllegalStateException :: class ) ĊĠĠĠ Ġfun Ġrequest Background F ine Location Permission () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġactivity Ġ= Ġthis . activity ĊĠĠĠĠĠĠĠ ĠcheckNotNull ( activity ) ĊĠĠĠĠĠĠĠ Ġrequest Background F ine Location Permission ( activity , Ġon Location Permission Request Result Listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRequests Ġco arse Ġlocation Ġpermission Ġin Ġbackground . ĊĠĠĠĠ Ġ* ĠWh enever Ġbackground Ġpermission Ġis Ġgranted , Ġforeground Ġpermission Ġis Ġalso ĊĠĠĠĠ Ġ* Ġimplicitly Ġgranted . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalStateException Ġif Ġno Ġactivity Ġhas Ġbeen Ġprovided . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IllegalStateException :: class ) ĊĠĠĠ Ġfun Ġrequest Background Co arse Location Permission () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġactivity Ġ= Ġthis . activity ĊĠĠĠĠĠĠĠ ĠcheckNotNull ( activity ) ĊĠĠĠĠĠĠĠ Ġrequest Background Co arse Location Permission ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Location Permission Request Result Listener ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIndicates Ġwhether Ġapplication Ġhas Ġprovided Ġpermission . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġprovided Ġpermission Ġis Ġavailable , Ġfalse Ġotherwise . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġhas Permission ( permission : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġthis . context ĊĠĠĠĠĠĠĠ Ġreturn ĠContext Compat . check Self Permission ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpermission ĊĠĠĠĠĠĠĠ Ġ) Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠRequests Ġfine Ġlocation Ġpermission Ġin Ġforeground . ĊĠĠĠĠĠĠĠĠ Ġ* ĠIf Ġbackground Ġlocation Ġpermission Ġis Ġalso Ġneeded , Ġthen ĊĠĠĠĠĠĠĠĠ Ġ* Ġ[ request Background F ine Location Permission ] Ġmust Ġbe Ġused Ġinstead . ĊĠĠĠĠĠĠĠĠ Ġ* ĠWh enever Ġfine Ġlocation Ġpermission Ġis Ġgranted , Ġco arse Ġpermission Ġis Ġalso ĊĠĠĠĠĠĠĠĠ Ġ* Ġimplicitly Ġgranted . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġcaller Ġan Ġactivity , Ġfragment Ġor Ġpicker Ġthat Ġcan Ġhandle Ġactivity Ġresults . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġlistener Ġlistener Ġto Ġnotify Ġthe Ġresult Ġof Ġpermission Ġrequest . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġrequest F ine Location Permission ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcaller : ĠActivity Result Caller , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener : ĠOn Location Permission Request Result Listener ? ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlauncher Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcaller . register For Activity Result ( Activity Result Contracts . Request Multiple Permissions ()) Ġ{ Ġpermissions Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġprocess Permissions ( permissions ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ?. on Location Permission Request Result ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlauncher . launch ( array Of ( Manifest . permission . ACCESS _ F INE _ LOCATION )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠRequests Ġco arse Ġlocation Ġpermission Ġin Ġforeground . ĊĠĠĠĠĠĠĠĠ Ġ* ĠIf Ġbackground Ġlocation Ġpermission Ġis Ġalso Ġneeded , Ġthen ĊĠĠĠĠĠĠĠĠ Ġ* Ġ[ request Background Co arse Location Permission ] Ġmust Ġbe Ġused Ġinstead . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġcaller Ġan Ġactivity , Ġfragment Ġor Ġpicker Ġthat Ġcan Ġhandle Ġactivity Ġresults . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġlistener Ġlistener Ġto Ġnotify Ġthe Ġresult Ġof Ġpermission Ġrequest . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġrequest Co arse Location Permission ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcaller : ĠActivity Result Caller , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener : ĠOn Location Permission Request Result Listener ? ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlauncher Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcaller . register For Activity Result ( Activity Result Contracts . Request Multiple Permissions ()) Ġ{ Ġpermissions Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġprocess Permissions ( permissions ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ?. on Location Permission Request Result ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlauncher . launch ( array Of ( Manifest . permission . ACCESS _ CO AR SE _ LOCATION )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠRequests Ġfine Ġlocation Ġpermission Ġin Ġbackground . ĊĠĠĠĠĠĠĠĠ Ġ* ĠWh enever Ġfine Ġlocation Ġpermission Ġis Ġgranted , Ġco arse Ġpermission Ġis Ġalso ĊĠĠĠĠĠĠĠĠ Ġ* Ġimplicitly Ġgranted . ĊĠĠĠĠĠĠĠĠ Ġ* ĠAdditionally , Ġwhenever Ġbackground Ġpermission Ġis Ġgranted , Ġforeground Ġpermission Ġis ĊĠĠĠĠĠĠĠĠ Ġ* Ġalso Ġimplicitly Ġgranted . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġcaller Ġan Ġactivity , Ġfragment Ġor Ġpicker Ġthat Ġcan Ġhandle Ġactivity Ġresults . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġlistener Ġlistener Ġto Ġnotify Ġthe Ġresult Ġof Ġpermission Ġrequest . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġrequest Background F ine Location Permission ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcaller : ĠActivity Result Caller , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener : ĠOn Location Permission Request Result Listener ? ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . Q ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlauncher Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcaller . register For Activity Result ( Activity Result Contracts . Request Multiple Permissions ()) Ġ{ Ġpermissions Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġprocess Permissions ( permissions ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ?. on Location Permission Request Result ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlauncher . launch ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . ACCESS _ F INE _ LOCATION , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . ACCESS _ BACKGROUND _ LOCATION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest F ine Location Permission ( caller , Ġlistener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠRequests Ġco arse Ġlocation Ġpermission Ġin Ġbackground . ĊĠĠĠĠĠĠĠĠ Ġ* ĠWh enever Ġbackground Ġpermission Ġis Ġgranted , Ġforeground Ġpermission Ġis Ġalso ĊĠĠĠĠĠĠĠĠ Ġ* Ġimplicitly Ġgranted . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġcaller Ġan Ġactivity , Ġfragment Ġor Ġpicker Ġthat Ġcan Ġhandle Ġactivity Ġresults . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġlistener Ġlistener Ġto Ġnotify Ġthe Ġresult Ġof Ġpermission Ġrequest . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġrequest Background Co arse Location Permission ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcaller : ĠActivity Result Caller , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener : ĠOn Location Permission Request Result Listener ? ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . Q ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlauncher Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcaller . register For Activity Result ( Activity Result Contracts . Request Multiple Permissions ()) Ġ{ Ġpermissions Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġprocess Permissions ( permissions ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ?. on Location Permission Request Result ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlauncher . launch ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . ACCESS _ CO AR SE _ LOCATION , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . ACCESS _ BACKGROUND _ LOCATION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Co arse Location Permission ( caller , Ġlistener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠPro cesses Ġreceived Ġpermissions . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġpermissions Ġpermission Ġrequest Ġresult . ĠContains Ġeach Ġrequested Ġpermission Ġand ĊĠĠĠĠĠĠĠĠ Ġ* Ġwhether Ġit Ġwas Ġgranted Ġor Ġnot . ĠIf Ġmap Ġis Ġempty Ġit Ġmeans Ġthat Ġpermission Ġrequest Ġwas ĊĠĠĠĠĠĠĠĠ Ġ* Ġcancelled Ġby Ġthe Ġuser . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġan Ġinstance Ġindicating Ġwhich Ġpermission Ġwas Ġrequested Ġand Ġwhich Ġone Ġwas Ġgranted . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġprocess Permissions ( permissions : ĠMap < String , ĠBoolean >): ĠLocation Permission Result Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( permissions . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠLocation Permission Result ( cancelled Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfine Permission Requested Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfine Permission Granted Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġco arse Permission Requested Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġco arse Permission Granted Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġbackground Permission Requested Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġbackground Permission Granted Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( key , Ġvalue ) Ġin Ġpermissions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . ACCESS _ F INE _ LOCATION Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfine Permission Requested Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfine Permission Granted Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . ACCESS _ CO AR SE _ LOCATION Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco arse Permission Requested Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco arse Permission Granted Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . ACCESS _ BACKGROUND _ LOCATION Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbackground Permission Requested Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbackground Permission Granted Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠLocation Permission Result ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcancelled Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfine Permission Granted , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco arse Permission Granted , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbackground Permission Granted , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfine Permission Requested , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco arse Permission Requested , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbackground Permission Requested ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠListener Ġto Ġnotify Ġthe Ġresult Ġof Ġpermission Ġrequest . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġinterface ĠOn Location Permission Request Result Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCalled Ġwhen Ġa Ġpermission Ġrequest Ġresult Ġis Ġreceived . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġresult Ġresult Ġof Ġlocation Ġpermission Ġrequest . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġon Location Permission Request Result ( result : ĠLocation Permission Result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠContains Ġinformation Ġabout Ġthe Ġresult Ġof Ġlocation Ġpermission Ġrequest . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ property Ġcancelled Ġtrue Ġindicates Ġthat Ġpermission Ġrequest Ġwas Ġcancelled Ġby Ġthe Ġuser . ĊĠĠĠĠ Ġ* Ġ@ property Ġfine Permission Granted Ġtrue Ġindicates Ġthat Ġfine Ġlocation Ġpermission Ġwas Ġgranted . ĊĠĠĠĠ Ġ* ĠWhen Ġthis Ġis Ġtrue , Ġco arse Ġpermission Ġis Ġalso Ġimplicitly Ġgranted . ĊĠĠĠĠ Ġ* Ġ@ property Ġco arse Permission Granted Ġtrue Ġindicates Ġthat Ġco arse Ġlocation Ġpermission Ġwas Ġgranted . ĊĠĠĠĠ Ġ* Ġ@ property Ġbackground Permission Granted Ġtrue Ġindicates Ġthat Ġbackground Ġlocation Ġpermission Ġwas ĊĠĠĠĠ Ġ* Ġgranted , Ġeither Ġfor Ġco arse Ġor Ġfine Ġlocation . ĠWhen Ġtrue , Ġforeground Ġlocation Ġpermission Ġis ĊĠĠĠĠ Ġ* Ġalso Ġimplicitly Ġgranted . ĊĠĠĠĠ Ġ* Ġ@ property Ġfine Permission Requested Ġtrue Ġindicates Ġthat Ġfine Ġlocation Ġpermission Ġwas Ġrequested ĊĠĠĠĠ Ġ* Ġto Ġthe Ġuser . ĊĠĠĠĠ Ġ* Ġ@ property Ġco arse Permission Requested Ġtrue Ġindicates Ġthat Ġco arse Ġlocation Ġpermission Ġwas ĊĠĠĠĠ Ġ* Ġrequested Ġto Ġthe Ġuser . ĊĠĠĠĠ Ġ* Ġ@ property Ġbackground Permission Requested Ġtrue Ġindicates Ġthat Ġbackground Ġlocation Ġpermission ĊĠĠĠĠ Ġ* Ġwas Ġrequested Ġto Ġthe Ġuser . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġdata Ġclass ĠLocation Permission Result ( ĊĠĠĠĠĠĠĠ Ġval Ġcancelled : ĠBoolean Ġ= Ġtrue , ĊĠĠĠĠĠĠĠ Ġval Ġfine Permission Granted : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġval Ġco arse Permission Granted : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġval Ġbackground Permission Granted : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġval Ġfine Permission Requested : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġval Ġco arse Permission Requested : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġval Ġbackground Permission Requested : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġ) Ċ }