Skip to content

Commit 2f079d8

Browse files
committed
fix scan on older android
1 parent 27990ef commit 2f079d8

File tree

2 files changed

+49
-11
lines changed

2 files changed

+49
-11
lines changed

library/android/src/main/java/it/iotinga/blelibrary/BleLibraryModule.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -137,34 +137,43 @@ public void cancel(String transactionId, Promise promise) {
137137
public void scanStart(ReadableArray filterUuid, Promise promise) {
138138
Log.d(NAME, String.format("scanStart(%s)", filterUuid));
139139

140+
140141
if (adapter == null) {
141142
promise.reject(BleError.ERROR_NOT_INITIALIZED.name(), "module is not initialized");
142143
} else {
143-
Log.i(NAME, "starting scan");
144+
boolean isFilteringSupported = adapter.isOffloadedFilteringSupported();
145+
boolean isBatchingSupported = adapter.isOffloadedScanBatchingSupported();
146+
147+
Log.i(NAME, String.format("starting scan filter supported %b batching supported %b", isFilteringSupported, isBatchingSupported));
144148

145149
List<ScanFilter> filters = null;
146150
ScanSettings.Builder settings = new ScanSettings.Builder()
147151
.setScanMode(ScanSettings.SCAN_MODE_BALANCED)
148152
.setMatchMode(ScanSettings.MATCH_MODE_AGGRESSIVE);
149153

150-
if (filterUuid != null && filterUuid.size() > 0) {
154+
List<ParcelUuid> uuidFilter = null;
155+
if (isFilteringSupported && filterUuid != null && filterUuid.size() > 0) {
151156
settings.setCallbackType(ScanSettings.CALLBACK_TYPE_FIRST_MATCH | ScanSettings.CALLBACK_TYPE_MATCH_LOST);
152157
filters = new ArrayList<>();
158+
uuidFilter = new ArrayList<>();
153159
for (int i = 0; i < filterUuid.size(); i++) {
154160
String serviceUuid = filterUuid.getString(i);
155161
Log.d(NAME, "adding filter UUID: " + serviceUuid);
156162
ParcelUuid uuid = ParcelUuid.fromString(serviceUuid);
163+
uuidFilter.add(uuid);
157164
filters.add(new ScanFilter.Builder().setServiceUuid(uuid).build());
158165
}
159166
} else {
160167
// avoid flooding JS with events
161-
settings.setReportDelay(SCAN_REPORT_DELAY_MS);
168+
if (isBatchingSupported) {
169+
settings.setReportDelay(SCAN_REPORT_DELAY_MS);
170+
}
162171
settings.setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES);
163172
}
164173

165174
if (scanner == null) {
166175
scanner = adapter.getBluetoothLeScanner();
167-
scanCallback = new BleScanCallback(emitter);
176+
scanCallback = new BleScanCallback(emitter, uuidFilter);
168177
} else {
169178
// stopping existing scan to restart it
170179
try {

library/android/src/main/java/it/iotinga/blelibrary/BleScanCallback.java

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package it.iotinga.blelibrary;
22

33
import android.bluetooth.le.ScanCallback;
4+
import android.bluetooth.le.ScanRecord;
45
import android.bluetooth.le.ScanResult;
56
import android.bluetooth.le.ScanSettings;
7+
import android.os.ParcelUuid;
68
import android.util.Log;
79

810
import androidx.annotation.RequiresPermission;
@@ -12,24 +14,49 @@
1214
public class BleScanCallback extends ScanCallback {
1315
private static final String TAG = "BleScanCallback";
1416
private final EventEmitter eventEmitter;
17+
private final List<ParcelUuid> filter;
1518

16-
BleScanCallback(EventEmitter eventEmitter) {
19+
BleScanCallback(EventEmitter eventEmitter, List<ParcelUuid> filter) {
1720
super();
1821
this.eventEmitter = eventEmitter;
22+
this.filter = filter;
23+
}
24+
25+
private boolean resultPassesUuidFilter(ScanResult result) {
26+
if (filter == null || filter.isEmpty()) {
27+
return true;
28+
}
29+
30+
ScanRecord record = result.getScanRecord();
31+
if (record == null) {
32+
return false;
33+
}
34+
35+
for (ParcelUuid uuid : record.getServiceUuids()) {
36+
for (ParcelUuid allowedUuid : filter) {
37+
if (uuid.equals(allowedUuid)) {
38+
return true;
39+
}
40+
}
41+
}
42+
43+
return false;
1944
}
2045

2146
@Override
2247
@RequiresPermission(value = "android.permission.BLUETOOTH_CONNECT")
2348
public void onScanResult(int callbackType, ScanResult result) {
2449
Log.i(TAG, String.format("got scan result: %s (callback type: %d)", result, callbackType));
2550

26-
boolean available = callbackType == ScanSettings.CALLBACK_TYPE_FIRST_MATCH
27-
|| callbackType == ScanSettings.CALLBACK_TYPE_ALL_MATCHES;
51+
if (resultPassesUuidFilter(result)) {
52+
boolean available = callbackType == ScanSettings.CALLBACK_TYPE_FIRST_MATCH
53+
|| callbackType == ScanSettings.CALLBACK_TYPE_ALL_MATCHES;
2854

29-
RNEventScanResult event = new RNEventScanResult();
30-
event.add(result, available);
55+
RNEventScanResult event = new RNEventScanResult();
56+
event.add(result, available);
3157

32-
eventEmitter.emit(event);
58+
eventEmitter.emit(event);
59+
}
3360
}
3461

3562
@Override
@@ -46,7 +73,9 @@ public void onBatchScanResults(List<ScanResult> results) {
4673

4774
RNEventScanResult event = new RNEventScanResult();
4875
for (ScanResult result : results) {
49-
event.add(result, true);
76+
if (resultPassesUuidFilter(result)) {
77+
event.add(result, true);
78+
}
5079
}
5180

5281
eventEmitter.emit(event);

0 commit comments

Comments
 (0)