Add impl for loadFastPairDevicesWithAccountKey.

Test: to add unit test
Bug: 204780849
Change-Id: Ic25d04d47d89f1ddfc648fc9f4d02ad6acec407b
diff --git a/nearby/service/java/com/android/server/nearby/provider/FastPairDataProvider.java b/nearby/service/java/com/android/server/nearby/provider/FastPairDataProvider.java
index 34db620..f8c16a1 100644
--- a/nearby/service/java/com/android/server/nearby/provider/FastPairDataProvider.java
+++ b/nearby/service/java/com/android/server/nearby/provider/FastPairDataProvider.java
@@ -20,6 +20,7 @@
 import android.annotation.Nullable;
 import android.content.Context;
 import android.nearby.FastPairDataProviderBase;
+import android.nearby.aidl.FastPairAccountDevicesMetadataRequestParcel;
 import android.nearby.aidl.FastPairAntispoofkeyDeviceMetadataRequestParcel;
 import android.nearby.aidl.FastPairEligibleAccountsRequestParcel;
 import android.nearby.aidl.FastPairManageAccountDeviceRequestParcel;
@@ -140,7 +141,24 @@
     }
 
     /**
-     * Get FastPair Eligible Accounts.
+     * Loads FastPair devices for a given account.
+     *
+     * @throws IllegalStateException If ProxyFastPairDataProvider is not available.
+     */
+    public List<Data.FastPairDeviceWithAccountKey> loadFastPairDevicesWithAccountKey(
+            Account account) {
+        if (mProxyFastPairDataProvider != null) {
+            FastPairAccountDevicesMetadataRequestParcel requestParcel =
+                    new FastPairAccountDevicesMetadataRequestParcel();
+            requestParcel.account = account;
+            return Utils.convertFastPairAccountKeyDevicesMetadataToFastPairDevicesWithAccountKey(
+                    mProxyFastPairDataProvider.loadFastPairAccountDevicesMetadata(requestParcel));
+        }
+        throw new IllegalStateException("No ProxyFastPairDataProvider yet constructed");
+    }
+
+    /**
+     * Loads FastPair Eligible Accounts.
      *
      * @throws IllegalStateException If ProxyFastPairDataProvider is not available.
      */
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 c06d017..a340b04 100644
--- a/nearby/service/java/com/android/server/nearby/provider/Utils.java
+++ b/nearby/service/java/com/android/server/nearby/provider/Utils.java
@@ -32,14 +32,247 @@
 import java.util.List;
 
 import service.proto.Cache;
