From a7a1e1d9f2f43b7773cf7464357e7f03af756e70 Mon Sep 17 00:00:00 2001 From: Desh Date: Wed, 18 Sep 2024 14:18:32 +0000 Subject: Avoid non-required AppSearch operations in MetadataSyncApater Flag: android.app.appfunctions.flags.enable_app_function_manager Test: atest FrameworksAppFunctionsTests -c Bug: 357551503 Change-Id: I506469e80e0c39a8f29adcced070d12bfd4f2177 --- .../server/appfunctions/MetadataSyncAdapter.java | 54 +++++++++++++++++----- 1 file changed, 42 insertions(+), 12 deletions(-) (limited to 'services/appfunctions/java') diff --git a/services/appfunctions/java/com/android/server/appfunctions/MetadataSyncAdapter.java b/services/appfunctions/java/com/android/server/appfunctions/MetadataSyncAdapter.java index 8c6f50e5c1bd..e29b6e403f2a 100644 --- a/services/appfunctions/java/com/android/server/appfunctions/MetadataSyncAdapter.java +++ b/services/appfunctions/java/com/android/server/appfunctions/MetadataSyncAdapter.java @@ -145,13 +145,25 @@ public class MetadataSyncAdapter { ArrayMap> removedFunctionsDiffMap = getRemovedFunctionsDiffMap(staticPackageToFunctionMap, runtimePackageToFunctionMap); - Set appRuntimeMetadataSchemas = - getAllRuntimeMetadataSchemas(staticPackageToFunctionMap.keySet()); - appRuntimeMetadataSchemas.add( - AppFunctionRuntimeMetadata.createParentAppFunctionRuntimeSchema()); + if (!staticPackageToFunctionMap.keySet().equals(runtimePackageToFunctionMap.keySet())) { + // Drop removed packages from removedFunctionsDiffMap, as setSchema() deletes them + ArraySet removedPackages = + getRemovedPackages( + staticPackageToFunctionMap.keySet(), removedFunctionsDiffMap.keySet()); + for (String packageName : removedPackages) { + removedFunctionsDiffMap.remove(packageName); + } + Set appRuntimeMetadataSchemas = + getAllRuntimeMetadataSchemas(staticPackageToFunctionMap.keySet()); + appRuntimeMetadataSchemas.add( + AppFunctionRuntimeMetadata.createParentAppFunctionRuntimeSchema()); + SetSchemaRequest addSetSchemaRequest = + buildSetSchemaRequestForRuntimeMetadataSchemas( + mPackageManager, appRuntimeMetadataSchemas); + Objects.requireNonNull( + runtimeMetadataSearchSession.setSchema(addSetSchemaRequest).get()); + } - // Operation order matters here. i.e. remove -> setSchema -> add. Otherwise we would - // encounter an error trying to delete a document with no existing schema. if (!removedFunctionsDiffMap.isEmpty()) { RemoveByDocumentIdRequest removeByDocumentIdRequest = buildRemoveRuntimeMetadataRequest(removedFunctionsDiffMap); @@ -164,12 +176,6 @@ public class MetadataSyncAdapter { } if (!addedFunctionsDiffMap.isEmpty()) { - // TODO(b/357551503): only set schema on package diff - SetSchemaRequest addSetSchemaRequest = - buildSetSchemaRequestForRuntimeMetadataSchemas( - mPackageManager, appRuntimeMetadataSchemas); - Objects.requireNonNull( - runtimeMetadataSearchSession.setSchema(addSetSchemaRequest).get()); PutDocumentsRequest putDocumentsRequest = buildPutRuntimeMetadataRequest(addedFunctionsDiffMap); AppSearchBatchResult putDocumentBatchResult = @@ -275,6 +281,30 @@ public class MetadataSyncAdapter { return appRuntimeMetadataSchemas; } + /** + * This method returns a set of packages that are in the removed function packages but not in + * the all existing static packages. + * + * @param allExistingStaticPackages A set of all existing static metadata packages. + * @param removedFunctionPackages A set of all removed function packages. + * @return A set of packages that are in the removed function packages but not in the all + * existing static packages. + */ + @NonNull + private static ArraySet getRemovedPackages( + @NonNull Set allExistingStaticPackages, + @NonNull Set removedFunctionPackages) { + ArraySet removedPackages = new ArraySet<>(); + + for (String packageName : removedFunctionPackages) { + if (!allExistingStaticPackages.contains(packageName)) { + removedPackages.add(packageName); + } + } + + return removedPackages; + } + /** * This method returns a map of package names to a set of function ids that are in the static * metadata but not in the runtime metadata. -- cgit v1.2.3-59-g8ed1b