TrackRecordingService: move BluetoothRemoteSensorManager and AltitudeSumManager to HandlerServer.

Part of #822.
This commit is contained in:
Dennis Guse
2021-07-12 21:22:28 +02:00
parent 7f618da7a6
commit 223ad70d36
7 changed files with 101 additions and 82 deletions
@@ -52,8 +52,6 @@ import de.dennisguse.opentracks.content.sensor.SensorDataSet;
import de.dennisguse.opentracks.io.file.exporter.ExportServiceResultReceiver;
import de.dennisguse.opentracks.services.handlers.GpsStatusValue;
import de.dennisguse.opentracks.services.handlers.HandlerServer;
import de.dennisguse.opentracks.services.sensors.AltitudeSumManager;
import de.dennisguse.opentracks.services.sensors.BluetoothRemoteSensorManager;
import de.dennisguse.opentracks.services.tasks.AnnouncementPeriodicTask;
import de.dennisguse.opentracks.services.tasks.PeriodicTaskExecutor;
import de.dennisguse.opentracks.settings.SettingsActivity;
@@ -125,14 +123,12 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand
maxRecordingDistance = PreferencesUtils.getMaxRecordingDistance(sharedPreferences, context);
}
handlerServer.onSharedPreferenceChanged(context, sharedPreferences, key);
handlerServer.onSharedPreferenceChanged(sharedPreferences, key);
}
};
// The following variables are set when recording:
private WakeLock wakeLock;
private BluetoothRemoteSensorManager remoteSensorManager;
private AltitudeSumManager altitudeSumManager;
private TrackStatisticsUpdater trackStatisticsUpdater;
private TrackPoint lastTrackPoint;
@@ -187,16 +183,6 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand
handlerServer.stop();
handlerServer = null;
if (remoteSensorManager != null) {
remoteSensorManager.stop();
remoteSensorManager = null;
}
if (altitudeSumManager != null) {
altitudeSumManager.stop(this);
altitudeSumManager = null;
}
// Reverse order from onCreate
showNotification(false); //TODO Why?
@@ -361,12 +347,6 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand
*/
private void startRecording() {
// Update instance variables
remoteSensorManager = new BluetoothRemoteSensorManager(this);
remoteSensorManager.start();
altitudeSumManager = new AltitudeSumManager();
altitudeSumManager.start(this);
handler.postDelayed(updateRecordingData, RECORDING_DATA_UPDATE_INTERVAL.toMillis());
lastTrackPoint = null;
@@ -374,6 +354,8 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand
startGps();
handlerServer.resetSensorData();
// Restore periodic tasks
voiceExecutor.restore();
}
@@ -412,7 +394,9 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand
insertTrackPointIfNewer(track, lastTrackPoint);
}
insertTrackPoint(track, TrackPoint.createSegmentEnd());
TrackPoint segmentEnd = TrackPoint.createSegmentEnd();
handlerServer.fillAndReset(segmentEnd);
insertTrackPoint(track, segmentEnd);
}
}
@@ -463,15 +447,6 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand
voiceExecutor.shutdown();
// Update instance variables
if (remoteSensorManager != null) {
remoteSensorManager.stop();
remoteSensorManager = null;
}
if (altitudeSumManager != null) {
altitudeSumManager.stop(this);
altitudeSumManager = null;
}
lastTrackPoint = null;
handlerServer.stop();
@@ -529,8 +504,6 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand
return;
}
remoteSensorManager.fill(trackPoint);
notificationManager.updateTrackPoint(this, track.getTrackStatistics(), trackPoint, recordingGpsAccuracy);
//TODO Figure out how to avoid loading the lastValidTrackPoint from the database
@@ -629,14 +602,6 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand
*/
private void insertTrackPoint(@NonNull Track track, @NonNull TrackPoint trackPoint) {
try {
if (!TrackPoint.Type.SEGMENT_START_MANUAL.equals(trackPoint.getType())) {
altitudeSumManager.fill(trackPoint);
altitudeSumManager.reset();
remoteSensorManager.fill(trackPoint);
remoteSensorManager.reset();
}
contentProviderUtils.insertTrackPoint(trackPoint, track.getId());
trackStatisticsUpdater.addTrackPoint(trackPoint, recordingDistanceInterval);
track.setTrackStatistics(trackStatisticsUpdater.getTrackStatistics());
@@ -681,18 +646,19 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand
}
}
// This is used to modify the state of this service while testing; must be called after startNewTrack().
@Deprecated
@VisibleForTesting
public void setRemoteSensorManager(@NonNull BluetoothRemoteSensorManager remoteSensorManager) {
this.remoteSensorManager = remoteSensorManager;
public HandlerServer getHandlerServer() {
return handlerServer;
}
// This is used to modify the state of this service while testing; must be called after startNewTrack().
/**
* To mock locations (to not get it from GPS).
*/
@Deprecated
@VisibleForTesting
public void setAltitudeSumManager(@NonNull AltitudeSumManager altitudeSumManager) {
this.altitudeSumManager = altitudeSumManager;
public void stopProcessingGPS() {
handlerServer.stopGPS();
}
public LiveData<GpsStatusValue> getGpsStatusObservable() {
@@ -723,16 +689,14 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand
tmpLastTrackPoint.setLatitude(lastTrackPoint.getLatitude());
}
BluetoothRemoteSensorManager localRemoteSensorManager = this.remoteSensorManager;
AltitudeSumManager localAltitudeSumManager = this.altitudeSumManager;
if (localAltitudeSumManager == null || localRemoteSensorManager == null) {
HandlerServer localHandlerServer = this.handlerServer;
if (localHandlerServer == null) {
// when this happens, no recording is running and we should not send any notifications.
//TODO This implementation is not a good idea; rather solve the issue for this properly
return;
}
localAltitudeSumManager.fill(tmpLastTrackPoint);
SensorDataSet sensorDataSet = localRemoteSensorManager.getSensorDataSet();
sensorDataSet.fillTrackPoint(tmpLastTrackPoint);
SensorDataSet sensorDataSet = localHandlerServer.fill(tmpLastTrackPoint);
tmpTrackStatisticsUpdater.addTrackPoint(tmpLastTrackPoint, recordingDistanceInterval);
track.setTrackStatistics(tmpTrackStatisticsUpdater.getTrackStatistics());
@@ -2,11 +2,15 @@ package de.dennisguse.opentracks.services.handlers;
import android.content.Context;
import android.content.SharedPreferences;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
import de.dennisguse.opentracks.content.data.TrackPoint;
import de.dennisguse.opentracks.content.sensor.SensorDataSet;
import de.dennisguse.opentracks.services.sensors.AltitudeSumManager;
import de.dennisguse.opentracks.services.sensors.BluetoothRemoteSensorManager;
import de.dennisguse.opentracks.util.PreferencesUtils;
public class HandlerServer {
@@ -21,6 +25,8 @@ public class HandlerServer {
private final LocationHandler locationHandler;
private final EGM2008CorrectionManager egm2008CorrectionManager = new EGM2008CorrectionManager();
private BluetoothRemoteSensorManager remoteSensorManager;
private AltitudeSumManager altitudeSumManager;
public HandlerServer(HandlerServerInterface service) {
this.service = service;
@@ -38,12 +44,46 @@ public class HandlerServer {
// serviceExecutor = Executors.newSingleThreadExecutor();
SharedPreferences sharedPreferences = PreferencesUtils.getSharedPreferences(context);
locationHandler.onStart(context);
locationHandler.onSharedPreferenceChanged(context, sharedPreferences, null);
locationHandler.onStart(context, sharedPreferences);
remoteSensorManager = new BluetoothRemoteSensorManager(context);
remoteSensorManager.start();
altitudeSumManager = new AltitudeSumManager();
altitudeSumManager.start(context);
}
@Deprecated
//There should be a cooler way to do this; we want to send fake locations without getting affected by real GPS data.
@VisibleForTesting
public void stopGPS() {
locationHandler.onStop();
}
public void resetSensorData() {
remoteSensorManager.reset();
altitudeSumManager.reset();
}
//TODO TrackPoint should be created by HandlerServer; instead of in the TrackRecordingService.
@Deprecated
public SensorDataSet fill(TrackPoint trackPoint) {
SensorDataSet sensorDataSet = remoteSensorManager.fill(trackPoint);
altitudeSumManager.fill(trackPoint);
return sensorDataSet;
}
public SensorDataSet fillAndReset(TrackPoint trackPoint) {
SensorDataSet sensorDataSet = fill(trackPoint);
resetSensorData();
return sensorDataSet;
}
public void stop() {
locationHandler.onStop(context);
locationHandler.onStop();
// if (serviceExecutor != null) {
// serviceExecutor.shutdownNow();
@@ -53,7 +93,12 @@ public class HandlerServer {
this.context = null;
}
public void onSharedPreferenceChanged(@NonNull Context context, @NonNull SharedPreferences preferences, String key) {
public void onSharedPreferenceChanged(@NonNull SharedPreferences preferences, String key) {
if (context == null) {
Log.w(TAG, "not started yet.");
return;
}
locationHandler.onSharedPreferenceChanged(context, preferences, key);
}
@@ -63,17 +108,32 @@ public class HandlerServer {
// }
egm2008CorrectionManager.correctAltitude(context, trackPoint);
fillAndReset(trackPoint);
// serviceExecutor.execute(() -> service.newTrackPoint(trackPoint, recordingGpsAccuracy));
service.newTrackPoint(trackPoint, recordingGpsAccuracy);
}
@Deprecated
@VisibleForTesting
public void setAltitudeSumManager(AltitudeSumManager altitudeSumManager) {
this.altitudeSumManager = altitudeSumManager;
}
@Deprecated
@VisibleForTesting
public void setRemoteSensorManager(BluetoothRemoteSensorManager remoteSensorManager) {
this.remoteSensorManager = remoteSensorManager;
}
void sendGpsStatus(GpsStatusValue gpsStatusValue) {
service.newGpsStatus(gpsStatusValue);
}
public interface HandlerServerInterface {
void newTrackPoint(TrackPoint trackPoint, int gpsAccuracy);
void newGpsStatus(GpsStatusValue gpsStatusValue);
}
}
@@ -33,14 +33,15 @@ class LocationHandler implements LocationListener, GpsStatus.GpsStatusListener {
this.handlerServer = handlerServer;
}
public void onStart(@NonNull Context context) {
public void onStart(@NonNull Context context, SharedPreferences sharedPreferences) {
onSharedPreferenceChanged(context, sharedPreferences, null);
gpsStatus = new GpsStatus(context, this);
locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
registerLocationListener();
gpsStatus.start();
}
public void onStop(@NonNull Context context) {
public void onStop() {
unregisterLocationListener();
locationManager = null;
if (gpsStatus != null) {
@@ -161,11 +161,8 @@ public class BluetoothRemoteSensorManager implements BluetoothConnectionManager.
}
}
public void fill(@NonNull TrackPoint trackPoint) {
public SensorDataSet fill(@NonNull TrackPoint trackPoint) {
sensorDataSet.fillTrackPoint(trackPoint);
}
public SensorDataSet getSensorDataSet() {
return new SensorDataSet(sensorDataSet);
}