+import service.proto.Data;
 import service.proto.FastPairString.FastPairStrings;
 import service.proto.Rpcs;
 
 /**
- * Utility classes to convert between different data classes.
+ * Utility functions to convert between different data classes.
  */
 class Utils {
 
+    static List<Data.FastPairDeviceWithAccountKey>
+            convertFastPairAccountKeyDevicesMetadataToFastPairDevicesWithAccountKey(
+                    @Nullable FastPairAccountKeyDeviceMetadataParcel[] metadataParcels) {
+        if (metadataParcels == null) {
+            return new ArrayList<Data.FastPairDeviceWithAccountKey>(0);
+        }
+
+        List<Data.FastPairDeviceWithAccountKey> fpDeviceList =
+                new ArrayList<>(metadataParcels.length);
+        for (FastPairAccountKeyDeviceMetadataParcel metadataParcel : metadataParcels) {
+            Data.FastPairDeviceWithAccountKey.Builder fpDeviceBuilder =
+                    Data.FastPairDeviceWithAccountKey.newBuilder();
+            if (metadataParcel.accountKey != null) {
+                fpDeviceBuilder.setAccountKey(ByteString.copyFrom(metadataParcel.accountKey));
+            }
+            if (metadataParcel.sha256AccountKeyPublicAddress != null) {
+                fpDeviceBuilder.setSha256AccountKeyPublicAddress(
+                        ByteString.copyFrom(metadataParcel.sha256AccountKeyPublicAddress));
+            }
+
+            Cache.StoredDiscoveryItem.Builder storedDiscoveryItemBuilder =
+                    Cache.StoredDiscoveryItem.newBuilder();
+
+            if (metadataParcel.discoveryItem != null) {
+                if (metadataParcel.discoveryItem.actionUrl != null) {
+                    storedDiscoveryItemBuilder.setActionUrl(metadataParcel.discoveryItem.actionUrl);
+                }
+                storedDiscoveryItemBuilder.setActionUrlType(
+                        Cache.ResolvedUrlType.forNumber(
+                                metadataParcel.discoveryItem.actionUrlType));
+                if (metadataParcel.discoveryItem.appName != null) {
+                    storedDiscoveryItemBuilder.setAppName(metadataParcel.discoveryItem.appName);
+                }
+                storedDiscoveryItemBuilder.setAttachmentType(
+                        Cache.DiscoveryAttachmentType.forNumber(
+                                metadataParcel.discoveryItem.attachmentType));
+                if (metadataParcel.discoveryItem.authenticationPublicKeySecp256r1 != null) {
+                    storedDiscoveryItemBuilder.setAuthenticationPublicKeySecp256R1(
+                            ByteString.copyFrom(
+                                    metadataParcel.discoveryItem.authenticationPublicKeySecp256r1));
+                }
+                if (metadataParcel.discoveryItem.bleRecordBytes != null) {
+                    storedDiscoveryItemBuilder.setBleRecordBytes(
+                            ByteString.copyFrom(metadataParcel.discoveryItem.bleRecordBytes));
+                }
+                storedDiscoveryItemBuilder.setDebugCategory(
+                        Cache.StoredDiscoveryItem.DebugMessageCategory.forNumber(
+                                metadataParcel.discoveryItem.debugCategory));
+                if (metadataParcel.discoveryItem.debugMessage != null) {
+                    storedDiscoveryItemBuilder.setDebugMessage(
+                            metadataParcel.discoveryItem.debugMessage);
+                }
+                if (metadataParcel.discoveryItem.description != null) {
+                    storedDiscoveryItemBuilder.setDescription(
+                            metadataParcel.discoveryItem.description);
+                }
+                if (metadataParcel.discoveryItem.deviceName != null) {
+                    storedDiscoveryItemBuilder.setDeviceName(
+                            metadataParcel.discoveryItem.deviceName);
+                }
+                if (metadataParcel.discoveryItem.displayUrl != null) {
+                    storedDiscoveryItemBuilder.setDisplayUrl(
+                            metadataParcel.discoveryItem.displayUrl);
+                }
+                if (metadataParcel.discoveryItem.entityId != null) {
+                    storedDiscoveryItemBuilder.setEntityId(
+                            metadataParcel.discoveryItem.entityId);
+                }
+                if (metadataParcel.discoveryItem.featureGraphicUrl != null) {
+                    storedDiscoveryItemBuilder.setFeatureGraphicUrl(
+                            metadataParcel.discoveryItem.featureGraphicUrl);
+                }
+                storedDiscoveryItemBuilder.setFirstObservationTimestampMillis(
+                        metadataParcel.discoveryItem.firstObservationTimestampMillis);
+                if (metadataParcel.discoveryItem.groupId != null) {
+                    storedDiscoveryItemBuilder.setGroupId(metadataParcel.discoveryItem.groupId);
+                }
+                if (metadataParcel.discoveryItem.iconFifeUrl != null) {
+                    storedDiscoveryItemBuilder.setIconFifeUrl(
+                            metadataParcel.discoveryItem.iconFifeUrl);
+                }
+                if (metadataParcel.discoveryItem.iconPng != null) {
+                    storedDiscoveryItemBuilder.setIconPng(
+                            ByteString.copyFrom(metadataParcel.discoveryItem.iconPng));
+                }
+                if (metadataParcel.discoveryItem.id != null) {
+                    storedDiscoveryItemBuilder.setId(metadataParcel.discoveryItem.id);
+                }
+                storedDiscoveryItemBuilder.setLastObservationTimestampMillis(
+                        metadataParcel.discoveryItem.lastObservationTimestampMillis);
+                storedDiscoveryItemBuilder.setLastUserExperience(
+                        Cache.StoredDiscoveryItem.ExperienceType.forNumber(
+                                metadataParcel.discoveryItem.lastUserExperience));
+                storedDiscoveryItemBuilder.setLostMillis(metadataParcel.discoveryItem.lostMillis);
+                if (metadataParcel.discoveryItem.macAddress != null) {
+                    storedDiscoveryItemBuilder.setMacAddress(
+                            metadataParcel.discoveryItem.macAddress);
+                }
+                if (metadataParcel.discoveryItem.packageName != null) {
+                    storedDiscoveryItemBuilder.setPackageName(
+                            metadataParcel.discoveryItem.packageName);
+                }
+                storedDiscoveryItemBuilder.setPendingAppInstallTimestampMillis(
+                        metadataParcel.discoveryItem.pendingAppInstallTimestampMillis);
+                storedDiscoveryItemBuilder.setRssi(metadataParcel.discoveryItem.rssi);
+                storedDiscoveryItemBuilder.setState(
+                        Cache.StoredDiscoveryItem.State.forNumber(
+                                metadataParcel.discoveryItem.state));
+                if (metadataParcel.discoveryItem.title != null) {
+                    storedDiscoveryItemBuilder.setTitle(metadataParcel.discoveryItem.title);
+                }
+                if (metadataParcel.discoveryItem.triggerId != null) {
+                    storedDiscoveryItemBuilder.setTriggerId(metadataParcel.discoveryItem.triggerId);
+                }
+                storedDiscoveryItemBuilder.setTxPower(metadataParcel.discoveryItem.txPower);
+                storedDiscoveryItemBuilder.setType(
+                        Cache.NearbyType.forNumber(metadataParcel.discoveryItem.type));
+            }
+            if (metadataParcel.metadata != null) {
+                FastPairStrings.Builder stringsBuilder = FastPairStrings.newBuilder();
+                if (metadataParcel.metadata.assistantSetupHalfSheet != null) {
+                    stringsBuilder.setAssistantHalfSheetDescription(
+                            metadataParcel.metadata.assistantSetupHalfSheet);
+                }
+                if (metadataParcel.metadata.assistantSetupNotification != null) {
+                    stringsBuilder.setAssistantNotificationDescription(
+                            metadataParcel.metadata.assistantSetupNotification);
+                }
+                if (metadataParcel.metadata.confirmPinDescription != null) {
+                    stringsBuilder.setConfirmPinDescription(
+                            metadataParcel.metadata.confirmPinDescription);
+                }
+                if (metadataParcel.metadata.confirmPinTitle != null) {
+                    stringsBuilder.setConfirmPinTitle(
+                            metadataParcel.metadata.confirmPinTitle);
+                }
+                if (metadataParcel.metadata.connectSuccessCompanionAppInstalled != null) {
+                    stringsBuilder.setPairingFinishedCompanionAppInstalled(
+                            metadataParcel.metadata.connectSuccessCompanionAppInstalled);
+                }
+                if (metadataParcel.metadata.connectSuccessCompanionAppNotInstalled != null) {
+                    stringsBuilder.setPairingFinishedCompanionAppNotInstalled(
+                            metadataParcel.metadata.connectSuccessCompanionAppNotInstalled);
+                }
+                if (metadataParcel.metadata.failConnectGoToSettingsDescription != null) {
+                    stringsBuilder.setPairingFailDescription(
+                            metadataParcel.metadata.failConnectGoToSettingsDescription);
+                }
+                if (metadataParcel.metadata.fastPairTvConnectDeviceNoAccountDescription != null) {
+                    stringsBuilder.setFastPairTvConnectDeviceNoAccountDescription(
+                            metadataParcel.metadata.fastPairTvConnectDeviceNoAccountDescription);
+                }
+                if (metadataParcel.metadata.initialNotificationDescription != null) {
+                    stringsBuilder.setTapToPairWithAccount(
+                            metadataParcel.metadata.initialNotificationDescription);
+                }
+                if (metadataParcel.metadata.initialNotificationDescriptionNoAccount != null) {
+                    stringsBuilder.setTapToPairWithoutAccount(
+                            metadataParcel.metadata.initialNotificationDescriptionNoAccount);
+                }
+                if (metadataParcel.metadata.initialPairingDescription != null) {
+                    stringsBuilder.setInitialPairingDescription(
+                            metadataParcel.metadata.initialPairingDescription);
+                }
+                if (metadataParcel.metadata.retroactivePairingDescription != null) {
+                    stringsBuilder.setRetroactivePairingDescription(
+                            metadataParcel.metadata.retroactivePairingDescription);
+                }
+                if (metadataParcel.metadata.subsequentPairingDescription != null) {
+                    stringsBuilder.setSubsequentPairingDescription(
+                            metadataParcel.metadata.subsequentPairingDescription);
+                }
+                if (metadataParcel.metadata.syncContactsDescription != null) {
+                    stringsBuilder.setSyncContactsDescription(
+                            metadataParcel.metadata.syncContactsDescription);
+                }
+                if (metadataParcel.metadata.syncContactsTitle != null) {
+                    stringsBuilder.setSyncContactsTitle(
+                            metadataParcel.metadata.syncContactsTitle);
+                }
+                if (metadataParcel.metadata.syncSmsDescription != null) {
+                    stringsBuilder.setSyncSmsDescription(
+                            metadataParcel.metadata.syncSmsDescription);
+                }
+                if (metadataParcel.metadata.syncSmsTitle != null) {
+                    stringsBuilder.setSyncSmsTitle(metadataParcel.metadata.syncSmsTitle);
+                }
+                if (metadataParcel.metadata.waitLaunchCompanionAppDescription != null) {
+                    stringsBuilder.setWaitAppLaunchDescription(
+                            metadataParcel.metadata.waitLaunchCompanionAppDescription);
+                }
+                storedDiscoveryItemBuilder.setFastPairStrings(stringsBuilder.build());
+
+                Cache.FastPairInformation.Builder fpInformationBuilder =
+                        Cache.FastPairInformation.newBuilder();
+                Rpcs.TrueWirelessHeadsetImages.Builder imagesBuilder =
+                        Rpcs.TrueWirelessHeadsetImages.newBuilder();
+                if (metadataParcel.metadata.trueWirelessImageUrlCase != null) {
+                    imagesBuilder.setCaseUrl(metadataParcel.metadata.trueWirelessImageUrlCase);
+                }
+                if (metadataParcel.metadata.trueWirelessImageUrlLeftBud != null) {
+                    imagesBuilder.setLeftBudUrl(
+                            metadataParcel.metadata.trueWirelessImageUrlLeftBud);
+                }
+                if (metadataParcel.metadata.trueWirelessImageUrlRightBud != null) {
+                    imagesBuilder.setRightBudUrl(
+                            metadataParcel.metadata.trueWirelessImageUrlRightBud);
+                }
+                fpInformationBuilder.setTrueWirelessImages(imagesBuilder.build());
+                fpInformationBuilder.setDeviceType(
+                        Rpcs.DeviceType.forNumber(metadataParcel.metadata.deviceType));
+
+                storedDiscoveryItemBuilder.setFastPairInformation(fpInformationBuilder.build());
+                storedDiscoveryItemBuilder.setTxPower(metadataParcel.metadata.bleTxPower);
+
+                if (metadataParcel.metadata.image != null) {
+                    storedDiscoveryItemBuilder.setIconPng(
+                            ByteString.copyFrom(metadataParcel.metadata.image));
+                }
+                if (metadataParcel.metadata.imageUrl != null) {
+                    storedDiscoveryItemBuilder.setIconFifeUrl(metadataParcel.metadata.imageUrl);
+                }
+                if (metadataParcel.metadata.intentUri != null) {
+                    storedDiscoveryItemBuilder.setActionUrl(metadataParcel.metadata.intentUri);
+                }
+            }
+            fpDeviceBuilder.setDiscoveryItem(storedDiscoveryItemBuilder.build());
+            fpDeviceList.add(fpDeviceBuilder.build());
+        }
+        return fpDeviceList;
+    }
+
     static List<Account> convertFastPairEligibleAccountsToAccountList(
             @Nullable FastPairEligibleAccountParcel[] accountParcels) {
         if (accountParcels == null) {
@@ -54,7 +287,7 @@
 
     static @Nullable Rpcs.GetObservedDeviceResponse
             convertFastPairAntispoofkeyDeviceMetadataToGetObservedDeviceResponse(
-            @Nullable FastPairAntispoofkeyDeviceMetadataParcel metadata) {
+                    @Nullable FastPairAntispoofkeyDeviceMetadataParcel metadata) {
         if (metadata == null) {
             return null;
         }
@@ -64,16 +297,16 @@
                                 .setPublicKey(ByteString.copyFrom(metadata.antiSpoofPublicKey))
                                 .build())
                         .setTrueWirelessImages(Rpcs.TrueWirelessHeadsetImages.newBuilder()
-                                        .setLeftBudUrl(
-                                                metadata.deviceMetadata.trueWirelessImageUrlLeftBud)
-                                        .setRightBudUrl(
-                                                metadata.deviceMetadata
-                                                        .trueWirelessImageUrlRightBud)
-                                        .setCaseUrl(
-                                                metadata.deviceMetadata
-                                                        .trueWirelessImageUrlCase
-                                        )
-                                        .build())
+                                .setLeftBudUrl(
+                                        metadata.deviceMetadata.trueWirelessImageUrlLeftBud)
+                                .setRightBudUrl(
+                                        metadata.deviceMetadata
+                                                .trueWirelessImageUrlRightBud)
+                                .setCaseUrl(
+                                        metadata.deviceMetadata
+                                                .trueWirelessImageUrlCase
+                                )
+                                .build())
                         .setImageUrl(metadata.deviceMetadata.imageUrl)
                         .setIntentUri(metadata.deviceMetadata.intentUri)
                         .setBleTxPower(metadata.deviceMetadata.bleTxPower)
@@ -133,7 +366,7 @@
 
     static @Nullable FastPairAccountKeyDeviceMetadataParcel
             convertFastPairUploadInfoToFastPairAccountKeyDeviceMetadata(
-            FastPairUploadInfo uploadInfo) {
+                    FastPairUploadInfo uploadInfo) {
         if (uploadInfo == null) {
             return null;
         }
@@ -155,7 +388,7 @@
 
     private static @Nullable FastPairDiscoveryItemParcel
             convertStoredDiscoveryItemToFastPairDiscoveryItem(
-            @Nullable Cache.StoredDiscoveryItem storedDiscoveryItem) {
+                    @Nullable Cache.StoredDiscoveryItem storedDiscoveryItem) {
         if (storedDiscoveryItem == null) {
             return null;
         }
@@ -165,7 +398,6 @@
         discoveryItemParcel.actionUrlType = storedDiscoveryItem.getActionUrlType().getNumber();
         discoveryItemParcel.appName = storedDiscoveryItem.getAppName();
         discoveryItemParcel.attachmentType = storedDiscoveryItem.getAttachmentType().getNumber();
-        discoveryItemParcel.attachmentType = storedDiscoveryItem.getAttachmentType().getNumber();
         discoveryItemParcel.authenticationPublicKeySecp256r1 =
                 storedDiscoveryItem.getAuthenticationPublicKeySecp256R1().toByteArray();
         discoveryItemParcel.bleRecordBytes = storedDiscoveryItem.getBleRecordBytes().toByteArray();
@@ -213,7 +445,7 @@
     */
     private static @Nullable FastPairDeviceMetadataParcel
             convertStoredDiscoveryItemToFastPairDeviceMetadata(
-            @Nullable Cache.StoredDiscoveryItem storedDiscoveryItem) {
+                    @Nullable Cache.StoredDiscoveryItem storedDiscoveryItem) {
         if (storedDiscoveryItem == null) {
             return null;
         }
diff --git a/nearby/service/proto/src/fastpair/data.proto b/nearby/service/proto/src/fastpair/data.proto
index 37dfac2..6f4fadd 100644
--- a/nearby/service/proto/src/fastpair/data.proto
+++ b/nearby/service/proto/src/fastpair/data.proto
@@ -1,6 +1,7 @@
 syntax = "proto3";
 
 package service.proto;
+import "src/fastpair/cache.proto";
 
 // A device that has been Fast Paired with.
 message FastPairDeviceWithAccountKey {
@@ -12,7 +13,7 @@
   // instead of StoredDiscoveryItem because icing only supports proto lite and
   // StoredDiscoveryItem is handed around as a nano proto in implementation,
   // which are not compatible with each other.
-  bytes discovery_item_bytes = 3;
+  StoredDiscoveryItem discovery_item = 3;
 
   // SHA256 of "account key + headset's public address", this is used to
   // identify the paired headset. Because of adding account key to generate the