package Ġcom . k yle cor ry . trail _ sense . tools . back track . ui Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . core . os . bundle Of Ċ import Ġandroidx . navigation . fragment . find Nav Controller Ċ import Ġcom . k yle cor ry . and rome da . alerts . Alerts Ċ import Ġcom . k yle cor ry . and rome da . fragments . Bound Fragment Ċ import Ġcom . k yle cor ry . and rome da . list . ListView Ċ import Ġcom . k yle cor ry . and rome da . pick ers . Pick ers Ċ import Ġcom . k yle cor ry . trail _ sense . R Ċ import Ġcom . k yle cor ry . trail _ sense . databinding . Fragment Back track Binding Ċ import Ġcom . k yle cor ry . trail _ sense . databinding . ListItem Plain Icon Menu Binding Ċ import Ġcom . k yle cor ry . trail _ sense . navigation . infrastructure . persistence . Path Service Ċ import Ġcom . k yle cor ry . trail _ sense . shared . Format Service Ċ import Ġcom . k yle cor ry . trail _ sense . shared . User Preferences Ċ import Ġcom . k yle cor ry . trail _ sense . shared . io . I OF actory Ċ import Ġcom . k yle cor ry . trail _ sense . shared . paths . Path 2 Ċ import Ġcom . k yle cor ry . trail _ sense . tools . back track . domain . Path GP X Converter Ċ import Ġcom . k yle cor ry . trail _ sense . tools . back track . infrastructure . Back track Scheduler Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġjava . time . Instant Ċ Ċ class ĠFragment Back track Ġ: ĠBound Fragment < Fragment Back track Binding >() Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġformat Service Ġby Ġlazy Ġ{ ĠFormat Service ( require Context ()) Ġ} ĊĠĠĠ Ġprivate Ġval Ġprefs Ġby Ġlazy Ġ{ ĠUser Preferences ( require Context ()) Ġ} ĊĠĠĠ Ġprivate Ġval Ġpath Service Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠPath Service . getInstance ( require Context ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġg px Service Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠI OF actory (). create G px Service ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġwas Enabled Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġvar Ġpaths Ġ= Ġempty List < Path 2 >() ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠlistView : ĠListView < Path 2 > ĊĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĊĠĠĠĠĠĠĠ ĠlistView Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠListView ( binding . way points List , ĠR . layout . list _ item _ plain _ icon _ menu ) Ġ{ ĠitemView , Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Path ListItem ( ListItem Plain Icon Menu Binding . bind ( item View ), Ġitem ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠlistView . add Line Separator () ĊĊĠĠĠĠĠĠĠ Ġpath Service . get Live Paths (). observe ( view Lifecycle Owner ) Ġ{ Ġpaths Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Paths Changed ( paths ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwas Enabled Ġ= Ġprefs . back track Enabled ĊĠĠĠĠĠĠĠ Ġif Ġ( was Enabled Ġ&& Ġ!( prefs . is Low Power Mode On Ġ&& Ġprefs . low Power Mode Dis ables Back track )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . start Btn . setImage Resource ( R . drawable . ic _ baseline _ stop _ 2 4 ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . start Btn . setImage Resource ( R . drawable . ic _ baseline _ play _ arrow _ 2 4 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbinding . start Btn . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( prefs . is Low Power Mode On Ġ&& Ġprefs . low Power Mode Dis ables Back track ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAlert s . toast ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . back track _ disabled _ low _ power _ toast ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . back track Enabled Ġ= Ġ! was Enabled ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! was Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . start Btn . setImage Resource ( R . drawable . ic _ baseline _ stop _ 2 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBack track Scheduler . start ( require Context (), Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . start Btn . setImage Resource ( R . drawable . ic _ baseline _ play _ arrow _ 2 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBack track Scheduler . stop ( require Context ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwas Enabled Ġ= Ġ! was Enabled ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġschedule Updates ( INTERVAL _ 1 _ FPS ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonUpdate () Ġ{ ĊĠĠĠĠĠĠĠ Ġwas Enabled Ġ= ĠBack track Scheduler . is On ( require Context ()) ĊĠĠĠĠĠĠĠ Ġif Ġ( was Enabled Ġ&& Ġ!( prefs . is Low Power Mode On Ġ&& Ġprefs . low Power Mode Dis ables Back track )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . start Btn . setImage Resource ( R . drawable . ic _ baseline _ stop _ 2 4 ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . start Btn . setImage Resource ( R . drawable . ic _ baseline _ play _ arrow _ 2 4 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġgenerate Binding ( ĊĠĠĠĠĠĠĠ Ġlayout Inflater : ĠLayoutInflater , ĊĠĠĠĠĠĠĠ Ġcontainer : ĠViewGroup ? ĊĠĠĠ Ġ): ĠFragment Back track Binding Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠFragment Back track Binding . inflate ( layout Inflater , Ġcontainer , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Paths Changed ( paths : ĠList < Path 2 >) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . paths Ġ= Ġpaths . sorted By Descending Ġ{ Ġit . id Ġ} ĊĠĠĠĠĠĠĠ ĠlistView . setData ( this . paths ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( paths . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . way points Empty Text . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . way points Empty Text . visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw Path ListItem ( item Binding : ĠListItem Plain Icon Menu Binding , Ġitem : ĠPath 2 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġitem Strategy Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPath ListItem ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġformat Service , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġpath , Ġaction Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPath Action . Export Ġ-> Ġexport Path ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPath Action . Delete Ġ-> Ġdelete Path ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPath Action . Merge Ġ-> Ġmerge Previous Path ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPath Action . Show Ġ-> Ġshow Path ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPath Action . Rename Ġ-> Ġrename Path ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPath Action . Keep Ġ-> Ġkeep Path ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPath Action . Toggle Visibility Ġ-> Ġtoggle Path Visibility ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġitem Strategy . display ( item Binding , Ġitem ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtoggle Path Visibility ( path : ĠPath 2 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrun In Background Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Service . add Path ( path . copy ( style Ġ= Ġpath . style . copy ( visible Ġ= Ġ! path . style . visible ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrename Path ( path : ĠPath 2 ) Ġ{ ĊĠĠĠĠĠĠĠ ĠPick ers . text ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . rename ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Ġ= Ġpath . name , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhint Ġ= ĠgetString ( R . string . name ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun In Background Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Service . add Path ( path . copy ( name Ġ= Ġif Ġ( it . isBlank ()) Ġnull Ġelse Ġit )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġkeep Path ( path : ĠPath 2 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrun In Background Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Service . add Path ( path . copy ( temporary Ġ= Ġfalse )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Path ( path : ĠPath 2 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfind Nav Controller (). navigate ( R . id . action _ back track _ to _ path , Ġbundle Of (" path _ id " Ġto Ġpath . id )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexport Path ( path : ĠPath 2 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrun In Background Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġway points Ġ= Ġpath Service . get Way points ( path . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġg px Ġ= ĠPath GP X Converter (). to GP X ( way points ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexport File Ġ= Ġ" trail - sense -${ Instant . now (). epoch Second }. g px " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsuccess Ġ= Ġg px Service . export ( g px , Ġexport File ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( success ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAlert s . toast ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . path _ exported ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAlert s . toast ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . export _ path _ error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdelete Path ( path : ĠPath 2 ) Ġ{ ĊĠĠĠĠĠĠĠ ĠAlert s . dialog ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . delete _ path ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresources . get Quantity String ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . plurals . way points _ to _ be _ deleted , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . metadata . way points , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath . metadata . way points ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ Ġcancelled Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! cancelled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun In Background Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Service . delete Path ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmerge Previous Path ( path : ĠPath 2 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprevious Path Ġ= Ġpaths . filter Ġ{ Ġit . id Ġ< Ġpath . id Ġ}. max By OrNull Ġ{ Ġit . id Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( previous Path Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAlert s . toast ( require Context (), ĠgetString ( R . string . no _ previous _ path )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠAlert s . dialog ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . merge _ previous _ path _ title ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ Ġcancelled Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! cancelled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun In Background Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġway points Ġ= Ġpath Service . get Way points ( previous Path . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Service . move Way points To Path ( way points , Ġpath . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Service . delete Path ( previous Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }