Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 11dfc508 authored by Wei Wang's avatar Wei Wang Committed by Android Git Automerger
Browse files

am 386deb92: am 03aeeb29: am 6d630c75: Merge "Fix parcel issues with empty...

am 386deb92: am 03aeeb29: am 6d630c75: Merge "Fix parcel issues with empty service uuid. Added tests." into lmp-dev

* commit '386deb926ca8309d1486b8b61f825710be9cbcef':
  Fix parcel issues with empty service uuid. Added tests.
parents bbe0dfcb 4f22c47d
Loading
Loading
Loading
Loading
+49 −30
Original line number Original line Diff line number Diff line
@@ -25,6 +25,7 @@ import android.os.Parcelable;
import java.util.ArrayList;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Arrays;
import java.util.List;
import java.util.List;
import java.util.Objects;


/**
/**
 * Advertise data packet container for Bluetooth LE advertising. This represents the data to be
 * 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;
        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
    @Override
    public String toString() {
    public String toString() {
        return "AdvertiseData [mServiceUuids=" + mServiceUuids + ", mManufacturerId="
        return "AdvertiseData [mServiceUuids=" + mServiceUuids + ", mManufacturerId="
                + mManufacturerId + ", mManufacturerSpecificData="
                + mManufacturerId + ", mManufacturerSpecificData="
                + Arrays.toString(mManufacturerSpecificData) + ", mServiceDataUuid="
                + Arrays.toString(mManufacturerSpecificData) + ", mServiceDataUuid="
                + mServiceDataUuid + ", mServiceData=" + Arrays.toString(mServiceData)
                + mServiceDataUuid + ", mServiceData=" + Arrays.toString(mServiceData)
                + ", mIncludeTxPowerLevel=" + mIncludeTxPowerLevel + ", mIncludeDeviceName=" + "]";
                + ", mIncludeTxPowerLevel=" + mIncludeTxPowerLevel + ", mIncludeDeviceName="
                + mIncludeDeviceName + "]";
    }
    }


    @Override
    @Override
@@ -135,33 +167,24 @@ public final class AdvertiseData implements Parcelable {


    @Override
    @Override
    public void writeToParcel(Parcel dest, int flags) {
    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);
        dest.writeInt(mManufacturerId);
        if (mManufacturerSpecificData == null) {
        if (mManufacturerSpecificData == null) {
            dest.writeInt(0);
            dest.writeInt(0);
        } else {
        } else {
            dest.writeInt(1);
            dest.writeInt(mManufacturerSpecificData.length);
            dest.writeInt(mManufacturerSpecificData.length);
            dest.writeByteArray(mManufacturerSpecificData);
            dest.writeByteArray(mManufacturerSpecificData);
        }
        }

        if (mServiceDataUuid == null) {
            dest.writeInt(0);
        } else {
            dest.writeInt(1);
        dest.writeParcelable(mServiceDataUuid, flags);
        dest.writeParcelable(mServiceDataUuid, flags);
        if (mServiceData == null) {
        if (mServiceData == null) {
            dest.writeInt(0);
            dest.writeInt(0);
        } else {
        } else {
            dest.writeInt(1);
            dest.writeInt(mServiceData.length);
            dest.writeInt(mServiceData.length);
            dest.writeByteArray(mServiceData);
            dest.writeByteArray(mServiceData);
        }
        }
        }
        dest.writeByte((byte) (getIncludeTxPowerLevel() ? 1 : 0));
        dest.writeByte((byte) (getIncludeTxPowerLevel() ? 1 : 0));
        dest.writeByte((byte) (getIncludeDeviceName() ? 1 : 0));
        dest.writeByte((byte) (getIncludeDeviceName() ? 1 : 0));
    }
    }
@@ -179,30 +202,27 @@ public final class AdvertiseData implements Parcelable {
            @Override
            @Override
                public AdvertiseData createFromParcel(Parcel in) {
                public AdvertiseData createFromParcel(Parcel in) {
                    Builder builder = new Builder();
                    Builder builder = new Builder();
                    if (in.readInt() > 0) {
                    List<ParcelUuid> uuids = in.readArrayList(ParcelUuid.class.getClassLoader());
                        List<ParcelUuid> uuids = new ArrayList<ParcelUuid>();
                    if (uuids != null) {
                        in.readList(uuids, ParcelUuid.class.getClassLoader());
                        for (ParcelUuid uuid : uuids) {
                        for (ParcelUuid uuid : uuids) {
                            builder.addServiceUuid(uuid);
                            builder.addServiceUuid(uuid);
                        }
                        }
                    }
                    }
                    int manufacturerId = in.readInt();
                    int manufacturerId = in.readInt();
                    if (in.readInt() == 1) {
                        int manufacturerDataLength = in.readInt();
                        int manufacturerDataLength = in.readInt();
                    if (manufacturerDataLength > 0) {
                        byte[] manufacturerData = new byte[manufacturerDataLength];
                        byte[] manufacturerData = new byte[manufacturerDataLength];
                        in.readByteArray(manufacturerData);
                        in.readByteArray(manufacturerData);
                        builder.setManufacturerData(manufacturerId, manufacturerData);
                        builder.setManufacturerData(manufacturerId, manufacturerData);
                    }
                    }
                    if (in.readInt() == 1) {
                    ParcelUuid serviceDataUuid = in.readParcelable(
                    ParcelUuid serviceDataUuid = in.readParcelable(
                            ParcelUuid.class.getClassLoader());
                            ParcelUuid.class.getClassLoader());
                    if (in.readInt() == 1) {
                        int serviceDataLength = in.readInt();
                        int serviceDataLength = in.readInt();
                        if (serviceDataLength > 0) {
                        byte[] serviceData = new byte[serviceDataLength];
                        byte[] serviceData = new byte[serviceDataLength];
                        in.readByteArray(serviceData);
                        in.readByteArray(serviceData);
                        builder.setServiceData(serviceDataUuid, serviceData);
                        builder.setServiceData(serviceDataUuid, serviceData);
                    }
                    }
                    }
                    builder.setIncludeTxPowerLevel(in.readByte() == 1);
                    builder.setIncludeTxPowerLevel(in.readByte() == 1);
                    builder.setIncludeDeviceName(in.readByte() == 1);
                    builder.setIncludeDeviceName(in.readByte() == 1);
                    return builder.build();
                    return builder.build();
@@ -221,7 +241,7 @@ public final class AdvertiseData implements Parcelable {


        @Nullable
        @Nullable
        private List<ParcelUuid> mServiceUuids = new ArrayList<ParcelUuid>();
        private List<ParcelUuid> mServiceUuids = new ArrayList<ParcelUuid>();
        private int mManufacturerId;
        private int mManufacturerId = -1;
        @Nullable
        @Nullable
        private byte[] mManufacturerSpecificData;
        private byte[] mManufacturerSpecificData;
        @Nullable
        @Nullable
@@ -307,7 +327,6 @@ public final class AdvertiseData implements Parcelable {


        /**
        /**
         * Build the {@link AdvertiseData}.
         * Build the {@link AdvertiseData}.
         *
         */
         */
        public AdvertiseData build() {
        public AdvertiseData build() {
            return new AdvertiseData(mServiceUuids,
            return new AdvertiseData(mServiceUuids,
+144 −0
Original line number Original line Diff line number Diff line
/*
 * 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);
    }
}
+0 −1
Original line number Original line Diff line number Diff line
@@ -186,7 +186,6 @@ public class ScanFilterTest extends TestCase {
        parcel.setDataPosition(0);
        parcel.setDataPosition(0);
        ScanFilter filterFromParcel =
        ScanFilter filterFromParcel =
                ScanFilter.CREATOR.createFromParcel(parcel);
                ScanFilter.CREATOR.createFromParcel(parcel);
        System.out.println(filterFromParcel);
        assertEquals(filter, filterFromParcel);
        assertEquals(filter, filterFromParcel);
    }
    }
}
}