From 4b5b23c3fdeb25af41c087b5708062fbecdb0b11 Mon Sep 17 00:00:00 2001 From: Jeongsik Mun Date: Wed, 7 Sep 2022 18:14:51 +0900 Subject: [PATCH] Fix a lot of OVERLAY_CHANGED broadcasts A regression was introduced during refactoring where replacing with PackageStateMutation. This caused a lot of OVERLAY_CHANGED sent while switching to Owner user from Secondary user. This CL modifies the logic to check if OverlayPaths can be updated like Android S. Bug: 245485968 Test: manually verified that OVERLAY_CHANGED not sent as expected. Merged-In: I247aa6d2abce28eebe60e622dbffad12d1c9540c Change-Id: I247aa6d2abce28eebe60e622dbffad12d1c9540c --- .../server/pm/PackageManagerService.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index e9d54268560a6..b7b332621e7fe 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -6546,7 +6546,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService if (dependentState == null) { continue; } - if (!Objects.equals(dependentState.getUserStateOrDefault(userId) + if (canSetOverlayPaths(dependentState.getUserStateOrDefault(userId) .getSharedLibraryOverlayPaths() .get(libName), newOverlayPaths)) { String dependentPackageName = dependent.getPackageName(); @@ -6562,7 +6562,10 @@ public class PackageManagerService implements PackageSender, TestUtilityService } } - outUpdatedPackageNames.add(targetPackageName); + if (canSetOverlayPaths(packageState.getUserStateOrDefault(userId).getOverlayPaths(), + newOverlayPaths)) { + outUpdatedPackageNames.add(targetPackageName); + } commitPackageStateMutation(null, mutator -> { mutator.forPackage(targetPackageName) @@ -6593,6 +6596,17 @@ public class PackageManagerService implements PackageSender, TestUtilityService return true; } + private boolean canSetOverlayPaths(OverlayPaths origPaths, OverlayPaths newPaths) { + if (Objects.equals(origPaths, newPaths)) { + return false; + } + if ((origPaths == null && newPaths.isEmpty()) + || (newPaths == null && origPaths.isEmpty())) { + return false; + } + return true; + } + private void maybeUpdateSystemOverlays(String targetPackageName, OverlayPaths newOverlayPaths) { if (!mResolverReplaced) { if (targetPackageName.equals("android")) {