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