Cleanup: TrackDataHub doesn't need to query the id of the last TrackPoint.

This commit is contained in:
Dennis Guse
2025-11-25 18:46:20 +01:00
parent 5cd639c852
commit 7ddb6b32bb
4 changed files with 23 additions and 60 deletions
@@ -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<TrackPoint> 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.
*
@@ -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<TrackPoint> 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);
}
@@ -27,14 +27,10 @@ class TrackPointIterator extends AutoCloseableIterator<TrackPoint> {
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<TrackPoint> {
return ContentProviderUtils.fillTrackPoint(cursor, indexes);
}
@Override
public int getPosition() {
return cursor.getPosition();
}
@VisibleForTesting
public int getCount() {
return cursor.getCount();
@@ -8,4 +8,8 @@ public abstract class AutoCloseableIterator<T> implements Iterator<T>, AutoClose
* Override: AutoClosable.close() throws Exception.
*/
public abstract void close();
public abstract int getPosition();
public abstract int getCount();
}