From d776f40977223922abcc6539fbd5c81d3b9adba2 Mon Sep 17 00:00:00 2001 From: Tim Ehrhart Date: Mon, 11 Jul 2016 15:56:29 -0500 Subject: [PATCH 1/4] added support for getBondedDevices --- .../java/com/polidea/rxandroidble/RxBleClient.java | 3 +++ .../com/polidea/rxandroidble/RxBleClientImpl.java | 11 +++++++++++ .../internal/util/RxBleAdapterWrapper.java | 6 ++++++ 3 files changed, 20 insertions(+) diff --git a/rxandroidble/src/main/java/com/polidea/rxandroidble/RxBleClient.java b/rxandroidble/src/main/java/com/polidea/rxandroidble/RxBleClient.java index 1b6e16ee2..49eb51a98 100644 --- a/rxandroidble/src/main/java/com/polidea/rxandroidble/RxBleClient.java +++ b/rxandroidble/src/main/java/com/polidea/rxandroidble/RxBleClient.java @@ -6,6 +6,7 @@ import com.polidea.rxandroidble.internal.RxBleLog; +import java.util.Set; import java.util.UUID; import rx.Observable; @@ -41,6 +42,8 @@ public static void setLogLevel(@RxBleLog.LogLevel int logLevel) { */ public abstract RxBleDevice getBleDevice(@NonNull String macAddress); + public abstract Set getBondedDevices(); + /** * Returns an infinite observable emitting BLE scan results. * Scan is automatically started and stopped based on the Observable lifecycle. diff --git a/rxandroidble/src/main/java/com/polidea/rxandroidble/RxBleClientImpl.java b/rxandroidble/src/main/java/com/polidea/rxandroidble/RxBleClientImpl.java index 23f3070ca..c52e31489 100644 --- a/rxandroidble/src/main/java/com/polidea/rxandroidble/RxBleClientImpl.java +++ b/rxandroidble/src/main/java/com/polidea/rxandroidble/RxBleClientImpl.java @@ -65,6 +65,17 @@ public RxBleDevice getBleDevice(@NonNull String macAddress) { return rxBleDeviceProvider.getBleDevice(macAddress); } + @Override + public Set getBondedDevices() { + Set rxBleDevices = null; + Set bluetoothDevices = rxBleAdapterWrapper.getBondedDevices(); + for (BluetoothDevice bluetoothDevice: bluetoothDevices) { + rxBleDevices.add(getBleDevice(bluetoothDevice.getAddress())); + } + + return rxBleDevices; + } + @Override public Observable scanBleDevices(@Nullable UUID... filterServiceUUIDs) { diff --git a/rxandroidble/src/main/java/com/polidea/rxandroidble/internal/util/RxBleAdapterWrapper.java b/rxandroidble/src/main/java/com/polidea/rxandroidble/internal/util/RxBleAdapterWrapper.java index 8e160b49f..9a1535d4b 100644 --- a/rxandroidble/src/main/java/com/polidea/rxandroidble/internal/util/RxBleAdapterWrapper.java +++ b/rxandroidble/src/main/java/com/polidea/rxandroidble/internal/util/RxBleAdapterWrapper.java @@ -4,6 +4,8 @@ import android.bluetooth.BluetoothDevice; import android.support.annotation.Nullable; +import java.util.Set; + public class RxBleAdapterWrapper { private final BluetoothAdapter bluetoothAdapter; @@ -31,4 +33,8 @@ public boolean startLeScan(BluetoothAdapter.LeScanCallback leScanCallback) { public void stopLeScan(BluetoothAdapter.LeScanCallback leScanCallback) { bluetoothAdapter.stopLeScan(leScanCallback); } + + public Set getBondedDevices() { + return bluetoothAdapter.getBondedDevices(); + } } From 8e65b28c993871b8b36e0a3d02cc0cf86893c4b0 Mon Sep 17 00:00:00 2001 From: Tim Ehrhart Date: Wed, 13 Jul 2016 11:04:50 -0500 Subject: [PATCH 2/4] fixing formatting issues --- .../main/java/com/polidea/rxandroidble/RxBleClientImpl.java | 2 +- .../internal/operations/RxBleRadioOperationScan.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/rxandroidble/src/main/java/com/polidea/rxandroidble/RxBleClientImpl.java b/rxandroidble/src/main/java/com/polidea/rxandroidble/RxBleClientImpl.java index c52e31489..42cad54fc 100644 --- a/rxandroidble/src/main/java/com/polidea/rxandroidble/RxBleClientImpl.java +++ b/rxandroidble/src/main/java/com/polidea/rxandroidble/RxBleClientImpl.java @@ -69,7 +69,7 @@ public RxBleDevice getBleDevice(@NonNull String macAddress) { public Set getBondedDevices() { Set rxBleDevices = null; Set bluetoothDevices = rxBleAdapterWrapper.getBondedDevices(); - for (BluetoothDevice bluetoothDevice: bluetoothDevices) { + for (BluetoothDevice bluetoothDevice : bluetoothDevices) { rxBleDevices.add(getBleDevice(bluetoothDevice.getAddress())); } diff --git a/rxandroidble/src/main/java/com/polidea/rxandroidble/internal/operations/RxBleRadioOperationScan.java b/rxandroidble/src/main/java/com/polidea/rxandroidble/internal/operations/RxBleRadioOperationScan.java index 84b75cba1..df06bd3e1 100644 --- a/rxandroidble/src/main/java/com/polidea/rxandroidble/internal/operations/RxBleRadioOperationScan.java +++ b/rxandroidble/src/main/java/com/polidea/rxandroidble/internal/operations/RxBleRadioOperationScan.java @@ -54,7 +54,8 @@ protected void protectedRun() { } } - public synchronized void stop() { // synchronized keyword added to be sure that operation will be stopped no matter which thread will call it + // synchronized keyword added to be sure that operation will be stopped no matter which thread will call it + public synchronized void stop() { isStopped = true; if (isStarted) { // TODO: [PU] 29.01.2016 https://code.google.com/p/android/issues/detail?id=160503 From f40ecaaf289a036b892a0d6c51b07536187f846f Mon Sep 17 00:00:00 2001 From: Tim Ehrhart Date: Thu, 14 Jul 2016 13:52:36 -0500 Subject: [PATCH 3/4] fixed potential null reference exception --- .../main/java/com/polidea/rxandroidble/RxBleClientImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rxandroidble/src/main/java/com/polidea/rxandroidble/RxBleClientImpl.java b/rxandroidble/src/main/java/com/polidea/rxandroidble/RxBleClientImpl.java index 42cad54fc..f838925fd 100644 --- a/rxandroidble/src/main/java/com/polidea/rxandroidble/RxBleClientImpl.java +++ b/rxandroidble/src/main/java/com/polidea/rxandroidble/RxBleClientImpl.java @@ -20,6 +20,7 @@ import com.polidea.rxandroidble.internal.util.UUIDUtil; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.UUID; @@ -67,7 +68,7 @@ public RxBleDevice getBleDevice(@NonNull String macAddress) { @Override public Set getBondedDevices() { - Set rxBleDevices = null; + Set rxBleDevices = new HashSet<>(); Set bluetoothDevices = rxBleAdapterWrapper.getBondedDevices(); for (BluetoothDevice bluetoothDevice : bluetoothDevices) { rxBleDevices.add(getBleDevice(bluetoothDevice.getAddress())); From 81d06b383cc8ec50a0d9aa103e2184ace26ce700 Mon Sep 17 00:00:00 2001 From: "tim.ehrhart" Date: Wed, 20 Jul 2016 09:53:54 -0500 Subject: [PATCH 4/4] added test for getBondedDevices --- .../MockRxBleAdapterWrapper.groovy | 11 ++++++++++ .../rxandroidble/RxBleClientTest.groovy | 21 +++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/rxandroidble/src/test/groovy/com/polidea/rxandroidble/MockRxBleAdapterWrapper.groovy b/rxandroidble/src/test/groovy/com/polidea/rxandroidble/MockRxBleAdapterWrapper.groovy index 137a12418..e9e207f7f 100644 --- a/rxandroidble/src/test/groovy/com/polidea/rxandroidble/MockRxBleAdapterWrapper.groovy +++ b/rxandroidble/src/test/groovy/com/polidea/rxandroidble/MockRxBleAdapterWrapper.groovy @@ -3,6 +3,7 @@ package com.polidea.rxandroidble import android.bluetooth.BluetoothAdapter import android.bluetooth.BluetoothDevice import com.polidea.rxandroidble.internal.util.RxBleAdapterWrapper +import org.apache.maven.artifact.versioning.OverConstrainedVersionException class MockRxBleAdapterWrapper extends RxBleAdapterWrapper { @@ -19,6 +20,7 @@ class MockRxBleAdapterWrapper extends RxBleAdapterWrapper { } private List scanDataList = new ArrayList<>() + private Set bondedDevices = new HashSet<>() MockRxBleAdapterWrapper() { super(null) @@ -32,6 +34,10 @@ class MockRxBleAdapterWrapper extends RxBleAdapterWrapper { scanDataList.add(new ScanData(bluetoothDevice, rssi, scanResult)) } + def addBondedDevice(BluetoothDevice bluetoothDevice) { + bondedDevices.add(bluetoothDevice) + } + @Override BluetoothDevice getRemoteDevice(String macAddress) { scanDataList.find { @@ -63,4 +69,9 @@ class MockRxBleAdapterWrapper extends RxBleAdapterWrapper { void stopLeScan(BluetoothAdapter.LeScanCallback leScanCallback) { } + + @Override + Set getBondedDevices() { + return bondedDevices + } } diff --git a/rxandroidble/src/test/groovy/com/polidea/rxandroidble/RxBleClientTest.groovy b/rxandroidble/src/test/groovy/com/polidea/rxandroidble/RxBleClientTest.groovy index 2541d1d33..4fc0a96b5 100644 --- a/rxandroidble/src/test/groovy/com/polidea/rxandroidble/RxBleClientTest.groovy +++ b/rxandroidble/src/test/groovy/com/polidea/rxandroidble/RxBleClientTest.groovy @@ -34,6 +34,20 @@ class RxBleClientTest extends Specification { adapterStateObservable.asObservable(), uuidParserSpy, Mock(BleConnectionCompat), locationServicesStatusMock) } + def "should return bonded devices"() { + given: + bluetoothDeviceBonded("AA:AA:AA:AA:AA:AA") + bluetoothDeviceBonded("BB:BB:BB:BB:BB:BB") + bluetoothDeviceDiscovered deviceMac: "AA:AA:AA:AA:AA:AA", rssi: 0, scanRecord: [] as byte[] + bluetoothDeviceDiscovered deviceMac: "BB:BB:BB:BB:BB:BB", rssi: 50, scanRecord: [] as byte[] + + when: + def results = objectUnderTest.getBondedDevices() + + then: + assert results.size() == 2 + } + def "should start BLE scan if subscriber subscribes to the scan observable"() { given: TestSubscriber testSubscriber = new TestSubscriber<>() @@ -320,6 +334,13 @@ class RxBleClientTest extends Specification { bleAdapterWrapperSpy.addScanResult(mock, scanData['rssi'], scanData['scanRecord']) } + def bluetoothDeviceBonded(String address) { + def mock = Mock(BluetoothDevice) + mock.getAddress() >> address + mock.hashCode() >> address.hashCode() + bleAdapterWrapperSpy.addBondedDevice(mock); + } + /** * This test reproduces issue: https://github.com/Polidea/RxAndroidBle/issues/17 * It first calls startLeScan method which takes 100ms to finish