Address API Council review comments.
Bug:222291418
Bug:222291433
Bug:222291394
Bug:222291470
Bug:222291434
Bug:222291543
Bug:222291565
Bug:219768328
Test: atest CtsNearbyFastPairTestCases
Change-Id: Icc258efcc9230bc3bb1cef87abf91cf483916283
diff --git a/nearby/framework/java/android/nearby/BroadcastCallback.java b/nearby/framework/java/android/nearby/BroadcastCallback.java
index 54c1916..cc94308 100644
--- a/nearby/framework/java/android/nearby/BroadcastCallback.java
+++ b/nearby/framework/java/android/nearby/BroadcastCallback.java
@@ -60,5 +60,5 @@
/**
* Called when broadcast status changes.
*/
- void onStatus(@BroadcastStatus int status);
+ void onStatusChanged(@BroadcastStatus int status);
}
diff --git a/nearby/framework/java/android/nearby/BroadcastRequest.java b/nearby/framework/java/android/nearby/BroadcastRequest.java
index 27468dd..71d51d2 100644
--- a/nearby/framework/java/android/nearby/BroadcastRequest.java
+++ b/nearby/framework/java/android/nearby/BroadcastRequest.java
@@ -38,6 +38,9 @@
@SuppressLint("ParcelNotFinal") // BroadcastRequest constructor is not public
public abstract class BroadcastRequest implements Parcelable {
+ /** An unknown nearby broadcast request type. */
+ public static final int BROADCAST_TYPE_UNKNOWN = -1;
+
/** Broadcast type for advertising using nearby presence protocol. */
public static final int BROADCAST_TYPE_NEARBY_PRESENCE = 3;
@@ -45,31 +48,49 @@
// Currently, only Nearby Presence broadcast is supported, in the future
// broadcasting using other nearby specifications will be added.
@Retention(RetentionPolicy.SOURCE)
- @IntDef({BROADCAST_TYPE_NEARBY_PRESENCE})
+ @IntDef({BROADCAST_TYPE_UNKNOWN, BROADCAST_TYPE_NEARBY_PRESENCE})
public @interface BroadcastType {
}
/**
* Tx Power when the value is not set in the broadcast.
*/
- public static final int UNKNOWN_TX_POWER = -100;
+ public static final int UNKNOWN_TX_POWER = -127;
/**
- * V0 of Nearby Presence Protocol.
+ * An unknown version of presence broadcast request.
+ */
+ public static final int PRESENCE_VERSION_UNKNOWN = -1;
+
+ /**
+ * A legacy presence version that is only suitable for legacy (31 bytes) BLE advertisements.
+ * This exists to support legacy presence version, and not recommended for use.
*/
public static final int PRESENCE_VERSION_V0 = 0;
/**
- * V1 of Nearby Presence Protocol.
+ * V1 of Nearby Presence Protocol. This version supports both legacy (31 bytes) BLE
+ * advertisements, and extended BLE advertisements.
*/
public static final int PRESENCE_VERSION_V1 = 1;
/** @hide **/
@Retention(RetentionPolicy.SOURCE)
- @IntDef({PRESENCE_VERSION_V0, PRESENCE_VERSION_V1})
+ @IntDef({PRESENCE_VERSION_UNKNOWN, PRESENCE_VERSION_V0, PRESENCE_VERSION_V1})
public @interface BroadcastVersion {
}
+ /**
+ * The medium where the broadcast request should be sent.
+ *
+ * @hide
+ */
+ @IntDef({Medium.BLE, Medium.MDNS})
+ public @interface Medium {
+ int BLE = 1;
+ int MDNS = 2;
+ }
+
public static final @NonNull Creator<BroadcastRequest> CREATOR =
new Creator<BroadcastRequest>() {
@Override
@@ -93,10 +114,10 @@
private final @BroadcastType int mType;
private final @BroadcastVersion int mVersion;
private final int mTxPower;
- private final List<Integer> mMediums;
+ private final @Medium List<Integer> mMediums;
BroadcastRequest(@BroadcastType int type, @BroadcastVersion int version, int txPower,
- List<Integer> mediums) {
+ @Medium List<Integer> mediums) {
this.mType = type;
this.mVersion = version;
this.mTxPower = txPower;
@@ -137,6 +158,7 @@
* Returns the list of broadcast mediums.
*/
@NonNull
+ @Medium
public List<Integer> getMediums() {
return mMediums;
}
diff --git a/nearby/framework/java/android/nearby/NearbyManager.java b/nearby/framework/java/android/nearby/NearbyManager.java
index 211ec34..1d91242 100644
--- a/nearby/framework/java/android/nearby/NearbyManager.java
+++ b/nearby/framework/java/android/nearby/NearbyManager.java
@@ -307,7 +307,7 @@
@Override
public void onStatusChanged(int status) {
- mExecutor.execute(()-> mBroadcastCallback.onStatus(status));
+ mExecutor.execute(()-> mBroadcastCallback.onStatusChanged(status));
}
}
}
diff --git a/nearby/framework/java/android/nearby/PresenceBroadcastRequest.java b/nearby/framework/java/android/nearby/PresenceBroadcastRequest.java
index b4d4b55..d01be06 100644
--- a/nearby/framework/java/android/nearby/PresenceBroadcastRequest.java
+++ b/nearby/framework/java/android/nearby/PresenceBroadcastRequest.java
@@ -137,18 +137,20 @@
private final List<Integer> mMediums;
private final List<Integer> mActions;
private final List<DataElement> mExtendedProperties;
+ private final byte[] mSalt;
+ private final PrivateCredential mCredential;
private int mVersion;
private int mTxPower;
- private byte[] mSalt;
- private PrivateCredential mCredential;
- public Builder(@NonNull List<Integer> mediums, @NonNull byte[] salt) {
+ public Builder(@NonNull List<Integer> mediums, @NonNull byte[] salt,
+ @NonNull PrivateCredential credential) {
Preconditions.checkState(!mediums.isEmpty(), "mediums cannot be empty");
Preconditions.checkState(salt != null && salt.length > 0, "salt cannot be empty");
mVersion = PRESENCE_VERSION_V0;
mTxPower = UNKNOWN_TX_POWER;
+ mCredential = credential;
mActions = new ArrayList<>();
mExtendedProperties = new ArrayList<>();
@@ -185,16 +187,6 @@
}
/**
- * Sets the credential associated with the presence broadcast request.
- */
- @NonNull
- public Builder setCredential(@NonNull PrivateCredential credential) {
- Objects.requireNonNull(credential);
- mCredential = credential;
- return this;
- }
-
- /**
* Adds an extended property for the presence broadcast request.
*/
@NonNull
diff --git a/nearby/framework/java/android/nearby/PresenceDevice.java b/nearby/framework/java/android/nearby/PresenceDevice.java
index d5ea0b4..12fc2a3 100644
--- a/nearby/framework/java/android/nearby/PresenceDevice.java
+++ b/nearby/framework/java/android/nearby/PresenceDevice.java
@@ -162,6 +162,12 @@
dest.writeInt(medium);
}
dest.writeInt(getRssi());
+ dest.writeInt(mSalt.length);
+ dest.writeByteArray(mSalt);
+ dest.writeInt(mSecretId.length);
+ dest.writeByteArray(mSecretId);
+ dest.writeInt(mEncryptedIdentity.length);
+ dest.writeByteArray(mEncryptedIdentity);
dest.writeString(mDeviceId);
dest.writeInt(mDeviceType);
dest.writeInt(mDeviceImageUrl == null ? 0 : 1);
@@ -184,26 +190,47 @@
public static final Creator<PresenceDevice> CREATOR = new Creator<PresenceDevice>() {
@Override
public PresenceDevice createFromParcel(Parcel in) {
- Builder builder = new Builder();
+ String name = null;
if (in.readInt() == 1) {
- builder.setName(in.readString());
+ name = in.readString();
}
int size = in.readInt();
+ List<Integer> mediums = new ArrayList<>();
for (int i = 0; i < size; i++) {
- builder.addMedium(in.readInt());
+ mediums.add(in.readInt());
}
- builder.setRssi(in.readInt());
- builder.setDeviceId(in.readString());
- builder.setDeviceType(in.readInt());
+ int rssi = in.readInt();
+ byte[] salt = new byte[in.readInt()];
+ in.readByteArray(salt);
+ byte[] secretId = new byte[in.readInt()];
+ in.readByteArray(secretId);
+ byte[] encryptedIdentity = new byte[in.readInt()];
+ in.readByteArray(encryptedIdentity);
+ String deviceId = in.readString();
+ int deviceType = in.readInt();
+ String deviceImageUrl = null;
if (in.readInt() == 1) {
- builder.setDeviceImageUrl(in.readString());
+ deviceImageUrl = in.readString();
}
- builder.setDiscoveryTimestampMillis(in.readLong());
+ long discoveryTimeMillis = in.readLong();
int dataElementSize = in.readInt();
+ List<DataElement> dataElements = new ArrayList<>();
for (int i = 0; i < dataElementSize; i++) {
- builder.addExtendedProperty(
+ dataElements.add(
in.readParcelable(DataElement.class.getClassLoader(), DataElement.class));
}
+ Builder builder = new Builder(deviceId, salt, secretId, encryptedIdentity)
+ .setName(name)
+ .setRssi(rssi)
+ .setDeviceType(deviceType)
+ .setDeviceImageUrl(deviceImageUrl)
+ .setDiscoveryTimestampMillis(discoveryTimeMillis);
+ for (int i = 0; i < mediums.size(); i++) {
+ builder.addMedium(mediums.get(i));
+ }
+ for (int i = 0; i < dataElements.size(); i++) {
+ builder.addExtendedProperty(dataElements.get(i));
+ }
return builder.build();
}
@@ -220,21 +247,34 @@
private final List<DataElement> mExtendedProperties;
private final List<Integer> mMediums;
+ private final String mDeviceId;
+ private final byte[] mSalt;
+ private final byte[] mSecretId;
+ private final byte[] mEncryptedIdentity;
private String mName;
private int mRssi;
- private String mDeviceId;
- private byte[] mSalt;
- private byte[] mSecretId;
- private byte[] mEncryptedIdentity;
private int mDeviceType;
private String mDeviceImageUrl;
private long mDiscoveryTimestampMillis;
- public Builder() {
+ /**
+ * Constructs a {@link Builder}.
+ *
+ * @param deviceId the identifier on the discovered Presence device
+ * @param salt a random salt used in the beacon from the Presence device.
+ * @param secretId a secret identifier used in the beacon from the Presence device.
+ * @param encryptedIdentity the identity associated with the Presence device.
+ */
+ public Builder(@NonNull String deviceId, @NonNull byte[] salt, @NonNull byte[] secretId,
+ @NonNull byte[] encryptedIdentity) {
+ mDeviceId = deviceId;
+ mSalt = salt;
+ mSecretId = secretId;
+ mEncryptedIdentity = encryptedIdentity;
mMediums = new ArrayList<>();
mExtendedProperties = new ArrayList<>();
- mRssi = -100;
+ mRssi = -127;
}
/**
@@ -271,48 +311,6 @@
}
/**
- * Sets the identifier on the discovered Presence device.
- *
- * @param deviceId Identifier of the Presence device.
- */
- @NonNull
- public Builder setDeviceId(@NonNull String deviceId) {
- Objects.requireNonNull(deviceId);
- mDeviceId = deviceId;
- return this;
- }
-
- /**
- * Sets the identifier on the discovered Presence device.
- */
- @NonNull
- public Builder setSalt(@NonNull byte[] salt) {
- Objects.requireNonNull(salt);
- mSalt = salt;
- return this;
- }
-
- /**
- * Sets the secret id of the discovered Presence device.
- */
- @NonNull
- public Builder setSecretId(@NonNull byte[] secretId) {
- Objects.requireNonNull(secretId);
- mSecretId = secretId;
- return this;
- }
-
- /**
- * Sets the encrypted identity of the discovered Presence device.
- */
- @NonNull
- public Builder setEncryptedIdentity(@NonNull byte[] encryptedIdentity) {
- Objects.requireNonNull(encryptedIdentity);
- mEncryptedIdentity = encryptedIdentity;
- return this;
- }
-
- /**
* Sets the type of discovered Presence device.
*
* @param deviceType Type of the Presence device.
diff --git a/nearby/service/java/com/android/server/nearby/presence/PresenceDiscoveryResult.java b/nearby/service/java/com/android/server/nearby/presence/PresenceDiscoveryResult.java
index 7a77aa9..e48074d 100644
--- a/nearby/service/java/com/android/server/nearby/presence/PresenceDiscoveryResult.java
+++ b/nearby/service/java/com/android/server/nearby/presence/PresenceDiscoveryResult.java
@@ -79,10 +79,13 @@
* Converts a presence device from the discovery result.
*/
public PresenceDevice toPresenceDevice() {
- return new PresenceDevice.Builder()
+ return new PresenceDevice.Builder(
+ // Use the public credential hash as the device Id.
+ String.valueOf(mPublicCredential.hashCode()),
+ mSalt,
+ mPublicCredential.getSecretId(),
+ mPublicCredential.getEncryptedMetadata())
.setRssi(mRssi)
- .setSalt(mSalt)
- .setSecretId(mPublicCredential.getSecretId())
.addMedium(NearbyDevice.Medium.BLE).build();
}
diff --git a/nearby/tests/cts/fastpair/src/android/nearby/cts/NearbyManagerTest.java b/nearby/tests/cts/fastpair/src/android/nearby/cts/NearbyManagerTest.java
index eedcce1..9dd4a93 100644
--- a/nearby/tests/cts/fastpair/src/android/nearby/cts/NearbyManagerTest.java
+++ b/nearby/tests/cts/fastpair/src/android/nearby/cts/NearbyManagerTest.java
@@ -106,8 +106,8 @@
.setIdentityType(IDENTITY_TYPE_PRIVATE)
.build();
BroadcastRequest broadcastRequest =
- new PresenceBroadcastRequest.Builder(Collections.singletonList(BLE_MEDIUM), SALT)
- .setCredential(credential)
+ new PresenceBroadcastRequest.Builder(
+ Collections.singletonList(BLE_MEDIUM), SALT, credential)
.build();
BroadcastCallback callback = status -> {
diff --git a/nearby/tests/cts/fastpair/src/android/nearby/cts/PresenceBroadcastRequestTest.java b/nearby/tests/cts/fastpair/src/android/nearby/cts/PresenceBroadcastRequestTest.java
index 67d5aa4..3c831a2 100644
--- a/nearby/tests/cts/fastpair/src/android/nearby/cts/PresenceBroadcastRequestTest.java
+++ b/nearby/tests/cts/fastpair/src/android/nearby/cts/PresenceBroadcastRequestTest.java
@@ -66,10 +66,10 @@
.setMetadataEncryptionKey(METADATA_ENCRYPTION_KEY)
.build();
DataElement element = new DataElement(KEY, VALUE);
- mBuilder = new PresenceBroadcastRequest.Builder(Collections.singletonList(BLE_MEDIUM), SALT)
+ mBuilder = new PresenceBroadcastRequest.Builder(Collections.singletonList(BLE_MEDIUM), SALT,
+ credential)
.setTxPower(TX_POWER)
.setVersion(VERSION)
- .setCredential(credential)
.addAction(ACTION_ID)
.addExtendedProperty(element);
}
diff --git a/nearby/tests/cts/fastpair/src/android/nearby/cts/PresenceDeviceTest.java b/nearby/tests/cts/fastpair/src/android/nearby/cts/PresenceDeviceTest.java
index e0d9200..5fefc68 100644
--- a/nearby/tests/cts/fastpair/src/android/nearby/cts/PresenceDeviceTest.java
+++ b/nearby/tests/cts/fastpair/src/android/nearby/cts/PresenceDeviceTest.java
@@ -55,19 +55,16 @@
@Test
@SdkSuppress(minSdkVersion = 32, codeName = "T")
public void testBuilder() {
- PresenceDevice device = new PresenceDevice.Builder()
- .setDeviceType(DEVICE_TYPE)
- .setDeviceId(DEVICE_ID)
- .setDeviceImageUrl(IMAGE_URL)
- .addExtendedProperty(new DataElement(KEY, VALUE))
- .setRssi(RSSI)
- .addMedium(MEDIUM)
- .setName(DEVICE_NAME)
- .setDiscoveryTimestampMillis(DISCOVERY_MILLIS)
- .setSalt(SALT)
- .setSecretId(SECRET_ID)
- .setEncryptedIdentity(ENCRYPTED_IDENTITY)
- .build();
+ PresenceDevice device =
+ new PresenceDevice.Builder(DEVICE_ID, SALT, SECRET_ID, ENCRYPTED_IDENTITY)
+ .setDeviceType(DEVICE_TYPE)
+ .setDeviceImageUrl(IMAGE_URL)
+ .addExtendedProperty(new DataElement(KEY, VALUE))
+ .setRssi(RSSI)
+ .addMedium(MEDIUM)
+ .setName(DEVICE_NAME)
+ .setDiscoveryTimestampMillis(DISCOVERY_MILLIS)
+ .build();
assertThat(device.getDeviceType()).isEqualTo(DEVICE_TYPE);
assertThat(device.getDeviceId()).isEqualTo(DEVICE_ID);
@@ -87,13 +84,13 @@
@Test
@SdkSuppress(minSdkVersion = 32, codeName = "T")
public void testWriteParcel() {
- PresenceDevice device = new PresenceDevice.Builder()
- .setDeviceId(DEVICE_ID)
- .addExtendedProperty(new DataElement(KEY, VALUE))
- .setRssi(RSSI)
- .addMedium(MEDIUM)
- .setName(DEVICE_NAME)
- .build();
+ PresenceDevice device =
+ new PresenceDevice.Builder(DEVICE_ID, SALT, SECRET_ID, ENCRYPTED_IDENTITY)
+ .addExtendedProperty(new DataElement(KEY, VALUE))
+ .setRssi(RSSI)
+ .addMedium(MEDIUM)
+ .setName(DEVICE_NAME)
+ .build();
Parcel parcel = Parcel.obtain();
device.writeToParcel(parcel, 0);
diff --git a/nearby/tests/unit/src/com/android/server/nearby/presence/FastAdvertisementTest.java b/nearby/tests/unit/src/com/android/server/nearby/presence/FastAdvertisementTest.java
index 19fbbc1..73d7695 100644
--- a/nearby/tests/unit/src/com/android/server/nearby/presence/FastAdvertisementTest.java
+++ b/nearby/tests/unit/src/com/android/server/nearby/presence/FastAdvertisementTest.java
@@ -56,9 +56,8 @@
.build();
mBuilder =
new PresenceBroadcastRequest.Builder(Collections.singletonList(MEDIUM_TYPE_BLE),
- SALT)
+ SALT, mCredential)
.setTxPower(TX_POWER)
- .setCredential(mCredential)
.setVersion(BroadcastRequest.PRESENCE_VERSION_V0)
.addAction(PRESENCE_ACTION);
}
diff --git a/nearby/tests/unit/src/com/android/server/nearby/provider/BroadcastProviderManagerTest.java b/nearby/tests/unit/src/com/android/server/nearby/provider/BroadcastProviderManagerTest.java
index 7f2168e..71ece63 100644
--- a/nearby/tests/unit/src/com/android/server/nearby/provider/BroadcastProviderManagerTest.java
+++ b/nearby/tests/unit/src/com/android/server/nearby/provider/BroadcastProviderManagerTest.java
@@ -92,9 +92,8 @@
.build();
mBroadcastRequest =
new PresenceBroadcastRequest.Builder(Collections.singletonList(MEDIUM_TYPE_BLE),
- SALT)
+ SALT, privateCredential)
.setTxPower(TX_POWER)
- .setCredential(privateCredential)
.setVersion(BroadcastRequest.PRESENCE_VERSION_V0)
.addAction(PRESENCE_ACTION).build();
}