Implement exclusion filter (#175)

* Implement exclusion filter

* Fix web filters

* Apply Ai Suggestions

* Fix scanFilterTest

* Resolve Ai comments

* Update readme and changelog

* Update CHANGELOG.md

Co-authored-by: Foti Dim <foti@navideck.com>

* Update exclusion filter doc

* Fix wording

---------

Co-authored-by: Foti Dim <foti@navideck.com>
Co-authored-by: Foti Dim <fotios.dimanidis@a2zebra.de>
This commit is contained in:
Rohit Sangwan
2025-09-01 13:01:56 +05:30
committed by GitHub
parent f3d5de250c
commit af873b3153
13 changed files with 300 additions and 78 deletions
+28 -7
View File
@@ -27,7 +27,10 @@ void main() {
services: [],
);
expect(filterUtil.manufacturerDataMatches(scanFilter, device), true);
expect(
filterUtil.manufacturerDataMatches(
scanFilter.withManufacturerData, device),
true);
});
test('should not match when device has no manufacturer data', () {
@@ -46,7 +49,10 @@ void main() {
services: [],
);
expect(filterUtil.manufacturerDataMatches(scanFilter, device), false);
expect(
filterUtil.manufacturerDataMatches(
scanFilter.withManufacturerData, device),
false);
});
test(
@@ -69,7 +75,10 @@ void main() {
services: [],
);
expect(filterUtil.manufacturerDataMatches(scanFilter, device), true);
expect(
filterUtil.manufacturerDataMatches(
scanFilter.withManufacturerData, device),
true);
});
group('Payload Prefix Tests', () {
@@ -94,7 +103,10 @@ void main() {
services: [],
);
expect(filterUtil.manufacturerDataMatches(scanFilter, device), true);
expect(
filterUtil.manufacturerDataMatches(
scanFilter.withManufacturerData, device),
true);
});
test('should match with multiple manufacturer data entries', () {
@@ -119,7 +131,10 @@ void main() {
services: [],
);
expect(filterUtil.manufacturerDataMatches(scanFilter, device), true);
expect(
filterUtil.manufacturerDataMatches(
scanFilter.withManufacturerData, device),
true);
});
});
@@ -146,7 +161,10 @@ void main() {
services: [],
);
expect(filterUtil.manufacturerDataMatches(scanFilter, device), true);
expect(
filterUtil.manufacturerDataMatches(
scanFilter.withManufacturerData, device),
true);
});
test('should not match when masked values are different', () {
@@ -171,7 +189,10 @@ void main() {
services: [],
);
expect(filterUtil.manufacturerDataMatches(scanFilter, device), false);
expect(
filterUtil.manufacturerDataMatches(
scanFilter.withManufacturerData, device),
false);
});
});
});
+120 -23
View File
@@ -9,7 +9,7 @@ void main() {
var device1 = BleDevice(
deviceId: '1',
name: '1_device',
services: ['1_ser'],
services: ['20a1'],
manufacturerDataList: [
ManufacturerData(0x01, Uint8List.fromList([1, 2, 3])),
],
@@ -17,7 +17,7 @@ void main() {
var device2 = BleDevice(
deviceId: '2',
name: '2_device',
services: ['2_ser'],
services: ['20a2'],
manufacturerDataList: [
ManufacturerData(0x02, Uint8List.fromList([1, 2, 3]))
],
@@ -25,7 +25,7 @@ void main() {
var device3 = BleDevice(
deviceId: '3',
name: '3_device',
services: ['3_ser'],
services: ['20a3'],
manufacturerDataList: [
ManufacturerData(0x03, Uint8List.fromList([1, 2, 3]))
],
@@ -52,7 +52,7 @@ void main() {
test('Test isServicesMatchingFilters', () {
var scanFilter = ScanFilter(
withServices: ['1_ser', 'random', '3_ser'],
withServices: ['20a1', '20a6', '20a3'],
);
expect(
universalBleFilter.servicesMatch(scanFilter, device1),
@@ -84,21 +84,21 @@ void main() {
]);
expect(
universalBleFilter.manufacturerDataMatches(
scanFilter,
scanFilter.withManufacturerData,
device1,
),
isTrue,
);
expect(
universalBleFilter.manufacturerDataMatches(
scanFilter,
scanFilter.withManufacturerData,
device2,
),
isTrue,
);
expect(
universalBleFilter.manufacturerDataMatches(
scanFilter,
scanFilter.withManufacturerData,
device3,
),
isFalse,
@@ -110,7 +110,7 @@ void main() {
test('Test filterDevice: Have filter for all', () {
universalBleFilter.scanFilter = ScanFilter(
withNamePrefix: ['1'],
withServices: ['3_ser'],
withServices: ['20a3'],
withManufacturerData: [
ManufacturerDataFilter(
companyIdentifier: 0x02,
@@ -118,15 +118,15 @@ void main() {
],
);
expect(
universalBleFilter.matchesDevice(device1),
universalBleFilter.matchedScanFilter(device1),
isTrue,
);
expect(
universalBleFilter.matchesDevice(device2),
universalBleFilter.matchedScanFilter(device2),
isTrue,
);
expect(
universalBleFilter.matchesDevice(device3),
universalBleFilter.matchedScanFilter(device3),
isTrue,
);
});
@@ -135,15 +135,15 @@ void main() {
withNamePrefix: ['1'],
);
expect(
universalBleFilter.matchesDevice(device1),
universalBleFilter.matchedScanFilter(device1),
isTrue,
);
expect(
universalBleFilter.matchesDevice(device2),
universalBleFilter.matchedScanFilter(device2),
isFalse,
);
expect(
universalBleFilter.matchesDevice(device3),
universalBleFilter.matchedScanFilter(device3),
isFalse,
);
});
@@ -152,47 +152,144 @@ void main() {
withNamePrefix: ['1', '2'],
);
expect(
universalBleFilter.matchesDevice(device1),
universalBleFilter.matchedScanFilter(device1),
isTrue,
);
expect(
universalBleFilter.matchesDevice(device2),
universalBleFilter.matchedScanFilter(device2),
isTrue,
);
expect(
universalBleFilter.matchesDevice(device3),
universalBleFilter.matchedScanFilter(device3),
isFalse,
);
});
test('Test filterDevice: Empty Filter', () {
universalBleFilter.scanFilter = ScanFilter();
expect(
universalBleFilter.matchesDevice(device1),
universalBleFilter.matchedScanFilter(device1),
isTrue,
);
expect(
universalBleFilter.matchesDevice(device2),
universalBleFilter.matchedScanFilter(device2),
isTrue,
);
expect(
universalBleFilter.matchesDevice(device3),
universalBleFilter.matchedScanFilter(device3),
isTrue,
);
});
test('Test filterDevice: Null Filter', () {
universalBleFilter.scanFilter = ScanFilter();
expect(
universalBleFilter.matchesDevice(device1),
universalBleFilter.matchedScanFilter(device1),
isTrue,
);
expect(
universalBleFilter.matchesDevice(device2),
universalBleFilter.matchedScanFilter(device2),
isTrue,
);
expect(
universalBleFilter.matchesDevice(device3),
universalBleFilter.matchedScanFilter(device3),
isTrue,
);
});
});
group("Test Exclusion Filter", () {
test('Test exclusionFilter: Have filter for 1', () {
universalBleFilter.scanFilter = ScanFilter(exclusionFilters: [
ExclusionFilter(
namePrefix: '1',
services: ['20a1'],
manufacturerDataFilter: [
ManufacturerDataFilter(
companyIdentifier: 0x01,
)
],
)
]);
expect(
universalBleFilter.matchesExclusionFilter(device1),
isTrue,
);
expect(
universalBleFilter.matchesExclusionFilter(device2),
isFalse,
);
expect(
universalBleFilter.matchesExclusionFilter(device3),
isFalse,
);
});
test('Test exclusionFilter: Filter for two', () {
universalBleFilter.scanFilter = ScanFilter(exclusionFilters: [
ExclusionFilter(
namePrefix: '1',
services: ['20a1'],
manufacturerDataFilter: [
ManufacturerDataFilter(
companyIdentifier: 0x01,
)
],
),
ExclusionFilter(
namePrefix: '2',
services: ['20a2'],
manufacturerDataFilter: [
ManufacturerDataFilter(
companyIdentifier: 0x02,
)
],
),
]);
expect(
universalBleFilter.matchesExclusionFilter(device1),
isTrue,
);
expect(
universalBleFilter.matchesExclusionFilter(device2),
isTrue,
);
expect(
universalBleFilter.matchesExclusionFilter(device3),
isFalse,
);
});
test('Test exclusionFilter: Invalid filter for last', () {
universalBleFilter.scanFilter = ScanFilter(exclusionFilters: [
ExclusionFilter(
namePrefix: '3',
services: ['20a2'],
manufacturerDataFilter: [
ManufacturerDataFilter(
companyIdentifier: 0x01,
)
],
),
]);
expect(
universalBleFilter.matchesExclusionFilter(device1),
isFalse,
);
expect(
universalBleFilter.matchesExclusionFilter(device2),
isFalse,
);
expect(
universalBleFilter.matchesExclusionFilter(device3),
isFalse,
);
});
test('Test exclusionFilter: Empty Filter', () {
universalBleFilter.scanFilter = ScanFilter();
expect(
universalBleFilter.matchesExclusionFilter(device1),
isFalse,
);
});
});
}