package Ġcom . j ace kp ie tras . zoo . tracking Ċ Ċ import Ġandroid . Manifest . permission . ACCESS _ CO AR SE _ LOCATION Ċ import Ġandroid . Manifest . permission . ACCESS _ F INE _ LOCATION Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . app . Service Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . pm . PackageManager . PERMISSION _ GRAN TED Ċ import Ġandroid . location . Location Ċ import Ġandroid . location . Location Listener Ċ import Ġandroid . location . Location Manager Ċ import Ġandroid . location . Location Manager .* Ċ import Ġandroid . os . Looper Ċ import Ġandroidx . core . content . Context Compat . check Self Permission Ċ import Ġcom . google . android . gms . common . Connection Result Ċ import Ġcom . google . android . gms . common . Google Api Availability Ċ import Ġcom . google . android . gms . location .* Ċ import Ġtim ber . log . Tim ber ĊĊ Ċ @ Suppress Lint (" Missing Permission ") Ċ class ĠG ps Location Listener Compat ( ĊĠĠĠ Ġprivate Ġval Ġon Location Changed : Ġ( time : ĠLong , Ġlat : ĠDouble , Ġlon : ĠDouble ) Ġ-> ĠUnit , ĊĠĠĠ Ġprivate Ġval Ġon G ps Status Changed : Ġ( enabled : ĠBoolean ) Ġ-> ĠUnit Ġ= Ġ{}, Ċ ) Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġhave Google Play Ġ= Ġfalse ĊĊĠĠĠ Ġfun Ġadd Location Listener ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġhave Google Play Ġ= ĠGoogle Api Availability . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. is Google Play Services Available ( context ) Ġ== ĠConnection Result . SUCCESS ĊĊĠĠĠĠĠĠĠ Ġif Ġ( have Google Play ) Ġadd Listener With G MS ( context . application Context ) ĊĠĠĠĠĠĠĠ Ġelse Ġadd Listener Without G MS ( context . application Context ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Location Listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( have Google Play ) Ġremove Listener With G MS () ĊĠĠĠĠĠĠĠ Ġelse Ġremove Listener Without G MS () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġno Permissions ( context : ĠContext ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġcheck Self Permission ( context , ĠACCESS _ F INE _ LOCATION ) Ġ!= ĠPER MISSION _ GRAN TED Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Self Permission ( context , ĠACCESS _ CO AR SE _ LOCATION ) Ġ!= ĠPER MISSION _ GRAN TED ĊĊĠĠĠ Ġ// region ĠWithout ĠGoogle ĠPlay ĊĠĠĠ Ġprivate Ġvar Ġlocation Manager : ĠLocation Manager ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġlocation Listener : ĠLocation Listener Impl ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġfun Ġrequest Location Updates ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠ Ġlocation Manager : ĠLocation Manager ĊĠĠĠ Ġ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġlocation Manager . request Location Updates ( context , ĠGPS _ PROVIDER ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġlocation Manager . request Location Updates ( context , ĠNET WORK _ PROVIDER ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġlocation Manager . request Location Updates ( context , ĠPAS SIVE _ PROVIDER ) ĊĊĠĠĠ Ġprivate Ġfun ĠLocation Manager . request Location Updates ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠ Ġprovider : ĠString ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlocation Listener Ġ= Ġlocation Listener Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġno Permissions ( context ) Ġ-> ĠTim ber . e (" Permissions Ġnot Ġgranted ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġall Providers . contains ( provider ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Location Updates ( provider , Ġ 5 0 0 0 , Ġ 0 f , Ġlocation Listener ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate With Last Known Location ( this , Ġprovider ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNullPointerException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . w ( e , Ġ" Location Ġcannot Ġbe Ġaccessed ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . w ( e , Ġ" Location Ġcannot Ġbe Ġaccessed ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate With Last Known Location ( location Manager : ĠLocation Manager , Ġprovider : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlocation Ġ= Ġlocation Manager . getLast Known Location ( provider ) ĊĠĠĠĠĠĠĠ Ġif Ġ( location Ġ!= Ġnull ) Ġlocation Listener ?. on Location Changed ( location ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Listener Without G MS ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlocation Listener ?. let Ġ{ Ġlistener Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Manager ?. remove Updates ( listener ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlocation Manager Ġ= Ġcontext . getSystem Service ( Service . LOCATION _ SERVICE ) Ġas ? ĠLocation Manager ĊĠĠĠĠĠĠĠ Ġlocation Listener Ġ= ĠLocation Listener Impl ( on Location Changed , Ġon G ps Status Changed ) ĊĠĠĠĠĠĠĠ Ġlocation Manager ?. let Ġ{ Ġmanager Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Listener ?. let Ġ{ Ġlistener Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmanager . remove Updates ( listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Location Updates ( context , Ġmanager ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġremove Listener Without G MS () Ġ{ ĊĠĠĠĠĠĠĠ Ġlocation Listener ?. let Ġ{ Ġlistener Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Manager ?. remove Updates ( listener ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlocation Listener Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġlocation Manager Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠLocation Listener Impl ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġon Location Changed : Ġ( time : ĠLong , Ġlat : ĠDouble , Ġlon : ĠDouble ) Ġ-> ĠUnit , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġon G ps Status Changed : Ġ( enabled : ĠBoolean ) Ġ-> ĠUnit Ġ= Ġ{}, ĊĠĠĠ Ġ) Ġ: ĠLocation Listener Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Location Changed ( location : ĠLocation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Location Changed ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation . time , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation . latitude , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation . longitude ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Provider Disabled ( provider : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon G ps Status Changed ( false ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Provider Enabled ( provider : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon G ps Status Changed ( true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// endregion ĊĊĠĠĠ Ġ// region ĠWith ĠGoogle ĠPlay ĊĠĠĠ Ġprivate Ġvar Ġf used Location Client : ĠF used Location Provider Client ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġlocation Callback : ĠLocation Callback ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Location Request () Ġ= ĊĠĠĠĠĠĠĠ ĠLocation Request ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. create () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpriority Ġ= ĠLocation Request . PRIORITY _ HIGH _ AC CUR ACY ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinterval Ġ= Ġ 1 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfast est Interval Ġ= Ġ 1 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsmallest Dis placement Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Listener With G MS ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlocation Callback ?. let Ġ{ Ġlocation Callback Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf used Location Client ?. remove Location Updates ( location Callback ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġclient Ġ= ĠLocation Services . getF used Location Provider Client ( context ) ĊĠĠĠĠĠĠĠ Ġf used Location Client Ġ= Ġclient ĊĠĠĠĠĠĠĠ Ġlocation Callback Ġ= ĠLocation Callback Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Location Changed , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon G ps Status Changed , ĊĠĠĠĠĠĠĠ Ġ). also Ġ{ Ġlocation Callback Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . request Location Updates ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Location Request (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Callback , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL ooper . get Main Looper (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġremove Listener With G MS () Ġ{ ĊĠĠĠĠĠĠĠ Ġlocation Callback ?. let Ġ{ Ġlocation Callback Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf used Location Client ?. remove Location Updates ( location Callback ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlocation Callback Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġf used Location Client Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠLocation Callback Impl ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġon Location Changed : Ġ( time : ĠLong , Ġlat : ĠDouble , Ġlon : ĠDouble ) Ġ-> ĠUnit , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġon G ps Status Changed : Ġ( enabled : ĠBoolean ) Ġ-> ĠUnit Ġ= Ġ{}, ĊĠĠĠ Ġ) Ġ: ĠLocation Callback () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Location Availability ( available : ĠLocation Availability ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon G ps Status Changed ( available ?. is Location Available Ġ?: Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Location Result ( location Result : ĠLocation Result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( location Ġin Ġlocation Result . locations ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Location Changed ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation . time , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation . latitude , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation . longitude , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// endregion Ċ }