forked from upstream-mirrors/OpenTracks
Cleanup: TrackDataHub doesn't need to query the id of the last TrackPoint.
This commit is contained in:
@@ -617,7 +617,6 @@ public class ContentProviderUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//TODO Only used for file import; might be better to replace it.
|
//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) {
|
public int bulkInsertTrackPoint(List<TrackPoint> trackPoints, Track.Id trackId) {
|
||||||
ContentValues[] values = new ContentValues[trackPoints.size()];
|
ContentValues[] values = new ContentValues[trackPoints.size()];
|
||||||
for (int i = 0; i < trackPoints.size(); i++) {
|
for (int i = 0; i < trackPoints.size(); i++) {
|
||||||
@@ -636,33 +635,20 @@ public class ContentProviderUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the last location id for a track.
|
* Gets the last valid location for a track.
|
||||||
* Returns -1L if it doesn't exist.
|
* Returns null if it doesn't exist.
|
||||||
*
|
*
|
||||||
* @param trackId the track id
|
* @param trackId the track id
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
@VisibleForTesting
|
||||||
public TrackPoint.Id getLastTrackPointId(@NonNull Track.Id trackId) {
|
@Deprecated // Use TrackPointIterator to fetch all TrackPoints and use the last.
|
||||||
String selection = TrackPointsColumns._ID + "=(SELECT MAX(" + TrackPointsColumns._ID + ") from " + TrackPointsColumns.TABLE_NAME + " WHERE " + TrackPointsColumns.TRACKID + "=?)";
|
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())};
|
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
try (Cursor cursor = getTrackPointCursor(null, selection, selectionArgs, TrackPointsColumns._ID)) {
|
||||||
* Gets the trackPoint id for a location.
|
if (cursor != null && cursor.moveToNext()) {
|
||||||
*/
|
return createTrackPoint(cursor);
|
||||||
@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)));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
@@ -698,26 +684,6 @@ public class ContentProviderUtils {
|
|||||||
return getTrackPointCursor(null, selection, selectionArgs, TrackPointsColumns.DEFAULT_SORT_ORDER);
|
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.
|
* Inserts a trackPoint.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -321,10 +321,6 @@ public class TrackDataHub {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
TrackPoint.Id lastTrackPointId = contentProviderUtils.getLastTrackPointId(selectedTrackId);
|
|
||||||
int samplingFrequency = -1;
|
|
||||||
|
|
||||||
|
|
||||||
TrackPoint.Id next = null;
|
TrackPoint.Id next = null;
|
||||||
if (localLastSeenTrackPointIdId != null) {
|
if (localLastSeenTrackPointIdId != null) {
|
||||||
next = new TrackPoint.Id(localLastSeenTrackPointIdId.id() + 1); //TODO startTrackPointId + 1 is an assumption assumption; should be derived from the DB.
|
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;
|
TrackPoint trackPoint = null;
|
||||||
try (AutoCloseableIterator<TrackPoint> trackPointIterator = contentProviderUtils.getTrackPointLocationIterator(selectedTrackId, next)) {
|
try (AutoCloseableIterator<TrackPoint> trackPointIterator = contentProviderUtils.getTrackPointLocationIterator(selectedTrackId, next)) {
|
||||||
|
long numTotalPoints = trackPointIterator.getCount();
|
||||||
|
int samplingFrequency = 1 + (int) (numTotalPoints / targetNumPoints);
|
||||||
|
|
||||||
while (trackPointIterator.hasNext()) {
|
while (trackPointIterator.hasNext()) {
|
||||||
|
|
||||||
if (!isStarted()) {
|
if (!isStarted()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -353,20 +350,15 @@ public class TrackDataHub {
|
|||||||
localFirstSeenTrackPointId = trackPointId;
|
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) {
|
if (trackStatisticsUpdater == null) {
|
||||||
trackStatisticsUpdater = new TrackStatisticsUpdater(trackPoint);
|
trackStatisticsUpdater = new TrackStatisticsUpdater(trackPoint);
|
||||||
} else {
|
} else {
|
||||||
trackStatisticsUpdater.addTrackPoint(trackPoint);
|
trackStatisticsUpdater.addTrackPoint(trackPoint);
|
||||||
}
|
}
|
||||||
Statistics statistics = trackStatisticsUpdater.getTrackStatistics();
|
Statistics statistics = trackStatisticsUpdater.getTrackStatistics();
|
||||||
|
|
||||||
// Also include the last point if the selected track is not recording.
|
// 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)
|
for (Listener trackDataListener : listeners)
|
||||||
trackDataListener.onSampledInTrackPoint(trackPoint, statistics);
|
trackDataListener.onSampledInTrackPoint(trackPoint, statistics);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,14 +27,10 @@ class TrackPointIterator extends AutoCloseableIterator<TrackPoint> {
|
|||||||
this.contentProviderUtils = contentProviderUtils;
|
this.contentProviderUtils = contentProviderUtils;
|
||||||
this.trackId = trackId;
|
this.trackId = trackId;
|
||||||
|
|
||||||
cursor = getCursor(startTrackPointId);
|
cursor = contentProviderUtils.getTrackPointCursor(trackId, startTrackPointId);
|
||||||
indexes = new CachedTrackPointsIndexes(cursor);
|
indexes = new CachedTrackPointsIndexes(cursor);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Cursor getCursor(TrackPoint.Id trackPointId) {
|
|
||||||
return contentProviderUtils.getTrackPointCursor(trackId, trackPointId);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean hasNext() {
|
public boolean hasNext() {
|
||||||
if (cursor == null) {
|
if (cursor == null) {
|
||||||
@@ -52,6 +48,11 @@ class TrackPointIterator extends AutoCloseableIterator<TrackPoint> {
|
|||||||
return ContentProviderUtils.fillTrackPoint(cursor, indexes);
|
return ContentProviderUtils.fillTrackPoint(cursor, indexes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getPosition() {
|
||||||
|
return cursor.getPosition();
|
||||||
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
public int getCount() {
|
public int getCount() {
|
||||||
return cursor.getCount();
|
return cursor.getCount();
|
||||||
|
|||||||
@@ -8,4 +8,8 @@ public abstract class AutoCloseableIterator<T> implements Iterator<T>, AutoClose
|
|||||||
* Override: AutoClosable.close() throws Exception.
|
* Override: AutoClosable.close() throws Exception.
|
||||||
*/
|
*/
|
||||||
public abstract void close();
|
public abstract void close();
|
||||||
|
|
||||||
|
public abstract int getPosition();
|
||||||
|
|
||||||
|
public abstract int getCount();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user