forked from upstream-mirrors/OpenTracks
TrackRecordingManager: cache last stored TrackPoint.
This commit is contained in:
@@ -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).
|
||||||
|
|||||||
Reference in New Issue
Block a user