From b9a36d1b3c1cd85133116997689a1c84a047d8b8 Mon Sep 17 00:00:00 2001 From: Dennis Guse Date: Sun, 21 Jun 2026 18:50:26 +0200 Subject: [PATCH] Bugfix: storing idle and sensor-based trackpoints might happen in the wrong order (race condition). Fixes #2356. --- .../opentracks/services/TrackRecordingManager.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingManager.java b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingManager.java index 6e5b8be7b..3a4197aee 100644 --- a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingManager.java +++ b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingManager.java @@ -67,7 +67,7 @@ public class TrackRecordingManager implements SharedPreferences.OnSharedPreferen contentProviderUtils = new ContentProviderUtils(context); } - Track.Id startNewTrack() { + synchronized Track.Id startNewTrack() { TrackPoint segmentStartTrackPoint = trackPointCreator.createSegmentStartManual(); 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. */ - boolean resumeExistingTrack(@NonNull Track.Id resumeTrackId) { + synchronized boolean resumeExistingTrack(@NonNull Track.Id resumeTrackId) { trackId = resumeTrackId; Track track = contentProviderUtils.getTrack(trackId); if (track == null) { @@ -119,7 +119,7 @@ public class TrackRecordingManager implements SharedPreferences.OnSharedPreferen return true; } - void endCurrentTrack() { + synchronized void endCurrentTrack() { TrackPoint segmentEnd = trackPointCreator.createSegmentEnd(); insertTrackPoint(segmentEnd, true); @@ -149,7 +149,7 @@ public class TrackRecordingManager implements SharedPreferences.OnSharedPreferen } @VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE) - public void onIdle() { + public synchronized void onIdle() { Log.d(TAG, "Becoming idle"); onNewTrackPoint(trackPointCreator.createIdle());