From 6f5b8fb612148f3c83f8da36d68400c661c941c4 Mon Sep 17 00:00:00 2001 From: Guillaume Bourge Date: Fri, 8 Jun 2018 16:21:42 +0200 Subject: [PATCH] Add the reset access --- .../mockrxandroidble/RxBleConnectionMock.java | 5 +++++ .../polidea/rxandroidble2/RxBleConnection.java | 18 ++++++++++++++++++ .../connection/RxBleConnectionImpl.java | 5 +++++ .../connection/ServiceDiscoveryManager.java | 18 ++++++++++++++++++ 4 files changed, 46 insertions(+) diff --git a/mockrxandroidble/src/main/java/com/polidea/rxandroidble2/mockrxandroidble/RxBleConnectionMock.java b/mockrxandroidble/src/main/java/com/polidea/rxandroidble2/mockrxandroidble/RxBleConnectionMock.java index 4101c8340..b18d8f97c 100644 --- a/mockrxandroidble/src/main/java/com/polidea/rxandroidble2/mockrxandroidble/RxBleConnectionMock.java +++ b/mockrxandroidble/src/main/java/com/polidea/rxandroidble2/mockrxandroidble/RxBleConnectionMock.java @@ -100,6 +100,11 @@ public Single discoverServices(long timeout, @NonNull TimeU return Single.just(rxBleDeviceServices); } + @Override + public Single discoverServices(long timeout, @NonNull TimeUnit timeUnit, Boolean clearCache) { + return Single.just(rxBleDeviceServices); + } + @Override public Single getCharacteristic(@NonNull final UUID characteristicUuid) { return discoverServices() diff --git a/rxandroidble/src/main/java/com/polidea/rxandroidble2/RxBleConnection.java b/rxandroidble/src/main/java/com/polidea/rxandroidble2/RxBleConnection.java index 73cbd5e90..87e3cdae9 100644 --- a/rxandroidble/src/main/java/com/polidea/rxandroidble2/RxBleConnection.java +++ b/rxandroidble/src/main/java/com/polidea/rxandroidble2/RxBleConnection.java @@ -266,6 +266,24 @@ interface WriteOperationAckStrategy extends ObservableTransformer discoverServices(@IntRange(from = 1) long timeout, @NonNull TimeUnit timeUnit); + /** + * Performs GATT service discovery and emits discovered results. After service discovery you can walk through + * {@link android.bluetooth.BluetoothGattService}s and {@link BluetoothGattCharacteristic}s. + *

+ * Result of the discovery is cached internally so consecutive calls won't trigger BLE operation and can be + * considered relatively lightweight. + * + * Timeouts after specified amount of time. + * + * @param timeout multiplier of TimeUnit after which the discovery will timeout in case of no return values + * @param timeUnit TimeUnit for the timeout + * @return Observable emitting result a GATT service discovery. + * @throws BleGattCannotStartException with {@link BleGattOperationType#SERVICE_DISCOVERY} type, when it wasn't possible to start + * the discovery for internal reasons. + * @throws BleGattException in case of GATT operation error with {@link BleGattOperationType#SERVICE_DISCOVERY} type. + */ + Single discoverServices(@IntRange(from = 1) long timeout, @NonNull TimeUnit timeUnit, Boolean clearCache); + /** * @see #setupNotification(UUID, NotificationSetupMode) with default setup mode. */ diff --git a/rxandroidble/src/main/java/com/polidea/rxandroidble2/internal/connection/RxBleConnectionImpl.java b/rxandroidble/src/main/java/com/polidea/rxandroidble2/internal/connection/RxBleConnectionImpl.java index 77b4e8d8c..4b466fc1e 100644 --- a/rxandroidble/src/main/java/com/polidea/rxandroidble2/internal/connection/RxBleConnectionImpl.java +++ b/rxandroidble/src/main/java/com/polidea/rxandroidble2/internal/connection/RxBleConnectionImpl.java @@ -138,6 +138,11 @@ public Single discoverServices(long timeout, @NonNull TimeU return serviceDiscoveryManager.getDiscoverServicesSingle(timeout, timeUnit); } + @Override + public Single discoverServices(long timeout, @NonNull TimeUnit timeUnit, Boolean clearCache) { + return serviceDiscoveryManager.getDiscoverServicesSingle(timeout, timeUnit, clearCache); + } + @Override @Deprecated public Single getCharacteristic(@NonNull final UUID characteristicUuid) { diff --git a/rxandroidble/src/main/java/com/polidea/rxandroidble2/internal/connection/ServiceDiscoveryManager.java b/rxandroidble/src/main/java/com/polidea/rxandroidble2/internal/connection/ServiceDiscoveryManager.java index e0e03ca7d..6116ac6aa 100644 --- a/rxandroidble/src/main/java/com/polidea/rxandroidble2/internal/connection/ServiceDiscoveryManager.java +++ b/rxandroidble/src/main/java/com/polidea/rxandroidble2/internal/connection/ServiceDiscoveryManager.java @@ -61,6 +61,24 @@ public void accept(Disposable disposable) throws Exception { } } + Single getDiscoverServicesSingle(final long timeout, final TimeUnit timeoutTimeUnit, Boolean clearCache) { + if (hasCachedResults) { + // optimisation to decrease the number of allocations + return deviceServicesObservable; + } else { + if (clearCache) { + reset(); + } + return deviceServicesObservable.doOnSubscribe( + new Consumer() { + @Override + public void accept(Disposable disposable) throws Exception { + timeoutBehaviorSubject.onNext(new TimeoutConfiguration(timeout, timeoutTimeUnit, Schedulers.computation())); + } + }); + } + } + private void reset() { hasCachedResults = false; this.deviceServicesObservable = getListOfServicesFromGatt()