dest.writeParcelable(mServiceUuidMask, flags);
}
}
- dest.writeInt(mServiceDataUuid == null? 0 : 1);
+ dest.writeInt(mServiceDataUuid == null ? 0 : 1);
if (mServiceDataUuid != null) {
dest.writeParcelable(mServiceDataUuid, flags);
dest.writeInt(mServiceData == null ? 0 : mServiceData.length);
}
/**
+ * @hide
+ */
+ @Nullable
+ public ParcelUuid getServiceDataUuid() {
+ return mServiceDataUuid;
+ }
+
+ /**
* Returns the manufacturer id. -1 if the manufacturer filter is not set.
*/
public int getManufacturerId() {
}
// Service data match
- if (mServiceData != null &&
- !matchesPartialData(mServiceData, mServiceDataMask, scanRecord.getServiceData())) {
- return false;
+ if (mServiceData != null) {
+ if (!Objects.equals(mServiceDataUuid, scanRecord.getServiceDataUuid()) ||
+ !matchesPartialData(mServiceData, mServiceDataMask,
+ scanRecord.getServiceData())) {
+ return false;
+ }
}
// Manufacturer data match.
- if (mManufacturerData != null && !matchesPartialData(mManufacturerData,
- mManufacturerDataMask, scanRecord.getManufacturerSpecificData())) {
- return false;
+ if (mManufacturerData != null) {
+ if (mManufacturerId != scanRecord.getManufacturerId() ||
+ !matchesPartialData(mManufacturerData,
+ mManufacturerDataMask, scanRecord.getManufacturerSpecificData())) {
+ return false;
+ }
}
// All filters match.
return true;
public String toString() {
return "BluetoothLeScanFilter [mDeviceName=" + mDeviceName + ", mDeviceAddress="
+ mDeviceAddress
- + ", mUuid=" + mServiceUuid + ", mUuidMask=" + mServiceUuidMask + ", mServiceData="
+ + ", mUuid=" + mServiceUuid + ", mUuidMask=" + mServiceUuidMask
+ + ", mServiceDataUuid=" + Objects.toString(mServiceDataUuid) + ", mServiceData="
+ Arrays.toString(mServiceData) + ", mServiceDataMask="
+ Arrays.toString(mServiceDataMask) + ", mManufacturerId=" + mManufacturerId
+ ", mManufacturerData=" + Arrays.toString(mManufacturerData)
@Override
public int hashCode() {
return Objects.hash(mDeviceName, mDeviceAddress, mManufacturerId, mManufacturerData,
- mManufacturerDataMask, mServiceData, mServiceDataMask,
+ mManufacturerDataMask, mServiceDataUuid, mServiceData, mServiceDataMask,
mServiceUuid, mServiceUuidMask);
}
mManufacturerId == other.mManufacturerId &&
Objects.deepEquals(mManufacturerData, other.mManufacturerData) &&
Objects.deepEquals(mManufacturerDataMask, other.mManufacturerDataMask) &&
+ Objects.deepEquals(mServiceDataUuid, other.mServiceDataUuid) &&
Objects.deepEquals(mServiceData, other.mServiceData) &&
Objects.deepEquals(mServiceDataMask, other.mServiceDataMask) &&
Objects.equals(mServiceUuid, other.mServiceUuid) &&
"size mismatch for service data and service data mask");
}
}
+ mServiceDataUuid = serviceDataUuid;
mServiceData = serviceData;
mServiceDataMask = serviceDataMask;
return this;
txPowerLevel = scanRecord[currentPos];
break;
case DATA_TYPE_SERVICE_DATA:
- serviceData = extractBytes(scanRecord, currentPos, dataLength);
- // The first two bytes of the service data are service data UUID.
+ // The first two bytes of the service data are service data UUID in little
+ // endian. The rest bytes are service data.
int serviceUuidLength = BluetoothUuid.UUID_BYTES_16_BIT;
byte[] serviceDataUuidBytes = extractBytes(scanRecord, currentPos,
serviceUuidLength);
serviceDataUuid = BluetoothUuid.parseUuidFrom(serviceDataUuidBytes);
+ serviceData = extractBytes(scanRecord, currentPos + 2, dataLength - 2);
break;
case DATA_TYPE_MANUFACTURER_SPECIFIC_DATA:
- manufacturerSpecificData = extractBytes(scanRecord, currentPos,
- dataLength);
// The first two bytes of the manufacturer specific data are
// manufacturer ids in little endian.
- manufacturerId = ((manufacturerSpecificData[1] & 0xFF) << 8) +
- (manufacturerSpecificData[0] & 0xFF);
+ manufacturerId = ((scanRecord[currentPos + 1] & 0xFF) << 8) +
+ (scanRecord[currentPos] & 0xFF);
+ manufacturerSpecificData = extractBytes(scanRecord, currentPos + 2,
+ dataLength - 2);
break;
default:
// Just ignore, we don't handle such data type.
/**
* Unit test cases for {@link ScanRecord}.
* <p>
- * To run this test, use adb shell am instrument -e class
- * 'android.bluetooth.ScanRecordTest' -w
+ * To run this test, use adb shell am instrument -e class 'android.bluetooth.ScanRecordTest' -w
* 'com.android.bluetooth.tests/android.bluetooth.BluetoothTestRunner'
*/
public class ScanRecordTest extends TestCase {
assertEquals("Ped", data.getDeviceName());
assertEquals(-20, data.getTxPowerLevel());
- assertEquals(224, data.getManufacturerId());
+ assertEquals(0x00e0, data.getManufacturerId());
assertArrayEquals(new byte[] {
- (byte) 0xe0, 0x00, 0x02, 0x15 }, data.getManufacturerSpecificData());
+ 0x02, 0x15 }, data.getManufacturerSpecificData());
assertEquals(uuid2, data.getServiceDataUuid());
assertArrayEquals(new byte[] {
- 0x0b, 0x11, 0x50, 0x64 }, data.getServiceData());
+ 0x50, 0x64 }, data.getServiceData());
}
// Assert two byte arrays are equal.