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);
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.sensors.sensorData.SensorData;
import de.dennisguse.opentracks.sensors.sensorData.SensorDataSet;
import de.dennisguse.opentracks.services.handlers.GPSManager;
import de.dennisguse.opentracks.services.handlers.TrackPointCreator;
public class SensorManager {
@@ -40,14 +41,20 @@ public class SensorManager {
private AltitudeSumManager altitudeSumManager;
public SensorManager(Context context, Handler handler, TrackPointCreator observer) {
private GPSManager gpsManager;
public SensorManager(TrackPointCreator observer) {
this.observer = observer;
bluetoothSensorManager = new BluetoothRemoteSensorManager(context, handler, listener);
altitudeSumManager = new AltitudeSumManager();
}
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);
altitudeSumManager = new AltitudeSumManager();
altitudeSumManager.start(context, handler);
}
@@ -62,6 +69,11 @@ public class SensorManager {
altitudeSumManager = null;
}
if (gpsManager != null) {
gpsManager.stop(context);
gpsManager = null;
}
sensorDataSet.clear();
}
@@ -86,6 +98,10 @@ public class SensorManager {
return bluetoothSensorManager;
}
public GPSManager getGpsManager() {
return gpsManager;
}
@Deprecated
@VisibleForTesting
public AltitudeSumManager getAltitudeSumManager() {
@@ -30,7 +30,7 @@ public class GPSManager implements SensorConnector, LocationListenerCompat, GpsS
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 Context context;
@@ -18,6 +18,7 @@ import de.dennisguse.opentracks.data.models.Distance;
import de.dennisguse.opentracks.data.models.TrackPoint;
import de.dennisguse.opentracks.sensors.SensorManager;
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).
@@ -32,26 +33,21 @@ public class TrackPointCreator {
@NonNull
private Clock clock = new MonotonicClock();
private final GPSManager gpsManager;
private SensorManager sensorManager;
public TrackPointCreator(Callback service, Context context, Handler handler) {
this.service = service;
this.gpsManager = new GPSManager(this);
this.sensorManager = new SensorManager(context, handler, this);
this.sensorManager = new SensorManager(this);
}
@VisibleForTesting
TrackPointCreator(GPSManager gpsManager, Callback service) {
TrackPointCreator(Callback service) {
this.service = service;
this.gpsManager = gpsManager;
}
public synchronized void start(@NonNull Context context, @NonNull Handler handler) {
this.context = context;
gpsManager.start(context, handler);
sensorManager.start(context, handler);
}
@@ -73,8 +69,7 @@ public class TrackPointCreator {
}
public synchronized void stop() {
gpsManager.stop(context);
sensorManager.stop(context);
this.context = null;
}
@@ -93,7 +88,7 @@ public class TrackPointCreator {
public void onNewTrackPoint(@NonNull TrackPoint trackPoint) {
addSensorData(trackPoint);
boolean stored = service.newTrackPoint(trackPoint, gpsManager.getThresholdHorizontalAccuracy());
boolean stored = service.newTrackPoint(trackPoint, PreferencesUtils.getThresholdHorizontalAccuracy()); //TODO Cache preference for performance
if (stored) {
reset();
}
@@ -151,16 +146,6 @@ public class TrackPointCreator {
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) {
service.newGpsStatus(gpsStatusValue);
}