TrackRecordingManager: only keeps reference to TrackId.

This commit is contained in:
Dennis Guse
2021-08-22 22:33:29 +02:00
parent f562d51d9a
commit 5981340bb9
@@ -34,7 +34,7 @@ class TrackRecordingManager {
private Distance recordingDistanceInterval; private Distance recordingDistanceInterval;
private Distance maxRecordingDistance; private Distance maxRecordingDistance;
private Track track; private Track.Id trackId;
private TrackStatisticsUpdater trackStatisticsUpdater; private TrackStatisticsUpdater trackStatisticsUpdater;
private TrackPoint lastTrackPoint; private TrackPoint lastTrackPoint;
@@ -47,54 +47,56 @@ class TrackRecordingManager {
} }
Track.Id start(TrackPoint segmentStartTrackPoint) { Track.Id start(TrackPoint segmentStartTrackPoint) {
// Insert a track // Create new track
track = new Track(); Track track = new Track();
track.setId(contentProviderUtils.insertTrack(track)); trackId = contentProviderUtils.insertTrack(track);
track.setId(trackId);
trackStatisticsUpdater = new TrackStatisticsUpdater(); trackStatisticsUpdater = new TrackStatisticsUpdater();
insertTrackPoint(track, segmentStartTrackPoint); insertTrackPoint(trackId, segmentStartTrackPoint);
//TODO Pass TrackPoint //TODO Pass TrackPoint
track.setName(TrackNameUtils.getTrackName(context, track.getId(), segmentStartTrackPoint.getTime())); track.setName(TrackNameUtils.getTrackName(context, trackId, segmentStartTrackPoint.getTime()));
String category = PreferencesUtils.getDefaultActivity(PreferencesUtils.getSharedPreferences(context), context); //TODO Re-use sharedpreferences String category = PreferencesUtils.getDefaultActivity(PreferencesUtils.getSharedPreferences(context), context); //TODO Re-use sharedpreferences
track.setCategory(category); track.setCategory(category);
track.setIcon(TrackIconUtils.getIconValue(context, category)); track.setIcon(TrackIconUtils.getIconValue(context, category));
track.setTrackStatistics(trackStatisticsUpdater.getTrackStatistics()); track.setTrackStatistics(trackStatisticsUpdater.getTrackStatistics());
contentProviderUtils.updateTrack(track); //TODO Could we do this in the insert? contentProviderUtils.updateTrack(track);
return track.getId(); return trackId;
} }
//TODO Handle non-existing trackId? Start a new track or exception? //TODO Handle non-existing trackId? Start a new track or exception?
void resume(@NonNull Track.Id trackId, @NonNull TrackPoint segmentStartTrackPoint) { void resume(@NonNull Track.Id resumeTrackId, @NonNull TrackPoint segmentStartTrackPoint) {
track = contentProviderUtils.getTrack(trackId); trackId = resumeTrackId;
Track track = contentProviderUtils.getTrack(trackId);
if (track == null) { if (track == null) {
Log.e(TAG, "Ignore resumeTrack. Track " + trackId.getId() + " does not exists."); Log.e(TAG, "Ignore resumeTrack. Track " + trackId.getId() + " does not exists.");
return; return;
} }
trackStatisticsUpdater = new TrackStatisticsUpdater(track.getTrackStatistics()); trackStatisticsUpdater = new TrackStatisticsUpdater(track.getTrackStatistics());
insertTrackPoint(track, segmentStartTrackPoint); insertTrackPoint(trackId, segmentStartTrackPoint);
} }
void pause(TrackPointCreator handlerServer) { void pause(TrackPointCreator handlerServer) {
if (lastTrackPoint != null) { if (lastTrackPoint != null) {
insertTrackPointIfNewer(track, lastTrackPoint); insertTrackPointIfNewer(trackId, lastTrackPoint);
} }
insertTrackPoint(track, handlerServer.createSegmentEnd()); insertTrackPoint(trackId, handlerServer.createSegmentEnd());
} }
void end(TrackPointCreator handlerServer) { void end(TrackPointCreator handlerServer) {
if (lastTrackPoint != null) { if (lastTrackPoint != null) {
insertTrackPointIfNewer(track, lastTrackPoint); insertTrackPointIfNewer(trackId, lastTrackPoint);
} }
TrackPoint segmentEnd = handlerServer.createSegmentEnd(); TrackPoint segmentEnd = handlerServer.createSegmentEnd();
insertTrackPoint(track, segmentEnd); insertTrackPoint(trackId, segmentEnd);
track = null; trackId = null;
trackStatisticsUpdater = null; trackStatisticsUpdater = null;
lastTrackPoint = null; lastTrackPoint = null;
lastValidTrackPoint = null; lastValidTrackPoint = null;
@@ -123,14 +125,14 @@ class TrackRecordingManager {
public Marker.Id insertMarker(String name, String category, String description, String photoUrl) { public Marker.Id insertMarker(String name, String category, String description, String photoUrl) {
if (name == null) { if (name == null) {
Integer nextMarkerNumber = contentProviderUtils.getNextMarkerNumber(track.getId()); Integer nextMarkerNumber = contentProviderUtils.getNextMarkerNumber(trackId);
if (nextMarkerNumber == null) { if (nextMarkerNumber == null) {
nextMarkerNumber = 1; nextMarkerNumber = 1;
} }
name = context.getString(R.string.marker_name_format, nextMarkerNumber + 1); name = context.getString(R.string.marker_name_format, nextMarkerNumber + 1);
} }
TrackPoint trackPoint = getLastValidTrackPointInCurrentSegment(track.getId()); TrackPoint trackPoint = getLastValidTrackPointInCurrentSegment(trackId);
if (trackPoint == 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;
@@ -143,20 +145,20 @@ class TrackRecordingManager {
// Insert marker // Insert marker
Marker marker = new Marker(name, description, category, icon, track.getId(), getTrackStatistics(), trackPoint, photoUrl); Marker marker = new Marker(name, description, category, icon, trackId, getTrackStatistics(), trackPoint, 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));
} }
void onNewTrackPoint(TrackPoint trackPoint, Distance thresholdHorizontalAccuracy) { void onNewTrackPoint(TrackPoint trackPoint, Distance thresholdHorizontalAccuracy) {
//TODO Figure out how to avoid loading the lastValidTrackPoint from the database //TODO Figure out how to avoid loading the lastValidTrackPoint from the database
TrackPoint lastValidTrackPoint = getLastValidTrackPointInCurrentSegment(track.getId()); TrackPoint lastValidTrackPoint = getLastValidTrackPointInCurrentSegment(trackId);
//Storing trackPoint //Storing trackPoint
// Always insert the first segment location // Always insert the first segment location
if (!currentSegmentHasTrackPoint()) { if (!currentSegmentHasTrackPoint()) {
insertTrackPoint(track, trackPoint); insertTrackPoint(trackId, trackPoint);
lastTrackPoint = trackPoint; lastTrackPoint = trackPoint;
return; return;
} }
@@ -164,10 +166,10 @@ class TrackRecordingManager {
Distance distanceToLastTrackLocation = trackPoint.distanceToPrevious(lastValidTrackPoint); Distance distanceToLastTrackLocation = trackPoint.distanceToPrevious(lastValidTrackPoint);
if (distanceToLastTrackLocation != null) { if (distanceToLastTrackLocation != null) {
if (distanceToLastTrackLocation.greaterThan(maxRecordingDistance)) { if (distanceToLastTrackLocation.greaterThan(maxRecordingDistance)) {
insertTrackPointIfNewer(track, lastTrackPoint); insertTrackPointIfNewer(trackId, lastTrackPoint);
trackPoint.setType(TrackPoint.Type.SEGMENT_START_AUTOMATIC); trackPoint.setType(TrackPoint.Type.SEGMENT_START_AUTOMATIC);
insertTrackPoint(track, trackPoint); insertTrackPoint(trackId, trackPoint);
isIdle = false; isIdle = false;
lastTrackPoint = trackPoint; lastTrackPoint = trackPoint;
@@ -175,9 +177,9 @@ class TrackRecordingManager {
} }
if (trackPoint.hasSensorData() || distanceToLastTrackLocation.greaterOrEqualThan(recordingDistanceInterval)) { if (trackPoint.hasSensorData() || distanceToLastTrackLocation.greaterOrEqualThan(recordingDistanceInterval)) {
insertTrackPointIfNewer(track, lastTrackPoint); insertTrackPointIfNewer(trackId, lastTrackPoint);
insertTrackPoint(track, trackPoint); insertTrackPoint(trackId, trackPoint);
isIdle = false; isIdle = false;
@@ -187,9 +189,9 @@ class TrackRecordingManager {
} }
if (!isIdle && !trackPoint.isMoving()) { if (!isIdle && !trackPoint.isMoving()) {
insertTrackPointIfNewer(track, lastTrackPoint); insertTrackPointIfNewer(trackId, lastTrackPoint);
insertTrackPoint(track, trackPoint); insertTrackPoint(trackId, trackPoint);
isIdle = true; isIdle = true;
@@ -198,9 +200,9 @@ class TrackRecordingManager {
} }
if (isIdle && trackPoint.isMoving()) { if (isIdle && trackPoint.isMoving()) {
insertTrackPointIfNewer(track, lastTrackPoint); insertTrackPointIfNewer(trackId, lastTrackPoint);
insertTrackPoint(track, trackPoint); insertTrackPoint(trackId, trackPoint);
isIdle = false; isIdle = false;
@@ -213,7 +215,7 @@ class TrackRecordingManager {
} }
Track getTrack() { Track getTrack() {
return contentProviderUtils.getTrack(track.getId()); //Copy in memory; not via DB return contentProviderUtils.getTrack(trackId);
} }
//Functionality that uses this method should happen here. //Functionality that uses this method should happen here.
@@ -247,34 +249,24 @@ class TrackRecordingManager {
/** /**
* Inserts a trackPoint if this trackPoint is different than lastValidTrackPoint. * Inserts a trackPoint if this trackPoint is different than lastValidTrackPoint.
*
* @param track the track
* @param trackPoint the trackPoint
*/ */
private void insertTrackPointIfNewer(@NonNull Track track, @NonNull TrackPoint trackPoint) { private void insertTrackPointIfNewer(@NonNull Track.Id trackId, @NonNull TrackPoint trackPoint) {
TrackPoint lastValidTrackPoint = getLastValidTrackPointInCurrentSegment(track.getId()); TrackPoint lastValidTrackPoint = getLastValidTrackPointInCurrentSegment(trackId);
if (lastValidTrackPoint != null && trackPoint.getTime().equals(lastValidTrackPoint.getTime())) { if (lastValidTrackPoint != null && trackPoint.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 track point time."); Log.w(TAG, "Ignore insertTrackPoint. trackPoint time same as last valid trackId point time.");
return; return;
} }
insertTrackPoint(track, trackPoint); insertTrackPoint(trackId, trackPoint);
} }
/** private void insertTrackPoint(@NonNull Track.Id trackId, @NonNull TrackPoint trackPoint) {
* Inserts a trackPoint.
*
* @param track the track
* @param trackPoint the trackPoint
*/
private void insertTrackPoint(@NonNull Track track, @NonNull TrackPoint trackPoint) {
try { try {
contentProviderUtils.insertTrackPoint(trackPoint, track.getId()); contentProviderUtils.insertTrackPoint(trackPoint, trackId);
trackStatisticsUpdater.addTrackPoint(trackPoint, recordingDistanceInterval); trackStatisticsUpdater.addTrackPoint(trackPoint, recordingDistanceInterval);
track.setTrackStatistics(trackStatisticsUpdater.getTrackStatistics());
contentProviderUtils.updateTrackStatistics(track.getId(), track.getTrackStatistics()); contentProviderUtils.updateTrackStatistics(trackId, trackStatisticsUpdater.getTrackStatistics());
} 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).