package Ġpl . jak ub ok ras a . b iker out es . core . service Ċ Ċ import Ġandroid . app . Notification Channel Ċ import Ġandroid . app . Notification Manager Ċ import Ġandroid . app . Pending Intent Ċ import Ġandroid . app . Service Ċ import Ġandroid . content . Intent Ċ import Ġandroid . location . Location Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Handler Thread Ċ import Ġandroid . os . IB inder Ċ import Ġandroid . util . Log Ċ import Ġandroidx . core . app . Notification Compat Ċ import Ġandroidx . core . content . edit Ċ import Ġandroidx . local broadcast manager . content . Local Broadcast Manager Ċ import Ġcom . google . android . gms . location . F used Location Provider Client Ċ import Ġcom . google . android . gms . location . Location Callback Ċ import Ġcom . google . android . gms . location . Location Request Ċ import Ġcom . google . android . gms . location . Location Result Ċ import Ġorg . k oin . core . K oin Component Ċ import Ġorg . k oin . core . inject Ċ import Ġorg . os md roid . util . Geo Point Ċ import Ġpl . jak ub ok ras a . b iker out es . R Ċ import Ġpl . jak ub ok ras a . b iker out es . core . user . presentation . MainActivity Ċ import Ġpl . jak ub ok ras a . b iker out es . core . util . Preference Helper Ċ import Ġpl . jak ub ok ras a . b iker out es . features . map . domain . model . Geo Point Data Ċ import Ġpl . jak ub ok ras a . b iker out es . features . ui _ features . map . presentation . Map Fragment . Companion . SEND _ LOCATION _ ACTION Ċ import Ġpl . jak ub ok ras a . b iker out es . features . ui _ features . map . presentation . Map ViewModel Ċ Ċ class ĠLocation Service Ġ: ĠService (), ĠK oin Component Ġ{ ĊĠĠĠ Ġprivate Ġval Ġm Location Request : ĠLocation Request Ġby Ġinject () ĊĠĠĠ Ġprivate Ġval Ġm F used Location Client : ĠF used Location Provider Client Ġby Ġinject () ĊĠĠĠ Ġprivate Ġval Ġm Local BR : ĠLocal Broadcast Manager Ġby Ġinject () ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Location Callback : ĠLocation Callback ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Service Handler : ĠHandler ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġhandler Thread : ĠHandler Thread ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Notification Manager : ĠNotification Manager ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Location : ĠLocation ĊĠĠĠ Ġprivate Ġval Ġmap ViewModel : ĠMap ViewModel Ġby Ġinject () ĊĠĠĠ Ġprivate Ġval Ġpreference Helper : ĠPreference Helper Ġby Ġinject () ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ( intent : ĠIntent ): ĠI Binder ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate () Ġ{ ĊĠĠĠĠĠĠĠ Ġhandler Thread Ġ= ĠHandler Thread ( LOG _ TAG ) ĊĠĠĠĠĠĠĠ Ġhandler Thread . start () ĊĠĠĠĠĠĠĠ Ġm Service Handler Ġ= ĠHandler ( handler Thread . lo oper ) ĊĠĠĠĠĠĠĠ Ġm Notification Manager Ġ= Ġget System Service ( NOTIFICATION _ SERVICE ) Ġas ĠNotification Manager ĊĠĠĠĠĠĠĠ Ġcreate Notification Channel () ĊĊĠĠĠĠĠĠĠ Ġ// Ġuseful Ġe . g . Ġwhen Ġthe Ġprocess Ġwith Ġapp Ġwas Ġkilled Ġwhile Ġthe ĠRecord ing ĠMode Ġwas Ġturned Ġon ĊĠĠĠĠĠĠĠ Ġdisable Recording Mode In Preferences () ĊĠĠĠĠĠĠĠ Ġsuper . onCreate () ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdisable Recording Mode In Preferences () Ġ{ ĊĠĠĠĠĠĠĠ Ġpreference Helper . preferences . edit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Boolean ( Preference Helper . PRE F _ KEY _ MAP FRAGMENT _ MODE _ RECORD ING , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlocation Callback Init () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Location Callback Ġ= Ġobject Ġ: ĠLocation Callback () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Location Result ( location Result : ĠLocation Result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Location Result ( location Result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Result . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocation Ġ= Ġit . last Location ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon New Location ( location ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Notification Channel () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnotify Manager Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbase Context . getSystem Service ( NOTIFICATION _ SERVICE ) Ġas ĠNotification Manager ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchannel Ġ= ĠNotification Channel ( CHANNEL _ DEFAULT _ IMPORT ANCE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Location ĠService Ġnotification ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Manager . IMPORT ANCE _ DEFAULT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchannel . description Ġ= Ġ" the Ġnotification Ġinform s Ġabout Ġrunning ĠLocation Ġservice " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchannel . set Sound ( null , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Manager . create Notification Channel ( channel ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart Command ( intent : ĠIntent ?, Ġflags : ĠInt , Ġstart Id : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpending Intent : ĠPending Intent Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIntent ( this , ĠMainActivity :: class . java ). let Ġ{ Ġnotification Intent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPending Intent . getActivity ( this , Ġ 0 , Ġnotification Intent , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġnotification Ġ= ĠNotification Compat . Builder ( this , ĠCHAN NEL _ DEFAULT _ IMPORT ANCE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Title (" Bi ke ĠRoutes ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Small Icon ( R . drawable . ic _ loc _ service ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Intent ( pending Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Sound ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Foreground ( SERVICE _ NOTIFICATION _ ID , Ġnotification ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Location Updates () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠSTART _ NOT _ STICK Y ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Service Handler . remove Callbacks And Messages ( null ) ĊĠĠĠĠĠĠĠ Ġif ( this :: m Location Callback . isInitialized ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove Location Updates () ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrequest Location Updates () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . i ( LOG _ TAG , Ġ" Request ing Ġlocation Ġupdates ") ĊĠĠĠĠĠĠĠ Ġlocation Callback Init () ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm F used Location Client . request Location Updates ( m Location Request , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Location Callback , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandler Thread . lo oper ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( unlikely : ĠSecurity Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( LOG _ TAG , Ġ" Lost Ġlocation Ġpermission . ĠCould Ġnot Ġrequest Ġupdates . Ġ$ unlikely ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon New Location ( loc : ĠLocation ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Location Ġ= Ġloc ĊĊĠĠĠĠĠĠĠ Ġif ( is Recording Mode ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap ViewModel . insert Point ( Geo Point Data ( loc . latitude , Ġloc . longitude )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap ViewModel . update Distance ( Geo Point ( loc )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// send Ġupdate ĠUI Ġbroadcast ĊĠĠĠĠĠĠĠ Ġval Ġnew Loc Intent Ġ= ĠIntent () ĊĠĠĠĠĠĠĠ Ġnew Loc Intent . action Ġ= ĠS END _ LOCATION _ ACTION ĊĠĠĠĠĠĠĠ Ġnew Loc Intent . putExtra (" EXTRA _ LOCATION ", Ġloc ) ĊĠĠĠĠĠĠĠ Ġm Local BR . send Broadcast ( new Loc Intent ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Recording Mode () Ġ= Ġpreference Helper . preferences . getBoolean ( Preference Helper . PRE F _ KEY _ MAP FRAGMENT _ MODE _ RECORD ING , Ġfalse ) ĊĊĠĠĠ Ġprivate Ġfun Ġremove Location Updates () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . i ( LOG _ TAG , Ġ" Removing Ġlocation Ġupdates ") ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm F used Location Client . remove Location Updates ( m Location Callback ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler Thread . quit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Self () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( unlikely : ĠSecurity Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( LOG _ TAG , Ġ" Lost Ġlocation Ġpermission . ĠCould Ġnot Ġremove Ġupdates . Ġ$ unlikely ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCHAN NEL _ DEFAULT _ IMPORT ANCE Ġ= Ġ" service _ notification _ channel " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSERVICE _ NOTIFICATION _ ID Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġval ĠLOG _ TAG : ĠString Ġ= ĠLocation Service :: class . java . simple Name ĊĠĠĠ Ġ} Ċ }