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..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; @@ -65,6 +66,17 @@ public RxBleDevice getBleDevice(@NonNull String macAddress) { return rxBleDeviceProvider.getBleDevice(macAddress); } + @Override + public Set getBondedDevices() { + Set rxBleDevices = new HashSet<>(); + 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/operations/RxBleRadioOperationScan.java b/rxandroidble/src/main/java/com/polidea/rxandroidble/internal/operations/RxBleRadioOperationScan.java index cbb458ccc..1b321b384 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 @@ -59,7 +59,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 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(); + } } 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