From 7ddb6b32bba79c9d0e6e5b7523c8aa97ddcf2f31 Mon Sep 17 00:00:00 2001 From: Dennis Guse Date: Tue, 25 Nov 2025 18:46:20 +0100 Subject: [PATCH] Cleanup: TrackDataHub doesn't need to query the id of the last TrackPoint. --- .../opentracks/data/ContentProviderUtils.java | 52 ++++--------------- .../opentracks/data/TrackDataHub.java | 16 ++---- .../opentracks/data/TrackPointIterator.java | 11 ++-- .../util/AutoCloseableIterator.java | 4 ++ 4 files changed, 23 insertions(+), 60 deletions(-) diff --git a/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java b/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java index b25e8db69..9675097db 100644 --- a/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java +++ b/src/main/java/de/dennisguse/opentracks/data/ContentProviderUtils.java @@ -617,7 +617,6 @@ public class ContentProviderUtils { } //TODO Only used for file import; might be better to replace it. - //TODO Rename to bulkInsert public int bulkInsertTrackPoint(List trackPoints, Track.Id trackId) { ContentValues[] values = new ContentValues[trackPoints.size()]; for (int i = 0; i < trackPoints.size(); i++) { @@ -636,33 +635,20 @@ public class ContentProviderUtils { } /** - * Gets the last location id for a track. - * Returns -1L if it doesn't exist. + * Gets the last valid location for a track. + * Returns null if it doesn't exist. * * @param trackId the track id */ - @Deprecated - public TrackPoint.Id getLastTrackPointId(@NonNull Track.Id trackId) { - String selection = TrackPointsColumns._ID + "=(SELECT MAX(" + TrackPointsColumns._ID + ") from " + TrackPointsColumns.TABLE_NAME + " WHERE " + TrackPointsColumns.TRACKID + "=?)"; + @VisibleForTesting + @Deprecated // Use TrackPointIterator to fetch all TrackPoints and use the last. + public TrackPoint getLastValidTrackPoint(Track.Id trackId) { + String selection = TrackPointsColumns._ID + "=(SELECT MAX(" + TrackPointsColumns._ID + ") FROM " + TrackPointsColumns.TABLE_NAME + " WHERE " + TrackPointsColumns.TRACKID + "=? AND " + TrackPointsColumns.TYPE + " IN (" + TrackPoint.Type.SEGMENT_START_AUTOMATIC.type_db + "," + TrackPoint.Type.TRACKPOINT.type_db + "))"; String[] selectionArgs = new String[]{Long.toString(trackId.id())}; - try (Cursor cursor = getTrackPointCursor(new String[]{TrackPointsColumns._ID}, selection, selectionArgs, TrackPointsColumns._ID)) { - if (cursor != null && cursor.moveToFirst()) { - return new TrackPoint.Id(cursor.getLong(cursor.getColumnIndexOrThrow(TrackPointsColumns._ID))); - } - } - return null; - } - /** - * Gets the trackPoint id for a location. - */ - @Deprecated - public TrackPoint.Id getTrackPointId(Track.Id trackId, Position position) { - String selection = TrackPointsColumns._ID + "=(SELECT MAX(" + TrackPointsColumns._ID + ") FROM " + TrackPointsColumns.TABLE_NAME + " WHERE " + TrackPointsColumns.TRACKID + "=? AND " + TrackPointsColumns.TIME + "=?)"; - String[] selectionArgs = new String[]{Long.toString(trackId.id()), Long.toString(position.time().toEpochMilli())}; - try (Cursor cursor = getTrackPointCursor(new String[]{TrackPointsColumns._ID}, selection, selectionArgs, TrackPointsColumns._ID)) { - if (cursor != null && cursor.moveToFirst()) { - return new TrackPoint.Id(cursor.getLong(cursor.getColumnIndexOrThrow(TrackPointsColumns._ID))); + try (Cursor cursor = getTrackPointCursor(null, selection, selectionArgs, TrackPointsColumns._ID)) { + if (cursor != null && cursor.moveToNext()) { + return createTrackPoint(cursor); } } return null; @@ -698,26 +684,6 @@ public class ContentProviderUtils { return getTrackPointCursor(null, selection, selectionArgs, TrackPointsColumns.DEFAULT_SORT_ORDER); } - /** - * Gets the last valid location for a track. - * Returns null if it doesn't exist. - * - * @param trackId the track id - */ - @VisibleForTesting - @Deprecated // Use TrackPointIterator to fetch all TrackPoints and use the last. - public TrackPoint getLastValidTrackPoint(Track.Id trackId) { - String selection = TrackPointsColumns._ID + "=(SELECT MAX(" + TrackPointsColumns._ID + ") FROM " + TrackPointsColumns.TABLE_NAME + " WHERE " + TrackPointsColumns.TRACKID + "=? AND " + TrackPointsColumns.TYPE + " IN (" + TrackPoint.Type.SEGMENT_START_AUTOMATIC.type_db + "," + TrackPoint.Type.TRACKPOINT.type_db + "))"; - String[] selectionArgs = new String[]{Long.toString(trackId.id())}; - - try (Cursor cursor = getTrackPointCursor(null, selection, selectionArgs, TrackPointsColumns._ID)) { - if (cursor != null && cursor.moveToNext()) { - return createTrackPoint(cursor); - } - } - return null; - } - /** * Inserts a trackPoint. * diff --git a/src/main/java/de/dennisguse/opentracks/data/TrackDataHub.java b/src/main/java/de/dennisguse/opentracks/data/TrackDataHub.java index 1c77d7f2e..e289be1b4 100644 --- a/src/main/java/de/dennisguse/opentracks/data/TrackDataHub.java +++ b/src/main/java/de/dennisguse/opentracks/data/TrackDataHub.java @@ -321,10 +321,6 @@ public class TrackDataHub { return; } - TrackPoint.Id lastTrackPointId = contentProviderUtils.getLastTrackPointId(selectedTrackId); - int samplingFrequency = -1; - - TrackPoint.Id next = null; if (localLastSeenTrackPointIdId != null) { next = new TrackPoint.Id(localLastSeenTrackPointIdId.id() + 1); //TODO startTrackPointId + 1 is an assumption assumption; should be derived from the DB. @@ -332,9 +328,10 @@ public class TrackDataHub { TrackPoint trackPoint = null; try (AutoCloseableIterator trackPointIterator = contentProviderUtils.getTrackPointLocationIterator(selectedTrackId, next)) { + long numTotalPoints = trackPointIterator.getCount(); + int samplingFrequency = 1 + (int) (numTotalPoints / targetNumPoints); while (trackPointIterator.hasNext()) { - if (!isStarted()) { return; } @@ -353,20 +350,15 @@ public class TrackDataHub { localFirstSeenTrackPointId = trackPointId; } - if (samplingFrequency == -1) { - long numTotalPoints = Math.max(0L, lastTrackPointId.id() - localFirstSeenTrackPointId.id()); //TODO That is an assumption; should be derived from the DB. - samplingFrequency = 1 + (int) (numTotalPoints / targetNumPoints); - } - if (trackStatisticsUpdater == null) { trackStatisticsUpdater = new TrackStatisticsUpdater(trackPoint); - } else { + } else { trackStatisticsUpdater.addTrackPoint(trackPoint); } Statistics statistics = trackStatisticsUpdater.getTrackStatistics(); // Also include the last point if the selected track is not recording. - if ((localNumLoadedTrackPoints % samplingFrequency == 0) || (trackPointId == lastTrackPointId && !isSelectedTrackRecording())) { + if ((localNumLoadedTrackPoints % samplingFrequency == 0) || (!trackPointIterator.hasNext() && !isSelectedTrackRecording())) { for (Listener trackDataListener : listeners) trackDataListener.onSampledInTrackPoint(trackPoint, statistics); } diff --git a/src/main/java/de/dennisguse/opentracks/data/TrackPointIterator.java b/src/main/java/de/dennisguse/opentracks/data/TrackPointIterator.java index b7f648bd4..8dfdaeaae 100644 --- a/src/main/java/de/dennisguse/opentracks/data/TrackPointIterator.java +++ b/src/main/java/de/dennisguse/opentracks/data/TrackPointIterator.java @@ -27,14 +27,10 @@ class TrackPointIterator extends AutoCloseableIterator { this.contentProviderUtils = contentProviderUtils; this.trackId = trackId; - cursor = getCursor(startTrackPointId); + cursor = contentProviderUtils.getTrackPointCursor(trackId, startTrackPointId); indexes = new CachedTrackPointsIndexes(cursor); } - private Cursor getCursor(TrackPoint.Id trackPointId) { - return contentProviderUtils.getTrackPointCursor(trackId, trackPointId); - } - @Override public boolean hasNext() { if (cursor == null) { @@ -52,6 +48,11 @@ class TrackPointIterator extends AutoCloseableIterator { return ContentProviderUtils.fillTrackPoint(cursor, indexes); } + @Override + public int getPosition() { + return cursor.getPosition(); + } + @VisibleForTesting public int getCount() { return cursor.getCount(); diff --git a/src/main/java/de/dennisguse/opentracks/util/AutoCloseableIterator.java b/src/main/java/de/dennisguse/opentracks/util/AutoCloseableIterator.java index ab145f9f5..7eb0b7326 100644 --- a/src/main/java/de/dennisguse/opentracks/util/AutoCloseableIterator.java +++ b/src/main/java/de/dennisguse/opentracks/util/AutoCloseableIterator.java @@ -8,4 +8,8 @@ public abstract class AutoCloseableIterator implements Iterator, AutoClose * Override: AutoClosable.close() throws Exception. */ public abstract void close(); + + public abstract int getPosition(); + + public abstract int getCount(); }