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

Commit dd1eed00 authored by Subramanian Srinivasan's avatar Subramanian Srinivasan Committed by Bruno Martins
Browse files

Add support for Transport discovery AD type (1/2)

Add support for Transport discovery AD type in
BLE advertisement data.

CRs-Fixed: 2299975
Change-Id: I76ef89856746ea5d88af77142a38398b33393449
parent 9d32a645
Loading
Loading
Loading
Loading
+40 −5
Original line number Diff line number Diff line
@@ -47,17 +47,20 @@ public final class AdvertiseData implements Parcelable {
    private final Map<ParcelUuid, byte[]> mServiceData;
    private final boolean mIncludeTxPowerLevel;
    private final boolean mIncludeDeviceName;
    private final byte[] mTransportDiscoveryData;

    private AdvertiseData(List<ParcelUuid> serviceUuids,
            SparseArray<byte[]> manufacturerData,
            Map<ParcelUuid, byte[]> serviceData,
            boolean includeTxPowerLevel,
            boolean includeDeviceName) {
            boolean includeDeviceName,
            byte[] transportDiscoveryData) {
        mServiceUuids = serviceUuids;
        mManufacturerSpecificData = manufacturerData;
        mServiceData = serviceData;
        mIncludeTxPowerLevel = includeTxPowerLevel;
        mIncludeDeviceName = includeDeviceName;
        mTransportDiscoveryData = transportDiscoveryData;
    }

    /**
@@ -97,13 +100,21 @@ public final class AdvertiseData implements Parcelable {
        return mIncludeDeviceName;
    }

    /**
     * Returns an array of Transport Discovery data.
     * @hide
     */
    public byte[] getTransportDiscoveryData() {
        return mTransportDiscoveryData;
    }

    /**
     * @hide
     */
    @Override
    public int hashCode() {
        return Objects.hash(mServiceUuids, mManufacturerSpecificData, mServiceData,
                mIncludeDeviceName, mIncludeTxPowerLevel);
                mIncludeDeviceName, mIncludeTxPowerLevel, mTransportDiscoveryData);
    }

    /**
@@ -123,7 +134,8 @@ public final class AdvertiseData implements Parcelable {
                    other.mManufacturerSpecificData)
                && BluetoothLeUtils.equals(mServiceData, other.mServiceData)
                && mIncludeDeviceName == other.mIncludeDeviceName
                && mIncludeTxPowerLevel == other.mIncludeTxPowerLevel;
                && mIncludeTxPowerLevel == other.mIncludeTxPowerLevel
                && BluetoothLeUtils.equals(mTransportDiscoveryData, other.mTransportDiscoveryData);
    }

    @Override
@@ -132,7 +144,8 @@ public final class AdvertiseData implements Parcelable {
                + BluetoothLeUtils.toString(mManufacturerSpecificData) + ", mServiceData="
                + BluetoothLeUtils.toString(mServiceData)
                + ", mIncludeTxPowerLevel=" + mIncludeTxPowerLevel + ", mIncludeDeviceName="
                + mIncludeDeviceName + "]";
                + mIncludeDeviceName + ", mTransportDiscoveryData="
                + BluetoothLeUtils.toString(mTransportDiscoveryData)+ "]";
    }

    @Override
@@ -157,6 +170,10 @@ public final class AdvertiseData implements Parcelable {
        }
        dest.writeByte((byte) (getIncludeTxPowerLevel() ? 1 : 0));
        dest.writeByte((byte) (getIncludeDeviceName() ? 1 : 0));
        if(mTransportDiscoveryData != null) {
            dest.writeInt(mTransportDiscoveryData.length);
            dest.writeByteArray(mTransportDiscoveryData);
        }
    }

    public static final @android.annotation.NonNull Parcelable.Creator<AdvertiseData> CREATOR =
@@ -188,6 +205,11 @@ public final class AdvertiseData implements Parcelable {
                    }
                    builder.setIncludeTxPowerLevel(in.readByte() == 1);
                    builder.setIncludeDeviceName(in.readByte() == 1);
                    int transportDiscoveryDataSize = in.readInt();
                    if (transportDiscoveryDataSize > 0) {
                        byte[] transportDiscoveryData = in.createByteArray();
                        builder.addTransportDiscoveryData(transportDiscoveryData);
                    }
                    return builder.build();
                }
            };
@@ -202,6 +224,7 @@ public final class AdvertiseData implements Parcelable {
        private Map<ParcelUuid, byte[]> mServiceData = new ArrayMap<ParcelUuid, byte[]>();
        private boolean mIncludeTxPowerLevel;
        private boolean mIncludeDeviceName;
        private byte[] mTransportDiscoveryData;

        /**
         * Add a service UUID to advertise data.
@@ -275,12 +298,24 @@ public final class AdvertiseData implements Parcelable {
            return this;
        }

        /**
         * Add Transport Discovery data
         * @hide
         */
        public Builder addTransportDiscoveryData(byte[] transportDiscoveryData) {
            if ((transportDiscoveryData == null) || (transportDiscoveryData.length == 0)) {
                throw new IllegalArgumentException("transportDiscoveryData is null");
            }
            mTransportDiscoveryData = transportDiscoveryData;
            return this;
        }

        /**
         * Build the {@link AdvertiseData}.
         */
        public AdvertiseData build() {
            return new AdvertiseData(mServiceUuids, mManufacturerSpecificData, mServiceData,
                    mIncludeTxPowerLevel, mIncludeDeviceName);
                    mIncludeTxPowerLevel, mIncludeDeviceName, mTransportDiscoveryData);
        }
    }
}
+41 −0
Original line number Diff line number Diff line
@@ -76,6 +76,28 @@ public class BluetoothLeUtils {
        return buffer.toString();
    }

    /**
     * Returns a string composed from a byte array.
     */
    static <T> String toString(byte[] data) {
        if (data == null) {
            return "null";
        }
        if (data.length == 0) {
            return "{}";
        }
        StringBuilder buffer = new StringBuilder();
        buffer.append('{');
        for(int i=0; i < data.length; i++) {
            buffer.append(data[i]);
            if ((i+1) < data.length) {
                buffer.append(", ");
            }
        }
        buffer.append('}');
        return buffer.toString();
    }

    /**
     * Check whether two {@link SparseArray} equal.
     */
@@ -125,6 +147,25 @@ public class BluetoothLeUtils {
        return true;
    }

    /**
     * Check whether two byte arrays are equal.
     */
    static <T> boolean equals(byte[] data, byte[] otherData) {
        if (data == otherData) {
            return true;
        }
        if (data == null || otherData == null) {
            return false;
        }
        if (data.length != otherData.length) {
            return false;
        }
        if (!Objects.deepEquals(data, otherData)) {
            return false;
        }
        return true;
    }

    /**
     * Ensure Bluetooth is turned on.
     *