package Ġcom . k yle cor ry . trail _ sense . tools . back track . domain Ċ Ċ import Ġandroid . content . Context Ċ import Ġcom . k yle cor ry . and rome da . core . sensors . I Al time ter Ċ import Ġcom . k yle cor ry . and rome da . core . sensors . read Ċ import Ġcom . k yle cor ry . and rome da . location . IG PS Ċ import Ġcom . k yle cor ry . and rome da . permissions . Permissions Ċ import Ġcom . k yle cor ry . and rome da . preferences . Preferences Ċ import Ġcom . k yle cor ry . and rome da . signal . Cell Network Ċ import Ġcom . k yle cor ry . and rome da . signal . IC ell Signal Sensor Ċ import Ġcom . k yle cor ry . trail _ sense . R Ċ import Ġcom . k yle cor ry . trail _ sense . navigation . domain . Beacon Entity Ċ import Ġcom . k yle cor ry . trail _ sense . navigation . infrastructure . persistence . I Beacon Repo Ċ import Ġcom . k yle cor ry . trail _ sense . shared . App Color Ċ import Ġcom . k yle cor ry . trail _ sense . shared . Format Service Ċ import Ġcom . k yle cor ry . trail _ sense . shared . sensors . al time ter . F used Al time ter Ċ import Ġcom . k yle cor ry . trail _ sense . tools . back track . infrastructure . persistence . I Waypoint Repo Ċ import Ġcom . k yle cor ry . tr ails ense core . domain . geo . Path Point Ċ import Ġcom . k yle cor ry . tr ails ense core . domain . navigation . Beacon Ċ import Ġcom . k yle cor ry . tr ails ense core . domain . navigation . Beacon Owner Ċ import Ġkotlinx . coroutines .* Ċ import Ġjava . time . Duration Ċ import Ġjava . time . Instant Ċ Ċ class ĠBack track ( ĊĠĠĠ Ġprivate Ġval Ġcontext : ĠContext , ĊĠĠĠ Ġprivate Ġval Ġgps : ĠIG PS , ĊĠĠĠ Ġprivate Ġval Ġal time ter : ĠI Al time ter , ĊĠĠĠ Ġprivate Ġval Ġcell Signal Sensor : ĠI Cell Signal Sensor , ĊĠĠĠ Ġprivate Ġval Ġback track Repo : ĠI Waypoint Repo , ĊĠĠĠ Ġprivate Ġval Ġbe acon Repo : ĠI Beacon Repo , ĊĠĠĠ Ġprivate Ġval Ġrecord Cell Signal : ĠBoolean Ġ= Ġtrue , ĊĠĠĠ Ġprivate Ġval Ġhistory : ĠDuration Ġ= ĠDuration . of Days ( 2 ), ĊĠĠĠ Ġprivate Ġval Ġcache : ĠPreferences Ċ ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġformat Service Ġby Ġlazy Ġ{ ĠFormat Service ( context ) Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġrecord Location () Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate Sensors () ĊĠĠĠĠĠĠĠ Ġval Ġpoint Ġ= Ġrecord Waypoint () ĊĠĠĠĠĠĠĠ Ġcreate Last Signal Beacon ( point ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġcreate Last Signal Beacon ( point : ĠPath Point ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( point . cell Signal Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexisting Ġ= Ġbe acon Repo . get Temporary Beacon ( Beacon Owner . Cell Signal ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbe acon Repo . add Beacon ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBe acon Entity . from ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBe acon ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexisting ?. id Ġ?: Ġ 0 L , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . last _ signal _ beacon _ name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġformat Service . format Cell Network ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCell Network . values () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first Ġ{ Ġit . id Ġ== Ġpoint . cell Signal !!. network . id Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġformat Service . format Quality ( point . cell Signal !!. quality ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpoint . coordinate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelevation Ġ= Ġpoint . elevation , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemporary Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner Ġ= ĠBe acon Owner . Cell Signal , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= ĠApp Color . Orange . color ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġupdate Sensors () Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Timeout OrNull ( Duration . of Seconds ( 3 0 ). to Millis ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjobs Ġ= Ġmutable ListOf < Job >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjobs . add ( launch Ġ{ Ġgps . read () Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( should Read Al time ter ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjobs . add ( launch Ġ{ Ġal time ter . read () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( record Cell Signal Ġ&& ĠPermissions . is Background Location Enabled ( context )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjobs . add ( launch Ġ{ Ġcell Signal Sensor . read () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjobs . join All () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshould Read Al time ter (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġal time ter Ġ! is ĠIG PS Ġ&& Ġal time ter Ġ! is ĠF used Al time ter ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġrecord Waypoint (): ĠPath Point Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Id Ġ= Ġcache . getLong ( context . getString ( R . string . pref _ last _ back track _ path _ id )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġ(( back track Repo . getLast Path Id () Ġ?: Ġ 0 L ) Ġ+ Ġ 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache . put Long ( context . getString ( R . string . pref _ last _ back track _ path _ id ), Ġpath Id ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcell Ġ= Ġcell Signal Sensor . signals . max By OrNull Ġ{ Ġit . strength Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġway point Ġ= ĠWay point Entity ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgps . location . latitude , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgps . location . longitude , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( should Read Al time ter ()) Ġal time ter . altitude Ġelse Ġgps . altitude , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInstant . now (). to Epoch Milli (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcell ?. network ?. id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcell ?. quality ?. ordinal , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġback track Repo . add Waypoint ( waypoint ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġback track Repo . delete Ol der Than ( Instant . now (). minus ( history )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġway point . to Path Point () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }