Merge "Bluetooth: make it possible to advertise service solicitation UUID" am: 60ccba0c52 am: 272efa5606
Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1453036 Change-Id: I1a71a69b61cf07aa2111ef1fa8d516053925053e
This commit is contained in:
@@ -9126,6 +9126,7 @@ package android.bluetooth.le {
|
||||
method public boolean getIncludeTxPowerLevel();
|
||||
method public android.util.SparseArray<byte[]> getManufacturerSpecificData();
|
||||
method public java.util.Map<android.os.ParcelUuid,byte[]> getServiceData();
|
||||
method @Nullable public java.util.List<android.os.ParcelUuid> getServiceSolicitationUuids();
|
||||
method public java.util.List<android.os.ParcelUuid> getServiceUuids();
|
||||
method public void writeToParcel(android.os.Parcel, int);
|
||||
field @NonNull public static final android.os.Parcelable.Creator<android.bluetooth.le.AdvertiseData> CREATOR;
|
||||
@@ -9135,6 +9136,7 @@ package android.bluetooth.le {
|
||||
ctor public AdvertiseData.Builder();
|
||||
method public android.bluetooth.le.AdvertiseData.Builder addManufacturerData(int, byte[]);
|
||||
method public android.bluetooth.le.AdvertiseData.Builder addServiceData(android.os.ParcelUuid, byte[]);
|
||||
method @NonNull public android.bluetooth.le.AdvertiseData.Builder addServiceSolicitationUuid(@NonNull android.os.ParcelUuid);
|
||||
method public android.bluetooth.le.AdvertiseData.Builder addServiceUuid(android.os.ParcelUuid);
|
||||
method public android.bluetooth.le.AdvertiseData build();
|
||||
method public android.bluetooth.le.AdvertiseData.Builder setIncludeDeviceName(boolean);
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
|
||||
package android.bluetooth.le;
|
||||
|
||||
import android.annotation.NonNull;
|
||||
import android.annotation.Nullable;
|
||||
import android.os.Parcel;
|
||||
import android.os.ParcelUuid;
|
||||
@@ -43,17 +44,22 @@ public final class AdvertiseData implements Parcelable {
|
||||
@Nullable
|
||||
private final List<ParcelUuid> mServiceUuids;
|
||||
|
||||
@Nullable
|
||||
private final List<ParcelUuid> mServiceSolicitationUuids;
|
||||
|
||||
private final SparseArray<byte[]> mManufacturerSpecificData;
|
||||
private final Map<ParcelUuid, byte[]> mServiceData;
|
||||
private final boolean mIncludeTxPowerLevel;
|
||||
private final boolean mIncludeDeviceName;
|
||||
|
||||
private AdvertiseData(List<ParcelUuid> serviceUuids,
|
||||
List<ParcelUuid> serviceSolicitationUuids,
|
||||
SparseArray<byte[]> manufacturerData,
|
||||
Map<ParcelUuid, byte[]> serviceData,
|
||||
boolean includeTxPowerLevel,
|
||||
boolean includeDeviceName) {
|
||||
mServiceUuids = serviceUuids;
|
||||
mServiceSolicitationUuids = serviceSolicitationUuids;
|
||||
mManufacturerSpecificData = manufacturerData;
|
||||
mServiceData = serviceData;
|
||||
mIncludeTxPowerLevel = includeTxPowerLevel;
|
||||
@@ -68,6 +74,14 @@ public final class AdvertiseData implements Parcelable {
|
||||
return mServiceUuids;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a list of service solicitation UUIDs within the advertisement that we invite to connect.
|
||||
*/
|
||||
@Nullable
|
||||
public List<ParcelUuid> getServiceSolicitationUuids() {
|
||||
return mServiceSolicitationUuids;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an array of manufacturer Id and the corresponding manufacturer specific data. The
|
||||
* manufacturer id is a non-negative number assigned by Bluetooth SIG.
|
||||
@@ -102,8 +116,8 @@ public final class AdvertiseData implements Parcelable {
|
||||
*/
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(mServiceUuids, mManufacturerSpecificData, mServiceData,
|
||||
mIncludeDeviceName, mIncludeTxPowerLevel);
|
||||
return Objects.hash(mServiceUuids, mServiceSolicitationUuids, mManufacturerSpecificData,
|
||||
mServiceData, mIncludeDeviceName, mIncludeTxPowerLevel);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -119,6 +133,7 @@ public final class AdvertiseData implements Parcelable {
|
||||
}
|
||||
AdvertiseData other = (AdvertiseData) obj;
|
||||
return Objects.equals(mServiceUuids, other.mServiceUuids)
|
||||
&& Objects.equals(mServiceSolicitationUuids, other.mServiceSolicitationUuids)
|
||||
&& BluetoothLeUtils.equals(mManufacturerSpecificData,
|
||||
other.mManufacturerSpecificData)
|
||||
&& BluetoothLeUtils.equals(mServiceData, other.mServiceData)
|
||||
@@ -128,7 +143,8 @@ public final class AdvertiseData implements Parcelable {
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "AdvertiseData [mServiceUuids=" + mServiceUuids + ", mManufacturerSpecificData="
|
||||
return "AdvertiseData [mServiceUuids=" + mServiceUuids + ", mServiceSolicitationUuids="
|
||||
+ mServiceSolicitationUuids + ", mManufacturerSpecificData="
|
||||
+ BluetoothLeUtils.toString(mManufacturerSpecificData) + ", mServiceData="
|
||||
+ BluetoothLeUtils.toString(mServiceData)
|
||||
+ ", mIncludeTxPowerLevel=" + mIncludeTxPowerLevel + ", mIncludeDeviceName="
|
||||
@@ -143,6 +159,8 @@ public final class AdvertiseData implements Parcelable {
|
||||
@Override
|
||||
public void writeToParcel(Parcel dest, int flags) {
|
||||
dest.writeTypedArray(mServiceUuids.toArray(new ParcelUuid[mServiceUuids.size()]), flags);
|
||||
dest.writeTypedArray(mServiceSolicitationUuids.toArray(
|
||||
new ParcelUuid[mServiceSolicitationUuids.size()]), flags);
|
||||
|
||||
// mManufacturerSpecificData could not be null.
|
||||
dest.writeInt(mManufacturerSpecificData.size());
|
||||
@@ -174,6 +192,11 @@ public final class AdvertiseData implements Parcelable {
|
||||
builder.addServiceUuid(uuid);
|
||||
}
|
||||
|
||||
ArrayList<ParcelUuid> solicitationUuids = in.createTypedArrayList(ParcelUuid.CREATOR);
|
||||
for (ParcelUuid uuid : solicitationUuids) {
|
||||
builder.addServiceSolicitationUuid(uuid);
|
||||
}
|
||||
|
||||
int manufacturerSize = in.readInt();
|
||||
for (int i = 0; i < manufacturerSize; ++i) {
|
||||
int manufacturerId = in.readInt();
|
||||
@@ -198,6 +221,8 @@ public final class AdvertiseData implements Parcelable {
|
||||
public static final class Builder {
|
||||
@Nullable
|
||||
private List<ParcelUuid> mServiceUuids = new ArrayList<ParcelUuid>();
|
||||
@Nullable
|
||||
private List<ParcelUuid> mServiceSolicitationUuids = new ArrayList<ParcelUuid>();
|
||||
private SparseArray<byte[]> mManufacturerSpecificData = new SparseArray<byte[]>();
|
||||
private Map<ParcelUuid, byte[]> mServiceData = new ArrayMap<ParcelUuid, byte[]>();
|
||||
private boolean mIncludeTxPowerLevel;
|
||||
@@ -207,16 +232,30 @@ public final class AdvertiseData implements Parcelable {
|
||||
* Add a service UUID to advertise data.
|
||||
*
|
||||
* @param serviceUuid A service UUID to be advertised.
|
||||
* @throws IllegalArgumentException If the {@code serviceUuids} are null.
|
||||
* @throws IllegalArgumentException If the {@code serviceUuid} is null.
|
||||
*/
|
||||
public Builder addServiceUuid(ParcelUuid serviceUuid) {
|
||||
if (serviceUuid == null) {
|
||||
throw new IllegalArgumentException("serivceUuids are null");
|
||||
throw new IllegalArgumentException("serviceUuid is null");
|
||||
}
|
||||
mServiceUuids.add(serviceUuid);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a service solicitation UUID to advertise data.
|
||||
*
|
||||
* @param serviceSolicitationUuid A service solicitation UUID to be advertised.
|
||||
* @throws IllegalArgumentException If the {@code serviceSolicitationUuid} is null.
|
||||
*/
|
||||
@NonNull
|
||||
public Builder addServiceSolicitationUuid(@NonNull ParcelUuid serviceSolicitationUuid) {
|
||||
if (serviceSolicitationUuid == null) {
|
||||
throw new IllegalArgumentException("serviceSolicitationUuid is null");
|
||||
}
|
||||
mServiceSolicitationUuids.add(serviceSolicitationUuid);
|
||||
return this;
|
||||
}
|
||||
/**
|
||||
* Add service data to advertise data.
|
||||
*
|
||||
@@ -279,8 +318,9 @@ public final class AdvertiseData implements Parcelable {
|
||||
* Build the {@link AdvertiseData}.
|
||||
*/
|
||||
public AdvertiseData build() {
|
||||
return new AdvertiseData(mServiceUuids, mManufacturerSpecificData, mServiceData,
|
||||
mIncludeTxPowerLevel, mIncludeDeviceName);
|
||||
return new AdvertiseData(mServiceUuids, mServiceSolicitationUuids,
|
||||
mManufacturerSpecificData, mServiceData, mIncludeTxPowerLevel,
|
||||
mIncludeDeviceName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -507,6 +507,33 @@ public final class BluetoothLeAdvertiser {
|
||||
+ num128BitUuids * BluetoothUuid.UUID_BYTES_128_BIT;
|
||||
}
|
||||
}
|
||||
if (data.getServiceSolicitationUuids() != null) {
|
||||
int num16BitUuids = 0;
|
||||
int num32BitUuids = 0;
|
||||
int num128BitUuids = 0;
|
||||
for (ParcelUuid uuid : data.getServiceSolicitationUuids()) {
|
||||
if (BluetoothUuid.is16BitUuid(uuid)) {
|
||||
++num16BitUuids;
|
||||
} else if (BluetoothUuid.is32BitUuid(uuid)) {
|
||||
++num32BitUuids;
|
||||
} else {
|
||||
++num128BitUuids;
|
||||
}
|
||||
}
|
||||
// 16 bit service uuids are grouped into one field when doing advertising.
|
||||
if (num16BitUuids != 0) {
|
||||
size += OVERHEAD_BYTES_PER_FIELD + num16BitUuids * BluetoothUuid.UUID_BYTES_16_BIT;
|
||||
}
|
||||
// 32 bit service uuids are grouped into one field when doing advertising.
|
||||
if (num32BitUuids != 0) {
|
||||
size += OVERHEAD_BYTES_PER_FIELD + num32BitUuids * BluetoothUuid.UUID_BYTES_32_BIT;
|
||||
}
|
||||
// 128 bit service uuids are grouped into one field when doing advertising.
|
||||
if (num128BitUuids != 0) {
|
||||
size += OVERHEAD_BYTES_PER_FIELD
|
||||
+ num128BitUuids * BluetoothUuid.UUID_BYTES_128_BIT;
|
||||
}
|
||||
}
|
||||
for (ParcelUuid uuid : data.getServiceData().keySet()) {
|
||||
int uuidLen = BluetoothUuid.uuidToBytes(uuid).length;
|
||||
size += OVERHEAD_BYTES_PER_FIELD + uuidLen
|
||||
|
||||
@@ -9126,6 +9126,7 @@ package android.bluetooth.le {
|
||||
method public boolean getIncludeTxPowerLevel();
|
||||
method public android.util.SparseArray<byte[]> getManufacturerSpecificData();
|
||||
method public java.util.Map<android.os.ParcelUuid,byte[]> getServiceData();
|
||||
method @Nullable public java.util.List<android.os.ParcelUuid> getServiceSolicitationUuids();
|
||||
method public java.util.List<android.os.ParcelUuid> getServiceUuids();
|
||||
method public void writeToParcel(android.os.Parcel, int);
|
||||
field @NonNull public static final android.os.Parcelable.Creator<android.bluetooth.le.AdvertiseData> CREATOR;
|
||||
@@ -9135,6 +9136,7 @@ package android.bluetooth.le {
|
||||
ctor public AdvertiseData.Builder();
|
||||
method public android.bluetooth.le.AdvertiseData.Builder addManufacturerData(int, byte[]);
|
||||
method public android.bluetooth.le.AdvertiseData.Builder addServiceData(android.os.ParcelUuid, byte[]);
|
||||
method @NonNull public android.bluetooth.le.AdvertiseData.Builder addServiceSolicitationUuid(@NonNull android.os.ParcelUuid);
|
||||
method public android.bluetooth.le.AdvertiseData.Builder addServiceUuid(android.os.ParcelUuid);
|
||||
method public android.bluetooth.le.AdvertiseData build();
|
||||
method public android.bluetooth.le.AdvertiseData.Builder setIncludeDeviceName(boolean);
|
||||
|
||||
Reference in New Issue
Block a user