diff --git a/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/ExportImportTest.java b/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/ExportImportTest.java index d8e9be3ee..0e3a76e63 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/ExportImportTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/ExportImportTest.java @@ -147,7 +147,7 @@ public class ExportImportTest { service.insertMarker("Marker 2", "Marker 2 category", "Marker 2 desc", null); trackPointCreator.setClock(Clock.fixed(Instant.parse("2020-02-02T02:02:06Z"), ZoneId.of("CET"))); - trackPointCreator.setRemoteSensorManager(new BluetoothRemoteSensorManager(context)); + trackPointCreator.setRemoteSensorManager(new BluetoothRemoteSensorManager(context, trackPointCreator)); service.pauseCurrentTrack(); trackPointCreator.setClock(Clock.fixed(Instant.parse("2020-02-02T02:02:20Z"), ZoneId.of("CET"))); @@ -165,7 +165,7 @@ public class ExportImportTest { sendLocation(trackPointCreator, Instant.parse("2020-02-02T02:02:23Z"), 3, 16.001, 10, 15, 10, 0); trackPointCreator.setClock(Clock.fixed(Instant.parse("2020-02-02T02:02:24Z"), ZoneId.of("CET"))); - trackPointCreator.setRemoteSensorManager(new BluetoothRemoteSensorManager(context)); + trackPointCreator.setRemoteSensorManager(new BluetoothRemoteSensorManager(context, trackPointCreator)); service.endCurrentTrack(); Track track = contentProviderUtils.getTrack(trackId); @@ -412,7 +412,7 @@ public class ExportImportTest { } private void mockBLESensorData(TrackPointCreator trackPointCreator, Float speed, Distance distance, Float heartRate, Float cyclingCadence, Float power) { - trackPointCreator.setRemoteSensorManager(new BluetoothRemoteSensorManager(context) { + trackPointCreator.setRemoteSensorManager(new BluetoothRemoteSensorManager(context, trackPointCreator) { @Override public SensorDataSet fill(@NonNull TrackPoint trackPoint) { SensorDataSet sensorDataSet = new SensorDataSet(); diff --git a/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceTest.java b/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceTest.java index 7670016fb..398a23ad4 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceTest.java @@ -280,7 +280,7 @@ public class TrackRecordingServiceTest { trackPointCreator.stopGPS(); trackPointCreator.setAltitudeSumManager(altitudeSumManager); - trackPointCreator.onNewTrackPoint(new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.parse("2020-02-02T02:02:05Z")), Distance.of(50)); + trackPointCreator.onNewTrackPoint(new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.parse("2020-02-02T02:02:05Z"))); // then assertTrue(service.isRecording()); @@ -404,7 +404,7 @@ public class TrackRecordingServiceTest { new TrackPoint(TrackPoint.Type.TRACKPOINT, Instant.parse("2020-02-02T02:02:03Z")) .setLatitude(10) .setLongitude(10) - , Distance.of(50)); + ); // when Marker.Id markerId = service.insertMarker(null, null, null, null); @@ -452,7 +452,7 @@ public class TrackRecordingServiceTest { .setSpeed(Speed.of(speed)) .setBearing(3.0f); - trackRecordingService.getTrackPointCreator().onNewTrackPoint(trackPoint, Distance.of(50)); + trackRecordingService.getTrackPointCreator().onNewTrackPoint(trackPoint); } //TODO Workaround as service is not stopped on API23; thus sharedpreferences are not reset between tests. diff --git a/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceTestLocation.java b/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceTestLocation.java index fa0c662af..968dd062d 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceTestLocation.java +++ b/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceTestLocation.java @@ -325,7 +325,7 @@ public class TrackRecordingServiceTestLocation { Track.Id trackId = service.startNewTrack(); service.stopUpdateRecordingData(); service.getTrackPointCreator().setAltitudeSumManager(altitudeSumManager); - service.getTrackPointCreator().setRemoteSensorManager(new BluetoothRemoteSensorManager(context) { + service.getTrackPointCreator().setRemoteSensorManager(new BluetoothRemoteSensorManager(context, service.getTrackPointCreator()) { @Override public boolean isEnabled() { @@ -386,7 +386,7 @@ public class TrackRecordingServiceTestLocation { @MediumTest @Test public void testOnLocationChangedAsync_idle_withSensorDistance() { - BluetoothRemoteSensorManager remoteSensorManager = new BluetoothRemoteSensorManager(context) { + BluetoothRemoteSensorManager remoteSensorManager = new BluetoothRemoteSensorManager(context, service.getTrackPointCreator()) { @Override public boolean isEnabled() { diff --git a/src/androidTest/java/de/dennisguse/opentracks/services/handlers/GPSHandlerTest.java b/src/androidTest/java/de/dennisguse/opentracks/services/handlers/GPSHandlerTest.java index b4b52d69f..dd13ba5db 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/services/handlers/GPSHandlerTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/services/handlers/GPSHandlerTest.java @@ -62,7 +62,7 @@ public class GPSHandlerTest { locationHandler.onLocationChanged(createLocation(45f, 35f, 3, 5, System.currentTimeMillis())); // then - verify(trackPointCreator, times(1)).onNewTrackPoint(any(TrackPoint.class), any(Distance.class)); + verify(trackPointCreator, times(1)).onNewTrackPoint(any(TrackPoint.class)); } /** @@ -78,7 +78,7 @@ public class GPSHandlerTest { locationHandler.onLocationChanged(createLocation(latitude, 35f, 3, 5, System.currentTimeMillis())); // then - verify(trackPointCreator, times(0)).onNewTrackPoint(any(TrackPoint.class), any(Distance.class)); + verify(trackPointCreator, times(0)).onNewTrackPoint(any(TrackPoint.class)); } /** @@ -94,7 +94,7 @@ public class GPSHandlerTest { // then // no newTrackPoint called - verify(trackPointCreator, times(0)).onNewTrackPoint(any(TrackPoint.class), any(Distance.class)); + verify(trackPointCreator, times(0)).onNewTrackPoint(any(TrackPoint.class)); } @Test @@ -107,7 +107,7 @@ public class GPSHandlerTest { locationHandler.onLocationChanged(createLocation(99.0, 35.0, Long.MAX_VALUE, 15, System.currentTimeMillis())); // then - verify(trackPointCreator, times(1)).onNewTrackPoint(any(TrackPoint.class), any(Distance.class)); + verify(trackPointCreator, times(1)).onNewTrackPoint(any(TrackPoint.class)); } /** diff --git a/src/androidTest/java/de/dennisguse/opentracks/services/handlers/TrackPointCreatorTest.java b/src/androidTest/java/de/dennisguse/opentracks/services/handlers/TrackPointCreatorTest.java index c5bd6f527..3d3db731a 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/services/handlers/TrackPointCreatorTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/services/handlers/TrackPointCreatorTest.java @@ -48,7 +48,7 @@ public class TrackPointCreatorTest { Distance horizontalAccuracyThreshold = Distance.of(50); // when - subject.onNewTrackPoint(trackPoint, horizontalAccuracyThreshold); + subject.onNewTrackPoint(trackPoint); // then Thread.sleep(10); // Wait for executor service diff --git a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java index bd437fa4f..2283c7d56 100644 --- a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java +++ b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java @@ -88,7 +88,6 @@ public class TrackRecordingService extends Service implements TrackPointCreator. @Override public void run() { updateRecordingDataWhileRecording(); - trackPointCreator.onNewTrackPointWithoutGPS(); //TODO Should not be called every second, right? + with do some duplicate computation with updateRecordingDataWhileRecording(). Handler localHandler = TrackRecordingService.this.handler; if (localHandler == null) { diff --git a/src/main/java/de/dennisguse/opentracks/services/handlers/GPSHandler.java b/src/main/java/de/dennisguse/opentracks/services/handlers/GPSHandler.java index 341618724..aa954d0fb 100644 --- a/src/main/java/de/dennisguse/opentracks/services/handlers/GPSHandler.java +++ b/src/main/java/de/dennisguse/opentracks/services/handlers/GPSHandler.java @@ -121,7 +121,7 @@ public class GPSHandler implements LocationListener, GpsStatus.GpsStatusListener } lastTrackPoint = trackPoint; - trackPointCreator.onNewTrackPoint(trackPoint, thresholdHorizontalAccuracy); + trackPointCreator.onNewTrackPoint(trackPoint); } @Override diff --git a/src/main/java/de/dennisguse/opentracks/services/handlers/TrackPointCreator.java b/src/main/java/de/dennisguse/opentracks/services/handlers/TrackPointCreator.java index 91fb2528d..06985f3b8 100644 --- a/src/main/java/de/dennisguse/opentracks/services/handlers/TrackPointCreator.java +++ b/src/main/java/de/dennisguse/opentracks/services/handlers/TrackPointCreator.java @@ -20,7 +20,7 @@ import de.dennisguse.opentracks.services.sensors.BluetoothRemoteSensorManager; /** * Creates TrackPoints while recording by fusing data from different sensors (e.g., GNSS, barometer, BLE sensors). */ -public class TrackPointCreator { +public class TrackPointCreator implements BluetoothRemoteSensorManager.SensorDataSetChangeObserver { private static final String TAG = TrackPointCreator.class.getSimpleName(); @@ -51,10 +51,10 @@ public class TrackPointCreator { gpsHandler.onStart(context); - remoteSensorManager = new BluetoothRemoteSensorManager(context); - remoteSensorManager.start(); - + remoteSensorManager = new BluetoothRemoteSensorManager(context, this); altitudeSumManager = new AltitudeSumManager(); + + remoteSensorManager.start(); altitudeSumManager.start(context); } @@ -109,19 +109,25 @@ public class TrackPointCreator { gpsHandler.onSharedPreferenceChanged(key); } - public synchronized void onNewTrackPoint(@NonNull TrackPoint trackPoint, @NonNull Distance thresholdHorizontalAccuracy) { + /** + * Got a new TrackPoint from Bluetooth only; contains no GPS location. + * + * @param sensorDataSet + */ + @Override + public void onChange(SensorDataSet sensorDataSet) { + onNewTrackPoint(new TrackPoint(TrackPoint.Type.SENSORPOINT, createNow())); + } + + public synchronized void onNewTrackPoint(@NonNull TrackPoint trackPoint) { fill(trackPoint); - boolean stored = service.newTrackPoint(trackPoint, thresholdHorizontalAccuracy); + boolean stored = service.newTrackPoint(trackPoint, gpsHandler.getThresholdHorizontalAccuracy()); if (stored) { resetSensorData(); } } - public void onNewTrackPointWithoutGPS() { - onNewTrackPoint(new TrackPoint(TrackPoint.Type.SENSORPOINT, createNow()), gpsHandler.getThresholdHorizontalAccuracy()); - } - public TrackPoint createSegmentStartManual() { return TrackPoint.createSegmentStartManualWithTime(createNow()); } diff --git a/src/main/java/de/dennisguse/opentracks/services/sensors/BluetoothRemoteSensorManager.java b/src/main/java/de/dennisguse/opentracks/services/sensors/BluetoothRemoteSensorManager.java index 39af85baa..ba5696174 100644 --- a/src/main/java/de/dennisguse/opentracks/services/sensors/BluetoothRemoteSensorManager.java +++ b/src/main/java/de/dennisguse/opentracks/services/sensors/BluetoothRemoteSensorManager.java @@ -33,8 +33,8 @@ import de.dennisguse.opentracks.content.sensor.SensorData; import de.dennisguse.opentracks.content.sensor.SensorDataCycling; import de.dennisguse.opentracks.content.sensor.SensorDataRunning; import de.dennisguse.opentracks.content.sensor.SensorDataSet; -import de.dennisguse.opentracks.util.BluetoothUtils; import de.dennisguse.opentracks.settings.PreferencesUtils; +import de.dennisguse.opentracks.util.BluetoothUtils; /** * Bluetooth LE sensor manager: manages connections to Bluetooth LE sensors. @@ -71,6 +71,8 @@ public class BluetoothRemoteSensorManager implements BluetoothConnectionManager. private final SensorDataSet sensorDataSet = new SensorDataSet(); + private final SensorDataSetChangeObserver observer; + private final SharedPreferences.OnSharedPreferenceChangeListener sharedPreferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() { @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { @@ -110,8 +112,9 @@ public class BluetoothRemoteSensorManager implements BluetoothConnectionManager. } }; - public BluetoothRemoteSensorManager(Context context) { + public BluetoothRemoteSensorManager(@NonNull Context context, @NonNull SensorDataSetChangeObserver observer) { this.context = context; + this.observer = observer; bluetoothAdapter = BluetoothUtils.getAdapter(context); } @@ -208,10 +211,15 @@ public class BluetoothRemoteSensorManager implements BluetoothConnectionManager. } sensorDataSet.set(sensorData); + observer.onChange(new SensorDataSet(sensorDataSet)); } @Override public void onDisconnecting(SensorData sensorData) { sensorDataSet.remove(sensorData); } + + public interface SensorDataSetChangeObserver { + void onChange(SensorDataSet sensorDataSet); + } }