diff options
author | Wei Wang <weiwa@google.com> | 2014-07-29 23:47:05 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2014-07-25 23:01:28 +0000 |
commit | 64d2b567c38d626b0f2da470e3451d7a957e8961 (patch) | |
tree | 2eca4bfeef942cfe18a371b2f7fbb0b7f9129d77 | |
parent | bf3a9465483976dcd5692b619b47132c2b95f73e (diff) | |
parent | 0462468aaff1089f08d0859e4920f90e4378b66b (diff) | |
download | frameworks_base-64d2b567c38d626b0f2da470e3451d7a957e8961.zip frameworks_base-64d2b567c38d626b0f2da470e3451d7a957e8961.tar.gz frameworks_base-64d2b567c38d626b0f2da470e3451d7a957e8961.tar.bz2 |
Merge "Make scan filter accepts prefix. Add tests." into lmp-dev
-rw-r--r-- | core/java/android/bluetooth/le/ScanFilter.java | 51 | ||||
-rw-r--r-- | core/tests/bluetoothtests/src/android/bluetooth/le/ScanFilterTest.java | 66 |
2 files changed, 77 insertions, 40 deletions
diff --git a/core/java/android/bluetooth/le/ScanFilter.java b/core/java/android/bluetooth/le/ScanFilter.java index 2ce18b0..30aaf2e 100644 --- a/core/java/android/bluetooth/le/ScanFilter.java +++ b/core/java/android/bluetooth/le/ScanFilter.java @@ -110,21 +110,27 @@ public final class ScanFilter implements Parcelable { dest.writeInt(mServiceDataUuid == null ? 0 : 1); if (mServiceDataUuid != null) { dest.writeParcelable(mServiceDataUuid, flags); - dest.writeInt(mServiceData == null ? 0 : mServiceData.length); + dest.writeInt(mServiceData == null ? 0 : 1); if (mServiceData != null) { + dest.writeInt(mServiceData.length); dest.writeByteArray(mServiceData); - dest.writeInt(mServiceDataMask == null ? 0 : mServiceDataMask.length); + + dest.writeInt(mServiceDataMask == null ? 0 : 1); if (mServiceDataMask != null) { + dest.writeInt(mServiceDataMask.length); dest.writeByteArray(mServiceDataMask); } } } dest.writeInt(mManufacturerId); - dest.writeInt(mManufacturerData == null ? 0 : mManufacturerData.length); + dest.writeInt(mManufacturerData == null ? 0 : 1); if (mManufacturerData != null) { + dest.writeInt(mManufacturerData.length); dest.writeByteArray(mManufacturerData); - dest.writeInt(mManufacturerDataMask == null ? 0 : mManufacturerDataMask.length); + + dest.writeInt(mManufacturerDataMask == null ? 0 : 1); if (mManufacturerDataMask != null) { + dest.writeInt(mManufacturerDataMask.length); dest.writeByteArray(mManufacturerDataMask); } } @@ -164,29 +170,31 @@ public final class ScanFilter implements Parcelable { if (in.readInt() == 1) { ParcelUuid servcieDataUuid = in.readParcelable(ParcelUuid.class.getClassLoader()); - int serviceDataLength = in.readInt(); - if (serviceDataLength > 0) { + if (in.readInt() == 1) { + int serviceDataLength = in.readInt(); byte[] serviceData = new byte[serviceDataLength]; in.readByteArray(serviceData); - builder.setServiceData(servcieDataUuid, serviceData); - int serviceDataMaskLength = in.readInt(); - if (serviceDataMaskLength > 0) { + if (in.readInt() == 0) { + builder.setServiceData(servcieDataUuid, serviceData); + } else { + int serviceDataMaskLength = in.readInt(); byte[] serviceDataMask = new byte[serviceDataMaskLength]; in.readByteArray(serviceDataMask); builder.setServiceData( - servcieDataUuid, serviceData, serviceDataMask); + servcieDataUuid, serviceData, serviceDataMask); } } } int manufacturerId = in.readInt(); - int manufacturerDataLength = in.readInt(); - if (manufacturerDataLength > 0) { + if (in.readInt() == 1) { + int manufacturerDataLength = in.readInt(); byte[] manufacturerData = new byte[manufacturerDataLength]; in.readByteArray(manufacturerData); - builder.setManufacturerData(manufacturerId, manufacturerData); - int manufacturerDataMaskLength = in.readInt(); - if (manufacturerDataMaskLength > 0) { + if (in.readInt() == 0) { + builder.setManufacturerData(manufacturerId, manufacturerData); + } else { + int manufacturerDataMaskLength = in.readInt(); byte[] manufacturerDataMask = new byte[manufacturerDataMaskLength]; in.readByteArray(manufacturerDataMask); builder.setManufacturerData(manufacturerId, manufacturerData, @@ -349,12 +357,17 @@ public final class ScanFilter implements Parcelable { // Check whether the data pattern matches the parsed data. private boolean matchesPartialData(byte[] data, byte[] dataMask, byte[] parsedData) { - if (dataMask == null) { - return Arrays.equals(data, parsedData); - } - if (parsedData == null) { + if (parsedData == null || parsedData.length < data.length) { return false; } + if (dataMask == null) { + for (int i = 0; i < data.length; ++i) { + if (parsedData[i] != data[i]) { + return false; + } + } + return true; + } for (int i = 0; i < data.length; ++i) { if ((dataMask[i] & parsedData[i]) != (dataMask[i] & data[i])) { return false; diff --git a/core/tests/bluetoothtests/src/android/bluetooth/le/ScanFilterTest.java b/core/tests/bluetoothtests/src/android/bluetooth/le/ScanFilterTest.java index 81f4baf..35da4bc 100644 --- a/core/tests/bluetoothtests/src/android/bluetooth/le/ScanFilterTest.java +++ b/core/tests/bluetoothtests/src/android/bluetooth/le/ScanFilterTest.java @@ -96,38 +96,56 @@ public class ScanFilterTest extends TestCase { @SmallTest public void testsetServiceDataFilter() { byte[] setServiceData = new byte[] { - 0x0b, 0x11, 0x50, 0x64 }; + 0x50, 0x64 }; ParcelUuid serviceDataUuid = ParcelUuid.fromString("0000110B-0000-1000-8000-00805F9B34FB"); ScanFilter filter = mFilterBuilder.setServiceData(serviceDataUuid, setServiceData).build(); assertTrue("service data filter fails", filter.matches(mScanResult)); - byte[] nonMatchData = new byte[] { - 0x0b, 0x01, 0x50, 0x64 }; - filter = mFilterBuilder.setServiceData(serviceDataUuid, nonMatchData).build(); - assertFalse("service data filter fails", filter.matches(mScanResult)); + byte[] emptyData = new byte[0]; + filter = mFilterBuilder.setServiceData(serviceDataUuid, emptyData).build(); + assertTrue("service data filter fails", filter.matches(mScanResult)); + byte[] prefixData = new byte[] { + 0x50 }; + filter = mFilterBuilder.setServiceData(serviceDataUuid, prefixData).build(); + assertTrue("service data filter fails", filter.matches(mScanResult)); + + byte[] nonMatchData = new byte[] { + 0x51, 0x64 }; byte[] mask = new byte[] { - (byte) 0xFF, (byte) 0x00, (byte) 0xFF, (byte) 0xFF }; + (byte) 0x00, (byte) 0xFF }; filter = mFilterBuilder.setServiceData(serviceDataUuid, nonMatchData, mask).build(); assertTrue("partial service data filter fails", filter.matches(mScanResult)); + + filter = mFilterBuilder.setServiceData(serviceDataUuid, nonMatchData).build(); + assertFalse("service data filter fails", filter.matches(mScanResult)); } @SmallTest public void testManufacturerSpecificData() { byte[] setManufacturerData = new byte[] { - (byte) 0xE0, 0x00, 0x02, 0x15 }; - int manufacturerId = 224; + 0x02, 0x15 }; + int manufacturerId = 0xE0; ScanFilter filter = mFilterBuilder.setManufacturerData(manufacturerId, setManufacturerData).build(); - assertTrue("setManufacturerData filter fails", filter.matches(mScanResult)); + assertTrue("manufacturer data filter fails", filter.matches(mScanResult)); + + byte[] emptyData = new byte[0]; + filter = mFilterBuilder.setManufacturerData(manufacturerId, emptyData).build(); + assertTrue("manufacturer data filter fails", filter.matches(mScanResult)); + + byte[] prefixData = new byte[] { + 0x02 }; + filter = mFilterBuilder.setManufacturerData(manufacturerId, prefixData).build(); + assertTrue("manufacturer data filter fails", filter.matches(mScanResult)); + // Test data mask byte[] nonMatchData = new byte[] { - (byte) 0xF0, 0x00, 0x02, 0x15 }; + 0x02, 0x14 }; filter = mFilterBuilder.setManufacturerData(manufacturerId, nonMatchData).build(); - assertFalse("setManufacturerData filter fails", filter.matches(mScanResult)); - + assertFalse("manufacturer data filter fails", filter.matches(mScanResult)); byte[] mask = new byte[] { - (byte) 0x00, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF + (byte) 0xFF, (byte) 0x00 }; filter = mFilterBuilder.setManufacturerData(manufacturerId, nonMatchData, mask).build(); assertTrue("partial setManufacturerData filter fails", filter.matches(mScanResult)); @@ -153,27 +171,33 @@ public class ScanFilterTest extends TestCase { ParcelUuid.fromString("FFFFFFF0-FFFF-FFFF-FFFF-FFFFFFFFFFFF")).build(); testReadWriteParcelForFilter(filter); - byte[] setServiceData = new byte[] { - 0x0b, 0x11, 0x50, 0x64 }; + byte[] serviceData = new byte[] { + 0x50, 0x64 }; ParcelUuid serviceDataUuid = ParcelUuid.fromString("0000110B-0000-1000-8000-00805F9B34FB"); - filter = mFilterBuilder.setServiceData(serviceDataUuid, setServiceData).build(); + filter = mFilterBuilder.setServiceData(serviceDataUuid, serviceData).build(); + testReadWriteParcelForFilter(filter); + + filter = mFilterBuilder.setServiceData(serviceDataUuid, new byte[0]).build(); testReadWriteParcelForFilter(filter); byte[] serviceDataMask = new byte[] { - (byte) 0xFF, (byte) 0x00, (byte) 0xFF, (byte) 0xFF }; - filter = mFilterBuilder.setServiceData(serviceDataUuid, setServiceData, serviceDataMask) + (byte) 0xFF, (byte) 0xFF }; + filter = mFilterBuilder.setServiceData(serviceDataUuid, serviceData, serviceDataMask) .build(); testReadWriteParcelForFilter(filter); byte[] manufacturerData = new byte[] { - (byte) 0xE0, 0x00, 0x02, 0x15 }; - int manufacturerId = 224; + 0x02, 0x15 }; + int manufacturerId = 0xE0; filter = mFilterBuilder.setManufacturerData(manufacturerId, manufacturerData).build(); testReadWriteParcelForFilter(filter); + filter = mFilterBuilder.setServiceData(serviceDataUuid, new byte[0]).build(); + testReadWriteParcelForFilter(filter); + byte[] manufacturerDataMask = new byte[] { - (byte) 0x00, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF + (byte) 0xFF, (byte) 0xFF }; filter = mFilterBuilder.setManufacturerData(manufacturerId, manufacturerData, manufacturerDataMask).build(); |