forked from upstream-mirrors/OpenTracks
TrackRecordingService uses LiveData to transfer data.
Replaces pull from UI layer. Fixes #173.
This commit is contained in:
@@ -76,7 +76,10 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand
|
||||
|
||||
private static final String TAG = TrackRecordingService.class.getSimpleName();
|
||||
|
||||
private static final Duration RECORDING_DATA_UPDATE_INTERVAL = Duration.ofSeconds(1);
|
||||
|
||||
public static final RecordingStatus STATUS_DEFAULT = new RecordingStatus(null, false);
|
||||
public static final RecordingData NOT_RECORDING = new RecordingData(null, null, null);
|
||||
public static final GpsStatusValue STATUS_GPS_DEFAULT = GpsStatusValue.GPS_NONE;
|
||||
|
||||
// The following variables are set in onCreate:
|
||||
@@ -84,6 +87,19 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand
|
||||
private PeriodicTaskExecutor voiceExecutor;
|
||||
private TrackRecordingServiceNotificationManager notificationManager;
|
||||
|
||||
private Handler handler;
|
||||
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));
|
||||
handler.postDelayed(this, RECORDING_DATA_UPDATE_INTERVAL.toMillis());
|
||||
}
|
||||
};
|
||||
|
||||
private SharedPreferences sharedPreferences;
|
||||
|
||||
private Distance recordingDistanceInterval;
|
||||
@@ -127,14 +143,18 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand
|
||||
private RecordingStatus recordingStatus;
|
||||
private MutableLiveData<RecordingStatus> recordingStatusObservable;
|
||||
private MutableLiveData<GpsStatusValue> gpsStatusObservable;
|
||||
private MutableLiveData<RecordingData> recordingDataObservable;
|
||||
|
||||
@Override
|
||||
public void onCreate() {
|
||||
super.onCreate();
|
||||
|
||||
handler = new Handler();
|
||||
|
||||
recordingStatusObservable = new MutableLiveData<>();
|
||||
updateRecordingStatus(STATUS_DEFAULT);
|
||||
gpsStatusObservable = new MutableLiveData<>(STATUS_GPS_DEFAULT);
|
||||
recordingDataObservable = new MutableLiveData<>(NOT_RECORDING);
|
||||
|
||||
handlerServer = new HandlerServer(this);
|
||||
|
||||
@@ -160,6 +180,8 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
handler = null;
|
||||
|
||||
handlerServer.stop(this);
|
||||
handlerServer = null;
|
||||
|
||||
@@ -192,6 +214,7 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand
|
||||
|
||||
recordingStatusObservable = null;
|
||||
gpsStatusObservable = null;
|
||||
recordingDataObservable = null;
|
||||
|
||||
super.onDestroy();
|
||||
}
|
||||
@@ -208,6 +231,7 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand
|
||||
return recordingStatus.getTrackId();
|
||||
}
|
||||
|
||||
//TODO
|
||||
public TrackStatistics getTrackStatistics() {
|
||||
if (trackStatisticsUpdater == null) {
|
||||
return null;
|
||||
@@ -352,6 +376,8 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand
|
||||
remoteSensorManager = new BluetoothRemoteSensorManager(this);
|
||||
remoteSensorManager.start();
|
||||
|
||||
handler.postDelayed(updateRecordingData, RECORDING_DATA_UPDATE_INTERVAL.toMillis());
|
||||
|
||||
altitudeSumManager = new AltitudeSumManager();
|
||||
altitudeSumManager.start(this);
|
||||
|
||||
@@ -438,6 +464,13 @@ 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);
|
||||
|
||||
// Shutdown periodic tasks
|
||||
voiceExecutor.shutdown();
|
||||
|
||||
@@ -613,14 +646,18 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand
|
||||
trackPoint.setAltitudeLoss(getAltitudeLoss_m());
|
||||
altitudeSumManager.reset();
|
||||
}
|
||||
|
||||
//TODO We need a copy of the SensorDataSet as data will be reset!
|
||||
SensorDataSet sensorDataSet = fillWithSensorDataSet(trackPoint);
|
||||
if (remoteSensorManager != null) {
|
||||
fillWithSensorDataSet(trackPoint);
|
||||
remoteSensorManager.reset();
|
||||
}
|
||||
contentProviderUtils.insertTrackPoint(trackPoint, track.getId());
|
||||
trackStatisticsUpdater.addTrackPoint(trackPoint, recordingDistanceInterval);
|
||||
|
||||
track.setTrackStatistics(trackStatisticsUpdater.getTrackStatistics());
|
||||
|
||||
recordingDataObservable.postValue(new RecordingData(track, trackPoint, sensorDataSet));
|
||||
|
||||
contentProviderUtils.updateTrack(track);
|
||||
} catch (SQLiteException e) {
|
||||
/*
|
||||
@@ -632,25 +669,26 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand
|
||||
voiceExecutor.update();
|
||||
}
|
||||
|
||||
public SensorDataSet getSensorDataSet() {
|
||||
private SensorDataSet fillWithSensorDataSet(TrackPoint trackPoint) {
|
||||
if (remoteSensorManager == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return remoteSensorManager.getSensorData();
|
||||
}
|
||||
SensorDataSet sensorData = remoteSensorManager.getSensorData();
|
||||
if (sensorData == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
private void fillWithSensorDataSet(TrackPoint trackPoint) {
|
||||
SensorDataSet sensorData = getSensorDataSet();
|
||||
if (sensorData != null) {
|
||||
if (trackPoint != null) {
|
||||
sensorData.fillTrackPoint(trackPoint);
|
||||
}
|
||||
return sensorData;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the relative altitude gain (since last trackpoint).
|
||||
*/
|
||||
public Float getAltitudeGain_m() {
|
||||
private Float getAltitudeGain_m() {
|
||||
if (altitudeSumManager == null || !altitudeSumManager.isConnected()) {
|
||||
return null;
|
||||
}
|
||||
@@ -661,7 +699,7 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand
|
||||
/**
|
||||
* Returns the relative altitude loss (since last trackpoint).
|
||||
*/
|
||||
public Float getAltitudeLoss_m() {
|
||||
private Float getAltitudeLoss_m() {
|
||||
if (altitudeSumManager == null || !altitudeSumManager.isConnected()) {
|
||||
return null;
|
||||
}
|
||||
@@ -712,6 +750,10 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand
|
||||
return gpsStatusObservable;
|
||||
}
|
||||
|
||||
public MutableLiveData<RecordingData> getRecordingDataObservable() {
|
||||
return recordingDataObservable;
|
||||
}
|
||||
|
||||
public LiveData<RecordingStatus> getRecordingStatusObservable() {
|
||||
return recordingStatusObservable;
|
||||
}
|
||||
@@ -792,4 +834,50 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
||||
public static class RecordingData {
|
||||
|
||||
private final Track track;
|
||||
|
||||
private final TrackPoint latestTrackPoint;
|
||||
|
||||
private final SensorDataSet sensorDataSet;
|
||||
|
||||
/**
|
||||
* {@link Track} and {@link TrackPoint} must be immutable (i.e., their content does not change).
|
||||
*/
|
||||
public RecordingData(Track track, TrackPoint lastTrackPoint, SensorDataSet sensorDataSet) {
|
||||
this.track = track;
|
||||
this.latestTrackPoint = lastTrackPoint;
|
||||
this.sensorDataSet = sensorDataSet;
|
||||
}
|
||||
|
||||
public Track getTrack() {
|
||||
return track;
|
||||
}
|
||||
|
||||
public String getTrackCategory() {
|
||||
if (track == null) {
|
||||
return "";
|
||||
}
|
||||
return track.getCategory();
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public TrackStatistics getTrackStatistics() {
|
||||
if (track == null) {
|
||||
return new TrackStatistics();
|
||||
}
|
||||
|
||||
return track.getTrackStatistics();
|
||||
}
|
||||
|
||||
public TrackPoint getLatestTrackPoint() {
|
||||
return latestTrackPoint;
|
||||
}
|
||||
|
||||
public SensorDataSet getSensorDataSet() {
|
||||
return sensorDataSet;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -44,6 +44,7 @@ public class TrackRecordingServiceConnection implements ServiceConnection, Death
|
||||
|
||||
private static final String TAG = TrackRecordingServiceConnection.class.getSimpleName();
|
||||
|
||||
@Deprecated //TODO Implement proper interface that passes the current TrackRecordingService
|
||||
private final Runnable callback;
|
||||
|
||||
private TrackRecordingService trackRecordingService;
|
||||
|
||||
@@ -178,7 +178,7 @@ public class AnnouncementPeriodicTask implements PeriodicTask {
|
||||
}
|
||||
String category = track.getCategory();
|
||||
|
||||
//TODO Querying all TrackPoints all the time is inefficient; use TrackDataHub or something else.
|
||||
//TODO Querying all TrackPoints all the time is inefficient; get infos from TrackRecordingService
|
||||
TrackPointIterator trackPointIterator = contentProviderUtils.getTrackPointLocationIterator(track.getId(), null);
|
||||
ArrayList<TrackPoint> trackPoints = new ArrayList<>();
|
||||
while (trackPointIterator.hasNext()) {
|
||||
|
||||
Reference in New Issue
Block a user