Move GPSManager into SensorManager.

Includes Bugfix: SensorManager might not have been stopped.

Part of #1424.
This commit is contained in:
Dennis Guse
2023-05-27 13:22:33 +02:00
parent 1657bf5ec1
commit f336a1da12
5 changed files with 26 additions and 82 deletions
@@ -30,6 +30,6 @@ public class TrackRecordingServiceTestUtils {
location.setSpeed(speed); location.setSpeed(speed);
trackPointCreator.setClock(time); trackPointCreator.setClock(time);
trackPointCreator.getGpsHandler().onLocationChanged(location); trackPointCreator.getSensorManager().getGpsManager().onLocationChanged(location);
} }
} }
@@ -1,57 +0,0 @@
package de.dennisguse.opentracks.services.handlers;
import static org.mockito.Mockito.verify;
import android.content.Context;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import de.dennisguse.opentracks.data.models.Distance;
import de.dennisguse.opentracks.data.models.TrackPoint;
@RunWith(MockitoJUnitRunner.class)
public class TrackPointCreatorTest {
@Mock
private Context context;
@Mock
private TrackPointCreator.Callback server;
@Mock
private GPSManager locationHandler;
private TrackPointCreator subject;
@Before
public void setUp() {
subject = new TrackPointCreator(locationHandler, server);
subject.start(context, null);
}
@After
public void tearDown() {
subject.stop();
}
@Ignore("ServiceExecutor disabled for #822")
@Test
public void sendTrackPoint() throws InterruptedException {
// given
TrackPoint trackPoint = new TrackPoint(TrackPoint.Type.TRACKPOINT, null);
Distance horizontalAccuracyThreshold = Distance.of(50);
// when
subject.onNewTrackPoint(trackPoint);
// then
Thread.sleep(10); // Wait for executor service
verify(server).newTrackPoint(trackPoint, horizontalAccuracyThreshold);
}
}
@@ -9,6 +9,7 @@ import androidx.annotation.VisibleForTesting;
import de.dennisguse.opentracks.data.models.TrackPoint; import de.dennisguse.opentracks.data.models.TrackPoint;
import de.dennisguse.opentracks.sensors.sensorData.SensorData; import de.dennisguse.opentracks.sensors.sensorData.SensorData;
import de.dennisguse.opentracks.sensors.sensorData.SensorDataSet; import de.dennisguse.opentracks.sensors.sensorData.SensorDataSet;
import de.dennisguse.opentracks.services.handlers.GPSManager;
import de.dennisguse.opentracks.services.handlers.TrackPointCreator; import de.dennisguse.opentracks.services.handlers.TrackPointCreator;
public class SensorManager { public class SensorManager {
@@ -40,14 +41,20 @@ public class SensorManager {
private AltitudeSumManager altitudeSumManager; private AltitudeSumManager altitudeSumManager;
public SensorManager(Context context, Handler handler, TrackPointCreator observer) { private GPSManager gpsManager;
public SensorManager(TrackPointCreator observer) {
this.observer = observer; this.observer = observer;
bluetoothSensorManager = new BluetoothRemoteSensorManager(context, handler, listener);
altitudeSumManager = new AltitudeSumManager();
} }
public void start(Context context, Handler handler) { public void start(Context context, Handler handler) {
gpsManager = new GPSManager(observer); //TODO Pass listener
gpsManager.start(context, handler);
bluetoothSensorManager = new BluetoothRemoteSensorManager(context, handler, listener);
bluetoothSensorManager.start(context, handler); bluetoothSensorManager.start(context, handler);
altitudeSumManager = new AltitudeSumManager();
altitudeSumManager.start(context, handler); altitudeSumManager.start(context, handler);
} }
@@ -62,6 +69,11 @@ public class SensorManager {
altitudeSumManager = null; altitudeSumManager = null;
} }
if (gpsManager != null) {
gpsManager.stop(context);
gpsManager = null;
}
sensorDataSet.clear(); sensorDataSet.clear();
} }
@@ -86,6 +98,10 @@ public class SensorManager {
return bluetoothSensorManager; return bluetoothSensorManager;
} }
public GPSManager getGpsManager() {
return gpsManager;
}
@Deprecated @Deprecated
@VisibleForTesting @VisibleForTesting
public AltitudeSumManager getAltitudeSumManager() { public AltitudeSumManager getAltitudeSumManager() {
@@ -30,7 +30,7 @@ public class GPSManager implements SensorConnector, LocationListenerCompat, GpsS
private final String TAG = GPSManager.class.getSimpleName(); private final String TAG = GPSManager.class.getSimpleName();
public static final String LOCATION_PROVIDER = LocationManager.GPS_PROVIDER; private static final String LOCATION_PROVIDER = LocationManager.GPS_PROVIDER;
private final TrackPointCreator trackPointCreator; private final TrackPointCreator trackPointCreator;
private Context context; private Context context;
@@ -18,6 +18,7 @@ import de.dennisguse.opentracks.data.models.Distance;
import de.dennisguse.opentracks.data.models.TrackPoint; import de.dennisguse.opentracks.data.models.TrackPoint;
import de.dennisguse.opentracks.sensors.SensorManager; import de.dennisguse.opentracks.sensors.SensorManager;
import de.dennisguse.opentracks.sensors.sensorData.SensorDataSet; import de.dennisguse.opentracks.sensors.sensorData.SensorDataSet;
import de.dennisguse.opentracks.settings.PreferencesUtils;
/** /**
* Creates TrackPoints while recording by fusing data from different sensors (e.g., GNSS, barometer, BLE sensors). * Creates TrackPoints while recording by fusing data from different sensors (e.g., GNSS, barometer, BLE sensors).
@@ -32,26 +33,21 @@ public class TrackPointCreator {
@NonNull @NonNull
private Clock clock = new MonotonicClock(); private Clock clock = new MonotonicClock();
private final GPSManager gpsManager;
private SensorManager sensorManager; private SensorManager sensorManager;
public TrackPointCreator(Callback service, Context context, Handler handler) { public TrackPointCreator(Callback service, Context context, Handler handler) {
this.service = service; this.service = service;
this.gpsManager = new GPSManager(this); this.sensorManager = new SensorManager(this);
this.sensorManager = new SensorManager(context, handler, this);
} }
@VisibleForTesting @VisibleForTesting
TrackPointCreator(GPSManager gpsManager, Callback service) { TrackPointCreator(Callback service) {
this.service = service; this.service = service;
this.gpsManager = gpsManager;
} }
public synchronized void start(@NonNull Context context, @NonNull Handler handler) { public synchronized void start(@NonNull Context context, @NonNull Handler handler) {
this.context = context; this.context = context;
gpsManager.start(context, handler);
sensorManager.start(context, handler); sensorManager.start(context, handler);
} }
@@ -73,8 +69,7 @@ public class TrackPointCreator {
} }
public synchronized void stop() { public synchronized void stop() {
gpsManager.stop(context); sensorManager.stop(context);
this.context = null; this.context = null;
} }
@@ -93,7 +88,7 @@ public class TrackPointCreator {
public void onNewTrackPoint(@NonNull TrackPoint trackPoint) { public void onNewTrackPoint(@NonNull TrackPoint trackPoint) {
addSensorData(trackPoint); addSensorData(trackPoint);
boolean stored = service.newTrackPoint(trackPoint, gpsManager.getThresholdHorizontalAccuracy()); boolean stored = service.newTrackPoint(trackPoint, PreferencesUtils.getThresholdHorizontalAccuracy()); //TODO Cache preference for performance
if (stored) { if (stored) {
reset(); reset();
} }
@@ -151,16 +146,6 @@ public class TrackPointCreator {
this.clock = Clock.fixed(Instant.parse(time), ZoneId.of("CET")); this.clock = Clock.fixed(Instant.parse(time), ZoneId.of("CET"));
} }
@VisibleForTesting
public void setClock(@NonNull Clock clock) {
this.clock = clock;
}
@VisibleForTesting
public GPSManager getGpsHandler() {
return gpsManager;
}
void sendGpsStatus(GpsStatusValue gpsStatusValue) { void sendGpsStatus(GpsStatusValue gpsStatusValue) {
service.newGpsStatus(gpsStatusValue); service.newGpsStatus(gpsStatusValue);
} }