package Ġcom . example . android . polit ical prepared ness . utils Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Sender Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . location . Geo coder Ċ import Ġandroid . location . Location Ċ import Ġandroid . location . Location Listener Ċ import Ġandroid . location . Location Manager Ċ import Ġandroid . util . Log Ċ import Ġandroidx . core . app . Activity Compat Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġcom . example . android . polit ical prepared ness . network . models . Address Ċ import Ġcom . example . android . polit ical prepared ness . utils . Constants . LOCATION _ TAG Ċ import Ġcom . google . android . gms . common . api . Res olvable ApiException Ċ import Ġcom . google . android . gms . location . F used Location Provider 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 . gms . maps . Camera Update Factory Ċ import Ġcom . google . android . gms . maps . model . LatLng Ċ import Ġcom . google . android . material . sn ackbar . Snackbar Ċ import Ġjava . util .* Ċ Ċ fun Ġcheck Location Permissions ( fragment : ĠFragment ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ( is Permission Granted ( fragment . require Context ())) Ġ{ ĊĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġrequest Foreground Location Permissions ( fragment ) ĊĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġis Permission Granted ( context : ĠContext ) Ġ: ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġ( Activity Compat . check Self Permission ( context , ĠManifest . permission . ACCESS _ F INE _ LOCATION ) Ġ== ĠPackage Manager . PERMISSION _ GRAN TED Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ ĠActivity Compat . check Self Permission ( context , ĠManifest . permission . ACCESS _ CO AR SE _ LOCATION ) Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ) Ċ } Ċ Ċ @ Suppress Lint (" Missing Permission ") Ċ fun Ġget Location ( location Manager Ġ: ĠLocation Manager , Ġcurrent Position Ġ: ĠMutable LiveData < LatLng >) Ġ{ ĊĠĠĠ Ġval Ġlocation Listener : ĠLocation Listener Ġ= Ġobject Ġ: ĠLocation Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Provider Enabled ( provider : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( LOCATION _ TAG , Ġ" provide Ġ$ provider Ġenabled ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Location Changed ( location : ĠLocation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Position . value Ġ= ĠLat Lng ( location . latitude , Ġlocation . longitude ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// It Ġis Ġcalled Ġfor Ġavoid Ġcrash ing Ġon ĠAndroid Ġ 9 Ġor Ġlower Ġwhen Ġwe Ġremove ĠGPS Ġposition Ġafter Ġselect Ġa Ġposition Ġon Ġa Ġmap ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Provider Disabled ( provider : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// super Ġwas Ġremoved ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( LOCATION _ TAG , Ġ" provide Ġ$ provider Ġdisabled ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġlocation Manager ĊĠĠĠĠĠĠĠ Ġ. request Location Updates ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLocation Manager . GPS _ PROVIDER , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 2 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Listener ĊĠĠĠĠĠĠĠ Ġ) Ċ } Ċ Ċ fun Ġask To Turn On Location ( fragment Ġ: ĠFragment , Ġmethod To Invoke : Ġ() Ġ-> ĠUnit Ġ Ġ= Ġ{}, Ġresolve Ġ: ĠBoolean Ġ= Ġtrue ){ ĊĠĠĠ Ġval Ġlocation Request Ġ= ĠLocation Request . create (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġpriority Ġ= ĠLocation Request . PRIORITY _ LOW _ POWER ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġbuilder Ġ= ĠLocation Settings Request . Builder (). add Location Request ( location Request ) ĊĊĠĠĠ Ġval Ġsettings Client Ġ= ĠLocation Services . get Settings Client ( fragment . require Activity ()) ĊĊĠĠĠ Ġ// variable Ġthat Ġchecks Ġlocation Ġsettings ĊĠĠĠ Ġval Ġlocation Settings Response Task Ġ= ĊĠĠĠĠĠĠĠ Ġsettings Client . check Location Settings ( builder . build ()) ĊĊĠĠĠ Ġlocation Settings Response Task . add On Failure Listener Ġ{ Ġexception Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( exception Ġis ĠRes olvable ApiException Ġ&& Ġresolve ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexception . start Resolution For Result ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment . require Activity (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConstants . REQUEST _ T URN _ DEVICE _ LOCATION _ ON ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( send Ex : ĠIntent Sender . Send Intent Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOC ATION _ TAG , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Error Ġgetting Ġlocation Ġsettings Ġresolution : Ġ" Ġ+ Ġsend Ex . message ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// it 's Ġa Ġcustom ĠSn ackbar Ġwith Ġan Ġaction ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . make ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment . require View (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"", ĠSn ackbar . LENGTH _ IN DEFIN ITE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). setAction ( android . R . string . ok ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġask To Turn On Location ( fragment ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġlocation Settings Response Task . add On Success Listener Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( LOCATION _ TAG , Ġ" Location Ġactivated ") ĊĠĠĠĠĠĠĠ Ġmethod To Invoke . invoke () ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ fun Ġrequest Foreground Location Permissions ( fragment Ġ: ĠFragment ) Ġ{ ĊĠĠĠ ĠLog . e ( LOCATION _ TAG , Ġ" request Foreground Location Permissions ") ĊĠĠĠ Ġif Ġ( is Permission Granted ( fragment . require Context ())) ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġval Ġpermissions Array Ġ= ĠarrayOf ( Manifest . permission . ACCESS _ F INE _ LOCATION , ĠManifest . permission . ACCESS _ CO AR SE _ LOCATION ) ĊĠĠĠ Ġval ĠresultCode Ġ= Ġ ĠConstants . REQUEST _ FO REG ROUND _ PERMISSION S _ REQUEST _ CODE ĊĊĠĠĠ Ġfragment . request Permissions ( ĊĠĠĠĠĠĠĠ Ġpermissions Array , ĊĠĠĠĠĠĠĠ ĠresultCode ) ĊĊĠĠĠ ĠLog . e ( LOCATION _ TAG , Ġ" wait Ġfor Ġforeground ") Ċ } Ċ Ċ fun Ġgeo Code Location ( geo Coder : ĠGeo coder , Ġcurrent Position Coordinates Ġ: ĠLat Lng ): ĠAddress Ġ{ ĊĠĠĠ Ġreturn Ġgeo Coder . get From Location ( current Position Coordinates . latitude , Ġcurrent Position Coordinates . longitude , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġaddress Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( LOCATION _ TAG , Ġ" line Ġ 1 Ġ${ address . th orough f are }") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( LOCATION _ TAG , Ġ" line Ġ 2 Ġ${ address . sub Th orough f are }") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( LOCATION _ TAG , Ġ" zip Ġ${ address . postal Code }") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( LOCATION _ TAG , Ġ" city Ġ${ address . locality }") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( LOCATION _ TAG , Ġ" state Ġ${ address . admin Area }") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAddress ( address . th orough f are , Ġaddress . sub Th orough f are , Ġaddress . locality , Ġaddress . admin Area , Ġaddress . postal Code ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. first () Ċ }