From 83fb5ca09184da1bf6a84774533efc14d52b2301 Mon Sep 17 00:00:00 2001 From: Yurii Zubrytskyi Date: Wed, 25 May 2022 22:34:10 -0700 Subject: [PATCH] Keep overlay info for the android app info up to date Bug: 230890975 Test: manually update the wallpaper shade and check resolver Change-Id: I851ba79bed0c70ac40a615cbaac9ed1c92a5e800 Merged-In: I851ba79bed0c70ac40a615cbaac9ed1c92a5e800 --- .../server/pm/PackageManagerService.java | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index c21c8d6141b88..ebce22716644b 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -799,6 +799,13 @@ public class PackageManagerService implements PackageSender, TestUtilityService private AndroidPackage mPlatformPackage; ComponentName mCustomResolverComponentName; + // Recorded overlay paths configuration for the Android app info. + private String[] mPlatformPackageOverlayPaths = null; + private String[] mPlatformPackageOverlayResourceDirs = null; + // And the same paths for the replaced resolver activity package + private String[] mReplacedResolverPackageOverlayPaths = null; + private String[] mReplacedResolverPackageOverlayResourceDirs = null; + private boolean mResolverReplaced = false; @NonNull @@ -6563,9 +6570,63 @@ public class PackageManagerService implements PackageSender, TestUtilityService }); } + if (userId == UserHandle.USER_SYSTEM) { + // Keep the overlays in the system application info (and anything special cased as well) + // up to date to make sure system ui is themed correctly. + for (int i = 0; i < numberOfPendingChanges; i++) { + final String targetPackageName = pendingChanges.keyAt(i); + final OverlayPaths newOverlayPaths = pendingChanges.valueAt(i); + maybeUpdateSystemOverlays(targetPackageName, newOverlayPaths); + } + } + invalidatePackageInfoCache(); } + private void maybeUpdateSystemOverlays(String targetPackageName, OverlayPaths newOverlayPaths) { + if (!mResolverReplaced) { + if (targetPackageName.equals("android")) { + if (newOverlayPaths == null) { + mPlatformPackageOverlayPaths = null; + mPlatformPackageOverlayResourceDirs = null; + } else { + mPlatformPackageOverlayPaths = newOverlayPaths.getOverlayPaths().toArray( + new String[0]); + mPlatformPackageOverlayResourceDirs = newOverlayPaths.getResourceDirs().toArray( + new String[0]); + } + applyUpdatedSystemOverlayPaths(); + } + } else { + if (targetPackageName.equals(mResolveActivity.applicationInfo.packageName)) { + if (newOverlayPaths == null) { + mReplacedResolverPackageOverlayPaths = null; + mReplacedResolverPackageOverlayResourceDirs = null; + } else { + mReplacedResolverPackageOverlayPaths = + newOverlayPaths.getOverlayPaths().toArray(new String[0]); + mReplacedResolverPackageOverlayResourceDirs = + newOverlayPaths.getResourceDirs().toArray(new String[0]); + } + applyUpdatedSystemOverlayPaths(); + } + } + } + + private void applyUpdatedSystemOverlayPaths() { + if (mAndroidApplication == null) { + Slog.i(TAG, "Skipped the AndroidApplication overlay paths update - no app yet"); + } else { + mAndroidApplication.overlayPaths = mPlatformPackageOverlayPaths; + mAndroidApplication.resourceDirs = mPlatformPackageOverlayResourceDirs; + } + if (mResolverReplaced) { + mResolveActivity.applicationInfo.overlayPaths = mReplacedResolverPackageOverlayPaths; + mResolveActivity.applicationInfo.resourceDirs = + mReplacedResolverPackageOverlayResourceDirs; + } + } + private void enforceAdjustRuntimePermissionsPolicyOrUpgradeRuntimePermissions( @NonNull String message) { if (mContext.checkCallingOrSelfPermission( @@ -7027,6 +7088,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService } PackageManagerService.onChanged(); } + applyUpdatedSystemOverlayPaths(); } ApplicationInfo getCoreAndroidApplication() {