package Ġcom . k yle cor ry . trail _ sense . navigation . ui Ċ Ċ import Ġandroid . view . View Ċ import Ġcom . k yle cor ry . trail _ sense . astr onomy . domain . A str onomy Service Ċ import Ġcom . k yle cor ry . trail _ sense . navigation . domain . Beacon Ċ import Ġcom . k yle cor ry . trail _ sense . navigation . domain . Location Math Ċ import Ġcom . k yle cor ry . trail _ sense . navigation . domain . Navigation Service Ċ import Ġcom . k yle cor ry . trail _ sense . navigation . domain . Navigation Vector Ċ import Ġcom . k yle cor ry . trail _ sense . navigation . infrastructure . Beacon DB Ċ import Ġcom . k yle cor ry . trail _ sense . shared . domain . Coordinate Ċ import Ġcom . k yle cor ry . trail _ sense . shared . User Preferences Ċ import Ġcom . k yle cor ry . trail _ sense . shared . math . delta Angle Ċ import Ġcom . k yle cor ry . trail _ sense . shared . sensors . Device Orientation Ċ import Ġcom . k yle cor ry . trail _ sense . shared . sensors . I Al time ter Ċ import Ġcom . k yle cor ry . trail _ sense . shared . sensors . I Comp ass Ċ import Ġcom . k yle cor ry . trail _ sense . shared . sensors . IG PS Ċ import Ġkotlin . math . abs Ċ import Ġkotlin . math . round ToInt Ċ Ċ class ĠNavigation ViewModel ( ĊĠĠĠ Ġprivate Ġval Ġcomp ass : ĠI Comp ass , ĊĠĠĠ Ġprivate Ġval Ġgps : ĠIG PS , ĊĠĠĠ Ġprivate Ġval Ġal time ter : ĠI Al time ter , ĊĠĠĠ Ġprivate Ġval Ġorientation : ĠDevice Orientation , ĊĠĠĠ Ġprefs : ĠUser Preferences , ĊĠĠĠ Ġbe acon DB : ĠBe acon DB Ċ ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġuse True North Ġ= Ġprefs . navigation . use True North ĊĠĠĠ Ġprivate Ġval Ġdistance Units Ġ= Ġprefs . distance Units ĊĠĠĠ Ġprivate Ġval Ġpref Show Linear Comp ass Ġ= Ġprefs . navigation . show Linear Comp ass ĊĠĠĠ Ġprivate Ġval Ġbe ac ons Ġ= Ġbe acon DB . be ac ons ĊĠĠĠ Ġprivate Ġval Ġshow Near by Be ac ons Ġ= Ġprefs . navigation . show Multiple Be ac ons ĊĠĠĠ Ġprivate Ġval Ġvisible Be ac ons Ġ= Ġprefs . navigation . numberOf Visible Be ac ons ĊĠĠĠ Ġprivate Ġval Ġshow Sun And Moon Ġ= Ġprefs . astr onomy . show On Comp ass ĊĠĠĠ Ġprivate Ġval Ġshow Sun And Moon When Down Ġ= Ġprefs . astr onomy . show On Comp ass When Down ĊĠĠĠ Ġprivate Ġval Ġa str onomy Service Ġ= ĠA str onomy Service () ĊĠĠĠ Ġprivate Ġval Ġnavigation Service Ġ= ĠNavigation Service () ĊĊĠĠĠ Ġval Ġr uler Scale Ġ= Ġprefs . navigation . r uler Scale ĊĊĠĠĠ Ġval Ġaz imuth : ĠFloat ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomp ass . decl ination Ġ= Ġif Ġ( use True North ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnavigation Service . get Decl ination ( gps . location , Ġgps . altitude ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcomp ass . be aring . value ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġaz imuth Txt : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ"${ ( az imuth . round ToInt () Ġ% Ġ 3 6 0 ). toString (). pad Start ( 3 , Ġ' Ġ' )} Â° " ĊĊĠĠĠ Ġval Ġaz imuth Direction : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomp ass . decl ination Ġ= Ġif Ġ( use True North ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnavigation Service . get Decl ination ( gps . location , Ġgps . altitude ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcomp ass . be aring . direction . symbol ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġlocation : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġgps . location . get Formatted String () ĊĊĠĠĠ Ġval Ġalt itude : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( distance Units Ġ== ĠUser Preferences . Distance Units . Met ers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ al time ter . altitude . round ToInt ()} Ġm " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ Location Math . convertTo Base Unit ( al time ter . altitude , Ġdistance Units ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. round ToInt ()} Ġft " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġshow Linear Comp ass : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġpref Show Linear Comp ass Ġ&& Ġorientation . orientation Ġ== ĠDevice Orientation . Orientation . Por trait ĊĊĠĠĠ Ġvar Ġbe acon : ĠBe acon ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġdestination : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbe acon ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvector Ġ= Ġnavigation Service . navigate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgps . location , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . coordinate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgps . altitude , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuse True North ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbe aring Ġ= Ġvector . direction . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"${ this . name } ĠĠĠ Ġ(${ be aring . round ToInt ()} Â° )\ n ${ Location Math . distance To Readable String ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvector . distance , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdistance Units ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġdestination Be aring : ĠFloat ? ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbe acon ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnavigation Service . navigate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgps . location , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . coordinate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgps . altitude , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuse True North ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). direction . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġshow Destination : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġbe acon Ġ!= Ġnull ĊĊĠĠĠ Ġval Ġshare able Location : ĠCoordinate ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġgps . location ĊĊĠĠĠ Ġprivate Ġfun Ġis Facing Beacon ( beacon : ĠBe acon ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdirection Ġ= Ġnavigation Service . navigate ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgps . location , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbe acon . coordinate , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgps . altitude , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuse True North ĊĠĠĠĠĠĠĠ Ġ). direction . value ĊĠĠĠĠĠĠĠ Ġreturn Ġabs ( delta Angle ( direction , Ġaz imuth )) Ġ< Ġ 2 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġnearest Be ac ons : ĠList < Float > ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( show Destination ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( sun Be aring , Ġmoon Be aring , Ġdestination Be aring Ġ?: Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! show Near by Be ac ons ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( sun Be aring , Ġmoon Be aring ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsun And Moon Ġ= ĠlistOf ( sun Be aring , Ġmoon Be aring ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbe ac ons Ġ= Ġ_ nearest Visible Be ac ons ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . second . direction . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. toList () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsun And Moon Ġ+ Ġbe ac ons ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġ_ nearest Visible Be ac ons : ĠList < Pair < Beacon , ĠNavigation Vector >> ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnavigation Service Ġ= ĠNavigation Service () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbe ac ons . as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . visible Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnavigation Service . navigate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgps . location , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . coordinate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgps . altitude , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuse True North ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . second . distance Ġ>= ĠMIN _ BE AC ON _ DISTANCE Ġ} Ġ// ĠDon 't Ġlook Ġat Ġreally Ġclose Ġbe ac ons ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted By Ġ{ Ġit . second . distance Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. take ( visible Be ac ons ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġnavigation : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( show Destination ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdestination ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! show Near by Be ac ons ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvectors Ġ= Ġ_ nearest Visible Be ac ons ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnearest Beacon Ġ= Ġvectors . min By Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdirection Ġ= Ġit . second . direction . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġabs ( delta Angle ( direction , Ġaz imuth )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnearest Beacon ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Facing Beacon ( this . first )) Ġreturn Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdirection Ġ= Ġthis . second . direction . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"${ this . first . name } ĠĠĠ Ġ(${ direction . round ToInt () Ġ% Ġ 3 6 0 } Â° )\ n ${ Location Math . distance To Readable String ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . second . distance , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdistance Units ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġmoon Beacon Visibility : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( show Sun And Moon When Down ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! show Sun And Moon Ġ|| Ġ! astr onomy Service . is Moon Up ( gps . location )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġsun Beacon Visibility : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( show Sun And Moon When Down ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! show Sun And Moon Ġ|| Ġ! astr onomy Service . is Sun Up ( gps . location )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġsun Beacon Opacity : ĠFloat ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( astr onomy Service . is Sun Up ( gps . location )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 5 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġmoon Beacon Opacity : ĠFloat ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( astr onomy Service . is Moon Up ( gps . location )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 5 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġsun Be aring : ĠFloat ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdecl ination Ġ= Ġif Ġ(! use True North ) Ġnavigation Service . get Decl ination ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgps . location , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgps . altitude ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġelse Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġa str onomy Service . getS un Az imuth ( gps . location ). with Decl ination (- decl ination ). value ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġmoon Be aring : ĠFloat ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdecl ination Ġ= Ġif Ġ(! use True North ) Ġnavigation Service . get Decl ination ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgps . location , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgps . altitude ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġelse Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġa str onomy Service . get Moon Az imuth ( gps . location ). with Decl ination (- decl ination ). value ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMIN _ BE AC ON _ DISTANCE Ġ= Ġ 8 f ĊĠĠĠ Ġ} Ċ Ċ }