From e71ab28701b6b2a2f7017aa38ec8145c6ecff961 Mon Sep 17 00:00:00 2001 From: Dennis Guse Date: Tue, 18 May 2021 16:43:57 +0200 Subject: [PATCH] TrackRecordingService: avoid race condition while stopping a recording. --- .../provider/ContentProviderUtils.java | 5 +--- .../services/TrackRecordingService.java | 28 ++++++++++++------- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/src/main/java/de/dennisguse/opentracks/content/provider/ContentProviderUtils.java b/src/main/java/de/dennisguse/opentracks/content/provider/ContentProviderUtils.java index f083d4c8e..0d01696e6 100644 --- a/src/main/java/de/dennisguse/opentracks/content/provider/ContentProviderUtils.java +++ b/src/main/java/de/dennisguse/opentracks/content/provider/ContentProviderUtils.java @@ -205,10 +205,7 @@ public class ContentProviderUtils { return tracks; } - public Track getTrack(Track.Id trackId) { - if (trackId == null) { - return null; - } + public Track getTrack(@NonNull Track.Id trackId) { try (Cursor cursor = getTrackCursor(TracksColumns._ID + "=?", new String[]{Long.toString(trackId.getId())}, null)) { if (cursor != null && cursor.moveToNext()) { return createTrack(cursor); diff --git a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java index c751ce47b..f245a530b 100644 --- a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java +++ b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java @@ -91,11 +91,7 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand private final Runnable updateRecordingData = new Runnable() { @Override public void run() { - Track track = contentProviderUtils.getTrack(recordingStatus.getTrackId()); - track.getTrackStatistics().setTotalTime(TrackRecordingService.this.getTotalTime()); - - SensorDataSet sensorDataSet = fillWithSensorDataSet(lastTrackPoint); - recordingDataObservable.postValue(new RecordingData(track, lastTrackPoint, sensorDataSet)); + updateRecordingDataWhileRecording(); handler.postDelayed(this, RECORDING_DATA_UPDATE_INTERVAL.toMillis()); } }; @@ -464,12 +460,12 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand * @param trackStopped true if track is stopped, false if track is paused */ private void endRecording(boolean trackStopped) { - if (trackStopped) { - recordingDataObservable.postValue(NOT_RECORDING); - } else { - updateRecordingData.run(); - } handler.removeCallbacks(updateRecordingData); + if (!trackStopped) { + updateRecordingDataWhileRecording(); + } else { + recordingDataObservable.postValue(NOT_RECORDING); + } // Shutdown periodic tasks voiceExecutor.shutdown(); @@ -754,6 +750,18 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand return recordingDataObservable; } + private void updateRecordingDataWhileRecording() { + if (!recordingStatus.isRecording()) { + Log.w(TAG, "Currently not recording; cannot update data."); + return; + } + Track track = contentProviderUtils.getTrack(recordingStatus.getTrackId()); + track.getTrackStatistics().setTotalTime(TrackRecordingService.this.getTotalTime()); + + SensorDataSet sensorDataSet = fillWithSensorDataSet(lastTrackPoint); + recordingDataObservable.postValue(new RecordingData(track, lastTrackPoint, sensorDataSet)); + } + public LiveData getRecordingStatusObservable() { return recordingStatusObservable; }