diff options
author | Wei Wang <weiwa@google.com> | 2014-07-23 18:41:10 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2014-07-22 16:29:55 +0000 |
commit | 3e2bbda757596026c80fe6e08a9987dca8ac6e1d (patch) | |
tree | d3d299390c201f048bcaf62b13988e3edc2ef3d4 | |
parent | ec9c4126a5c772d8910462291077f5f99ad6397f (diff) | |
parent | 03259472b19fef586f5eec5d4e7d61c34a6cd298 (diff) | |
download | frameworks_base-3e2bbda757596026c80fe6e08a9987dca8ac6e1d.zip frameworks_base-3e2bbda757596026c80fe6e08a9987dca8ac6e1d.tar.gz frameworks_base-3e2bbda757596026c80fe6e08a9987dca8ac6e1d.tar.bz2 |
Merge "Fix parcel issues with empty service uuid. Added tests." into lmp-dev
3 files changed, 193 insertions, 31 deletions
diff --git a/core/java/android/bluetooth/le/AdvertiseData.java b/core/java/android/bluetooth/le/AdvertiseData.java index f2e4828..34fecfa 100644 --- a/core/java/android/bluetooth/le/AdvertiseData.java +++ b/core/java/android/bluetooth/le/AdvertiseData.java @@ -25,6 +25,7 @@ import android.os.Parcelable; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Objects; /** * Advertise data packet container for Bluetooth LE advertising. This represents the data to be @@ -119,13 +120,44 @@ public final class AdvertiseData implements Parcelable { return mIncludeDeviceName; } + /** + * @hide + */ + @Override + public int hashCode() { + return Objects.hash(mServiceUuids, mManufacturerId, mManufacturerSpecificData, + mServiceDataUuid, mServiceData, mIncludeDeviceName, mIncludeTxPowerLevel); + } + + /** + * @hide + */ + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null || getClass() != obj.getClass()) { + return false; + } + AdvertiseData other = (AdvertiseData) obj; + return Objects.equals(mServiceUuids, other.mServiceUuids) && + mManufacturerId == other.mManufacturerId && + Objects.deepEquals(mManufacturerSpecificData, other.mManufacturerSpecificData) && + Objects.equals(mServiceDataUuid, other.mServiceDataUuid) && + Objects.deepEquals(mServiceData, other.mServiceData) && + mIncludeDeviceName == other.mIncludeDeviceName && + mIncludeTxPowerLevel == other.mIncludeTxPowerLevel; + } + @Override public String toString() { return "AdvertiseData [mServiceUuids=" + mServiceUuids + ", mManufacturerId=" + mManufacturerId + ", mManufacturerSpecificData=" + Arrays.toString(mManufacturerSpecificData) + ", mServiceDataUuid=" + mServiceDataUuid + ", mServiceData=" + Arrays.toString(mServiceData) - + ", mIncludeTxPowerLevel=" + mIncludeTxPowerLevel + ", mIncludeDeviceName=" + "]"; + + ", mIncludeTxPowerLevel=" + mIncludeTxPowerLevel + ", mIncludeDeviceName=" + + mIncludeDeviceName + "]"; } @Override @@ -135,32 +167,23 @@ public final class AdvertiseData implements Parcelable { @Override public void writeToParcel(Parcel dest, int flags) { - if (mServiceUuids == null) { - dest.writeInt(0); - } else { - dest.writeInt(mServiceUuids.size()); - dest.writeList(mServiceUuids); - } + dest.writeList(mServiceUuids); dest.writeInt(mManufacturerId); if (mManufacturerSpecificData == null) { dest.writeInt(0); } else { + dest.writeInt(1); dest.writeInt(mManufacturerSpecificData.length); dest.writeByteArray(mManufacturerSpecificData); } - - if (mServiceDataUuid == null) { + dest.writeParcelable(mServiceDataUuid, flags); + if (mServiceData == null) { dest.writeInt(0); } else { dest.writeInt(1); - dest.writeParcelable(mServiceDataUuid, flags); - if (mServiceData == null) { - dest.writeInt(0); - } else { - dest.writeInt(mServiceData.length); - dest.writeByteArray(mServiceData); - } + dest.writeInt(mServiceData.length); + dest.writeByteArray(mServiceData); } dest.writeByte((byte) (getIncludeTxPowerLevel() ? 1 : 0)); dest.writeByte((byte) (getIncludeDeviceName() ? 1 : 0)); @@ -179,29 +202,26 @@ public final class AdvertiseData implements Parcelable { @Override public AdvertiseData createFromParcel(Parcel in) { Builder builder = new Builder(); - if (in.readInt() > 0) { - List<ParcelUuid> uuids = new ArrayList<ParcelUuid>(); - in.readList(uuids, ParcelUuid.class.getClassLoader()); + List<ParcelUuid> uuids = in.readArrayList(ParcelUuid.class.getClassLoader()); + if (uuids != null) { for (ParcelUuid uuid : uuids) { builder.addServiceUuid(uuid); } } 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); } + ParcelUuid serviceDataUuid = in.readParcelable( + ParcelUuid.class.getClassLoader()); if (in.readInt() == 1) { - ParcelUuid serviceDataUuid = in.readParcelable( - ParcelUuid.class.getClassLoader()); int serviceDataLength = in.readInt(); - if (serviceDataLength > 0) { - byte[] serviceData = new byte[serviceDataLength]; - in.readByteArray(serviceData); - builder.setServiceData(serviceDataUuid, serviceData); - } + byte[] serviceData = new byte[serviceDataLength]; + in.readByteArray(serviceData); + builder.setServiceData(serviceDataUuid, serviceData); } builder.setIncludeTxPowerLevel(in.readByte() == 1); builder.setIncludeDeviceName(in.readByte() == 1); @@ -221,7 +241,7 @@ public final class AdvertiseData implements Parcelable { @Nullable private List<ParcelUuid> mServiceUuids = new ArrayList<ParcelUuid>(); - private int mManufacturerId; + private int mManufacturerId = -1; @Nullable private byte[] mManufacturerSpecificData; @Nullable @@ -307,7 +327,6 @@ public final class AdvertiseData implements Parcelable { /** * Build the {@link AdvertiseData}. - * */ public AdvertiseData build() { return new AdvertiseData(mServiceUuids, diff --git a/core/tests/bluetoothtests/src/android/bluetooth/le/AdvertiseDataTest.java b/core/tests/bluetoothtests/src/android/bluetooth/le/AdvertiseDataTest.java new file mode 100644 index 0000000..5e451ca --- /dev/null +++ b/core/tests/bluetoothtests/src/android/bluetooth/le/AdvertiseDataTest.java @@ -0,0 +1,144 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.bluetooth.le; + +import android.os.Parcel; +import android.os.ParcelUuid; +import android.test.suitebuilder.annotation.SmallTest; + +import junit.framework.TestCase; + +/** + * Unit test cases for {@link AdvertiseData}. + * <p> + * To run the test, use adb shell am instrument -e class 'android.bluetooth.le.AdvertiseDataTest' -w + * 'com.android.bluetooth.tests/android.bluetooth.BluetoothTestRunner' + */ +public class AdvertiseDataTest extends TestCase { + + private AdvertiseData.Builder mAdvertiseDataBuilder; + + @Override + protected void setUp() throws Exception { + mAdvertiseDataBuilder = new AdvertiseData.Builder(); + } + + @SmallTest + public void testEmptyData() { + Parcel parcel = Parcel.obtain(); + AdvertiseData data = mAdvertiseDataBuilder.build(); + data.writeToParcel(parcel, 0); + parcel.setDataPosition(0); + AdvertiseData dataFromParcel = + AdvertiseData.CREATOR.createFromParcel(parcel); + assertEquals(data, dataFromParcel); + } + + @SmallTest + public void testEmptyServiceUuid() { + Parcel parcel = Parcel.obtain(); + AdvertiseData data = mAdvertiseDataBuilder.setIncludeDeviceName(true).build(); + data.writeToParcel(parcel, 0); + parcel.setDataPosition(0); + AdvertiseData dataFromParcel = + AdvertiseData.CREATOR.createFromParcel(parcel); + assertEquals(data, dataFromParcel); + } + + @SmallTest + public void testEmptyManufacturerData() { + Parcel parcel = Parcel.obtain(); + int manufacturerId = 50; + byte[] manufacturerData = new byte[0]; + AdvertiseData data = + mAdvertiseDataBuilder.setIncludeDeviceName(true) + .setManufacturerData(manufacturerId, manufacturerData).build(); + data.writeToParcel(parcel, 0); + parcel.setDataPosition(0); + AdvertiseData dataFromParcel = + AdvertiseData.CREATOR.createFromParcel(parcel); + assertEquals(data, dataFromParcel); + } + + @SmallTest + public void testEmptyServiceData() { + Parcel parcel = Parcel.obtain(); + ParcelUuid uuid = ParcelUuid.fromString("0000110A-0000-1000-8000-00805F9B34FB"); + byte[] serviceData = new byte[0]; + AdvertiseData data = + mAdvertiseDataBuilder.setIncludeDeviceName(true) + .setServiceData(uuid, serviceData).build(); + data.writeToParcel(parcel, 0); + parcel.setDataPosition(0); + AdvertiseData dataFromParcel = + AdvertiseData.CREATOR.createFromParcel(parcel); + assertEquals(data, dataFromParcel); + } + + @SmallTest + public void testServiceUuid() { + Parcel parcel = Parcel.obtain(); + ParcelUuid uuid = ParcelUuid.fromString("0000110A-0000-1000-8000-00805F9B34FB"); + ParcelUuid uuid2 = ParcelUuid.fromString("0000110B-0000-1000-8000-00805F9B34FB"); + + AdvertiseData data = + mAdvertiseDataBuilder.setIncludeDeviceName(true) + .addServiceUuid(uuid).addServiceUuid(uuid2).build(); + data.writeToParcel(parcel, 0); + parcel.setDataPosition(0); + AdvertiseData dataFromParcel = + AdvertiseData.CREATOR.createFromParcel(parcel); + assertEquals(data, dataFromParcel); + } + + @SmallTest + public void testManufacturerData() { + Parcel parcel = Parcel.obtain(); + ParcelUuid uuid = ParcelUuid.fromString("0000110A-0000-1000-8000-00805F9B34FB"); + ParcelUuid uuid2 = ParcelUuid.fromString("0000110B-0000-1000-8000-00805F9B34FB"); + + int manufacturerId = 50; + byte[] manufacturerData = new byte[] { + (byte) 0xF0, 0x00, 0x02, 0x15 }; + AdvertiseData data = + mAdvertiseDataBuilder.setIncludeDeviceName(true) + .addServiceUuid(uuid).addServiceUuid(uuid2) + .setManufacturerData(manufacturerId, manufacturerData).build(); + + data.writeToParcel(parcel, 0); + parcel.setDataPosition(0); + AdvertiseData dataFromParcel = + AdvertiseData.CREATOR.createFromParcel(parcel); + assertEquals(data, dataFromParcel); + } + + @SmallTest + public void testServiceData() { + Parcel parcel = Parcel.obtain(); + ParcelUuid uuid = ParcelUuid.fromString("0000110A-0000-1000-8000-00805F9B34FB"); + byte[] serviceData = new byte[] { + (byte) 0xF0, 0x00, 0x02, 0x15 }; + AdvertiseData data = + mAdvertiseDataBuilder.setIncludeDeviceName(true) + .setServiceData(uuid, serviceData).build(); + data.writeToParcel(parcel, 0); + parcel.setDataPosition(0); + AdvertiseData dataFromParcel = + AdvertiseData.CREATOR.createFromParcel(parcel); + assertEquals(data, dataFromParcel); + } +} diff --git a/core/tests/bluetoothtests/src/android/bluetooth/le/ScanFilterTest.java b/core/tests/bluetoothtests/src/android/bluetooth/le/ScanFilterTest.java index 25ea227..81f4baf 100644 --- a/core/tests/bluetoothtests/src/android/bluetooth/le/ScanFilterTest.java +++ b/core/tests/bluetoothtests/src/android/bluetooth/le/ScanFilterTest.java @@ -186,7 +186,6 @@ public class ScanFilterTest extends TestCase { parcel.setDataPosition(0); ScanFilter filterFromParcel = ScanFilter.CREATOR.createFromParcel(parcel); - System.out.println(filterFromParcel); assertEquals(filter, filterFromParcel); } } |