From 3ba73b94d24c4da716f6d9f4e35998fff520ad2c Mon Sep 17 00:00:00 2001 From: Dariusz Seweryn Date: Wed, 5 Jul 2017 15:33:28 +0200 Subject: [PATCH 1/3] Fixed scan filtering by name for API <21. As it was observed for API <21 the name is not always available in the `ScanRecord` but it is available in the `BluetoothDevice`. On API >=21 this issue is not visible. --- .../java/com/polidea/rxandroidble/scan/ScanFilter.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/rxandroidble/src/main/java/com/polidea/rxandroidble/scan/ScanFilter.java b/rxandroidble/src/main/java/com/polidea/rxandroidble/scan/ScanFilter.java index f0b49ba64..b0f96e967 100644 --- a/rxandroidble/src/main/java/com/polidea/rxandroidble/scan/ScanFilter.java +++ b/rxandroidble/src/main/java/com/polidea/rxandroidble/scan/ScanFilter.java @@ -277,8 +277,12 @@ public boolean matches(RxBleInternalScanResult scanResult) { } // Local name match. - if (mDeviceName != null && !mDeviceName.equals(scanRecord.getDeviceName())) { - return false; + if (mDeviceName != null) { + final boolean advertisedDeviceNameMatches = mDeviceName.equals(scanRecord.getDeviceName()); + final boolean bluetoothDeviceNameMatches = mDeviceName.equals(device.getName()); + if (!(advertisedDeviceNameMatches || bluetoothDeviceNameMatches)) { + return false; + } } // UUID match. From 9b34aa85d9752d2af4c070773628acdb3fa56496 Mon Sep 17 00:00:00 2001 From: Dariusz Seweryn Date: Wed, 5 Jul 2017 15:55:11 +0200 Subject: [PATCH 2/3] Added ScanFilterTest. --- .../rxandroidble/scan/ScanFilterTest.groovy | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 rxandroidble/src/test/groovy/com/polidea/rxandroidble/scan/ScanFilterTest.groovy diff --git a/rxandroidble/src/test/groovy/com/polidea/rxandroidble/scan/ScanFilterTest.groovy b/rxandroidble/src/test/groovy/com/polidea/rxandroidble/scan/ScanFilterTest.groovy new file mode 100644 index 000000000..c176e730e --- /dev/null +++ b/rxandroidble/src/test/groovy/com/polidea/rxandroidble/scan/ScanFilterTest.groovy @@ -0,0 +1,60 @@ +package com.polidea.rxandroidble.scan + +import android.bluetooth.BluetoothDevice +import com.polidea.rxandroidble.internal.scan.RxBleInternalScanResult +import spock.lang.Specification + +class ScanFilterTest extends Specification { + + RxBleInternalScanResult mockInternalScanResult = Mock RxBleInternalScanResult + + BluetoothDevice mockBluetoothDevice = Mock BluetoothDevice + + ScanRecord mockScanRecord = Mock ScanRecord + + ScanFilter objectUnderTest + + def setup() { + mockInternalScanResult.getBluetoothDevice() >> mockBluetoothDevice + mockInternalScanResult.getScanRecord() >> mockScanRecord + } + + def "should match by device name if the name is present in ScanRecord"() { + + given: + String name = "xxx" + givenScanRecordWith deviceName: name + objectUnderTest = new ScanFilter.Builder().setDeviceName(name).build() + + expect: + objectUnderTest.matches(mockInternalScanResult) + } + + def "should match by device name if the name is present in BluetoothDevice"() { + + given: + String name = "xxx" + mockBluetoothDevice.getName() >> name + objectUnderTest = new ScanFilter.Builder().setDeviceName(name).build() + + expect: + objectUnderTest.matches(mockInternalScanResult) + } + + def "should not match by device name if the name is not present in BluetoothDevice nor ScanRecord"() { + + given: + String name = "xxx" + objectUnderTest = new ScanFilter.Builder().setDeviceName(name).build() + + expect: + !objectUnderTest.matches(mockInternalScanResult) + } + + private void givenScanRecordWith(Map scanRecordMap) { + mockScanRecord.getDeviceName() >> (scanRecordMap['deviceName'] ?: null) + mockScanRecord.getServiceUuids() >> (scanRecordMap['serviceUuids'] ?: null) + mockScanRecord.getServiceData(_) >> (scanRecordMap['serviceData'] ?: null) + mockScanRecord.getManufacturerSpecificData(_) >> (scanRecordMap['manufacturerSpecificData'] ?: null) + } +} From 3d77af2aec889adccf80f2b8c9ffcee4b1e427eb Mon Sep 17 00:00:00 2001 From: Dariusz Seweryn Date: Wed, 5 Jul 2017 16:36:14 +0200 Subject: [PATCH 3/3] Code review updates + added changelog. --- CHANGELOG.md | 3 +++ .../main/java/com/polidea/rxandroidble/scan/ScanFilter.java | 4 +--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b7d97a53..187ec7267 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ Change Log ========== +Version 1.3.3-SNAPSHOT +* Fixed scan filtering by name on API <21 (https://github.com/Polidea/RxAndroidBle/pull/243) + Version 1.3.2 * Fixed completing the `Observable` emitted by `RxBleConnection.setupNotification()`/`RxBleConnection.setupIndication()` when unsubscribed (https://github.com/Polidea/RxAndroidBle/issues/231) diff --git a/rxandroidble/src/main/java/com/polidea/rxandroidble/scan/ScanFilter.java b/rxandroidble/src/main/java/com/polidea/rxandroidble/scan/ScanFilter.java index b0f96e967..8ef2761bf 100644 --- a/rxandroidble/src/main/java/com/polidea/rxandroidble/scan/ScanFilter.java +++ b/rxandroidble/src/main/java/com/polidea/rxandroidble/scan/ScanFilter.java @@ -278,9 +278,7 @@ public boolean matches(RxBleInternalScanResult scanResult) { // Local name match. if (mDeviceName != null) { - final boolean advertisedDeviceNameMatches = mDeviceName.equals(scanRecord.getDeviceName()); - final boolean bluetoothDeviceNameMatches = mDeviceName.equals(device.getName()); - if (!(advertisedDeviceNameMatches || bluetoothDeviceNameMatches)) { + if (!(mDeviceName.equals(scanRecord.getDeviceName()) || mDeviceName.equals(device.getName()))) { return false; } }