From e5b054d7164ca6d7227ce2d6f2849ea5c96bbaee Mon Sep 17 00:00:00 2001 From: Dariusz Seweryn Date: Wed, 5 Apr 2017 12:20:28 +0200 Subject: [PATCH] Fixed `RxBleConnectionMock` overwriting `BluetoothCharacteristic` value on setting notification. Summary: https://github.com/Polidea/RxAndroidBle/issues/160 Reviewers: michal.zielinski, pawel.urban Reviewed By: michal.zielinski, pawel.urban Differential Revision: https://phabricator.polidea.com/D2288 --- .../mockrxandroidble/RxBleConnectionMock.java | 49 ++++++++++--------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/mockrxandroidble/src/main/java/com/polidea/rxandroidble/mockrxandroidble/RxBleConnectionMock.java b/mockrxandroidble/src/main/java/com/polidea/rxandroidble/mockrxandroidble/RxBleConnectionMock.java index 08f2bdbd6..0102b6f4e 100644 --- a/mockrxandroidble/src/main/java/com/polidea/rxandroidble/mockrxandroidble/RxBleConnectionMock.java +++ b/mockrxandroidble/src/main/java/com/polidea/rxandroidble/mockrxandroidble/RxBleConnectionMock.java @@ -19,19 +19,32 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; +import rx.Completable; import rx.Observable; import rx.functions.Action0; import rx.functions.Actions; import rx.functions.Func1; -import static android.bluetooth.BluetoothGattDescriptor.DISABLE_NOTIFICATION_VALUE; -import static android.bluetooth.BluetoothGattDescriptor.ENABLE_INDICATION_VALUE; -import static android.bluetooth.BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE; import static rx.Observable.just; public class RxBleConnectionMock implements RxBleConnection { - static final UUID CLIENT_CHARACTERISTIC_CONFIG_UUID = UUID.fromString("00002902-0000-1000-8000-00805f9b34fb"); + /** + * Value used to enable notification for a client configuration descriptor + */ + private static final byte[] ENABLE_NOTIFICATION_VALUE = {0x01, 0x00}; + + /** + * Value used to enable indication for a client configuration descriptor + */ + private static final byte[] ENABLE_INDICATION_VALUE = {0x02, 0x00}; + + /** + * Value used to disable notifications or indicatinos + */ + private static final byte[] DISABLE_NOTIFICATION_VALUE = {0x00, 0x00}; + + private static final UUID CLIENT_CHARACTERISTIC_CONFIG_UUID = UUID.fromString("00002902-0000-1000-8000-00805f9b34fb"); private HashMap>> notificationObservableMap = new HashMap<>(); private HashMap>> indicationObservableMap = new HashMap<>(); private RxBleDeviceServices rxBleDeviceServices; @@ -368,8 +381,14 @@ public Observable call(Boolean ignored) { } @Override - public Observable writeDescriptor(BluetoothGattDescriptor descriptor, byte[] data) { - return Observable.just(data); + public Observable writeDescriptor(final BluetoothGattDescriptor descriptor, final byte[] data) { + return Completable.fromAction(new Action0() { + @Override + public void call() { + descriptor.setValue(data); + } + }) + .andThen(Observable.just(data)); } private Observable> createCharacteristicNotificationObservable(final UUID characteristicUuid, @@ -426,30 +445,12 @@ private Observable observeOnCharacteristicChangeCallbacks(UUID character return characteristicNotificationSources.get(characteristicUuid); } - private Observable setCharacteristicNotification(UUID notificationCharacteristicUUID, boolean enable) { - return writeCharacteristic(notificationCharacteristicUUID, new byte[]{(byte) (enable ? 1 : 0)}); - } - @NonNull private Observable setupCharacteristicNotification( final UUID bluetoothGattCharacteristicUUID, final NotificationSetupMode setupMode, final boolean enabled, final boolean isIndication - ) { - return setCharacteristicNotification(bluetoothGattCharacteristicUUID, enabled) - .flatMap(new Func1>() { - @Override - public Observable call(byte[] it) { - return setupCharacteristicDescriptorTriggeredRead(bluetoothGattCharacteristicUUID, - setupMode, enabled, isIndication); - } - }); - } - - @NonNull - private Observable setupCharacteristicDescriptorTriggeredRead( - UUID bluetoothGattCharacteristicUUID, NotificationSetupMode setupMode, final boolean enabled, boolean isIndication ) { if (setupMode == NotificationSetupMode.DEFAULT) { final byte[] enableValue = isIndication ? ENABLE_INDICATION_VALUE : ENABLE_NOTIFICATION_VALUE;