Merge "Add toString helper method"
diff --git a/nearby/framework/java/android/nearby/BroadcastCallback.java b/nearby/framework/java/android/nearby/BroadcastCallback.java
index 84e19b0..54c1916 100644
--- a/nearby/framework/java/android/nearby/BroadcastCallback.java
+++ b/nearby/framework/java/android/nearby/BroadcastCallback.java
@@ -16,14 +16,49 @@
 
 package android.nearby;
 
+import android.annotation.IntDef;
+import android.annotation.SystemApi;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
 /**
  * Callback when broadcasting request using nearby specification.
  *
  * @hide
  */
+@SystemApi
 public interface BroadcastCallback {
+    /** Broadcast was successful. */
+    int STATUS_OK = 0;
+
+    /** General status code when broadcast failed. */
+    int STATUS_FAILURE = 1;
+
+    /**
+     * Broadcast failed as the callback was already registered.
+     */
+    int STATUS_FAILURE_ALREADY_REGISTERED = 2;
+
+    /**
+     * Broadcast failed as the request contains excessive data.
+     */
+    int STATUS_FAILURE_SIZE_EXCEED_LIMIT = 3;
+
+    /**
+     * Broadcast failed as the client doesn't hold required permissions.
+     */
+    int STATUS_FAILURE_MISSING_PERMISSIONS = 4;
+
+    /** @hide **/
+    @Retention(RetentionPolicy.SOURCE)
+    @IntDef({STATUS_OK, STATUS_FAILURE, STATUS_FAILURE_ALREADY_REGISTERED,
+            STATUS_FAILURE_SIZE_EXCEED_LIMIT, STATUS_FAILURE_MISSING_PERMISSIONS})
+    @interface BroadcastStatus {
+    }
+
     /**
      * Called when broadcast status changes.
      */
-    void onStatus(int status);
+    void onStatus(@BroadcastStatus int status);
 }
diff --git a/nearby/framework/java/android/nearby/BroadcastRequest.java b/nearby/framework/java/android/nearby/BroadcastRequest.java
index 1f408d4..27468dd 100644
--- a/nearby/framework/java/android/nearby/BroadcastRequest.java
+++ b/nearby/framework/java/android/nearby/BroadcastRequest.java
@@ -17,8 +17,10 @@
 package android.nearby;
 
 import android.annotation.IntDef;
+import android.annotation.IntRange;
 import android.annotation.NonNull;
 import android.annotation.SuppressLint;
+import android.annotation.SystemApi;
 import android.os.Parcel;
 import android.os.Parcelable;
 
@@ -32,6 +34,7 @@
  *
  * @hide
  */
+@SystemApi
 @SuppressLint("ParcelNotFinal")  // BroadcastRequest constructor is not public
 public abstract class BroadcastRequest implements Parcelable {
 
@@ -39,6 +42,8 @@
     public static final int BROADCAST_TYPE_NEARBY_PRESENCE = 3;
 
     /** @hide **/
+    // 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})
     public @interface BroadcastType {
@@ -114,7 +119,7 @@
     }
 
     /**
-     * Returns the version fo the broadcast.
+     * Returns the version of the broadcast.
      */
     public @BroadcastVersion int getVersion() {
         return mVersion;
@@ -123,12 +128,13 @@
     /**
      * Returns the calibrated TX power when this request is broadcast.
      */
+    @IntRange(from = -127, to = 126)
     public int getTxPower() {
         return mTxPower;
     }
 
     /**
-     * Returns the list broadcast mediums.
+     * Returns the list of broadcast mediums.
      */
     @NonNull
     public List<Integer> getMediums() {
diff --git a/nearby/framework/java/android/nearby/CredentialElement.java b/nearby/framework/java/android/nearby/CredentialElement.java
index 5f31c17..d2049d1 100644
--- a/nearby/framework/java/android/nearby/CredentialElement.java
+++ b/nearby/framework/java/android/nearby/CredentialElement.java
@@ -17,6 +17,7 @@
 package android.nearby;
 
 import android.annotation.NonNull;
+import android.annotation.SystemApi;
 import android.os.Parcel;
 import android.os.Parcelable;
 
@@ -27,11 +28,17 @@
  *
  * @hide
  */
+@SystemApi
 public final class CredentialElement implements Parcelable {
     private final String mKey;
     private final byte[] mValue;
 
-    private CredentialElement(String key, byte[] value) {
+    /**
+     * Constructs a {@link CredentialElement}.
+     */
+    public CredentialElement(@NonNull String key, @NonNull byte[] value) {
+        Preconditions.checkState(key != null && value != null,
+                "neither key or value can be null");
         mKey = key;
         mValue = value;
     }
@@ -44,7 +51,7 @@
                     String key = in.readString();
                     byte[] value = new byte[in.readInt()];
                     in.readByteArray(value);
-                    return new CredentialElement.Builder().setElement(key, value).build();
+                    return new CredentialElement(key, value);
                 }
 
                 @Override
@@ -80,33 +87,4 @@
     public byte[] getValue() {
         return mValue;
     }
-
-    /**
-     * Builder for {@link CredentialElement}.
-     */
-    public static final class Builder {
-        private String mKey;
-        private byte[] mValue;
-
-        /**
-         * Set the key and value for this credential element.
-         */
-        @NonNull
-        @SuppressWarnings("MissingGetterMatchingBuilder")
-        public CredentialElement.Builder setElement(@NonNull String key, @NonNull byte[] value) {
-            mKey = key;
-            mValue = value;
-            return this;
-        }
-
-        /**
-         * Builds a {@link CredentialElement}.
-         */
-        @NonNull
-        public CredentialElement build() {
-            Preconditions.checkState(mKey != null && mValue != null,
-                    "neither key or value can be null");
-            return new CredentialElement(mKey, mValue);
-        }
-    }
 }
diff --git a/nearby/framework/java/android/nearby/DataElement.java b/nearby/framework/java/android/nearby/DataElement.java
index f037612..6fa5fb5 100644
--- a/nearby/framework/java/android/nearby/DataElement.java
+++ b/nearby/framework/java/android/nearby/DataElement.java
@@ -17,6 +17,7 @@
 package android.nearby;
 
 import android.annotation.NonNull;
+import android.annotation.SystemApi;
 import android.os.Parcel;
 import android.os.Parcelable;
 
@@ -28,12 +29,17 @@
  *
  * @hide
  */
+@SystemApi
 public final class DataElement implements Parcelable {
 
     private final int mKey;
     private final byte[] mValue;
 
-    private DataElement(int key, byte[] value) {
+    /**
+     * Constructs a {@link DataElement}.
+     */
+    public DataElement(int key, @NonNull byte[] value) {
+        Preconditions.checkState(value != null, "value cannot be null");
         mKey = key;
         mValue = value;
     }
@@ -45,7 +51,7 @@
             int key = in.readInt();
             byte[] value = new byte[in.readInt()];
             in.readByteArray(value);
-            return new Builder().setElement(key, value).build();
+            return new DataElement(key, value);
         }
 
         @Override
@@ -67,7 +73,7 @@
     }
 
     /**
-     * Returns the key of the data element.
+     * Returns the key of the data element, as defined in the nearby presence specification.
      */
     public int getKey() {
         return mKey;
@@ -80,33 +86,4 @@
     public byte[] getValue() {
         return mValue;
     }
-
-    /**
-     * Builder for {@link DataElement}.
-     */
-    public static final class Builder {
-        private int mKey;
-        private byte[] mValue;
-
-        /**
-         * Set the key and value for this data element.
-         */
-        @NonNull
-        @SuppressWarnings("MissingGetterMatchingBuilder")
-        public Builder setElement(int key, @NonNull byte[] value) {
-            mKey = key;
-            mValue = value;
-            return this;
-        }
-
-        /**
-         * Builds a {@link DataElement}.
-         */
-        @NonNull
-        public DataElement build() {
-            Preconditions.checkState(mValue != null,
-                    "value can be null");
-            return new DataElement(mKey, mValue);
-        }
-    }
 }
diff --git a/nearby/framework/java/android/nearby/FastPairDevice.java b/nearby/framework/java/android/nearby/FastPairDevice.java
index 1e766a5..e12b4f8 100644
--- a/nearby/framework/java/android/nearby/FastPairDevice.java
+++ b/nearby/framework/java/android/nearby/FastPairDevice.java
@@ -22,7 +22,9 @@
 import android.os.Parcel;
 import android.os.Parcelable;
 
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.List;
 import java.util.Objects;
 
 /**
@@ -41,7 +43,10 @@
             if (in.readInt() == 1) {
                 builder.setName(in.readString());
             }
-            builder.setMedium(in.readInt());
+            int size = in.readInt();
+            for (int i = 0; i < size; i++) {
+                builder.addMedium(in.readInt());
+            }
             builder.setRssi(in.readInt());
             if (in.readInt() == 1) {
                 builder.setModelId(in.readString());
@@ -75,7 +80,7 @@
      * Creates a new FastPairDevice.
      *
      * @param name Name of the FastPairDevice. Can be {@code null} if there is no name.
-     * @param medium The {@link Medium} over which the device is discovered.
+     * @param mediums The {@link Medium}s over which the device is discovered.
      * @param rssi The received signal strength in dBm.
      * @param modelId The identifier of the Fast Pair device.
      *                Can be {@code null} if there is no Model ID.
@@ -83,44 +88,18 @@
      * @param data Extra data for a Fast Pair device.
      */
     public FastPairDevice(@Nullable String name,
-            @Medium int medium,
+            List<Integer> mediums,
             int rssi,
             @Nullable String modelId,
             @NonNull String bluetoothAddress,
             @Nullable byte[] data) {
-        super(name, medium, rssi);
+        super(name, mediums, rssi);
         this.mModelId = modelId;
         this.mBluetoothAddress = bluetoothAddress;
         this.mData = data;
     }
 
     /**
-     * Gets the name of the device, or {@code null} if not available.
-     *
-     * @hide
-     */
-    @Nullable
-    @Override
-    public String getName() {
-        return mName;
-    }
-
-    /** Gets the medium over which this device was discovered. */
-    @Override
-    public int getMedium() {
-        return mMedium;
-    }
-
-    /**
-     * Gets the received signal strength in dBm.
-     */
-    @IntRange(from = -127, to  = 126)
-    @Override
-    public int getRssi() {
-        return mRssi;
-    }
-
-    /**
      * Gets the identifier of the Fast Pair device. Can be {@code null} if there is no Model ID.
      */
     @Nullable
@@ -161,11 +140,15 @@
     public String toString() {
         StringBuilder stringBuilder = new StringBuilder();
         stringBuilder.append("FastPairDevice [");
-        if (mName != null && !mName.isEmpty()) {
-            stringBuilder.append("name=").append(mName).append(", ");
+        String name = getName();
+        if (getName() != null && !name.isEmpty()) {
+            stringBuilder.append("name=").append(name).append(", ");
         }
-        stringBuilder.append("medium=").append(mediumToString(mMedium));
-        stringBuilder.append(" rssi=").append(mRssi);
+        stringBuilder.append("medium={");
+        for (int medium: getMediums()) {
+            stringBuilder.append(mediumToString(medium));
+        }
+        stringBuilder.append("} rssi=").append(getRssi());
         stringBuilder.append(" modelId=").append(mModelId);
         stringBuilder.append(" bluetoothAddress=").append(mBluetoothAddress);
         stringBuilder.append("]");
@@ -189,17 +172,23 @@
     @Override
     public int hashCode() {
         return Objects.hash(
-                mName, mMedium, mRssi, mModelId, mBluetoothAddress, Arrays.hashCode(mData));
+                getName(), getMediums(), getRssi(), mModelId, mBluetoothAddress,
+                Arrays.hashCode(mData));
     }
 
     @Override
     public void writeToParcel(@NonNull Parcel dest, int flags) {
-        dest.writeInt(mName == null ? 0 : 1);
-        if (mName != null) {
-            dest.writeString(mName);
+        String name = getName();
+        dest.writeInt(name == null ? 0 : 1);
+        if (name != null) {
+            dest.writeString(name);
         }
-        dest.writeInt(mMedium);
-        dest.writeInt(mRssi);
+        List<Integer> mediums = getMediums();
+        dest.writeInt(mediums.size());
+        for (int medium : mediums) {
+            dest.writeInt(medium);
+        }
+        dest.writeInt(getRssi());
         dest.writeInt(mModelId == null ? 0 : 1);
         if (mModelId != null) {
             dest.writeString(mModelId);
@@ -218,13 +207,18 @@
      * @hide
      */
     public static final class Builder {
+        private final List<Integer> mMediums;
 
         @Nullable private String mName;
-        @Medium private int mMedium;
         private int mRssi;
         @Nullable private String mModelId;
         private String mBluetoothAddress;
         @Nullable private byte[] mData;
+
+        public Builder() {
+            mMediums = new ArrayList<>();
+        }
+
         /**
          * Sets the name of the Fast Pair device.
          *
@@ -242,8 +236,8 @@
          * @param medium The {@link Medium} over which the device is discovered.
          */
         @NonNull
-        public Builder setMedium(@Medium int medium) {
-            mMedium = medium;
+        public Builder addMedium(@Medium int medium) {
+            mMediums.add(medium);
             return this;
         }
 
@@ -253,7 +247,7 @@
          * @param rssi The received signal strength in dBm.
          */
         @NonNull
-        public Builder setRssi(int rssi) {
+        public Builder setRssi(@IntRange(from = -127, to = 126) int rssi) {
             mRssi = rssi;
             return this;
         }
@@ -298,7 +292,7 @@
          */
         @NonNull
         public FastPairDevice build() {
-            return new FastPairDevice(mName, mMedium, mRssi, mModelId,
+            return new FastPairDevice(mName, mMediums, mRssi, mModelId,
                     mBluetoothAddress, mData);
         }
     }
diff --git a/nearby/framework/java/android/nearby/NearbyDevice.java b/nearby/framework/java/android/nearby/NearbyDevice.java
index 790b2ed..538940c 100644
--- a/nearby/framework/java/android/nearby/NearbyDevice.java
+++ b/nearby/framework/java/android/nearby/NearbyDevice.java
@@ -18,11 +18,13 @@
 
 import android.annotation.IntDef;
 import android.annotation.IntRange;
+import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.annotation.SystemApi;
 
 import com.android.internal.util.Preconditions;
 
+import java.util.List;
 import java.util.Objects;
 
 /**
@@ -34,27 +36,29 @@
 public abstract class NearbyDevice {
 
     @Nullable
-    final String mName;
+    private final String mName;
 
     @Medium
-    final int mMedium;
+    private final List<Integer> mMediums;
 
-    final int mRssi;
+    private final int mRssi;
 
     /**
      * Creates a new NearbyDevice.
      *
      * @param name Local device name. Can be {@code null} if there is no name.
-     * @param medium The {@link Medium} over which the device is discovered.
+     * @param mediums The {@link Medium}s over which the device is discovered.
      * @param rssi The received signal strength in dBm.
      * @hide
      */
-    public NearbyDevice(@Nullable String name, @Medium int medium, int rssi) {
-        Preconditions.checkState(isValidMedium(medium),
-                "Not supported medium: " + medium
-                        + ", scan medium must be one of NearbyDevice#Medium.");
+    public NearbyDevice(@Nullable String name, List<Integer> mediums, int rssi) {
+        for (int medium : mediums) {
+            Preconditions.checkState(isValidMedium(medium),
+                    "Not supported medium: " + medium
+                            + ", scan medium must be one of NearbyDevice#Medium.");
+        }
         mName = name;
-        mMedium = medium;
+        mMediums = mediums;
         mRssi = rssi;
     }
 
@@ -81,8 +85,6 @@
 
     /**
      * The name of the device, or null if not available.
-     *
-     * @hide
      */
     @Nullable
     public String getName() {
@@ -90,9 +92,9 @@
     }
 
     /** The medium over which this device was discovered. */
-    @Medium
-    public int getMedium() {
-        return mMedium;
+    @NonNull
+    @Medium public List<Integer> getMediums() {
+        return mMediums;
     }
 
     /**
@@ -110,8 +112,11 @@
         if (mName != null && !mName.isEmpty()) {
             stringBuilder.append("name=").append(mName).append(", ");
         }
-        stringBuilder.append("medium=").append(mediumToString(mMedium));
-        stringBuilder.append(" rssi=").append(mRssi);
+        stringBuilder.append("medium={");
+        for (int medium : mMediums) {
+            stringBuilder.append(mediumToString(medium));
+        }
+        stringBuilder.append("} rssi=").append(mRssi);
         stringBuilder.append("]");
         return stringBuilder.toString();
     }
@@ -121,7 +126,7 @@
         if (other instanceof NearbyDevice) {
             NearbyDevice otherDevice = (NearbyDevice) other;
             return Objects.equals(mName, otherDevice.mName)
-                    && mMedium == otherDevice.mMedium
+                    && mMediums == otherDevice.mMediums
                     && mRssi == otherDevice.mRssi;
         }
         return false;
@@ -129,7 +134,7 @@
 
     @Override
     public int hashCode() {
-        return Objects.hash(mName, mMedium, mRssi);
+        return Objects.hash(mName, mMediums, mRssi);
     }
 
     /**
diff --git a/nearby/framework/java/android/nearby/NearbyManager.java b/nearby/framework/java/android/nearby/NearbyManager.java
index f8eef7f..7fb14ef 100644
--- a/nearby/framework/java/android/nearby/NearbyManager.java
+++ b/nearby/framework/java/android/nearby/NearbyManager.java
@@ -67,7 +67,7 @@
         if (scanType == ScanRequest.SCAN_TYPE_FAST_PAIR) {
             return new FastPairDevice.Builder()
                     .setName(nearbyDeviceParcelable.getName())
-                    .setMedium(nearbyDeviceParcelable.getMedium())
+                    .addMedium(nearbyDeviceParcelable.getMedium())
                     .setRssi(nearbyDeviceParcelable.getRssi())
                     .setModelId(nearbyDeviceParcelable.getFastPairModelId())
                     .setBluetoothAddress(nearbyDeviceParcelable.getBluetoothAddress())
@@ -146,8 +146,6 @@
      * @param broadcastRequest Request for the nearby broadcast.
      * @param executor Executor for running the callback.
      * @param callback Callback for notifying the client..
-     *
-     * @hide
      */
     public void startBroadcast(@NonNull BroadcastRequest broadcastRequest,
             @CallbackExecutor @NonNull Executor executor, @NonNull BroadcastCallback callback) {
@@ -158,8 +156,6 @@
      * Stop the broadcast associated with the given callback.
      *
      * @param callback The callback that was used for starting the broadcast.
-     *
-     * @hide
      */
     @SuppressLint("ExecutorRegistration")
     public void stopBroadcast(@NonNull BroadcastCallback callback) {
diff --git a/nearby/framework/java/android/nearby/PresenceBroadcastRequest.java b/nearby/framework/java/android/nearby/PresenceBroadcastRequest.java
index 7e387b5..b4d4b55 100644
--- a/nearby/framework/java/android/nearby/PresenceBroadcastRequest.java
+++ b/nearby/framework/java/android/nearby/PresenceBroadcastRequest.java
@@ -16,7 +16,9 @@
 
 package android.nearby;
 
+import android.annotation.IntRange;
 import android.annotation.NonNull;
+import android.annotation.SystemApi;
 import android.os.Parcel;
 import android.os.Parcelable;
 
@@ -24,12 +26,14 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 
 /**
  * Request for Nearby Presence Broadcast.
  *
  * @hide
  */
+@SystemApi
 public final class PresenceBroadcastRequest extends BroadcastRequest implements Parcelable {
     private final byte[] mSalt;
     private final List<Integer> mActions;
@@ -128,8 +132,6 @@
 
     /**
      * Builder for {@link PresenceBroadcastRequest}.
-     *
-     * @hide
      */
     public static final class Builder {
         private final List<Integer> mMediums;
@@ -141,12 +143,17 @@
         private byte[] mSalt;
         private PrivateCredential mCredential;
 
-        public Builder() {
+        public Builder(@NonNull List<Integer> mediums, @NonNull byte[] salt) {
+            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;
-            mMediums = new ArrayList<>();
             mActions = new ArrayList<>();
             mExtendedProperties = new ArrayList<>();
+
+            mSalt = salt;
+            mMediums = mediums;
         }
 
         /**
@@ -159,37 +166,20 @@
         }
 
         /**
-         * Sets the calibrated tx power level for this request.
+         * Sets the calibrated tx power level in dBm for this request. The tx power level should
+         * be between -127 dBm and 126 dBm.
          */
         @NonNull
-        public Builder setTxPower(int txPower) {
+        public Builder setTxPower(@IntRange(from = -127, to = 126) int txPower) {
             mTxPower = txPower;
             return this;
         }
 
         /**
-         * Add a medium for the presence broadcast request.
-         */
-        @NonNull
-        public Builder addMediums(int medium) {
-            mMediums.add(medium);
-            return this;
-        }
-
-        /**
-         * Sets the salt for the presence broadcast request.
-         */
-        @NonNull
-        public Builder setSalt(byte[] salt) {
-            mSalt = salt;
-            return this;
-        }
-
-        /**
          * Adds an action for the presence broadcast request.
          */
         @NonNull
-        public Builder addAction(int action) {
+        public Builder addAction(@IntRange(from = 1, to = 255) int action) {
             mActions.add(action);
             return this;
         }
@@ -199,6 +189,7 @@
          */
         @NonNull
         public Builder setCredential(@NonNull PrivateCredential credential) {
+            Objects.requireNonNull(credential);
             mCredential = credential;
             return this;
         }
@@ -207,7 +198,8 @@
          * Adds an extended property for the presence broadcast request.
          */
         @NonNull
-        public Builder addExtendedProperty(DataElement dataElement) {
+        public Builder addExtendedProperty(@NonNull DataElement dataElement) {
+            Objects.requireNonNull(dataElement);
             mExtendedProperties.add(dataElement);
             return this;
         }
@@ -217,8 +209,6 @@
          */
         @NonNull
         public PresenceBroadcastRequest build() {
-            Preconditions.checkState(!mMediums.isEmpty(), "mediums cannot be empty");
-            Preconditions.checkState(mSalt != null && mSalt.length > 0, "salt cannot be empty");
             return new PresenceBroadcastRequest(mVersion, mTxPower, mMediums, mSalt, mActions,
                     mCredential, mExtendedProperties);
         }
diff --git a/nearby/framework/java/android/nearby/PresenceCredential.java b/nearby/framework/java/android/nearby/PresenceCredential.java
index 14b17ae..fae3603 100644
--- a/nearby/framework/java/android/nearby/PresenceCredential.java
+++ b/nearby/framework/java/android/nearby/PresenceCredential.java
@@ -19,6 +19,7 @@
 import android.annotation.IntDef;
 import android.annotation.NonNull;
 import android.annotation.SuppressLint;
+import android.annotation.SystemApi;
 import android.os.Parcel;
 import android.os.Parcelable;
 
@@ -32,6 +33,7 @@
  *
  * @hide
  */
+@SystemApi
 @SuppressLint("ParcelNotFinal")  // PresenceCredential constructor is not public
 public abstract class PresenceCredential implements Parcelable {
     /**
@@ -86,10 +88,10 @@
     private final List<CredentialElement> mCredentialElements;
 
     PresenceCredential(@CredentialType int type, @IdentityType int identityType,
-            byte[] secreteId, byte[] authenticityKey, List<CredentialElement> credentialElements) {
+            byte[] secretId, byte[] authenticityKey, List<CredentialElement> credentialElements) {
         mType = type;
         mIdentityType = identityType;
-        mSecretId = secreteId;
+        mSecretId = secretId;
         mAuthenticityKey = authenticityKey;
         mCredentialElements = credentialElements;
     }
diff --git a/nearby/framework/java/android/nearby/PresenceDevice.java b/nearby/framework/java/android/nearby/PresenceDevice.java
index 0b3782c..d5ea0b4 100644
--- a/nearby/framework/java/android/nearby/PresenceDevice.java
+++ b/nearby/framework/java/android/nearby/PresenceDevice.java
@@ -19,18 +19,22 @@
 import android.annotation.IntDef;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
-import android.os.Bundle;
+import android.annotation.SystemApi;
 import android.os.Parcel;
 import android.os.Parcelable;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
 
 /**
  * Represents a Presence device from nearby scans.
  *
  * @hide
  */
+@SystemApi
 public final class PresenceDevice extends NearbyDevice implements Parcelable {
 
     /** The type of presence device. */
@@ -69,18 +73,7 @@
     private final int mDeviceType;
     private final String mDeviceImageUrl;
     private final long mDiscoveryTimestampMillis;
-    private final Bundle mExtendedProperties;
-
-    /**
-     * Gets the name of the device, or {@code null} if not available.
-     *
-     * @hide
-     */
-    @Nullable
-    @Override
-    public String getName() {
-        return mName;
-    }
+    private final List<DataElement> mExtendedProperties;
 
     /**
      * The id of the device.
@@ -137,16 +130,15 @@
      * The extended properties of the device.
      */
     @NonNull
-    public Bundle getExtendedProperties() {
+    public List<DataElement> getExtendedProperties() {
         return mExtendedProperties;
     }
 
-    private PresenceDevice(String deviceName, int mMedium, int rssi, String deviceId,
+    private PresenceDevice(String deviceName, List<Integer> mMediums, int rssi, String deviceId,
             byte[] salt, byte[] secretId, byte[] encryptedIdentity, int deviceType,
             String deviceImageUrl, long discoveryTimestampMillis,
-            Bundle extendedProperties) {
-        // TODO (b/217462253): change medium to a set in NearbyDevice.
-        super(deviceName, mMedium, rssi);
+            List<DataElement> extendedProperties) {
+        super(deviceName, mMediums, rssi);
         mDeviceId = deviceId;
         mSalt = salt;
         mSecretId = secretId;
@@ -159,12 +151,17 @@
 
     @Override
     public void writeToParcel(@NonNull Parcel dest, int flags) {
-        dest.writeInt(mName == null ? 0 : 1);
-        if (mName != null) {
-            dest.writeString(mName);
+        String name = getName();
+        dest.writeInt(name == null ? 0 : 1);
+        if (name != null) {
+            dest.writeString(name);
         }
-        dest.writeInt(mMedium);
-        dest.writeInt(mRssi);
+        List<Integer> mediums = getMediums();
+        dest.writeInt(mediums.size());
+        for (int medium : mediums) {
+            dest.writeInt(medium);
+        }
+        dest.writeInt(getRssi());
         dest.writeString(mDeviceId);
         dest.writeInt(mDeviceType);
         dest.writeInt(mDeviceImageUrl == null ? 0 : 1);
@@ -172,7 +169,10 @@
             dest.writeString(mDeviceImageUrl);
         }
         dest.writeLong(mDiscoveryTimestampMillis);
-        dest.writeBundle(mExtendedProperties);
+        dest.writeInt(mExtendedProperties.size());
+        for (DataElement dataElement : mExtendedProperties) {
+            dest.writeParcelable(dataElement, 0);
+        }
     }
 
     @Override
@@ -188,7 +188,10 @@
             if (in.readInt() == 1) {
                 builder.setName(in.readString());
             }
-            builder.setMedium(in.readInt());
+            int size = in.readInt();
+            for (int i = 0; i < size; i++) {
+                builder.addMedium(in.readInt());
+            }
             builder.setRssi(in.readInt());
             builder.setDeviceId(in.readString());
             builder.setDeviceType(in.readInt());
@@ -196,9 +199,10 @@
                 builder.setDeviceImageUrl(in.readString());
             }
             builder.setDiscoveryTimestampMillis(in.readLong());
-            Bundle bundle = in.readBundle();
-            for (String key : bundle.keySet()) {
-                builder.addExtendedProperty(key, bundle.getCharSequence(key).toString());
+            int dataElementSize = in.readInt();
+            for (int i = 0; i < dataElementSize; i++) {
+                builder.addExtendedProperty(
+                        in.readParcelable(DataElement.class.getClassLoader(), DataElement.class));
             }
             return builder.build();
         }
@@ -211,16 +215,14 @@
 
     /**
      * Builder class for {@link PresenceDevice}.
-     *
-     * @hide
      */
     public static final class Builder {
 
-        private final Bundle mExtendedProperties;
+        private final List<DataElement> mExtendedProperties;
+        private final List<Integer> mMediums;
 
         private String mName;
         private int mRssi;
-        private int mMedium;
         private String mDeviceId;
         private byte[] mSalt;
         private byte[] mSecretId;
@@ -230,7 +232,8 @@
         private long mDiscoveryTimestampMillis;
 
         public Builder() {
-            mExtendedProperties = new Bundle();
+            mMediums = new ArrayList<>();
+            mExtendedProperties = new ArrayList<>();
             mRssi = -100;
         }
 
@@ -240,19 +243,19 @@
          * @param name Name of the Presence. Can be {@code null} if there is no name.
          */
         @NonNull
-        public Builder setName(@android.annotation.Nullable String name) {
+        public Builder setName(@Nullable String name) {
             mName = name;
             return this;
         }
 
         /**
-         * Sets the medium over which the Presence device is discovered.
+         * Adds the medium over which the Presence device is discovered.
          *
          * @param medium The {@link Medium} over which the device is discovered.
          */
         @NonNull
-        public Builder setMedium(@Medium int medium) {
-            mMedium = medium;
+        public Builder addMedium(@Medium int medium) {
+            mMediums.add(medium);
             return this;
         }
 
@@ -274,6 +277,7 @@
          */
         @NonNull
         public Builder setDeviceId(@NonNull String deviceId) {
+            Objects.requireNonNull(deviceId);
             mDeviceId = deviceId;
             return this;
         }
@@ -283,15 +287,17 @@
          */
         @NonNull
         public Builder setSalt(@NonNull byte[] salt) {
+            Objects.requireNonNull(salt);
             mSalt = salt;
             return this;
         }
 
         /**
-         * Sets the secret Id of the discovered Presence device.
+         * Sets the secret id of the discovered Presence device.
          */
         @NonNull
         public Builder setSecretId(@NonNull byte[] secretId) {
+            Objects.requireNonNull(secretId);
             mSecretId = secretId;
             return this;
         }
@@ -301,6 +307,7 @@
          */
         @NonNull
         public Builder setEncryptedIdentity(@NonNull byte[] encryptedIdentity) {
+            Objects.requireNonNull(encryptedIdentity);
             mEncryptedIdentity = encryptedIdentity;
             return this;
         }
@@ -311,7 +318,7 @@
          * @param deviceType Type of the Presence device.
          */
         @NonNull
-        public Builder setDeviceType(int deviceType) {
+        public Builder setDeviceType(@DeviceType int deviceType) {
             mDeviceType = deviceType;
             return this;
         }
@@ -323,7 +330,7 @@
          * @param deviceImageUrl Url of the image for the Presence device.
          */
         @NonNull
-        public Builder setDeviceImageUrl(@NonNull String deviceImageUrl) {
+        public Builder setDeviceImageUrl(@Nullable String deviceImageUrl) {
             mDeviceImageUrl = deviceImageUrl;
             return this;
         }
@@ -344,12 +351,12 @@
         /**
          * Adds an extended property of the discovered presence device.
          *
-         * @param key   Key of the extended property.
-         * @param value Value of the extended property,
+         * @param dataElement Data element of the extended property.
          */
         @NonNull
-        public Builder addExtendedProperty(@NonNull String key, @NonNull String value) {
-            mExtendedProperties.putCharSequence(key, value);
+        public Builder addExtendedProperty(@NonNull DataElement dataElement) {
+            Objects.requireNonNull(dataElement);
+            mExtendedProperties.add(dataElement);
             return this;
         }
 
@@ -358,7 +365,7 @@
          */
         @NonNull
         public PresenceDevice build() {
-            return new PresenceDevice(mName, mMedium, mRssi, mDeviceId,
+            return new PresenceDevice(mName, mMediums, mRssi, mDeviceId,
                     mSalt, mSecretId, mEncryptedIdentity,
                     mDeviceType,
                     mDeviceImageUrl,
diff --git a/nearby/framework/java/android/nearby/PresenceScanFilter.java b/nearby/framework/java/android/nearby/PresenceScanFilter.java
index e9b5faa..f0c3c06 100644
--- a/nearby/framework/java/android/nearby/PresenceScanFilter.java
+++ b/nearby/framework/java/android/nearby/PresenceScanFilter.java
@@ -16,7 +16,9 @@
 
 package android.nearby;
 
+import android.annotation.IntRange;
 import android.annotation.NonNull;
+import android.annotation.SystemApi;
 import android.os.Parcel;
 import android.os.Parcelable;
 import android.util.ArraySet;
@@ -25,6 +27,7 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 import java.util.Set;
 
 /**
@@ -32,6 +35,7 @@
  *
  * @hide
  */
+@SystemApi
 public final class PresenceScanFilter extends ScanFilter implements Parcelable {
 
     private final List<PublicCredential> mCredentials;
@@ -134,18 +138,16 @@
 
     /**
      * Builder for {@link PresenceScanFilter}.
-     *
-     * @hide
      */
     public static final class Builder {
-        private int mRssiThreshold;
+        private int mMaxPathLoss;
         private final Set<PublicCredential> mCredentials;
         private final Set<Integer> mPresenceIdentities;
         private final Set<Integer> mPresenceActions;
         private final List<DataElement> mExtendedProperties;
 
         public Builder() {
-            mRssiThreshold = -100;
+            mMaxPathLoss = 127;
             mCredentials = new ArraySet<>();
             mPresenceIdentities = new ArraySet<>();
             mPresenceActions = new ArraySet<>();
@@ -153,29 +155,33 @@
         }
 
         /**
-         * Sets the rssi threshold for the scan request.
+         * Sets the max path loss (in dBm) for the scan request. The path loss is the attenuation
+         * of radio energy between sender and receiver. Path loss here is defined as (TxPower -
+         * Rssi).
          */
         @NonNull
-        public Builder setRssiThreshold(int rssiThreshold) {
-            mRssiThreshold = rssiThreshold;
+        public Builder setMaxPathLoss(@IntRange(from = 0, to = 127) int maxPathLoss) {
+            mMaxPathLoss = maxPathLoss;
             return this;
         }
 
         /**
-         * Adds a list of credentials the scan filter is expected to match.
+         * Adds a credential the scan filter is expected to match.
          */
 
         @NonNull
         public Builder addCredential(@NonNull PublicCredential credential) {
+            Objects.requireNonNull(credential);
             mCredentials.add(credential);
             return this;
         }
 
         /**
-         * Adds a presence action for filtering.
+         * Adds a presence action for filtering, which is an action the discoverer could take
+         * when it receives the broadcast of a presence device.
          */
         @NonNull
-        public Builder addPresenceAction(int action) {
+        public Builder addPresenceAction(@IntRange(from = 1, to = 255) int action) {
             mPresenceActions.add(action);
             return this;
         }
@@ -185,6 +191,7 @@
          */
         @NonNull
         public Builder addExtendedProperty(@NonNull DataElement dataElement) {
+            Objects.requireNonNull(dataElement);
             mExtendedProperties.add(dataElement);
             return this;
         }
@@ -195,7 +202,7 @@
         @NonNull
         public PresenceScanFilter build() {
             Preconditions.checkState(!mCredentials.isEmpty(), "credentials cannot be empty");
-            return new PresenceScanFilter(mRssiThreshold,
+            return new PresenceScanFilter(mMaxPathLoss,
                     new ArrayList<>(mCredentials),
                     new ArrayList<>(mPresenceActions),
                     mExtendedProperties);
diff --git a/nearby/framework/java/android/nearby/PrivateCredential.java b/nearby/framework/java/android/nearby/PrivateCredential.java
index 2860fdb..8db49fa 100644
--- a/nearby/framework/java/android/nearby/PrivateCredential.java
+++ b/nearby/framework/java/android/nearby/PrivateCredential.java
@@ -17,6 +17,7 @@
 package android.nearby;
 
 import android.annotation.NonNull;
+import android.annotation.SystemApi;
 import android.os.Parcel;
 import android.os.Parcelable;
 
@@ -30,6 +31,7 @@
  *
  * @hide
  */
+@SystemApi
 public final class PrivateCredential extends PresenceCredential implements Parcelable {
 
     @NonNull
@@ -46,23 +48,23 @@
         }
     };
 
-    private byte[] mMetaDataEncryptionKey;
+    private byte[] mMetadataEncryptionKey;
     private String mDeviceName;
 
     private PrivateCredential(Parcel in) {
         super(CREDENTIAL_TYPE_PRIVATE, in);
-        mMetaDataEncryptionKey = new byte[in.readInt()];
-        in.readByteArray(mMetaDataEncryptionKey);
+        mMetadataEncryptionKey = new byte[in.readInt()];
+        in.readByteArray(mMetadataEncryptionKey);
         mDeviceName = in.readString();
     }
 
-    private PrivateCredential(int identityType, byte[] secreteId,
+    private PrivateCredential(int identityType, byte[] secretId,
             String deviceName, byte[] authenticityKey, List<CredentialElement> credentialElements,
-            byte[] metaDataEncryptionKey) {
-        super(CREDENTIAL_TYPE_PRIVATE, identityType, secreteId, authenticityKey,
+            byte[] metadataEncryptionKey) {
+        super(CREDENTIAL_TYPE_PRIVATE, identityType, secretId, authenticityKey,
                 credentialElements);
         mDeviceName = deviceName;
-        mMetaDataEncryptionKey = metaDataEncryptionKey;
+        mMetadataEncryptionKey = metadataEncryptionKey;
     }
 
     static PrivateCredential createFromParcelBody(Parcel in) {
@@ -77,8 +79,8 @@
     @Override
     public void writeToParcel(@NonNull Parcel dest, int flags) {
         super.writeToParcel(dest, flags);
-        dest.writeInt(mMetaDataEncryptionKey.length);
-        dest.writeByteArray(mMetaDataEncryptionKey);
+        dest.writeInt(mMetadataEncryptionKey.length);
+        dest.writeByteArray(mMetadataEncryptionKey);
         dest.writeString(mDeviceName);
     }
 
@@ -86,8 +88,8 @@
      * Returns the metadata encryption key associated with this credential.
      */
     @NonNull
-    public byte[] getMetaDataEncryptionKey() {
-        return mMetaDataEncryptionKey;
+    public byte[] getMetadataEncryptionKey() {
+        return mMetadataEncryptionKey;
     }
 
     /**
@@ -100,19 +102,23 @@
 
     /**
      * Builder class for {@link PresenceCredential}.
-     *
-     * @hide
      */
     public static final class Builder {
         private final List<CredentialElement> mCredentialElements;
 
         private @IdentityType int mIdentityType;
-        private byte[] mSecreteId;
+        private byte[] mSecretId;
         private byte[] mAuthenticityKey;
-        private byte[] mMetaDataEncryptionKey;
+        private byte[] mMetadataEncryptionKey;
         private String mDeviceName;
 
-        public Builder() {
+        public Builder(@NonNull byte[] secretId, @NonNull byte[] authenticityKey) {
+            Preconditions.checkState(secretId != null && secretId.length > 0,
+                    "secret id cannot be empty");
+            Preconditions.checkState(authenticityKey != null && authenticityKey.length > 0,
+                    "authenticity key cannot be empty");
+            mSecretId = secretId;
+            mAuthenticityKey = authenticityKey;
             mCredentialElements = new ArrayList<>();
         }
 
@@ -126,29 +132,11 @@
         }
 
         /**
-         * Sets the secrete id for the presence credential.
-         */
-        @NonNull
-        public Builder setSecretId(@NonNull byte[] secreteId) {
-            mSecreteId = secreteId;
-            return this;
-        }
-
-        /**
-         * Sets the authenticity key for the presence credential.
-         */
-        @NonNull
-        public Builder setAuthenticityKey(@NonNull byte[] authenticityKey) {
-            mAuthenticityKey = authenticityKey;
-            return this;
-        }
-
-        /**
          * Sets the metadata encryption key to the credential.
          */
         @NonNull
-        public Builder setMetaDataEncryptionKey(@NonNull byte[] metaDataEncryptionKey) {
-            mMetaDataEncryptionKey = metaDataEncryptionKey;
+        public Builder setMetadataEncryptionKey(@NonNull byte[] metadataEncryptionKey) {
+            mMetadataEncryptionKey = metadataEncryptionKey;
             return this;
         }
 
@@ -175,12 +163,8 @@
          */
         @NonNull
         public PrivateCredential build() {
-            Preconditions.checkState(mSecreteId != null && mSecreteId.length > 0,
-                    "secrete id cannot be empty");
-            Preconditions.checkState(mAuthenticityKey != null && mAuthenticityKey.length > 0,
-                    "authenticity key cannot be empty");
-            return new PrivateCredential(mIdentityType, mSecreteId, mDeviceName,
-                    mAuthenticityKey, mCredentialElements, mMetaDataEncryptionKey);
+            return new PrivateCredential(mIdentityType, mSecretId, mDeviceName,
+                    mAuthenticityKey, mCredentialElements, mMetadataEncryptionKey);
         }
 
     }
diff --git a/nearby/framework/java/android/nearby/PublicCredential.java b/nearby/framework/java/android/nearby/PublicCredential.java
index 78f6205..715e7fd 100644
--- a/nearby/framework/java/android/nearby/PublicCredential.java
+++ b/nearby/framework/java/android/nearby/PublicCredential.java
@@ -17,19 +17,20 @@
 package android.nearby;
 
 import android.annotation.NonNull;
+import android.annotation.SystemApi;
 import android.os.Parcel;
 import android.os.Parcelable;
 
-import com.android.internal.util.Preconditions;
-
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 
 /**
  * Represents a public credential.
  *
  * @hide
  */
+@SystemApi
 public final class PublicCredential extends PresenceCredential implements Parcelable {
     @NonNull
     public static final Creator<PublicCredential> CREATOR = new Creator<PublicCredential>() {
@@ -47,15 +48,15 @@
 
     private final byte[] mPublicKey;
     private final byte[] mEncryptedMetadata;
-    private final byte[] mMetaDataEncryptionKeyTag;
+    private final byte[] mEncryptedMetadataKeyTag;
 
-    private PublicCredential(int identityType, byte[] secreteId, byte[] authenticityKey,
+    private PublicCredential(int identityType, byte[] secretId, byte[] authenticityKey,
             List<CredentialElement> credentialElements, byte[] publicKey, byte[] encryptedMetadata,
-            byte[] metaDataEncryptionKeyTag) {
-        super(CREDENTIAL_TYPE_PUBLIC, identityType, secreteId, authenticityKey, credentialElements);
+            byte[] metadataEncryptionKeyTag) {
+        super(CREDENTIAL_TYPE_PUBLIC, identityType, secretId, authenticityKey, credentialElements);
         mPublicKey = publicKey;
         mEncryptedMetadata = encryptedMetadata;
-        mMetaDataEncryptionKeyTag = metaDataEncryptionKeyTag;
+        mEncryptedMetadataKeyTag = metadataEncryptionKeyTag;
     }
 
     private PublicCredential(Parcel in) {
@@ -64,8 +65,8 @@
         in.readByteArray(mPublicKey);
         mEncryptedMetadata = new byte[in.readInt()];
         in.readByteArray(mEncryptedMetadata);
-        mMetaDataEncryptionKeyTag = new byte[in.readInt()];
-        in.readByteArray(mMetaDataEncryptionKeyTag);
+        mEncryptedMetadataKeyTag = new byte[in.readInt()];
+        in.readByteArray(mEncryptedMetadataKeyTag);
     }
 
     static PublicCredential createFromParcelBody(Parcel in) {
@@ -92,8 +93,8 @@
      * Returns the metadata encryption key tag associated with this credential.
      */
     @NonNull
-    public byte[] getMetaDataEncryptionKeyTag() {
-        return mMetaDataEncryptionKeyTag;
+    public byte[] getEncryptedMetadataKeyTag() {
+        return mEncryptedMetadataKeyTag;
     }
 
     @Override
@@ -108,26 +109,28 @@
         dest.writeByteArray(mPublicKey);
         dest.writeInt(mEncryptedMetadata.length);
         dest.writeByteArray(mEncryptedMetadata);
-        dest.writeInt(mMetaDataEncryptionKeyTag.length);
-        dest.writeByteArray(mMetaDataEncryptionKeyTag);
+        dest.writeInt(mEncryptedMetadataKeyTag.length);
+        dest.writeByteArray(mEncryptedMetadataKeyTag);
     }
 
     /**
      * Builder class for {@link PresenceCredential}.
-     *
-     * @hide
      */
     public static final class Builder {
         private final List<CredentialElement> mCredentialElements;
 
         private @IdentityType int mIdentityType;
-        private byte[] mSecreteId;
+        private byte[] mSecretId;
         private byte[] mAuthenticityKey;
         private byte[] mPublicKey;
         private byte[] mEncryptedMetadata;
-        private byte[] mMetaDataEncryptionKeyTag;
+        private byte[] mEncryptedMetadataKeyTag;
 
-        public Builder() {
+        public Builder(@NonNull byte[] secretId, @NonNull byte[] authenticityKey) {
+            Objects.requireNonNull(secretId);
+            Objects.requireNonNull(authenticityKey);
+            mSecretId = secretId;
+            mAuthenticityKey = authenticityKey;
             mCredentialElements = new ArrayList<>();
         }
 
@@ -141,28 +144,11 @@
         }
 
         /**
-         * Sets the secrete id for the presence credential.
-         */
-        @NonNull
-        public Builder setSecretId(@NonNull byte[] secreteId) {
-            mSecreteId = secreteId;
-            return this;
-        }
-
-        /**
-         * Sets the authenticity key for the presence credential.
-         */
-        @NonNull
-        public Builder setAuthenticityKey(@NonNull byte[] authenticityKey) {
-            mAuthenticityKey = authenticityKey;
-            return this;
-        }
-
-        /**
          * Adds an element to the credential.
          */
         @NonNull
         public Builder addCredentialElement(@NonNull CredentialElement credentialElement) {
+            Objects.requireNonNull(credentialElement);
             mCredentialElements.add(credentialElement);
             return this;
         }
@@ -172,6 +158,7 @@
          */
         @NonNull
         public Builder setPublicKey(@NonNull byte[] publicKey) {
+            Objects.requireNonNull(publicKey);
             mPublicKey = publicKey;
             return this;
         }
@@ -181,16 +168,18 @@
          */
         @NonNull
         public Builder setEncryptedMetadata(@NonNull byte[] encryptedMetadata) {
+            Objects.requireNonNull(encryptedMetadata);
             mEncryptedMetadata = encryptedMetadata;
             return this;
         }
 
         /**
-         * Sets the metadata encryption key tag.
+         * Sets the encrypted metadata key tag.
          */
         @NonNull
-        public Builder setMetaDataEncryptionKeyTag(@NonNull byte[] metaDataEncryptionKeyTag) {
-            mMetaDataEncryptionKeyTag = metaDataEncryptionKeyTag;
+        public Builder setEncryptedMetadataKeyTag(@NonNull byte[] encryptedMetadataKeyTag) {
+            Objects.requireNonNull(encryptedMetadataKeyTag);
+            mEncryptedMetadataKeyTag = encryptedMetadataKeyTag;
             return this;
         }
 
@@ -199,11 +188,8 @@
          */
         @NonNull
         public PublicCredential build() {
-            Preconditions.checkState(mSecreteId.length > 0, "secrete id cannot be empty");
-            Preconditions.checkState(mAuthenticityKey.length > 0,
-                    "authenticity key cannot be empty");
-            return new PublicCredential(mIdentityType, mSecreteId, mAuthenticityKey,
-                    mCredentialElements, mPublicKey, mEncryptedMetadata, mMetaDataEncryptionKeyTag);
+            return new PublicCredential(mIdentityType, mSecretId, mAuthenticityKey,
+                    mCredentialElements, mPublicKey, mEncryptedMetadata, mEncryptedMetadataKeyTag);
         }
 
     }
diff --git a/nearby/framework/java/android/nearby/ScanFilter.java b/nearby/framework/java/android/nearby/ScanFilter.java
index 0b2a754..e16c6a0 100644
--- a/nearby/framework/java/android/nearby/ScanFilter.java
+++ b/nearby/framework/java/android/nearby/ScanFilter.java
@@ -16,8 +16,10 @@
 
 package android.nearby;
 
+import android.annotation.IntRange;
 import android.annotation.NonNull;
 import android.annotation.SuppressLint;
+import android.annotation.SystemApi;
 import android.os.Parcel;
 import android.os.Parcelable;
 
@@ -26,6 +28,7 @@
  *
  * @hide
  */
+@SystemApi
 @SuppressLint("ParcelNotFinal")  // ScanFilter constructor is not public
 public abstract class ScanFilter implements Parcelable {
     public static final @NonNull Creator<ScanFilter> CREATOR = new Creator<ScanFilter>() {
@@ -33,6 +36,8 @@
         public ScanFilter createFromParcel(Parcel in) {
             int type = in.readInt();
             switch (type) {
+                // Currently, only Nearby Presence filtering is supported, in the future
+                // filtering other nearby specifications will be added.
                 case ScanRequest.SCAN_TYPE_NEARBY_PRESENCE:
                     return PresenceScanFilter.createFromParcelBody(in);
                 default:
@@ -48,16 +53,16 @@
     };
 
     private final @ScanRequest.ScanType int mType;
-    private final int mRssiThreshold;
+    private final int mMaxPathLoss;
 
     /**
      * Constructs a Scan Filter.
      *
      * @hide
      */
-    ScanFilter(@ScanRequest.ScanType int type, int rssiThreshold) {
+    ScanFilter(@ScanRequest.ScanType int type, @IntRange(from = 0, to = 127) int maxPathLoss) {
         mType = type;
-        mRssiThreshold = rssiThreshold;
+        mMaxPathLoss = maxPathLoss;
     }
 
     /**
@@ -67,7 +72,7 @@
      */
     ScanFilter(@ScanRequest.ScanType int type, Parcel in) {
         mType = type;
-        mRssiThreshold = in.readInt();
+        mMaxPathLoss = in.readInt();
     }
 
     /**
@@ -78,16 +83,19 @@
     }
 
     /**
-     * Minimum RSSI of the received scan result.
+     * Returns the maximum path loss (in dBm) of the received scan result. The path loss is the
+     * attenuation of radio energy between sender and receiver. Path loss here is defined as
+     * (TxPower - Rssi).
      */
-    public int getRssiThreshold() {
-        return mRssiThreshold;
+    @IntRange(from = 0, to = 127)
+    public int getMaxPathLoss() {
+        return mMaxPathLoss;
     }
 
     @Override
     public void writeToParcel(@NonNull Parcel dest, int flags) {
         dest.writeInt(mType);
-        dest.writeInt(mRssiThreshold);
+        dest.writeInt(mMaxPathLoss);
     }
 
     /**
@@ -97,5 +105,4 @@
     public int describeContents() {
         return 0;
     }
-
 }
diff --git a/nearby/framework/java/android/nearby/ScanRequest.java b/nearby/framework/java/android/nearby/ScanRequest.java
index 9180d5e..7ff0631 100644
--- a/nearby/framework/java/android/nearby/ScanRequest.java
+++ b/nearby/framework/java/android/nearby/ScanRequest.java
@@ -126,7 +126,7 @@
     /**
      * Returns true if an integer is a defined scan type.
      */
-    public static boolean isValidScanType(int scanType) {
+    public static boolean isValidScanType(@ScanType int scanType) {
         return scanType == SCAN_TYPE_FAST_PAIR
                 || scanType == SCAN_TYPE_NEARBY_SHARE
                 || scanType == SCAN_TYPE_NEARBY_PRESENCE
@@ -136,7 +136,7 @@
     /**
      * Returns true if an integer is a defined scan mode.
      */
-    public static boolean isValidScanMode(int scanMode) {
+    public static boolean isValidScanMode(@ScanMode int scanMode) {
         return scanMode == SCAN_MODE_LOW_LATENCY
                 || scanMode == SCAN_MODE_BALANCED
                 || scanMode == SCAN_MODE_LOW_POWER
@@ -166,8 +166,6 @@
 
     /**
      * Returns Scan Filters for this request.
-     *
-     * @hide
      */
     @NonNull
     public List<ScanFilter> getScanFilters() {
@@ -334,11 +332,10 @@
          * usage of Nearby scans.
          *
          * @param scanFilter Filter for scanning the request.
-         *
-         * @hide
          */
         @NonNull
         public Builder addScanFilter(@NonNull ScanFilter scanFilter) {
+            Objects.requireNonNull(scanFilter);
             mScanFilters.add(scanFilter);
             return this;
         }
diff --git a/nearby/service/java/com/android/server/nearby/provider/Utils.java b/nearby/service/java/com/android/server/nearby/provider/Utils.java
index ddb01fa..3aceb7d 100644
--- a/nearby/service/java/com/android/server/nearby/provider/Utils.java
+++ b/nearby/service/java/com/android/server/nearby/provider/Utils.java
@@ -291,30 +291,42 @@
         if (metadata == null) {
             return null;
         }
+
+        Rpcs.Device.Builder deviceBuilder = Rpcs.Device.newBuilder();
+        if (metadata.antiSpoofPublicKey != null) {
+            deviceBuilder.setAntiSpoofingKeyPair(Rpcs.AntiSpoofingKeyPair.newBuilder()
+                    .setPublicKey(ByteString.copyFrom(metadata.antiSpoofPublicKey))
+                    .build());
+        }
+        if (metadata.deviceMetadata != null) {
+            Rpcs.TrueWirelessHeadsetImages.Builder imagesBuilder =
+                    Rpcs.TrueWirelessHeadsetImages.newBuilder();
+            if (metadata.deviceMetadata.trueWirelessImageUrlLeftBud != null) {
+                imagesBuilder.setLeftBudUrl(metadata.deviceMetadata.trueWirelessImageUrlLeftBud);
+            }
+            if (metadata.deviceMetadata.trueWirelessImageUrlRightBud != null) {
+                imagesBuilder.setRightBudUrl(metadata.deviceMetadata.trueWirelessImageUrlRightBud);
+            }
+            if (metadata.deviceMetadata.trueWirelessImageUrlCase != null) {
+                imagesBuilder.setCaseUrl(metadata.deviceMetadata.trueWirelessImageUrlCase);
+            }
+            deviceBuilder.setTrueWirelessImages(imagesBuilder.build());
+            if (metadata.deviceMetadata.imageUrl != null) {
+                deviceBuilder.setImageUrl(metadata.deviceMetadata.imageUrl);
+            }
+            if (metadata.deviceMetadata.intentUri != null) {
+                deviceBuilder.setIntentUri(metadata.deviceMetadata.intentUri);
+            }
+            if (metadata.deviceMetadata.name != null) {
+                deviceBuilder.setName(metadata.deviceMetadata.name);
+            }
+            deviceBuilder.setBleTxPower(metadata.deviceMetadata.bleTxPower)
+                    .setTriggerDistance(metadata.deviceMetadata.triggerDistance)
+                    .setDeviceType(Rpcs.DeviceType.forNumber(metadata.deviceMetadata.deviceType));
+        }
+
         return Rpcs.GetObservedDeviceResponse.newBuilder()
-                .setDevice(Rpcs.Device.newBuilder()
-                        .setAntiSpoofingKeyPair(Rpcs.AntiSpoofingKeyPair.newBuilder()
-                                .setPublicKey(ByteString.copyFrom(metadata.antiSpoofPublicKey))
-                                .build())
-                        .setTrueWirelessImages(Rpcs.TrueWirelessHeadsetImages.newBuilder()
-                                .setLeftBudUrl(
-                                        metadata.deviceMetadata.trueWirelessImageUrlLeftBud)
-                                .setRightBudUrl(
-                                        metadata.deviceMetadata
-                                                .trueWirelessImageUrlRightBud)
-                                .setCaseUrl(
-                                        metadata.deviceMetadata
-                                                .trueWirelessImageUrlCase
-                                )
-                                .build())
-                        .setImageUrl(metadata.deviceMetadata.imageUrl)
-                        .setIntentUri(metadata.deviceMetadata.intentUri)
-                        .setName(metadata.deviceMetadata.name)
-                        .setBleTxPower(metadata.deviceMetadata.bleTxPower)
-                        .setTriggerDistance(metadata.deviceMetadata.triggerDistance)
-                        .setDeviceType(
-                                Rpcs.DeviceType.forNumber(metadata.deviceMetadata.deviceType))
-                        .build())
+                .setDevice(deviceBuilder.build())
                 .setImage(ByteString.copyFrom(metadata.deviceMetadata.image))
                 .setStrings(Rpcs.ObservedDeviceStrings.newBuilder()
                         .setAssistantSetupHalfSheet(metadata.deviceMetadata.assistantSetupHalfSheet)
diff --git a/nearby/tests/cts/fastpair/src/android/nearby/cts/CredentialElementTest.java b/nearby/tests/cts/fastpair/src/android/nearby/cts/CredentialElementTest.java
index 0cf81ee..19a4a40 100644
--- a/nearby/tests/cts/fastpair/src/android/nearby/cts/CredentialElementTest.java
+++ b/nearby/tests/cts/fastpair/src/android/nearby/cts/CredentialElementTest.java
@@ -39,8 +39,7 @@
 
     @Test
     public void testBuilder() {
-        CredentialElement element = new CredentialElement.Builder().setElement(KEY,
-                VALUE).build();
+        CredentialElement element = new CredentialElement(KEY, VALUE);
 
         assertThat(element.getKey()).isEqualTo(KEY);
         assertThat(Arrays.equals(element.getValue(), VALUE)).isTrue();
@@ -48,8 +47,7 @@
 
     @Test
     public void testWriteParcel() {
-        CredentialElement element = new CredentialElement.Builder().setElement(KEY,
-                VALUE).build();
+        CredentialElement element = new CredentialElement(KEY, VALUE);
 
         Parcel parcel = Parcel.obtain();
         element.writeToParcel(parcel, 0);
diff --git a/nearby/tests/cts/fastpair/src/android/nearby/cts/DataElementTest.java b/nearby/tests/cts/fastpair/src/android/nearby/cts/DataElementTest.java
index d096ed1..eb03a0d 100644
--- a/nearby/tests/cts/fastpair/src/android/nearby/cts/DataElementTest.java
+++ b/nearby/tests/cts/fastpair/src/android/nearby/cts/DataElementTest.java
@@ -40,7 +40,7 @@
 
     @Test
     public void testBuilder() {
-        DataElement dataElement = new DataElement.Builder().setElement(KEY, VALUE).build();
+        DataElement dataElement = new DataElement(KEY, VALUE);
 
         assertThat(dataElement.getKey()).isEqualTo(KEY);
         assertThat(Arrays.equals(dataElement.getValue(), VALUE)).isTrue();
@@ -48,7 +48,7 @@
 
     @Test
     public void testWriteParcel() {
-        DataElement dataElement = new DataElement.Builder().setElement(KEY, VALUE).build();
+        DataElement dataElement = new DataElement(KEY, VALUE);
 
         Parcel parcel = Parcel.obtain();
         dataElement.writeToParcel(parcel, 0);
diff --git a/nearby/tests/cts/fastpair/src/android/nearby/cts/NearbyDeviceTest.java b/nearby/tests/cts/fastpair/src/android/nearby/cts/NearbyDeviceTest.java
index aad3fca..f37800a 100644
--- a/nearby/tests/cts/fastpair/src/android/nearby/cts/NearbyDeviceTest.java
+++ b/nearby/tests/cts/fastpair/src/android/nearby/cts/NearbyDeviceTest.java
@@ -49,11 +49,11 @@
     @SdkSuppress(minSdkVersion = 32, codeName = "T")
     public void test_getMedium_fromChild() {
         FastPairDevice fastPairDevice = new FastPairDevice.Builder()
-                .setMedium(NearbyDevice.Medium.BLE)
+                .addMedium(NearbyDevice.Medium.BLE)
                 .setRssi(-60)
                 .build();
 
-        assertThat(fastPairDevice.getMedium()).isEqualTo(1);
+        assertThat(fastPairDevice.getMediums()).contains(1);
         assertThat(fastPairDevice.getRssi()).isEqualTo(-60);
     }
 }
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 23ae47d..f32ef12 100644
--- a/nearby/tests/cts/fastpair/src/android/nearby/cts/NearbyManagerTest.java
+++ b/nearby/tests/cts/fastpair/src/android/nearby/cts/NearbyManagerTest.java
@@ -41,6 +41,7 @@
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 
+import java.util.Collections;
 import java.util.concurrent.Executors;
 
 /**
@@ -92,15 +93,12 @@
 
     @Test
     public void testStartStopBroadcast() {
-        PrivateCredential credential = new PrivateCredential.Builder()
+        PrivateCredential credential = new PrivateCredential.Builder(SECRETE_ID, AUTHENTICITY_KEY)
                 .setIdentityType(IDENTITY_TYPE_PRIVATE)
-                .setSecretId(SECRETE_ID)
-                .setAuthenticityKey(AUTHENTICITY_KEY)
                 .build();
         BroadcastRequest broadcastRequest =
-                new PresenceBroadcastRequest.Builder()
-                        .setSalt(SALT)
-                        .addMediums(BLE_MEDIUM).setCredential(credential)
+                new PresenceBroadcastRequest.Builder(Collections.singletonList(BLE_MEDIUM), SALT)
+                        .setCredential(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 a27d525..0b3ff07 100644
--- a/nearby/tests/cts/fastpair/src/android/nearby/cts/PresenceBroadcastRequestTest.java
+++ b/nearby/tests/cts/fastpair/src/android/nearby/cts/PresenceBroadcastRequestTest.java
@@ -34,6 +34,8 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
+import java.util.Collections;
+
 /**
  * Tests for {@link PresenceBroadcastRequest}.
  */
@@ -56,19 +58,15 @@
 
     @Before
     public void setUp() {
-        PrivateCredential credential = new PrivateCredential.Builder()
+        PrivateCredential credential = new PrivateCredential.Builder(SECRETE_ID, AUTHENTICITY_KEY)
                 .setIdentityType(IDENTITY_TYPE_PRIVATE)
-                .setSecretId(SECRETE_ID)
-                .setAuthenticityKey(AUTHENTICITY_KEY)
-                .setMetaDataEncryptionKey(METADATA_ENCRYPTION_KEY)
+                .setMetadataEncryptionKey(METADATA_ENCRYPTION_KEY)
                 .build();
-        DataElement element = new DataElement.Builder().setElement(KEY, VALUE).build();
-        mBuilder = new PresenceBroadcastRequest.Builder()
-                .setSalt(SALT)
+        DataElement element = new DataElement(KEY, VALUE);
+        mBuilder = new PresenceBroadcastRequest.Builder(Collections.singletonList(BLE_MEDIUM), SALT)
                 .setTxPower(TX_POWER)
                 .setCredential(credential)
                 .addAction(ACTION_ID)
-                .addMediums(BLE_MEDIUM)
                 .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 c704022..e21bc80 100644
--- a/nearby/tests/cts/fastpair/src/android/nearby/cts/PresenceDeviceTest.java
+++ b/nearby/tests/cts/fastpair/src/android/nearby/cts/PresenceDeviceTest.java
@@ -18,6 +18,7 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import android.nearby.DataElement;
 import android.nearby.NearbyDevice;
 import android.nearby.PresenceDevice;
 import android.os.Build;
@@ -29,6 +30,8 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
+import java.util.Arrays;
+
 /**
  * Test for {@link PresenceDevice}.
  */
@@ -38,11 +41,11 @@
     private static final int DEVICE_TYPE = PresenceDevice.DeviceType.PHONE;
     private static final String DEVICE_ID = "123";
     private static final String IMAGE_URL = "http://example.com/imageUrl";
-    private static final String SUPPORT_MEDIA = "SupportMedia";
-    private static final String SUPPORT_MEDIA_VALUE = "true";
     private static final int RSSI = -40;
     private static final int MEDIUM = NearbyDevice.Medium.BLE;
     private static final String DEVICE_NAME = "testDevice";
+    private static final int KEY = 1234;
+    private static final byte[] VALUE = new byte[]{1, 1, 1, 1};
 
     @Test
     public void testBuilder() {
@@ -50,19 +53,20 @@
                 .setDeviceType(DEVICE_TYPE)
                 .setDeviceId(DEVICE_ID)
                 .setDeviceImageUrl(IMAGE_URL)
-                .addExtendedProperty(SUPPORT_MEDIA, SUPPORT_MEDIA_VALUE)
+                .addExtendedProperty(new DataElement(KEY, VALUE))
                 .setRssi(RSSI)
-                .setMedium(MEDIUM)
+                .addMedium(MEDIUM)
                 .setName(DEVICE_NAME)
                 .build();
 
         assertThat(device.getDeviceType()).isEqualTo(DEVICE_TYPE);
         assertThat(device.getDeviceId()).isEqualTo(DEVICE_ID);
         assertThat(device.getDeviceImageUrl()).isEqualTo(IMAGE_URL);
-        assertThat(device.getExtendedProperties().get(SUPPORT_MEDIA)).isEqualTo(
-                SUPPORT_MEDIA_VALUE);
+        DataElement dataElement = device.getExtendedProperties().get(0);
+        assertThat(dataElement.getKey()).isEqualTo(KEY);
+        assertThat(Arrays.equals(dataElement.getValue(), VALUE)).isTrue();
         assertThat(device.getRssi()).isEqualTo(RSSI);
-        assertThat(device.getMedium()).isEqualTo(MEDIUM);
+        assertThat(device.getMediums()).containsExactly(MEDIUM);
         assertThat(device.getName()).isEqualTo(DEVICE_NAME);
     }
 
@@ -70,9 +74,9 @@
     public void testWriteParcel() {
         PresenceDevice device = new PresenceDevice.Builder()
                 .setDeviceId(DEVICE_ID)
-                .addExtendedProperty(SUPPORT_MEDIA, SUPPORT_MEDIA_VALUE)
+                .addExtendedProperty(new DataElement(KEY, VALUE))
                 .setRssi(RSSI)
-                .setMedium(MEDIUM)
+                .addMedium(MEDIUM)
                 .setName(DEVICE_NAME)
                 .build();
 
@@ -83,10 +87,9 @@
         parcel.recycle();
 
         assertThat(parcelDevice.getDeviceId()).isEqualTo(DEVICE_ID);
-        assertThat(parcelDevice.getExtendedProperties().get(SUPPORT_MEDIA)).isEqualTo(
-                SUPPORT_MEDIA_VALUE);
+        assertThat(parcelDevice.getExtendedProperties().get(0).getKey()).isEqualTo(KEY);
         assertThat(parcelDevice.getRssi()).isEqualTo(RSSI);
-        assertThat(parcelDevice.getMedium()).isEqualTo(MEDIUM);
+        assertThat(parcelDevice.getMediums()).containsExactly(MEDIUM);
         assertThat(parcelDevice.getName()).isEqualTo(DEVICE_NAME);
     }
 }
diff --git a/nearby/tests/cts/fastpair/src/android/nearby/cts/PresenceScanFilterTest.java b/nearby/tests/cts/fastpair/src/android/nearby/cts/PresenceScanFilterTest.java
index 017677f..8962499 100644
--- a/nearby/tests/cts/fastpair/src/android/nearby/cts/PresenceScanFilterTest.java
+++ b/nearby/tests/cts/fastpair/src/android/nearby/cts/PresenceScanFilterTest.java
@@ -52,22 +52,21 @@
 
 
     private PublicCredential mPublicCredential =
-            new PublicCredential.Builder()
+            new PublicCredential.Builder(SECRETE_ID, AUTHENTICITY_KEY)
                     .setIdentityType(IDENTITY_TYPE_PRIVATE)
-                    .setSecretId(SECRETE_ID).setAuthenticityKey(AUTHENTICITY_KEY)
                     .setPublicKey(PUBLIC_KEY).setEncryptedMetadata(ENCRYPTED_METADATA)
-                    .setMetaDataEncryptionKeyTag(METADATA_ENCRYPTION_KEY_TAG).build();
+                    .setEncryptedMetadataKeyTag(METADATA_ENCRYPTION_KEY_TAG).build();
     private PresenceScanFilter.Builder mBuilder = new PresenceScanFilter.Builder()
-            .setRssiThreshold(RSSI)
+            .setMaxPathLoss(RSSI)
             .addCredential(mPublicCredential)
             .addPresenceAction(ACTION)
-            .addExtendedProperty(new DataElement.Builder().setElement(KEY, VALUE).build());
+            .addExtendedProperty(new DataElement(KEY, VALUE));
 
     @Test
     public void testBuilder() {
         PresenceScanFilter filter = mBuilder.build();
 
-        assertThat(filter.getRssiThreshold()).isEqualTo(RSSI);
+        assertThat(filter.getMaxPathLoss()).isEqualTo(RSSI);
         assertThat(filter.getCredentials().get(0).getIdentityType()).isEqualTo(
                 IDENTITY_TYPE_PRIVATE);
         assertThat(filter.getPresenceActions()).containsExactly(ACTION);
@@ -84,7 +83,7 @@
         parcel.recycle();
 
         assertThat(parcelFilter.getType()).isEqualTo(ScanRequest.SCAN_TYPE_NEARBY_PRESENCE);
-        assertThat(parcelFilter.getRssiThreshold()).isEqualTo(RSSI);
+        assertThat(parcelFilter.getMaxPathLoss()).isEqualTo(RSSI);
         assertThat(parcelFilter.getPresenceActions()).containsExactly(ACTION);
     }
 }
diff --git a/nearby/tests/cts/fastpair/src/android/nearby/cts/PrivateCredentialTest.java b/nearby/tests/cts/fastpair/src/android/nearby/cts/PrivateCredentialTest.java
index 054bb1a..3212307 100644
--- a/nearby/tests/cts/fastpair/src/android/nearby/cts/PrivateCredentialTest.java
+++ b/nearby/tests/cts/fastpair/src/android/nearby/cts/PrivateCredentialTest.java
@@ -51,12 +51,10 @@
 
     @Before
     public void setUp() {
-        mBuilder = new PrivateCredential.Builder()
+        mBuilder = new PrivateCredential.Builder(SECRETE_ID, AUTHENTICITY_KEY)
                 .setIdentityType(IDENTITY_TYPE_PRIVATE)
-                .setSecretId(SECRETE_ID).setAuthenticityKey(AUTHENTICITY_KEY)
-                .setMetaDataEncryptionKey(METADATA_ENCRYPTION_KEY)
-                .addCredentialElement(
-                        new CredentialElement.Builder().setElement(KEY, VALUE).build());
+                .setMetadataEncryptionKey(METADATA_ENCRYPTION_KEY)
+                .addCredentialElement(new CredentialElement(KEY, VALUE));
     }
 
     @Test
@@ -67,7 +65,7 @@
         assertThat(credential.getIdentityType()).isEqualTo(IDENTITY_TYPE_PRIVATE);
         assertThat(Arrays.equals(credential.getSecretId(), SECRETE_ID)).isTrue();
         assertThat(Arrays.equals(credential.getAuthenticityKey(), AUTHENTICITY_KEY)).isTrue();
-        assertThat(Arrays.equals(credential.getMetaDataEncryptionKey(),
+        assertThat(Arrays.equals(credential.getMetadataEncryptionKey(),
                 METADATA_ENCRYPTION_KEY)).isTrue();
         CredentialElement credentialElement = credential.getCredentialElements().get(0);
         assertThat(credentialElement.getKey()).isEqualTo(KEY);
@@ -90,7 +88,7 @@
         assertThat(Arrays.equals(credentialFromParcel.getSecretId(), SECRETE_ID)).isTrue();
         assertThat(Arrays.equals(credentialFromParcel.getAuthenticityKey(),
                 AUTHENTICITY_KEY)).isTrue();
-        assertThat(Arrays.equals(credentialFromParcel.getMetaDataEncryptionKey(),
+        assertThat(Arrays.equals(credentialFromParcel.getMetadataEncryptionKey(),
                 METADATA_ENCRYPTION_KEY)).isTrue();
         CredentialElement credentialElement = credentialFromParcel.getCredentialElements().get(0);
         assertThat(credentialElement.getKey()).isEqualTo(KEY);
diff --git a/nearby/tests/cts/fastpair/src/android/nearby/cts/PublicCredentialTest.java b/nearby/tests/cts/fastpair/src/android/nearby/cts/PublicCredentialTest.java
index 4359ba5..4a12416 100644
--- a/nearby/tests/cts/fastpair/src/android/nearby/cts/PublicCredentialTest.java
+++ b/nearby/tests/cts/fastpair/src/android/nearby/cts/PublicCredentialTest.java
@@ -52,11 +52,10 @@
 
     @Before
     public void setUp() {
-        mBuilder = new PublicCredential.Builder()
+        mBuilder = new PublicCredential.Builder(SECRETE_ID, AUTHENTICITY_KEY)
                 .setIdentityType(IDENTITY_TYPE_PRIVATE)
-                .setSecretId(SECRETE_ID).setAuthenticityKey(AUTHENTICITY_KEY)
                 .setPublicKey(PUBLIC_KEY).setEncryptedMetadata(ENCRYPTED_METADATA)
-                .setMetaDataEncryptionKeyTag(METADATA_ENCRYPTION_KEY_TAG);
+                .setEncryptedMetadataKeyTag(METADATA_ENCRYPTION_KEY_TAG);
     }
 
     @Test
@@ -69,7 +68,7 @@
         assertThat(Arrays.equals(credential.getAuthenticityKey(), AUTHENTICITY_KEY)).isTrue();
         assertThat(Arrays.equals(credential.getPublicKey(), PUBLIC_KEY)).isTrue();
         assertThat(Arrays.equals(credential.getEncryptedMetadata(), ENCRYPTED_METADATA)).isTrue();
-        assertThat(Arrays.equals(credential.getMetaDataEncryptionKeyTag(),
+        assertThat(Arrays.equals(credential.getEncryptedMetadataKeyTag(),
                 METADATA_ENCRYPTION_KEY_TAG)).isTrue();
     }
 
@@ -92,7 +91,7 @@
         assertThat(Arrays.equals(credentialFromParcel.getPublicKey(), PUBLIC_KEY)).isTrue();
         assertThat(Arrays.equals(credentialFromParcel.getEncryptedMetadata(),
                 ENCRYPTED_METADATA)).isTrue();
-        assertThat(Arrays.equals(credentialFromParcel.getMetaDataEncryptionKeyTag(),
+        assertThat(Arrays.equals(credentialFromParcel.getEncryptedMetadataKeyTag(),
                 METADATA_ENCRYPTION_KEY_TAG)).isTrue();
     }
 }
diff --git a/nearby/tests/cts/fastpair/src/android/nearby/cts/ScanRequestTest.java b/nearby/tests/cts/fastpair/src/android/nearby/cts/ScanRequestTest.java
index 25aa926..2d01e83 100644
--- a/nearby/tests/cts/fastpair/src/android/nearby/cts/ScanRequestTest.java
+++ b/nearby/tests/cts/fastpair/src/android/nearby/cts/ScanRequestTest.java
@@ -157,25 +157,23 @@
     @Test
     @SdkSuppress(minSdkVersion = 32, codeName = "T")
     public void testScanFilter() {
-        final byte[] secreteId = new byte[]{1, 2, 3, 4};
+        final byte[] secretId = new byte[]{1, 2, 3, 4};
         final byte[] authenticityKey = new byte[]{0, 1, 1, 1};
         final byte[] publicKey = new byte[]{1, 1, 2, 2};
         final byte[] encryptedMetadata = new byte[]{1, 2, 3, 4, 5};
         final byte[] metadataEncryptionKeyTag = new byte[]{1, 1, 3, 4, 5};
 
-        PublicCredential credential = new PublicCredential.Builder()
+        PublicCredential credential = new PublicCredential.Builder(secretId, authenticityKey)
                 .setIdentityType(IDENTITY_TYPE_PRIVATE)
-                .setSecretId(secreteId)
-                .setAuthenticityKey(authenticityKey)
                 .setEncryptedMetadata(encryptedMetadata)
                 .setPublicKey(publicKey)
-                .setMetaDataEncryptionKeyTag(metadataEncryptionKeyTag).build();
+                .setEncryptedMetadataKeyTag(metadataEncryptionKeyTag).build();
 
         final int rssi = -40;
         final int action = 123;
         PresenceScanFilter filter = new PresenceScanFilter.Builder()
                 .addCredential(credential)
-                .setRssiThreshold(rssi)
+                .setMaxPathLoss(rssi)
                 .addPresenceAction(action)
                 .build();
 
@@ -183,7 +181,7 @@
                 SCAN_TYPE_FAST_PAIR).addScanFilter(filter).build();
 
         assertThat(request.getScanFilters()).isNotEmpty();
-        assertThat(request.getScanFilters().get(0).getRssiThreshold()).isEqualTo(rssi);
+        assertThat(request.getScanFilters().get(0).getMaxPathLoss()).isEqualTo(rssi);
     }
 
     private static WorkSource getWorkSource() {