package Ġcom . ud acity . location reminder . location rem inders . ge ofence Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . annotation . Target Api Ċ import Ġandroid . app . Pending Intent Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . Intent Sender Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . net . Uri Ċ import Ġandroid . provider . Settings Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . View Ċ import Ġcom . google . android . gms . common . api . Res olvable ApiException Ċ import Ġcom . google . android . gms . location . Ge of encing Client Ċ import Ġcom . google . android . gms . location . Location Request Ċ import Ġcom . google . android . gms . location . Location Services Ċ import Ġcom . google . android . gms . location . Location Settings Request Ċ import Ġcom . google . android . material . sn ackbar . Snackbar Ċ import Ġcom . ud acity . location reminder . Build Config Ċ import Ġcom . ud acity . location reminder . R Ċ import Ġcom . ud acity . location reminder . base . Base Fragment Ċ Ċ private Ġconst Ġval ĠTAG Ġ= Ġ" Ge ofence Base Fragment " Ċ Ċ abstract Ġclass ĠGe ofence Base Fragment Ġ: ĠBase Fragment () Ġ{ ĊĊĠĠĠ Ġprotected Ġlateinit Ġvar Ġge of encing Client : ĠGe of encing Client ĊĊĠĠĠ Ġprotected Ġlateinit Ġvar Ġroot View : ĠView ĊĊĠĠĠ Ġprotected Ġval Ġge ofence Pending Intent : ĠPending Intent Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġbuild Ge ofence Pending Intent ( require Context ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġinit Ge of encing Client () Ġ{ ĊĠĠĠĠĠĠĠ Ġge of encing Client Ġ= ĠLocation Services . get Ge of encing Client ( require Context ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Target Api ( 2 9 ) ĊĠĠĠ Ġprotected Ġfun Ġforeground And Background Location Permission Approved (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġforeground And Background Location Permission Approved ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* Ċ Ġ* Ġ ĠRequests ĠACCESS _ F INE _ LOCATION Ġand Ġ( on ĠAndroid Ġ 1 0 + Ġ( Q ) ĠACCESS _ BACKGROUND _ LOCATION . Ċ Ġ*/ ĊĠĠĠ Ġ@ Target Api ( 2 9 ) ĊĠĠĠ Ġprivate Ġfun Ġrequest Foreground And Background Location Permissions () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . i ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" request Foreground And Background Location Permissions " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġif Ġ( foreground And Background Location Permission Approved ( require Context ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ(! foreground Location Permission Approved ( require Context ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpermissions Array Ġ= ĠarrayOf ( Manifest . permission . ACCESS _ F INE _ LOCATION ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠresultCode Ġ= ĠREQUEST _ FO REG ROUND _ ONLY _ PERMISSION S _ REQUEST _ CODE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" DE PREC ATION ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Permissions ( permissions Array , ĠresultCode ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( running Q Or Later ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpermissions Array Ġ= ĠarrayOf ( Manifest . permission . ACCESS _ BACKGROUND _ LOCATION ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠresultCode Ġ= ĠREQUEST _ BACKGROUND _ ONLY _ PERMISSION S _ REQUEST _ CODE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" DE PREC ATION ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Permissions ( permissions Array , ĠresultCode ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcheck Permissions And Start () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( foreground And Background Location Permission Approved ( require Context ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Device Location Settings And Start () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Foreground And Background Location Permissions () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ* Ġ ĠUses Ġthe ĠLocation ĠClient Ġto Ġcheck Ġthe Ġcurrent Ġstate Ġof Ġlocation Ġsettings , ĊĠĠĠĠ Ġ* Ġ Ġand Ġgives Ġthe Ġuser Ġthe Ġopportunity Ġto Ġturn Ġon Ġlocation Ġservices Ġwithin Ġour Ġapp . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcheck Device Location Settings And Start ( resolve : ĠBoolean Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" check Device Location Settings And Start Ge ofence ") ĊĠĠĠĠĠĠĠ Ġ// Ġcheck Ġthat Ġthe Ġdevice 's Ġlocation Ġis Ġon ĊĠĠĠĠĠĠĠ Ġval Ġlocation Request Ġ= ĠLocation Request . create (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpriority Ġ= ĠLocation Request . PRIORITY _ HIGH _ AC CUR ACY ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠLocation Settings Request . Builder (). add Location Request ( location Request ) ĊĠĠĠĠĠĠĠ Ġval Ġsettings Client Ġ= ĠLocation Services . get Settings Client ( require Activity ()) ĊĠĠĠĠĠĠĠ Ġval Ġlocation Settings Response Task Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsettings Client . check Location Settings ( builder . build ()) ĊĠĠĠĠĠĠĠ Ġlocation Settings Response Task . add On Failure Listener Ġ{ Ġexception Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" location Settings Response Task . add On Failure Listener : Ġexception : Ġ$ exception ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( exception Ġis ĠRes olvable ApiException Ġ&& Ġresolve ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" DE PREC ATION ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Intent Sender For Result ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexception . resolution . intent Sender , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠREQUEST _ T URN _ DEVICE _ LOCATION _ ON , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( send Ex : ĠIntent Sender . Send Intent Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Error Ġgetting Ġlocation Ġsettings Ġresolution : Ġ" Ġ+ Ġsend Ex . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . make ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot View , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . location _ required _ error , ĠSn ackbar . LENGTH _ IN DEFIN ITE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). setAction ( android . R . string . ok ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Device Location Settings And Start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlocation Settings Response Task . add On Complete Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" location Settings Response Task . add On Complete Listener : Ġsuccessful : Ġ${ it . is Successful }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" location Settings Response Task . add On Complete Listener : Ġwas Ġsuccessful ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonSuccess full Check () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ* ĠIn Ġall Ġcases , Ġwe Ġneed Ġto Ġhave Ġthe Ġlocation Ġpermission . Ġ ĠOn ĠAndroid Ġ 1 0 + Ġ( Q ) Ġwe Ġneed Ġto Ġhave ĊĠĠĠĠ Ġ* Ġthe Ġbackground Ġpermission Ġas Ġwell . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon Request Permissions Result ( ĊĠĠĠĠĠĠĠ Ġrequest Code : ĠInt , ĊĠĠĠĠĠĠĠ Ġpermissions : ĠArray < String >, ĊĠĠĠĠĠĠĠ Ġgrant Results : ĠInt Array ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġhandle Ġthe Ġresult Ġof Ġthe Ġuser 's Ġpermission ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on Request Permission Result ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgrant Results . isEmpty () Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgrant Results [ LOCATION _ PERMISSION _ INDEX ] Ġ== ĠPackage Manager . PERMISSION _ DEN IED Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( request Code Ġ== ĠREQUEST _ FO REG ROUND _ AND _ BACKGROUND _ PERMISSION _ RESULT _ CODE Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgrant Results [ BACKGROUND _ LOCATION _ PERMISSION _ INDEX ] Ġ== ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPackage Manager . PERMISSION _ DEN IED ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . make ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot View , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . permission _ den ied _ explanation , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . LENGTH _ IN DEFIN ITE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setAction ( R . string . settings ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( Intent (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= ĠSettings . ACTION _ APPLICATION _ DETAILS _ SETTINGS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= ĠUri . from Parts (" package ", ĠBuild Config . APPLICATION _ ID , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflags Ġ= ĠIntent . FLAG _ ACTIVITY _ NEW _ TASK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. show () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Foreground And Background Location Permissions () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Device Location Settings And Start () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ* Ġ ĠWhen Ġwe Ġget Ġthe Ġresult Ġfrom Ġasking Ġthe Ġuser Ġto Ġturn Ġon Ġdevice Ġlocation , Ġwe Ġcall ĊĠĠĠĠ Ġ* Ġ Ġcheck Device Location Settings And Start Ge ofence Ġagain Ġto Ġmake Ġsure Ġit 's Ġactually Ġon , Ġbut ĊĠĠĠĠ Ġ* Ġ Ġwe Ġdon 't Ġresolve Ġthe Ġcheck Ġto Ġkeep Ġthe Ġuser Ġfrom Ġseeing Ġan Ġend less Ġloop . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġcheck Ġthat Ġthe Ġuser Ġturned Ġon Ġtheir Ġdevice Ġlocation Ġand Ġask Ġagain Ġif Ġthey Ġdid Ġnot ĊĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" on Activity Result ") ĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== ĠREQUEST _ T URN _ DEVICE _ LOCATION _ ON ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" on Activity Result : ĠREQUEST _ T URN _ DEVICE _ LOCATION _ ON ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Device Location Settings And Start ( false ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġfun ĠonSuccess full Check () Ċ } Ċ