TrackRecordingService: avoid race condition while stopping a recording.

This commit is contained in:
Dennis Guse
2021-05-18 16:43:57 +02:00
parent ae001c73dd
commit e71ab28701
2 changed files with 19 additions and 14 deletions
@@ -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);
@@ -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<RecordingStatus> getRecordingStatusObservable() {
return recordingStatusObservable;
}