package Ġcom . y ab aze . tracking helper library Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . location . Location Ċ import Ġandroid . location . Location Listener Ċ import Ġandroid . location . Location Manager Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Looper Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . core . app . Activity Compat Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġcom . google . android . gms . location .* Ċ Ċ abstract Ġclass ĠLocation Tracker ( var Ġcontext : ĠContext ) Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġm Location Request : ĠLocation Request ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġprevious Api Location : ĠLocation ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġgps Location Manager : ĠLocation Manager ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġnetwork Location Manager : ĠLocation Manager ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm F used Location Provider Client : ĠF used Location Provider Client ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġpermission Check Ġ: ĠPermission Check Ġ= ĠPermission Check ( context Ġ= Ġcontext ) ĊĊĠĠĠ Ġval Ġis GPS Enabled Ġ: Boolean ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgps Location Manager Ġ= Ġcontext ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getSystem Service ( Context . LOCATION _ SERVICE ) Ġas ĠLocation Manager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġgps Location Manager ?. is Provider Enabled ( Location Manager . GPS _ PROVIDER ) ?: false ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġis Network Enabled Ġ: ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork Location Manager Ġ= Ġcontext ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getSystem Service ( Context . LOCATION _ SERVICE ) Ġas ĠLocation Manager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnetwork Location Manager ?. is Provider Enabled ( Location Manager . NETWORK _ PROVIDER ) ?: false ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġupdate Interval Ġ: Long Ġ= Ġ 5 Ġ* Ġ 1 0 0 0 ĊĠĠĠ Ġprivate Ġvar Ġfast est Interval : Long Ġ= Ġ 5 Ġ* Ġ 1 0 0 0 ĊĠĠĠ Ġprivate Ġvar Ġminimum Distance : Float Ġ= Ġ 1 f ĊĊĠĠĠ Ġprivate Ġval Ġlocation Callback : ĠLocation Callback Ġ= Ġobject Ġ: ĠLocation Callback () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Location Result ( location Result : ĠLocation Result ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( previous Api Location Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Api Location Ġ= Ġlocation Result . last Location ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocation Detail Ġ= ĠLocation Detail ( location Result . last Location , Ġprevious Api Location ?: location Result . last Location ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġspeed : ĠDouble Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Detail . get Calculated Speed () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// on Google F used Location Changed ( location Result . last Location , Ġspeed ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Location Changed ( location Result . last Location , Ġspeed , Location Update . F USED _ LOCATION ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Api Location Ġ= Ġlocation Result . last Location ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġgps Location : ĠLocation ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġprevious G ps Location : ĠLocation ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġprevious Network Location : ĠLocation ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġgps Location Listener : ĠLocation Listener Ġ= ĊĠĠĠĠĠĠĠ Ġobject Ġ: ĠLocation Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Location Changed ( location : ĠLocation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( previous G ps Location Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevious G ps Location Ġ= Ġlocation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgps Location Ġ= Ġlocation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocation Detail Ġ= ĠLocation Detail ( location , Ġprevious G ps Location ?: location ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgps Calculated Speed : ĠDouble Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Detail . get Calculated Speed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// on G ps Location Changed ( location , Ġgps Calculated Speed ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Location Changed ( location , Ġgps Calculated Speed , Location Update . GPS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevious G ps Location Ġ= Ġlocation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Status Changed ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprovider : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextras : ĠBundle ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Provider Enabled ( provider : ĠString ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Provider Disabled ( provider : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( context , Ġ" Please ĠEnable ĠGPS ", ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġnetwork Location Listener : ĠLocation Listener Ġ= ĊĠĠĠĠĠĠĠ Ġobject Ġ: ĠLocation Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Location Changed ( location : ĠLocation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( previous Network Location Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Network Location Ġ= Ġlocation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocation Detail Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocation Detail ( location , Ġprevious Network Location ?: location ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnetwork Calculated Speed : ĠDouble Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Detail . get Calculated Speed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// on Network Location Changed ( location , Ġnetwork Calculated Speed ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Location Changed ( location , Ġnetwork Calculated Speed , Location Update . NETWORK ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Network Location Ġ= Ġlocation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Status Changed ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprovider : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextras : ĠBundle ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Provider Enabled ( provider : ĠString ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Provider Disabled ( provider : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Failure ( ErrorMessage . NETWORK _ NOT _ AVAILABLE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget G ps Location () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is GPS Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( gps Location Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . M ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( context . check Self Permission ( Manifest . permission . ACCESS _ F INE _ LOCATION ) Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED Ġ&& Ġcontext . check Self Permission ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . ACCESS _ CO AR SE _ LOCATION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Failure ( ErrorMessage . PERMISSION _ DEN IED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgps Location Manager !!. request Location Updates ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocation Manager . GPS _ PROVIDER , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Interval , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġminimum Distance , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgps Location Listener , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL ooper . get Main Looper () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonSuccess ( Success Message . SERVICE _ RUNNING ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Failure ( ErrorMessage . GPS _ NOT _ AVAILABLE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Network Location Updates () ĊĠĠĠ Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Network Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . M ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( context . check Self Permission ( Manifest . permission . ACCESS _ F INE _ LOCATION ) Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED Ġ&& Ġcontext . check Self Permission ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . ACCESS _ CO AR SE _ LOCATION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork Location Manager !!. request Location Updates ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocation Manager . NETWORK _ PROVIDER , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Interval , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġminimum Distance , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork Location Listener , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL ooper . get Main Looper () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Failure ( ErrorMessage . NETWORK _ NOT _ AVAILABLE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġget F used Location Updates () ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( 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 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Failure ( ErrorMessage . PERMISSION _ DEN IED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Location Request Ġ= ĠLocation Request () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Location Request !!. interval Ġ= Ġupdate Interval ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Location Request !!. fast est Interval Ġ= Ġfast est Interval ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Location Request !!. priority Ġ= ĠLocation Request . PRIORITY _ HIGH _ AC CUR ACY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm F used Location Provider Client Ġ= ĠLocation Services . getF used Location Provider Client ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpermission Ġ= ĠContext Compat . check Self Permission ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . ACCESS _ F INE _ LOCATION ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( permission Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm F used Location Provider Client ?. request Location Updates ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Location Request , Ġlocation Callback , Ġ Ġ// m Location Request , Ġlocation Callback , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL ooper . get Main Looper () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Failure ( ErrorMessage . PERMISSION _ DEN IED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstart Location Tracker ( update Interval : Long , fast est Interval : Long Ġ, Ġminimum Distance Ġ: Float , Ġlocation Update : Location Update ){ ĊĊĠĠĠĠĠĠĠ Ġif ( permission Check . check Permission ( permission Check . LOCATION _ PERMISSION S )) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( update Interval Ġ< Ġ 1 0 0 0 Ġ&& Ġfast est Interval Ġ< Ġ 1 0 0 0 ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Failure ( ErrorMessage . FAILED _ TO _ START ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . update Interval Ġ= Ġupdate Interval ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . fast est Interval Ġ= Ġfast est Interval ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . minimum Distance Ġ= Ġminimum Distance ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Location Tracker ( location Update ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Location Tracker ( location Update ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Failure ( errorMessage Ġ= ĠError Message . PERMISSION _ DEN IED ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstart Location Tracker ( location Update : ĠLocation Update ){ ĊĊĠĠĠĠĠĠĠ Ġif ( permission Check . check Permission ( permission Check . LOCATION _ PERMISSION S )) Ġ{ ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( location Update ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocation Update . GPS Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget G ps Location () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocation Update . NETWORK Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Network Location Updates () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocation Update . F USED _ LOCATION Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget F used Location Updates () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocation Update . ALL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Network Location Updates () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget G ps Location () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget F used Location Updates () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠonSuccess ( Success Message . SERVICE _ STARTED ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Failure ( errorMessage Ġ= ĠError Message . PERMISSION _ DEN IED ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstop Location Tracker ( location Update : ĠLocation Update ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen ( location Update ){ ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠLocation Update . GPS ->{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgps Location Manager ?. remove Updates ( gps Location Listener ) ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Failure ( ErrorMessage . FAILED _ TO _ STOP _ UPDATE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLocation Update . NETWORK ->{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork Location Manager ?. remove Updates ( network Location Listener ) ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Failure ( ErrorMessage . FAILED _ TO _ STOP _ UPDATE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLocation Update . F USED _ LOCATION ->{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm F used Location Provider Client ?. remove Location Updates ( location Callback ) ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Failure ( ErrorMessage . FAILED _ TO _ STOP _ UPDATE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLocation Update . ALL ->{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgps Location Manager ?. remove Updates ( gps Location Listener ) ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Failure ( ErrorMessage . FAILED _ TO _ STOP _ UPDATE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnetwork Location Manager ?. remove Updates ( network Location Listener ) ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Failure ( ErrorMessage . FAILED _ TO _ STOP _ UPDATE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm F used Location Provider Client ?. remove Location Updates ( location Callback ) ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Failure ( ErrorMessage . FAILED _ TO _ STOP _ UPDATE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠonSuccess ( Success Message . SERVICE _ STOP PED ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġabstract Ġfun Ġon Location Changed ( ĊĠĠĠĠĠĠĠ Ġnetwork Location : ĠLocation ?, ĊĠĠĠĠĠĠĠ Ġnetwork Location Speed : ĠDouble , ĊĠĠĠĠĠĠĠ Ġlocation Update : ĠLocation Update ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprotected Ġabstract Ġfun Ġon Failure ( errorMessage Ġ: ĠError Message ) ĊĊĠĠĠ Ġprotected Ġabstract Ġfun ĠonSuccess ( success Message Ġ: ĠSuccess Message ) Ċ Ċ } Ċ