Use property instead of meta-data for primary CDM service
Meta-data will increase the system server ram consumption.
So we decide to use property instead of meta-data to
indicate the primary cdm service.
Test: atest CtsCompanionDeviceManagerCoreTestCases:SelfPresenceReportingTest
Fix: 217953124
Change-Id: I91ebe374bba392d14d693d3c6a36433b5af7cf2a
diff --git a/core/java/android/companion/CompanionDeviceManager.java b/core/java/android/companion/CompanionDeviceManager.java
index 36802ea..1568500 100644
--- a/core/java/android/companion/CompanionDeviceManager.java
+++ b/core/java/android/companion/CompanionDeviceManager.java
@@ -780,9 +780,9 @@
}
/**
- * Notify the system that the given self-managed association has just 'appeared'.
+ * Notify the system that the given self-managed association has just appeared.
* This causes the system to bind to the companion app to keep it running until the association
- * is reported as 'disappeared'
+ * is reported as disappeared
*
* <p>This API is only available for the companion apps that manage the connectivity by
* themselves.</p>
@@ -803,7 +803,7 @@
}
/**
- * Notify the system that the given self-managed association has just 'disappeared'.
+ * Notify the system that the given self-managed association has just disappeared.
* This causes the system to unbind to the companion app.
*
* <p>This API is only available for the companion apps that manage the connectivity by
diff --git a/core/java/android/companion/CompanionDeviceService.java b/core/java/android/companion/CompanionDeviceService.java
index cb96ebe..9e1bf4b 100644
--- a/core/java/android/companion/CompanionDeviceService.java
+++ b/core/java/android/companion/CompanionDeviceService.java
@@ -77,10 +77,11 @@
* {@link #onDeviceAppeared(AssociationInfo)} and {@link #onDeviceDisappeared(AssociationInfo)}
* only to one "primary" services.
* Applications that declare multiple {@link CompanionDeviceService}-s should indicate the "primary"
- * service using "android.companion.primary" tag.
+ * service using "android.companion.PROPERTY_PRIMARY_COMPANION_DEVICE_SERVICE" service level
+ * property.
* <pre>{@code
- * <meta-data
- * android:name="android.companion.primary"
+ * <property
+ * android:name="android.companion.PROPERTY_PRIMARY_COMPANION_DEVICE_SERVICE"
* android:value="true" />
* }</pre>
*
diff --git a/services/companion/java/com/android/server/companion/PackageUtils.java b/services/companion/java/com/android/server/companion/PackageUtils.java
index 818f0cf..a2b2059 100644
--- a/services/companion/java/com/android/server/companion/PackageUtils.java
+++ b/services/companion/java/com/android/server/companion/PackageUtils.java
@@ -18,7 +18,6 @@
import static android.content.pm.PackageManager.FEATURE_COMPANION_DEVICE_SETUP;
import static android.content.pm.PackageManager.GET_CONFIGURATIONS;
-import static android.content.pm.PackageManager.GET_META_DATA;
import static android.content.pm.PackageManager.GET_PERMISSIONS;
import static com.android.server.companion.CompanionDeviceManagerService.TAG;
@@ -53,7 +52,8 @@
final class PackageUtils {
private static final Intent COMPANION_SERVICE_INTENT =
new Intent(CompanionDeviceService.SERVICE_INTERFACE);
- private static final String META_DATA_PRIMARY_TAG = "android.companion.primary";
+ private static final String PROPERTY_PRIMARY_TAG =
+ "android.companion.PROPERTY_PRIMARY_COMPANION_DEVICE_SERVICE";
static @Nullable PackageInfo getPackageInfo(@NonNull Context context,
@UserIdInt int userId, @NonNull String packageName) {
@@ -84,9 +84,8 @@
static @NonNull Map<String, List<ComponentName>> getCompanionServicesForUser(
@NonNull Context context, @UserIdInt int userId) {
final PackageManager pm = context.getPackageManager();
- final ResolveInfoFlags flags = ResolveInfoFlags.of(GET_META_DATA);
- final List<ResolveInfo> companionServices =
- pm.queryIntentServicesAsUser(COMPANION_SERVICE_INTENT, flags, userId);
+ final List<ResolveInfo> companionServices = pm.queryIntentServicesAsUser(
+ COMPANION_SERVICE_INTENT, ResolveInfoFlags.of(0), userId);
final Map<String, List<ComponentName>> packageNameToServiceInfoList = new HashMap<>();
@@ -109,7 +108,8 @@
service.packageName, it -> new LinkedList<>());
final ComponentName componentName = service.getComponentName();
- if (isPrimaryCompanionDeviceService(service)) {
+
+ if (isPrimaryCompanionDeviceService(pm, componentName)) {
// "Primary" service should be at the head of the list.
services.addFirst(componentName);
} else {
@@ -120,7 +120,12 @@
return packageNameToServiceInfoList;
}
- private static boolean isPrimaryCompanionDeviceService(ServiceInfo service) {
- return service.metaData != null && service.metaData.getBoolean(META_DATA_PRIMARY_TAG);
+ private static boolean isPrimaryCompanionDeviceService(@NonNull PackageManager pm,
+ @NonNull ComponentName componentName) {
+ try {
+ return pm.getProperty(PROPERTY_PRIMARY_TAG, componentName).getBoolean();
+ } catch (PackageManager.NameNotFoundException e) {
+ return false;
+ }
}
}