Bugfix: reset on SensorDataSet should only take place if the TrackPoint was stored

Fixes #969.
This commit is contained in:
Dennis Guse
2021-10-07 07:46:37 +02:00
parent 12e18b0bcd
commit 52a110d998
7 changed files with 104 additions and 29 deletions
@@ -400,11 +400,14 @@ public class TrackPoint {
return result;
}
result += ": lat=" + getLatitude() + " lng=" + getLongitude();
if (!hasHorizontalAccuracy()) {
return result;
if (hasHorizontalAccuracy()) {
result += " acc=" + getHorizontalAccuracy();
}
if (hasSensorDistance()) {
result += " distance=" + getSensorDistance();
}
return result + " acc=" + getHorizontalAccuracy();
return result;
}
public static class Id {
@@ -93,7 +93,6 @@ public final class SensorDataSet {
if (cyclingCadence != null) cyclingCadence.reset();
if (cyclingDistanceSpeed != null) cyclingDistanceSpeed.reset();
if (cyclingPower != null) cyclingPower.reset();
if (runningDistanceSpeedCadence != null) runningDistanceSpeedCadence.reset();
}
@@ -149,7 +149,7 @@ class TrackRecordingManager {
return new Marker.Id(ContentUris.parseId(uri));
}
void onNewTrackPoint(TrackPoint trackPoint, Distance thresholdHorizontalAccuracy) {
boolean onNewTrackPoint(TrackPoint trackPoint, Distance thresholdHorizontalAccuracy) {
//TODO Figure out how to avoid loading the lastValidTrackPoint from the database
TrackPoint lastValidTrackPoint = getLastValidTrackPointInCurrentSegment(trackId);
@@ -159,7 +159,7 @@ class TrackRecordingManager {
if (!currentSegmentHasTrackPoint()) {
insertTrackPoint(trackId, trackPoint);
lastTrackPoint = trackPoint;
return;
return true;
}
Distance distanceToLastTrackLocation = trackPoint.distanceToPrevious(lastValidTrackPoint);
@@ -173,7 +173,7 @@ class TrackRecordingManager {
isIdle = false;
lastTrackPoint = trackPoint;
return;
return true;
}
if (trackPoint.hasSensorData() || distanceToLastTrackLocation.greaterOrEqualThan(recordingDistanceInterval)) {
@@ -184,7 +184,7 @@ class TrackRecordingManager {
isIdle = false;
lastTrackPoint = trackPoint;
return;
return true;
}
}
@@ -196,7 +196,7 @@ class TrackRecordingManager {
isIdle = true;
lastTrackPoint = trackPoint;
return;
return true;
}
if (isIdle && trackPoint.isMoving()) {
@@ -207,11 +207,12 @@ class TrackRecordingManager {
isIdle = false;
lastTrackPoint = trackPoint;
return;
return true;
}
Log.d(TAG, "Not recording TrackPoint, idle");
lastTrackPoint = trackPoint;
return false;
}
Track getTrack() {
@@ -355,14 +355,14 @@ public class TrackRecordingService extends Service implements TrackPointCreator.
}
@Override
public void newTrackPoint(TrackPoint trackPoint, Distance thresholdHorizontalAccuracy) {
public boolean newTrackPoint(TrackPoint trackPoint, Distance thresholdHorizontalAccuracy) {
if (!isRecording() || isPaused()) {
Log.w(TAG, "Ignore newTrackPoint. Not recording or paused.");
return;
return false;
}
trackRecordingManager.onNewTrackPoint(trackPoint, thresholdHorizontalAccuracy);
notificationManager.updateTrackPoint(this, trackRecordingManager.getTrackStatistics(), trackPoint, thresholdHorizontalAccuracy);
return trackRecordingManager.onNewTrackPoint(trackPoint, thresholdHorizontalAccuracy);
}
@Override
@@ -83,14 +83,6 @@ public class TrackPointCreator {
return sensorDataSet;
}
public SensorDataSet fillAndReset(TrackPoint trackPoint) {
SensorDataSet sensorDataSet = fill(trackPoint);
resetSensorData();
return sensorDataSet;
}
public void stop() {
locationHandler.onStop();
@@ -112,9 +104,12 @@ public class TrackPointCreator {
}
public void onNewTrackPoint(TrackPoint trackPoint, Distance thresholdHorizontalAccuracy) {
fillAndReset(trackPoint);
fill(trackPoint);
service.newTrackPoint(trackPoint, thresholdHorizontalAccuracy);
boolean stored = service.newTrackPoint(trackPoint, thresholdHorizontalAccuracy);
if (stored) {
resetSensorData();
}
}
public TrackPoint createSegmentStartManual() {
@@ -123,7 +118,8 @@ public class TrackPointCreator {
public TrackPoint createSegmentEnd() {
TrackPoint segmentEnd = TrackPoint.createSegmentEndWithTime(createNow());
fillAndReset(segmentEnd);
fill(segmentEnd);
resetSensorData();
return segmentEnd;
}
@@ -181,7 +177,10 @@ public class TrackPointCreator {
}
public interface Callback {
void newTrackPoint(TrackPoint trackPoint, Distance thresholdHorizontalAccuracy);
/**
* @return Was TrackPoint stored (not discarded)?
*/
boolean newTrackPoint(TrackPoint trackPoint, Distance thresholdHorizontalAccuracy);
void newGpsStatus(GpsStatusValue gpsStatusValue);
}