From ce06a7fa39c933637cfdcb8d854fc9a90a9f72af Mon Sep 17 00:00:00 2001 From: Foti Dim Date: Wed, 20 Nov 2024 16:21:59 +0100 Subject: [PATCH] Fix multiple app filtering in Linux (#100) --- example/pubspec.lock | 2 +- .../universal_ble_linux.dart | 51 ++++++------------- 2 files changed, 17 insertions(+), 36 deletions(-) diff --git a/example/pubspec.lock b/example/pubspec.lock index d0b6e7e..c71dee7 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -402,7 +402,7 @@ packages: path: ".." relative: true source: path - version: "0.13.0" + version: "0.14.0" vector_math: dependency: transitive description: diff --git a/lib/src/universal_ble_linux/universal_ble_linux.dart b/lib/src/universal_ble_linux/universal_ble_linux.dart index 7b2874a..8f2efc3 100644 --- a/lib/src/universal_ble_linux/universal_ble_linux.dart +++ b/lib/src/universal_ble_linux/universal_ble_linux.dart @@ -17,6 +17,8 @@ class UniversalBleLinux extends UniversalBlePlatform { final BlueZClient _client = BlueZClient(); late final UniversalBleFilterUtil _bleFilter = UniversalBleFilterUtil(); BlueZAdapter? _activeAdapter; + StreamSubscription? _deviceAdded; + StreamSubscription? _deviceRemoved; Completer? _initializationCompleter; final Map _devices = {}; final Map _deviceUpdateStreamSubscriptions = {}; @@ -65,36 +67,16 @@ class UniversalBleLinux extends UniversalBlePlatform { // Stop scan and clean all old advertisement listeners await stopScan(); - bool hasCustomFilter = scanFilter?.hasCustomFilter() ?? false; - List withServicesFilter = []; + _bleFilter.scanFilter = scanFilter; - if (hasCustomFilter) { - _bleFilter.scanFilter = scanFilter; - } else { - _bleFilter.scanFilter = null; - withServicesFilter = scanFilter?.withServices.toValidUUIDList() ?? []; - } + // Setup listeners + _deviceAdded ??= _client.deviceAdded.listen(_onDeviceAdd); + _deviceRemoved ??= _client.deviceRemoved.listen(_onDeviceRemoved); - // Add services filter - await adapter.setDiscoveryFilter( - uuids: withServicesFilter, - ); + await adapter.startDiscovery(); - await _activeAdapter?.startDiscovery(); - - // Apply custom Services filter to these devices - ScanFilter customServicesFilter = ScanFilter( - withServices: withServicesFilter, - ); for (var device in _client.devices) { - if (!hasCustomFilter && withServicesFilter.isNotEmpty) { - if (_bleFilter.isServicesMatchingFilters( - customServicesFilter, device.toBleDevice())) { - _onDeviceAdd(device); - } - } else { - _onDeviceAdd(device); - } + _onDeviceAdd(device); } } @@ -102,9 +84,17 @@ class UniversalBleLinux extends UniversalBlePlatform { Future stopScan() async { await _ensureInitialized(); try { + // Dispose listeners + _deviceAdded?.cancel(); + _deviceRemoved?.cancel(); + _deviceAdded = null; + _deviceRemoved = null; + + // Stop Disovery if (_activeAdapter?.discovering == true) { await _activeAdapter?.stopDiscovery(); } + // Clean all advertiseemnt listeners _deviceAdvertisementSubscriptions.removeWhere((e, value) { value.cancel(); @@ -415,9 +405,6 @@ class UniversalBleLinux extends UniversalBlePlatform { } }); - _client.deviceAdded.listen(_onDeviceAdd); - _client.deviceRemoved.listen(_onDeviceRemoved); - updateAvailability(_availabilityState); isInitialized = true; _initializationCompleter?.complete(); @@ -584,12 +571,6 @@ extension on BlueZFailedException { } } -extension on ScanFilter { - bool hasCustomFilter() { - return withNamePrefix.isNotEmpty || withManufacturerData.isNotEmpty; - } -} - extension BlueZDeviceExtension on BlueZDevice { List get manufacturerDataList => manufacturerData.entries .map((MapEntry> data) =>