package Ġcom . k yle cor ry . trail _ sense . navigation . paths . infrastructure . commands Ċ Ċ import Ġandroid . content . Context Ċ import Ġcom . k yle cor ry . and rome da . location . IG PS Ċ import Ġcom . k yle cor ry . trail _ sense . navigation . paths . domain . Path Point Ċ import Ġcom . k yle cor ry . trail _ sense . navigation . paths . infrastructure . persistence . Path Service Ċ import Ġcom . k yle cor ry . trail _ sense . shared . User Preferences Ċ import Ġcom . k yle cor ry . trail _ sense . shared . commands . Coroutine Command Ċ import Ġcom . k yle cor ry . trail _ sense . shared . extensions . on IO Ċ import Ġcom . k yle cor ry . trail _ sense . shared . network Quality Ċ import Ġcom . k yle cor ry . trail _ sense . shared . sensors . Null Cell Signal Sensor Ċ import Ġcom . k yle cor ry . trail _ sense . shared . sensors . Sensor Service Ċ import Ġcom . k yle cor ry . trail _ sense . shared . sensors . al time ter . F used Al time ter Ċ import Ġkotlinx . coroutines . Job Ċ import Ġkotlinx . coroutines . join All Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . with Timeout OrNull Ċ import Ġjava . time . Duration Ċ import Ġjava . time . Instant Ċ Ċ class ĠBack track Command ( private Ġval Ġcontext : ĠContext , Ġprivate Ġval Ġpath Id : ĠLong Ġ= Ġ 0 ) Ġ: ĊĠĠĠ ĠCor outine Command Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġprefs Ġ= ĠUser Preferences ( context ) ĊĊĠĠĠ Ġprivate Ġval Ġsensor Service Ġ= ĠSensor Service ( context ) ĊĠĠĠ Ġprivate Ġval Ġgps Ġ= Ġsensor Service . get GPS () ĊĠĠĠ Ġprivate Ġval Ġal time ter Ġ= Ġsensor Service . get Al time ter () ĊĠĠĠ Ġprivate Ġval Ġcell Signal Sensor Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( prefs . back track Save Cell History Ġ&& Ġpath Id Ġ== Ġ 0 L ) Ġsensor Service . getCell Signal () Ġelse ĠNull Cell Signal Sensor () ĊĊĠĠĠ Ġprivate Ġval Ġpath Service Ġ= ĠPath Service . getInstance ( context ) ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġexecute () Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate Sensors () ĊĠĠĠĠĠĠĠ Ġval Ġpoint Ġ= Ġrecord Waypoint () ĊĠĠĠĠĠĠĠ ĠCreate Last Signal Beacon Command ( context ). execute ( point ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġupdate Sensors () Ġ{ ĊĠĠĠĠĠĠĠ Ġon IO Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Timeout OrNull ( Duration . of Seconds ( 1 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 () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjobs . add ( launch Ġ{ Ġcell Signal Sensor . read () Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjobs . join All () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgps . stop ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġal time ter . stop ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcell Signal Sensor . stop ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ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 Ġon IO Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġway point Ġ= ĠPath Point ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgps . location , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( should Read Al time ter () Ġ&& Ġal time ter . altitude Ġ!= Ġ 0 f ) Ġal time ter . altitude Ġelse Ġgps . altitude , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInstant . now (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcell Signal Sensor . network Quality () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( path Id Ġ== Ġ 0 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Service . add Back track Point ( waypoint ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Service . add Waypoint ( waypoint ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġway point ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }