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();
     }