Skip to content

Commit

Permalink
Fixed RxBleConnectionMock overwriting BluetoothCharacteristic val…
Browse files Browse the repository at this point in the history
…ue on setting notification.

Summary: #160

Reviewers: michal.zielinski, pawel.urban

Reviewed By: michal.zielinski, pawel.urban

Differential Revision: https://phabricator.polidea.com/D2288
  • Loading branch information
dariuszseweryn committed Apr 5, 2017
1 parent 2788cdc commit e5b054d
Showing 1 changed file with 25 additions and 24 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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<UUID, Observable<Observable<byte[]>>> notificationObservableMap = new HashMap<>();
private HashMap<UUID, Observable<Observable<byte[]>>> indicationObservableMap = new HashMap<>();
private RxBleDeviceServices rxBleDeviceServices;
Expand Down Expand Up @@ -368,8 +381,14 @@ public Observable<? extends byte[]> call(Boolean ignored) {
}

@Override
public Observable<byte[]> writeDescriptor(BluetoothGattDescriptor descriptor, byte[] data) {
return Observable.just(data);
public Observable<byte[]> 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<Observable<byte[]>> createCharacteristicNotificationObservable(final UUID characteristicUuid,
Expand Down Expand Up @@ -426,30 +445,12 @@ private Observable<byte[]> observeOnCharacteristicChangeCallbacks(UUID character
return characteristicNotificationSources.get(characteristicUuid);
}

private Observable<byte[]> setCharacteristicNotification(UUID notificationCharacteristicUUID, boolean enable) {
return writeCharacteristic(notificationCharacteristicUUID, new byte[]{(byte) (enable ? 1 : 0)});
}

@NonNull
private Observable<Boolean> setupCharacteristicNotification(
final UUID bluetoothGattCharacteristicUUID,
final NotificationSetupMode setupMode,
final boolean enabled,
final boolean isIndication
) {
return setCharacteristicNotification(bluetoothGattCharacteristicUUID, enabled)
.flatMap(new Func1<byte[], Observable<? extends Boolean>>() {
@Override
public Observable<? extends Boolean> call(byte[] it) {
return setupCharacteristicDescriptorTriggeredRead(bluetoothGattCharacteristicUUID,
setupMode, enabled, isIndication);
}
});
}

@NonNull
private Observable<Boolean> setupCharacteristicDescriptorTriggeredRead(
UUID bluetoothGattCharacteristicUUID, NotificationSetupMode setupMode, final boolean enabled, boolean isIndication
) {
if (setupMode == NotificationSetupMode.DEFAULT) {
final byte[] enableValue = isIndication ? ENABLE_INDICATION_VALUE : ENABLE_NOTIFICATION_VALUE;
Expand Down

0 comments on commit e5b054d

Please sign in to comment.