TrackRecordingService: generate timestamps for TrackPoints in HandlerServer.

Part of #822.
This commit is contained in:
Dennis Guse
2021-07-12 23:03:37 +02:00
parent 223ad70d36
commit 7d24262b38
15 changed files with 122 additions and 110 deletions
@@ -29,6 +29,7 @@ import android.os.Bundle;
import android.os.Handler;
import android.os.PowerManager.WakeLock;
import android.util.Log;
import android.util.Pair;
import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
@@ -281,7 +282,7 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand
// Update database
track.setId(trackId);
TrackPoint segmentStartTrackPoint = TrackPoint.createSegmentStartManual();
TrackPoint segmentStartTrackPoint = handlerServer.createSegmentStartManual();
trackStatisticsUpdater = new TrackStatisticsUpdater();
insertTrackPoint(track, segmentStartTrackPoint);
@@ -315,7 +316,7 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand
track.getTrackStatistics().setStopTime(Instant.now());
trackStatisticsUpdater = new TrackStatisticsUpdater(track.getTrackStatistics());
insertTrackPoint(track, TrackPoint.createSegmentStartManual());
insertTrackPoint(track, handlerServer.createSegmentStartManual());
// Set recording status
updateRecordingStatus(new RecordingStatus(trackId, false));
@@ -336,7 +337,7 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand
// Update database
Track track = contentProviderUtils.getTrack(getRecordingTrackId());
if (track != null) {
insertTrackPoint(track, TrackPoint.createSegmentStartManual());
insertTrackPoint(track, handlerServer.createSegmentStartManual());
}
startRecording();
@@ -394,8 +395,7 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand
insertTrackPointIfNewer(track, lastTrackPoint);
}
TrackPoint segmentEnd = TrackPoint.createSegmentEnd();
handlerServer.fillAndReset(segmentEnd);
TrackPoint segmentEnd = handlerServer.createSegmentEnd();
insertTrackPoint(track, segmentEnd);
}
}
@@ -422,7 +422,7 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand
if (lastTrackPoint != null) {
insertTrackPointIfNewer(track, lastTrackPoint);
}
insertTrackPoint(track, TrackPoint.createSegmentEnd());
insertTrackPoint(track, handlerServer.createSegmentEnd());
}
endRecording(false);
@@ -677,17 +677,6 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand
Track track = contentProviderUtils.getTrack(recordingStatus.getTrackId());
// Compute temporary track statistics using sensorData and update time.
//TODO This somehow should happen in the HandlerServer as we create a new TrackPoint.
TrackStatisticsUpdater tmpTrackStatisticsUpdater = new TrackStatisticsUpdater(trackStatisticsUpdater);
TrackPoint tmpLastTrackPoint = new TrackPoint(TrackPoint.Type.TRACKPOINT);
if (lastTrackPoint != null && lastTrackPoint.hasLocation()) {
//TODO Should happen in TrackPoint? via constructor
tmpLastTrackPoint.setSpeed(lastTrackPoint.getSpeed());
tmpLastTrackPoint.setAltitude(lastTrackPoint.getAltitude());
tmpLastTrackPoint.setLongitude(lastTrackPoint.getLongitude());
tmpLastTrackPoint.setLatitude(lastTrackPoint.getLatitude());
}
HandlerServer localHandlerServer = this.handlerServer;
if (localHandlerServer == null) {
@@ -696,11 +685,14 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand
return;
}
SensorDataSet sensorDataSet = localHandlerServer.fill(tmpLastTrackPoint);
tmpTrackStatisticsUpdater.addTrackPoint(tmpLastTrackPoint, recordingDistanceInterval);
//TODO This somehow should happen in the HandlerServer as we create a new TrackPoint.
TrackStatisticsUpdater tmpTrackStatisticsUpdater = new TrackStatisticsUpdater(trackStatisticsUpdater);
Pair<TrackPoint, SensorDataSet> current = localHandlerServer.createCurrentTrackPoint(lastTrackPoint);
tmpTrackStatisticsUpdater.addTrackPoint(current.first, recordingDistanceInterval);
track.setTrackStatistics(tmpTrackStatisticsUpdater.getTrackStatistics());
recordingDataObservable.postValue(new RecordingData(track, tmpLastTrackPoint, sensorDataSet));
recordingDataObservable.postValue(new RecordingData(track, current.first, current.second));
}
public LiveData<RecordingStatus> getRecordingStatusObservable() {
@@ -128,8 +128,6 @@ class GpsStatus {
}
if (trackPoint != null) {
// Update trackPoint's time to the current time millis when trackPoint has been received.
trackPoint.setTime(Instant.now());
lastValidTrackPoint = trackPoint;
}
lastTrackPoint = trackPoint;
@@ -3,10 +3,15 @@ package de.dennisguse.opentracks.services.handlers;
import android.content.Context;
import android.content.SharedPreferences;
import android.util.Log;
import android.util.Pair;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import java.time.Clock;
import java.time.Instant;
import de.dennisguse.opentracks.content.data.TrackPoint;
import de.dennisguse.opentracks.content.sensor.SensorDataSet;
import de.dennisguse.opentracks.services.sensors.AltitudeSumManager;
@@ -23,6 +28,9 @@ public class HandlerServer {
// Disabled to simplify testing and implementation of #822
// private ExecutorService serviceExecutor;
@VisibleForTesting
private Clock clock;
private final LocationHandler locationHandler;
private final EGM2008CorrectionManager egm2008CorrectionManager = new EGM2008CorrectionManager();
private BluetoothRemoteSensorManager remoteSensorManager;
@@ -115,6 +123,41 @@ public class HandlerServer {
service.newTrackPoint(trackPoint, recordingGpsAccuracy);
}
public TrackPoint createSegmentStartManual() {
return TrackPoint.createSegmentStartManualWithTime(createNow());
}
public TrackPoint createSegmentEnd() {
TrackPoint segmentEnd = TrackPoint.createSegmentEndWithTime(createNow());
fillAndReset(segmentEnd);
return segmentEnd;
}
//TODO get lastTrackPoint from LocationHandler
public Pair<TrackPoint, SensorDataSet> createCurrentTrackPoint(@Nullable TrackPoint lastTrackPoint) {
TrackPoint currentTrackPoint = new TrackPoint(TrackPoint.Type.TRACKPOINT, createNow());
if (lastTrackPoint != null && lastTrackPoint.hasLocation()) {
//TODO Should happen in TrackPoint? via constructor
currentTrackPoint.setSpeed(lastTrackPoint.getSpeed());
currentTrackPoint.setAltitude(lastTrackPoint.getAltitude());
currentTrackPoint.setLongitude(lastTrackPoint.getLongitude());
currentTrackPoint.setLatitude(lastTrackPoint.getLatitude());
}
SensorDataSet sensorDataSet = fill(currentTrackPoint);
return new Pair<>(currentTrackPoint, sensorDataSet);
}
//TODO Limit visibility
public Instant createNow() {
if (clock != null) {
return Instant.now(clock);
} else {
return Instant.now();
}
}
@Deprecated
@VisibleForTesting
public void setAltitudeSumManager(AltitudeSumManager altitudeSumManager) {
@@ -89,7 +89,7 @@ class LocationHandler implements LocationListener, GpsStatus.GpsStatusListener {
*/
@Override
public void onLocationChanged(@NonNull Location location) {
TrackPoint trackPoint = new TrackPoint(location);
TrackPoint trackPoint = new TrackPoint(location, handlerServer.createNow());
boolean isAccurate = trackPoint.fulfillsAccuracy(recordingGpsAccuracy);
boolean isValid = LocationUtils.isValidLocation(location);