TrackRecordingManager: cache last stored TrackPoint.

This commit is contained in:
Dennis Guse
2021-10-07 21:44:19 +02:00
parent 24826ff442
commit f6b994572a
@@ -8,7 +8,6 @@ import android.util.Log;
import android.util.Pair; import android.util.Pair;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import de.dennisguse.opentracks.R; import de.dennisguse.opentracks.R;
import de.dennisguse.opentracks.content.data.Distance; import de.dennisguse.opentracks.content.data.Distance;
@@ -39,7 +38,7 @@ class TrackRecordingManager {
private boolean currentSegmentHasTrackPoint; private boolean currentSegmentHasTrackPoint;
private TrackPoint lastTrackPoint; private TrackPoint lastTrackPoint;
private TrackPoint lastValidTrackPoint; private TrackPoint lastStoredTrackPoint;
private boolean isIdle; private boolean isIdle;
TrackRecordingManager(Context context) { TrackRecordingManager(Context context) {
@@ -83,11 +82,14 @@ class TrackRecordingManager {
trackStatisticsUpdater = new TrackStatisticsUpdater(track.getTrackStatistics()); trackStatisticsUpdater = new TrackStatisticsUpdater(track.getTrackStatistics());
insertTrackPoint(trackId, segmentStartTrackPoint); insertTrackPoint(trackId, segmentStartTrackPoint);
currentSegmentHasTrackPoint = false; currentSegmentHasTrackPoint = false;
} lastTrackPoint = null;
lastStoredTrackPoint = null; }
void pause(TrackPointCreator trackPointCreator) { void pause(TrackPointCreator trackPointCreator) {
insertTrackPoint(trackId, trackPointCreator.createSegmentEnd()); insertTrackPoint(trackId, trackPointCreator.createSegmentEnd());
currentSegmentHasTrackPoint = false; currentSegmentHasTrackPoint = false;
lastTrackPoint = null;
lastStoredTrackPoint = null;
} }
void end(TrackPointCreator trackPointCreator) { void end(TrackPointCreator trackPointCreator) {
@@ -97,8 +99,8 @@ class TrackRecordingManager {
trackId = null; trackId = null;
trackStatisticsUpdater = null; trackStatisticsUpdater = null;
lastTrackPoint = null; lastTrackPoint = null;
lastStoredTrackPoint = null;
currentSegmentHasTrackPoint = false; currentSegmentHasTrackPoint = false;
lastValidTrackPoint = null;
isIdle = false; isIdle = false;
} }
@@ -106,12 +108,12 @@ class TrackRecordingManager {
if (trackPointCreator == null) { if (trackPointCreator == null) {
return null; return null;
} }
TrackStatisticsUpdater tmpTrackStatisticsUpdater = getTrackStatisticsUpdater(); TrackStatisticsUpdater tmpTrackStatisticsUpdater = new TrackStatisticsUpdater(trackStatisticsUpdater);
Pair<TrackPoint, SensorDataSet> current = trackPointCreator.createCurrentTrackPoint(lastTrackPoint); Pair<TrackPoint, SensorDataSet> current = trackPointCreator.createCurrentTrackPoint(lastTrackPoint);
tmpTrackStatisticsUpdater.addTrackPoint(current.first, recordingDistanceInterval); tmpTrackStatisticsUpdater.addTrackPoint(current.first, recordingDistanceInterval);
Track track = getTrack(); //Get copy Track track = contentProviderUtils.getTrack(trackId); //Get copy
if (track == null) { if (track == null) {
Log.w(TAG, "Requesting data if not recording is taking place, should not be done."); Log.w(TAG, "Requesting data if not recording is taking place, should not be done.");
return null; return null;
@@ -131,8 +133,7 @@ class TrackRecordingManager {
name = context.getString(R.string.marker_name_format, nextMarkerNumber + 1); name = context.getString(R.string.marker_name_format, nextMarkerNumber + 1);
} }
TrackPoint trackPoint = getLastValidTrackPointInCurrentSegment(trackId); if (lastStoredTrackPoint == null) {
if (trackPoint == null) {
Log.i(TAG, "Could not create a marker as trackPoint is unknown."); Log.i(TAG, "Could not create a marker as trackPoint is unknown.");
return null; return null;
} }
@@ -142,17 +143,13 @@ class TrackRecordingManager {
String icon = context.getString(R.string.marker_icon_url); String icon = context.getString(R.string.marker_icon_url);
photoUrl = photoUrl != null ? photoUrl : ""; photoUrl = photoUrl != null ? photoUrl : "";
// Insert marker // Insert marker
Marker marker = new Marker(name, description, category, icon, trackId, getTrackStatistics(), trackPoint, photoUrl); Marker marker = new Marker(name, description, category, icon, trackId, getTrackStatistics(), lastStoredTrackPoint, photoUrl);
Uri uri = contentProviderUtils.insertMarker(marker); Uri uri = contentProviderUtils.insertMarker(marker);
return new Marker.Id(ContentUris.parseId(uri)); return new Marker.Id(ContentUris.parseId(uri));
} }
boolean onNewTrackPoint(TrackPoint trackPoint) { boolean onNewTrackPoint(TrackPoint trackPoint) {
//TODO Figure out how to avoid loading the lastValidTrackPoint from the database
TrackPoint lastValidTrackPoint = getLastValidTrackPointInCurrentSegment(trackId);
//Storing trackPoint //Storing trackPoint
// Always insert the first segment location // Always insert the first segment location
@@ -162,14 +159,13 @@ class TrackRecordingManager {
return true; return true;
} }
Distance distanceToLastTrackLocation = trackPoint.distanceToPrevious(lastValidTrackPoint); Distance distanceToLastTrackLocation = trackPoint.distanceToPrevious(lastStoredTrackPoint);
if (distanceToLastTrackLocation != null) { if (distanceToLastTrackLocation != null) {
if (distanceToLastTrackLocation.greaterThan(maxRecordingDistance)) { if (distanceToLastTrackLocation.greaterThan(maxRecordingDistance)) {
trackPoint.setType(TrackPoint.Type.SEGMENT_START_AUTOMATIC); trackPoint.setType(TrackPoint.Type.SEGMENT_START_AUTOMATIC);
insertTrackPoint(trackId, trackPoint); insertTrackPoint(trackId, trackPoint);
isIdle = false; isIdle = false;
return true; return true;
} }
@@ -177,7 +173,6 @@ class TrackRecordingManager {
insertTrackPoint(trackId, trackPoint); insertTrackPoint(trackId, trackPoint);
isIdle = false; isIdle = false;
return true; return true;
} }
} }
@@ -186,7 +181,6 @@ class TrackRecordingManager {
insertTrackPoint(trackId, trackPoint); insertTrackPoint(trackId, trackPoint);
isIdle = true; isIdle = true;
return true; return true;
} }
@@ -194,7 +188,6 @@ class TrackRecordingManager {
insertTrackPoint(trackId, trackPoint); insertTrackPoint(trackId, trackPoint);
isIdle = false; isIdle = false;
return true; return true;
} }
@@ -203,39 +196,13 @@ class TrackRecordingManager {
return false; return false;
} }
Track getTrack() {
return contentProviderUtils.getTrack(trackId);
}
//Functionality that uses this method should happen here.
@Deprecated
TrackStatisticsUpdater getTrackStatisticsUpdater() {
return new TrackStatisticsUpdater(trackStatisticsUpdater);
}
TrackStatistics getTrackStatistics() { TrackStatistics getTrackStatistics() {
return trackStatisticsUpdater.getTrackStatistics(); return trackStatisticsUpdater.getTrackStatistics();
} }
/**
* Gets the last valid track point in the current segment.
*
* @param trackId the track id
* @return the location or null
*/
@Deprecated
//Use lastValidTrackPoint
private TrackPoint getLastValidTrackPointInCurrentSegment(Track.Id trackId) {
if (!currentSegmentHasTrackPoint) {
return null;
}
return contentProviderUtils.getLastValidTrackPoint(trackId);
}
private void insertTrackPoint(@NonNull Track.Id trackId, @NonNull TrackPoint trackPoint) { private void insertTrackPoint(@NonNull Track.Id trackId, @NonNull TrackPoint trackPoint) {
if (lastTrackPoint != null) { if (lastTrackPoint != null) {
TrackPoint lastValidTrackPoint = getLastValidTrackPointInCurrentSegment(trackId); if (lastStoredTrackPoint != null && lastTrackPoint.getTime().equals(lastStoredTrackPoint.getTime())) {
if (lastValidTrackPoint != null && lastTrackPoint.getTime().equals(lastValidTrackPoint.getTime())) {
// Do not insert if inserted already // Do not insert if inserted already
Log.w(TAG, "Ignore insertTrackPoint. trackPoint time same as last valid trackId point time."); Log.w(TAG, "Ignore insertTrackPoint. trackPoint time same as last valid trackId point time.");
} else { } else {
@@ -253,7 +220,7 @@ class TrackRecordingManager {
trackStatisticsUpdater.addTrackPoint(trackPoint, recordingDistanceInterval); trackStatisticsUpdater.addTrackPoint(trackPoint, recordingDistanceInterval);
contentProviderUtils.updateTrackStatistics(trackId, trackStatisticsUpdater.getTrackStatistics()); contentProviderUtils.updateTrackStatistics(trackId, trackStatisticsUpdater.getTrackStatistics());
lastValidTrackPoint = trackPoint; lastStoredTrackPoint = trackPoint;
} catch (SQLiteException e) { } catch (SQLiteException e) {
/* /*
* Insert failed, most likely because of SqlLite error code 5 (SQLite_BUSY). * Insert failed, most likely because of SqlLite error code 5 (SQLite_BUSY).