From 50a3c1b95e150666f8bfb64098409140d13aa4a9 Mon Sep 17 00:00:00 2001 From: Ryan Mitchell Date: Tue, 16 Feb 2021 21:45:16 -0800 Subject: [PATCH] Always update overlay paths of newly added apps When a package is updated, its overlays must always be initialized. A package may be affected by framework overlays or overlays of shared libraries it uses. The overlay paths must always be initialized in package manager. To work around this issue, rebooting the device always initializes overlay paths for all installed applications. Bug: 180416025 Bug: 180016597 Test: OverlayManagerTests Change-Id: I1bf0d460336ee757bb191adaaeec0089911fa182 --- .../com/android/server/om/OverlayManagerServiceImpl.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java b/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java index fb183f57cac42..799ab4633b2a4 100644 --- a/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java +++ b/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java @@ -244,7 +244,11 @@ final class OverlayManagerServiceImpl { @NonNull Set onPackageAdded(@NonNull final String pkgName, final int userId) throws OperationFailedException { - return reconcileSettingsForPackage(pkgName, userId, 0 /* flags */); + final Set updatedTargets = new ArraySet<>(); + // Always update the overlays of newly added packages. + updatedTargets.add(new PackageAndUser(pkgName, userId)); + updatedTargets.addAll(reconcileSettingsForPackage(pkgName, userId, 0 /* flags */)); + return updatedTargets; } @NonNull @@ -282,7 +286,7 @@ final class OverlayManagerServiceImpl { private Set removeOverlaysForUser( @NonNull final Predicate condition, final int userId) { final List overlays = mSettings.removeIf( - io -> userId == io.userId && condition.test(io) ); + io -> userId == io.userId && condition.test(io)); Set targets = Collections.emptySet(); for (int i = 0, n = overlays.size(); i < n; i++) { final OverlayInfo info = overlays.get(i);