Bugfix: storing idle and sensor-based trackpoints might happen in the wrong order (race condition).

Fixes #2356.
This commit is contained in:
Dennis Guse
2026-06-21 18:50:26 +02:00
parent 34e89ea3f9
commit b9a36d1b3c
@@ -67,7 +67,7 @@ public class TrackRecordingManager implements SharedPreferences.OnSharedPreferen
contentProviderUtils = new ContentProviderUtils(context); contentProviderUtils = new ContentProviderUtils(context);
} }
Track.Id startNewTrack() { synchronized Track.Id startNewTrack() {
TrackPoint segmentStartTrackPoint = trackPointCreator.createSegmentStartManual(); TrackPoint segmentStartTrackPoint = trackPointCreator.createSegmentStartManual();
ZoneOffset zoneOffset = ZoneOffset.systemDefault().getRules().getOffset(segmentStartTrackPoint.getTime()); ZoneOffset zoneOffset = ZoneOffset.systemDefault().getRules().getOffset(segmentStartTrackPoint.getTime());
@@ -103,7 +103,7 @@ public class TrackRecordingManager implements SharedPreferences.OnSharedPreferen
/** /**
* @return if the recording could be started. * @return if the recording could be started.
*/ */
boolean resumeExistingTrack(@NonNull Track.Id resumeTrackId) { synchronized boolean resumeExistingTrack(@NonNull Track.Id resumeTrackId) {
trackId = resumeTrackId; trackId = resumeTrackId;
Track track = contentProviderUtils.getTrack(trackId); Track track = contentProviderUtils.getTrack(trackId);
if (track == null) { if (track == null) {
@@ -119,7 +119,7 @@ public class TrackRecordingManager implements SharedPreferences.OnSharedPreferen
return true; return true;
} }
void endCurrentTrack() { synchronized void endCurrentTrack() {
TrackPoint segmentEnd = trackPointCreator.createSegmentEnd(); TrackPoint segmentEnd = trackPointCreator.createSegmentEnd();
insertTrackPoint(segmentEnd, true); insertTrackPoint(segmentEnd, true);
@@ -149,7 +149,7 @@ public class TrackRecordingManager implements SharedPreferences.OnSharedPreferen
} }
@VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE) @VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE)
public void onIdle() { public synchronized void onIdle() {
Log.d(TAG, "Becoming idle"); Log.d(TAG, "Becoming idle");
onNewTrackPoint(trackPointCreator.createIdle()); onNewTrackPoint(trackPointCreator.createIdle());