From 1637ef16d6010df916e60d49effe79ae01873ea2 Mon Sep 17 00:00:00 2001 From: Ethan Dalool Date: Sun, 2 Apr 2023 18:41:16 -0700 Subject: [PATCH] Improve isolate_trkseg feature by querying its endpoints for more. --- .../main/java/net/voussoir/trkpt/Database.kt | 4 +-- app/src/main/java/net/voussoir/trkpt/Track.kt | 36 +++++++++++++++++-- .../java/net/voussoir/trkpt/TrackFragment.kt | 8 ++--- app/src/main/java/net/voussoir/trkpt/Trkpt.kt | 6 ++++ 4 files changed, 46 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/net/voussoir/trkpt/Database.kt b/app/src/main/java/net/voussoir/trkpt/Database.kt index 83f412c..4ecefdf 100644 --- a/app/src/main/java/net/voussoir/trkpt/Database.kt +++ b/app/src/main/java/net/voussoir/trkpt/Database.kt @@ -85,11 +85,11 @@ class Database(val trackbook: Trackbook) connection.insert("trkpt", null, values) } - fun select_trkpt_start_end(device_id: String, start_time: Long, end_time: Long): Iterator + fun select_trkpt_start_end(device_id: String, start_time: Long, end_time: Long, order: String="ASC"): Iterator { Log.i("VOUSSOIR", "Track.trkpt_generator: Querying points between ${start_time} -- ${end_time}.") return _trkpt_generator(this.connection.rawQuery( - "SELECT device_id, lat, lon, time, provider, ele, accuracy, sat FROM trkpt WHERE device_id = ? AND time >= ? AND time <= ? ORDER BY time ASC", + "SELECT device_id, lat, lon, time, provider, ele, accuracy, sat FROM trkpt WHERE device_id = ? AND time >= ? AND time <= ? ORDER BY time ${order}", arrayOf(device_id, start_time.toString(), end_time.toString()) )) } diff --git a/app/src/main/java/net/voussoir/trkpt/Track.kt b/app/src/main/java/net/voussoir/trkpt/Track.kt index 38b7e93..5e0e474 100644 --- a/app/src/main/java/net/voussoir/trkpt/Track.kt +++ b/app/src/main/java/net/voussoir/trkpt/Track.kt @@ -36,10 +36,42 @@ data class Track ( var name: String = "", var _start_time: Long = 0L, var _end_time: Long = 0L, - val trkpts: ArrayList = ArrayList(), + val trkpts: ArrayDeque = ArrayDeque(), var trackFormatVersion: Int = Keys.CURRENT_TRACK_FORMAT_VERSION, ) { + /** + * Discover the true bounds of this trkseg by querying for points until the stop over threshold. + * This is extremely helpful when using the "when was I here" button on an area, then expanding + * the trkseg to its ends. + */ + fun expand_to_trkseg_bounds() + { + if (trkpts.isEmpty()) + { + return + } + var previous = trkpts.first() + for (trkpt in database.select_trkpt_start_end(device_id, start_time=0L, end_time=trkpts.first().time, order="DESC")) + { + if ((previous.time - trkpt.time) > Keys.STOP_OVER_THRESHOLD) + { + break + } + trkpts.addFirst(trkpt) + previous = trkpt + } + previous = trkpts.last() + for (trkpt in database.select_trkpt_start_end(device_id, start_time=trkpts.last().time, end_time=Long.MAX_VALUE, order="ASC")) + { + if ((trkpt.time - previous.time) > Keys.STOP_OVER_THRESHOLD) + { + break + } + trkpts.add(trkpt) + previous = trkpt + } + } fun export_gpx(context: Context, fileuri: Uri): Uri? { if (! database.ready) @@ -133,7 +165,7 @@ data class Track ( } data class TrackStatistics( - val trkpts: ArrayList, + val trkpts: ArrayDeque, var distance: Double = 0.0, var duration: Long = 0, var pause_duration: Long = 0, diff --git a/app/src/main/java/net/voussoir/trkpt/TrackFragment.kt b/app/src/main/java/net/voussoir/trkpt/TrackFragment.kt index cec33eb..adb68a2 100644 --- a/app/src/main/java/net/voussoir/trkpt/TrackFragment.kt +++ b/app/src/main/java/net/voussoir/trkpt/TrackFragment.kt @@ -311,6 +311,9 @@ class TrackFragment : Fragment(), MapListener, YesNoDialog.YesNoDialogListener (polyline.actualPoints.first() as Trkpt).time, (polyline.actualPoints.last() as Trkpt).time, )) + + track.expand_to_trkseg_bounds() + set_datetimes_from_track() render_track() } @@ -468,10 +471,7 @@ class TrackFragment : Fragment(), MapListener, YesNoDialog.YesNoDialogListener delete_selected_trkpt_button.visibility = View.VISIBLE use_trkpt_as_start_button.visibility = View.VISIBLE use_trkpt_as_end_button.visibility = View.VISIBLE - if (track_segment_overlays.size > 1) - { - isolate_trkseg_button.visibility = View.VISIBLE - } + isolate_trkseg_button.visibility = View.VISIBLE return } }) diff --git a/app/src/main/java/net/voussoir/trkpt/Trkpt.kt b/app/src/main/java/net/voussoir/trkpt/Trkpt.kt index edadd5a..2017d5e 100644 --- a/app/src/main/java/net/voussoir/trkpt/Trkpt.kt +++ b/app/src/main/java/net/voussoir/trkpt/Trkpt.kt @@ -20,6 +20,7 @@ import android.location.Location import org.osmdroid.util.GeoPoint import org.osmdroid.views.overlay.Polyline import net.voussoir.trkpt.helpers.getNumberOfSatellites +import net.voussoir.trkpt.helpers.iso8601_local class Trkpt( val device_id: String, @@ -53,4 +54,9 @@ class Trkpt( location.time = this.time return location } + + override fun toString(): String + { + return "${device_id} ${iso8601_local(time)} ${latitude}/${longitude}" + } }