forked from upstream-mirrors/OpenTracks
TrackRecordingService: avoid race condition while stopping a recording.
This commit is contained in:
@@ -205,10 +205,7 @@ public class ContentProviderUtils {
|
|||||||
return tracks;
|
return tracks;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Track getTrack(Track.Id trackId) {
|
public Track getTrack(@NonNull Track.Id trackId) {
|
||||||
if (trackId == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
try (Cursor cursor = getTrackCursor(TracksColumns._ID + "=?", new String[]{Long.toString(trackId.getId())}, null)) {
|
try (Cursor cursor = getTrackCursor(TracksColumns._ID + "=?", new String[]{Long.toString(trackId.getId())}, null)) {
|
||||||
if (cursor != null && cursor.moveToNext()) {
|
if (cursor != null && cursor.moveToNext()) {
|
||||||
return createTrack(cursor);
|
return createTrack(cursor);
|
||||||
|
|||||||
@@ -91,11 +91,7 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand
|
|||||||
private final Runnable updateRecordingData = new Runnable() {
|
private final Runnable updateRecordingData = new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
Track track = contentProviderUtils.getTrack(recordingStatus.getTrackId());
|
updateRecordingDataWhileRecording();
|
||||||
track.getTrackStatistics().setTotalTime(TrackRecordingService.this.getTotalTime());
|
|
||||||
|
|
||||||
SensorDataSet sensorDataSet = fillWithSensorDataSet(lastTrackPoint);
|
|
||||||
recordingDataObservable.postValue(new RecordingData(track, lastTrackPoint, sensorDataSet));
|
|
||||||
handler.postDelayed(this, RECORDING_DATA_UPDATE_INTERVAL.toMillis());
|
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
|
* @param trackStopped true if track is stopped, false if track is paused
|
||||||
*/
|
*/
|
||||||
private void endRecording(boolean trackStopped) {
|
private void endRecording(boolean trackStopped) {
|
||||||
if (trackStopped) {
|
|
||||||
recordingDataObservable.postValue(NOT_RECORDING);
|
|
||||||
} else {
|
|
||||||
updateRecordingData.run();
|
|
||||||
}
|
|
||||||
handler.removeCallbacks(updateRecordingData);
|
handler.removeCallbacks(updateRecordingData);
|
||||||
|
if (!trackStopped) {
|
||||||
|
updateRecordingDataWhileRecording();
|
||||||
|
} else {
|
||||||
|
recordingDataObservable.postValue(NOT_RECORDING);
|
||||||
|
}
|
||||||
|
|
||||||
// Shutdown periodic tasks
|
// Shutdown periodic tasks
|
||||||
voiceExecutor.shutdown();
|
voiceExecutor.shutdown();
|
||||||
@@ -754,6 +750,18 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand
|
|||||||
return recordingDataObservable;
|
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() {
|
public LiveData<RecordingStatus> getRecordingStatusObservable() {
|
||||||
return recordingStatusObservable;
|
return recordingStatusObservable;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user