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 7587f038f..8315d5e8a 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 @@ -756,6 +756,6 @@ public class ExportImportTest { mockAltitudeChange(trackPointCreator, altitudeGain); trackPointCreator.setClock(time); - trackPointCreator.getSensorManager().getGpsManager().onData(location); + trackPointCreator.getSensorManager().getGpsManager().onDataReceived(location); } } \ No newline at end of file diff --git a/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceRecordingTest.java b/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceRecordingTest.java index abba894c5..9b94d2595 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceRecordingTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceRecordingTest.java @@ -995,6 +995,6 @@ public class TrackRecordingServiceRecordingTest { location.setSpeed(speed); trackPointCreator.setClock(time); - trackPointCreator.getSensorManager().getGpsManager().onData(location); + trackPointCreator.getSensorManager().getGpsManager().onDataReceived(location); } } diff --git a/src/main/java/de/dennisguse/opentracks/sensors/GpsManager.java b/src/main/java/de/dennisguse/opentracks/sensors/GpsManager.java index a79b29680..c89938007 100644 --- a/src/main/java/de/dennisguse/opentracks/sensors/GpsManager.java +++ b/src/main/java/de/dennisguse/opentracks/sensors/GpsManager.java @@ -120,22 +120,22 @@ public class GpsManager implements DriverObserver, GpsStatusManager.Gp } @Override - public void onConnect(String sensorAddress, String sensorName) { + public void onConnected(String sensorAddress, String sensorName) { gpsStatusManager.onGpsEnabled(); } @Override - public void onDisconnect() { + public void onConnectionLost() { gpsStatusManager.onGpsDisabled(); } @Override - public void onRemove() { + public void onDisconnected() { gpsStatusManager.onGpsDisabled(); } @Override - public void onData(Location location) { + public void onDataReceived(Location location) { // Send each update to the status; please note that this TrackPoint is not stored. Position position = Position.of(location, observer.getNow()); gpsStatusManager.onNewTrackPoint(position); diff --git a/src/main/java/de/dennisguse/opentracks/sensors/SensorHandler.java b/src/main/java/de/dennisguse/opentracks/sensors/SensorHandler.java index cbb5d5b98..e8d45f548 100644 --- a/src/main/java/de/dennisguse/opentracks/sensors/SensorHandler.java +++ b/src/main/java/de/dennisguse/opentracks/sensors/SensorHandler.java @@ -25,23 +25,23 @@ public abstract class SensorHandler { protected final DriverObserver driverObserver = new DriverObserver<>() { @Override - public void onConnect(String sensorAddress, String sensorName) { + public void onConnected(String sensorAddress, String sensorName) { SensorHandler.this.aggregator = createAggregator(sensorAddress, sensorName); } @Override - public void onDisconnect() { + public void onConnectionLost() { SensorHandler.this.aggregator.resetAggregated(); } @Override - public void onData(AggregatorInput value) { + public void onDataReceived(AggregatorInput value) { SensorHandler.this.aggregator.add(sensorManager.getNow(), value); sensorManager.onChange(); } @Override - public void onRemove() { + public void onDisconnected() { SensorHandler.this.aggregator = null; } }; @@ -57,6 +57,7 @@ public abstract class SensorHandler { switch (PreferencesUtils.getSensorType(address)) { case NONE -> { + driverObserver.onDisconnected(); return; } case INTERNAL -> { diff --git a/src/main/java/de/dennisguse/opentracks/sensors/driver/BarometerInternal.java b/src/main/java/de/dennisguse/opentracks/sensors/driver/BarometerInternal.java index fbcb5a839..b200d1f09 100644 --- a/src/main/java/de/dennisguse/opentracks/sensors/driver/BarometerInternal.java +++ b/src/main/java/de/dennisguse/opentracks/sensors/driver/BarometerInternal.java @@ -21,7 +21,7 @@ public class BarometerInternal implements Driver { private final DriverObserver observer; - private Context context; + private android.hardware.SensorManager sensorService; private final SensorEventListener sensorEventListener = new SensorEventListener() { @Override @@ -31,7 +31,7 @@ public class BarometerInternal implements Driver { return; } - observer.onData(AtmosphericPressure.ofHPA(event.values[0])); + observer.onDataReceived(AtmosphericPressure.ofHPA(event.values[0])); } @Override @@ -46,34 +46,28 @@ public class BarometerInternal implements Driver { @Override public void connect(Context context, Handler handler, String addressIgnored) { + sensorService = (android.hardware.SensorManager) context.getSystemService(Context.SENSOR_SERVICE); + Sensor pressureSensor = sensorService.getDefaultSensor(Sensor.TYPE_PRESSURE); - android.hardware.SensorManager sensorManager = (android.hardware.SensorManager) context.getSystemService(Context.SENSOR_SERVICE); - Sensor pressureSensor = sensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE); - if (pressureSensor == null) { - Log.w(TAG, "No pressure sensor available."); + if (pressureSensor != null && sensorService.registerListener(sensorEventListener, pressureSensor, SAMPLING_PERIOD, handler)) { + observer.onConnected(null, null); return; } - if (sensorManager.registerListener(sensorEventListener, pressureSensor, SAMPLING_PERIOD, handler)) { - this.context = context; - observer.onConnect(null, null); - return; - } - - disconnect(); + Log.w(TAG, "No pressure sensor available."); + observer.onDisconnected(); } @Override public boolean isConnected() { - return context != null; + return sensorService != null; } @Override public void disconnect() { if (!isConnected()) return; - android.hardware.SensorManager sensorManager = (android.hardware.SensorManager) context.getSystemService(Context.SENSOR_SERVICE); - sensorManager.unregisterListener(sensorEventListener); - this.context = null; + sensorService.unregisterListener(sensorEventListener); + sensorService = null; } } diff --git a/src/main/java/de/dennisguse/opentracks/sensors/driver/BluetoothDriver.java b/src/main/java/de/dennisguse/opentracks/sensors/driver/BluetoothDriver.java index 37d1d264f..e3b088383 100644 --- a/src/main/java/de/dennisguse/opentracks/sensors/driver/BluetoothDriver.java +++ b/src/main/java/de/dennisguse/opentracks/sensors/driver/BluetoothDriver.java @@ -56,27 +56,29 @@ public class BluetoothDriver implements Driver { @Override public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { switch (newState) { - case BluetoothProfile.STATE_CONNECTING -> - Log.i(TAG, gatt.getDevice() + ": connecting to sensor"); + case BluetoothProfile.STATE_CONNECTING -> { + Log.i(TAG, gatt.getDevice() + ": connecting to sensor"); + } case BluetoothProfile.STATE_CONNECTED -> { Log.i(TAG, gatt.getDevice() + ": connected to sensor; discovering services"); gatt.discoverServices(); } - case BluetoothProfile.STATE_DISCONNECTING -> - Log.i(TAG, gatt.getDevice() + ": disconnecting from sensor: "); + case BluetoothProfile.STATE_DISCONNECTING -> Log.i(TAG, gatt.getDevice() + ": disconnecting from sensor: "); case BluetoothProfile.STATE_DISCONNECTED -> { //This is also triggered, if no connection was established (ca. 30s) Log.i(TAG, gatt.getDevice() + ": disconnected from sensor: trying to reconnect"); if (gatt.connect()) { Log.e(TAG, gatt.getDevice() + ": could not trigger reconnect for sensor"); } - clearData(); + observer.onConnectionLost(); } } } @Override public void onServicesDiscovered(@NonNull BluetoothGatt gatt, int status) { + BluetoothDevice device = gatt.getDevice(); + BluetoothGattService gattService = null; ServiceMeasurementUUID serviceMeasurement = null; for (ServiceMeasurementUUID s : sensorHandler.getServices()) { @@ -88,13 +90,13 @@ public class BluetoothDriver implements Driver { } if (gattService == null) { - Log.e(TAG, gatt.getDevice() + ": could not get gattService for serviceUUID=" + serviceMeasurement); + Log.e(TAG, device + ": could not get gattService for serviceUUID=" + serviceMeasurement); return; } BluetoothGattCharacteristic characteristic = gattService.getCharacteristic(serviceMeasurement.measurementUUID()); if (characteristic == null) { - Log.e(TAG, gatt.getDevice() + ": could not get BluetoothCharacteristic for serviceUUID=" + serviceMeasurement.serviceUUID() + " characteristicUUID=" + serviceMeasurement.measurementUUID()); + Log.e(TAG, device + ": could not get BluetoothCharacteristic for serviceUUID=" + serviceMeasurement.serviceUUID() + " characteristicUUID=" + serviceMeasurement.measurementUUID()); return; } gatt.setCharacteristicNotification(characteristic, true); @@ -112,6 +114,8 @@ public class BluetoothDriver implements Driver { if (!gatt.writeDescriptor(descriptor)) { Log.e(TAG, "CLIENT_CHARACTERISTIC_CONFIG_UUID descriptor could not be written"); } + + observer.onConnected(device.getAddress(), device.getName()); } @Override @@ -132,7 +136,7 @@ public class BluetoothDriver implements Driver { if (value == null) { return; } - observer.onData(value); + observer.onDataReceived(value); } }; @@ -165,37 +169,23 @@ public class BluetoothDriver implements Driver { Log.d(TAG, device + ": trying to connect"); bluetoothGatt = device.connectGatt(context, false, connectCallback, BluetoothDevice.TRANSPORT_AUTO, 0, handler); - - observer.onConnect(device.getAddress(), device.getName()); - } - - private synchronized void clearData() { - observer.onDisconnect(); } @Override public synchronized void disconnect() { if (!isConnected()) { - Log.w(TAG, "Not connected; no need to re-connect."); + Log.w(TAG, "Not connected; cannot disconnect."); return; } Log.i(TAG, bluetoothGatt.getDevice() + ": start disconnect"); bluetoothGatt.disconnect(); bluetoothGatt.close(); - clearData(); Log.i(TAG, bluetoothGatt.getDevice() + ": disconnect finished"); bluetoothGatt = null; + + observer.onDisconnected(); } - private synchronized boolean isSameBluetoothDevice(String address) { - if (bluetoothGatt == null) { - return false; - } - - return address.equals(bluetoothGatt.getDevice().getAddress()); - } - - private boolean isBluetoothEnabled() { return bluetoothAdapter != null && bluetoothAdapter.isEnabled(); } diff --git a/src/main/java/de/dennisguse/opentracks/sensors/driver/DriverObserver.java b/src/main/java/de/dennisguse/opentracks/sensors/driver/DriverObserver.java index eecf89096..4fda6d99d 100644 --- a/src/main/java/de/dennisguse/opentracks/sensors/driver/DriverObserver.java +++ b/src/main/java/de/dennisguse/opentracks/sensors/driver/DriverObserver.java @@ -2,11 +2,24 @@ package de.dennisguse.opentracks.sensors.driver; public interface DriverObserver { - void onConnect(String sensorAddress, String sensorName); + /** + * The Driver could connect to the sensor. + */ + void onConnected(String sensorAddress, String sensorName); - void onDisconnect(); + /** + * Sensor got temporarily disconnected, Driver should try to re-connect. + */ + void onConnectionLost(); - void onData(T value); + /** + * The Driver provided data from the sensor. + */ + void onDataReceived(T value); - void onRemove(); + /** + * The Driver was shutdown and no further data will be provided. + */ + //TODO check if really need this, because the driver was told to disconnect and then just signalizes that it finished this task. + void onDisconnected(); } diff --git a/src/main/java/de/dennisguse/opentracks/sensors/driver/GpsInternal.java b/src/main/java/de/dennisguse/opentracks/sensors/driver/GpsInternal.java index cbde65a29..77b668bf2 100644 --- a/src/main/java/de/dennisguse/opentracks/sensors/driver/GpsInternal.java +++ b/src/main/java/de/dennisguse/opentracks/sensors/driver/GpsInternal.java @@ -23,17 +23,17 @@ public class GpsInternal implements Driver { private final LocationListenerCompat locationListenerCompat = new LocationListenerCompat() { @Override public void onLocationChanged(@NonNull Location location) { - driverObserver.onData(location); + driverObserver.onDataReceived(location); } @Override public void onProviderEnabled(@NonNull String provider) { - driverObserver.onConnect(null, provider); + driverObserver.onConnected(null, provider); } @Override public void onProviderDisabled(@NonNull String provider) { - driverObserver.onDisconnect(); + driverObserver.onConnectionLost(); } }; @@ -63,10 +63,14 @@ public class GpsInternal implements Driver { try { Log.i(TAG, "Register for location updates " + context); LocationManagerCompat.requestLocationUpdates(locationManager, LOCATION_PROVIDER, locationRequest, handler::post, locationListenerCompat); + driverObserver.onConnected(null, null); + return; } catch (SecurityException e) { Log.e(TAG, "Could not register location listener; permissions not granted.", e); } } + + driverObserver.onDisconnected(); } @SuppressWarnings({"MissingPermission"}) @@ -77,7 +81,7 @@ public class GpsInternal implements Driver { LocationManagerCompat.removeUpdates(locationManager, locationListenerCompat); locationManager = null; - driverObserver.onDisconnect(); + driverObserver.onDisconnected(); }