OSDN Git Service

Split manu id and manu data.
authorWei Wang <weiwa@google.com>
Fri, 25 Jul 2014 22:14:55 +0000 (15:14 -0700)
committerWei Wang <weiwa@google.com>
Mon, 28 Jul 2014 06:12:26 +0000 (23:12 -0700)
b/16407380

Change-Id: I39f6ce0ab4cccadec809f0a4f518f5d2c77a90b7

core/java/android/bluetooth/le/ScanFilter.java
core/java/android/bluetooth/le/ScanRecord.java
core/java/android/bluetooth/le/ScanResult.java
core/tests/bluetoothtests/src/android/bluetooth/le/ScanRecordTest.java

index 0ae11b0..2ce18b0 100644 (file)
@@ -107,7 +107,7 @@ public final class ScanFilter implements Parcelable {
                 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);
@@ -235,6 +235,14 @@ public final class ScanFilter implements Parcelable {
     }
 
     /**
+     * @hide
+     */
+    @Nullable
+    public ParcelUuid getServiceDataUuid() {
+        return mServiceDataUuid;
+    }
+
+    /**
      * Returns the manufacturer id. -1 if the manufacturer filter is not set.
      */
     public int getManufacturerId() {
@@ -287,15 +295,21 @@ public final class ScanFilter implements Parcelable {
         }
 
         // 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;
@@ -353,7 +367,8 @@ public final class ScanFilter implements Parcelable {
     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)
@@ -363,7 +378,7 @@ public final class ScanFilter implements Parcelable {
     @Override
     public int hashCode() {
         return Objects.hash(mDeviceName, mDeviceAddress, mManufacturerId, mManufacturerData,
-                mManufacturerDataMask, mServiceData, mServiceDataMask,
+                mManufacturerDataMask, mServiceDataUuid, mServiceData, mServiceDataMask,
                 mServiceUuid, mServiceUuidMask);
     }
 
@@ -381,6 +396,7 @@ public final class ScanFilter implements Parcelable {
                         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) &&
@@ -498,6 +514,7 @@ public final class ScanFilter implements Parcelable {
                             "size mismatch for service data and service data mask");
                 }
             }
+            mServiceDataUuid = serviceDataUuid;
             mServiceData = serviceData;
             mServiceDataMask = serviceDataMask;
             return this;
index dd03308..e564c7d 100644 (file)
@@ -225,20 +225,21 @@ public final class ScanRecord {
                         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.
index 9aee200..a0bdaff 100644 (file)
@@ -69,7 +69,7 @@ public final class ScanResult implements Parcelable {
             dest.writeInt(0);
         }
         if (mScanRecord != null) {
-            dest.writeInt(mScanRecord.getBytes().length);
+            dest.writeInt(1);
             dest.writeByteArray(mScanRecord.getBytes());
         } else {
             dest.writeInt(0);
@@ -145,7 +145,7 @@ public final class ScanResult implements Parcelable {
     @Override
     public String toString() {
         return "ScanResult{" + "mDevice=" + mDevice + ", mScanRecord="
-                + mScanRecord.toString() + ", mRssi=" + mRssi + ", mTimestampNanos="
+                + Objects.toString(mScanRecord) + ", mRssi=" + mRssi + ", mTimestampNanos="
                 + mTimestampNanos + '}';
     }
 
index e259bcc..ccdd90a 100644 (file)
@@ -27,8 +27,7 @@ import java.util.Arrays;
 /**
  * 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 {
@@ -54,13 +53,13 @@ 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.