package Ġcom . track me . android Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . os . Bundle Ċ import Ġandroidx . activity . compose . setContent Ċ import Ġandroidx . activity . result . contract . Activity Result Contracts Ċ import Ġandroidx . activity . view Models Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . compose . material . Experimental Material Api Ċ import Ġandroidx . core . app . Activity Compat Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġcom . track me . android . services . Location Tracker Service Ċ import Ġkotlinx . coroutines . launch ĊĊ Ċ class ĠMainActivity Ġ: ĠAppCompatActivity () Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġon Tracking Started Callback : Ġ(( new Track Id : ĠLong ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval ĠviewModel : ĠMainActivity ViewModel Ġby Ġview Models Ġ{ ĊĠĠĠĠĠĠĠ ĠMainActivity ViewModel Factory ( application ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġhas Location Permission : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠActivity Compat . check Self Permission ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . ACCESS _ F INE _ LOCATION ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġval Ġrequest Location Permission Ġ= ĊĠĠĠĠĠĠĠ Ġregister For Activity Result ( Activity Result Contracts . Request Permission ()) Ġ{ Ġgranted Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( gr anted ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Location Tracking () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Experimental Material Api ĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġset Content Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApp ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis :: request Location Tracking , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis :: stop Location Tracking , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstop Location Tracking () Ġ{ ĊĠĠĠĠĠĠĠ Ġstop Service ( Intent ( this , ĠLocation Tracker Service :: class . java )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrequest Location Tracking ( on Tracking Started : Ġ(( new Track Id : ĠLong ) Ġ-> ĠUnit )? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( on Tracking Started Ġ!== Ġnull ) Ġon Tracking Started Callback Ġ= Ġon Tracking Started ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! has Location Permission ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Location Permission . launch ( Manifest . permission . ACCESS _ F INE _ LOCATION ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Track Ġ= ĠviewModel . new Track () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Location Tracking ( new Track . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Tracking Started Callback ?. invoke ( new Track . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Tracking Started Callback Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Location Tracking ( track Id : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġservice Intent Ġ= ĠIntent ( this @ MainActivity , ĠLocation Tracker Service :: class . java ) ĊĠĠĠĠĠĠĠ Ġservice Intent . putExtra ( Location Tracker Service . EXTRA _ TRACK _ ID , Ġtrack Id ) ĊĠĠĠĠĠĠĠ Ġstart Foreground Service ( service Intent ) ĊĠĠĠ Ġ} Ċ }