From f9de5e977002e8bf195d4981384ae9bb8c7732fb 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 | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 621ad5223de23..4f8c792d3b495 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -803,6 +803,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 @@ -6562,11 +6569,61 @@ 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. + maybeUpdateSystemOverlays(targetPackageName, newOverlayPaths); + } + invalidatePackageInfoCache(); return true; } + 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( @@ -7043,6 +7100,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService } PackageManagerService.onChanged(); } + applyUpdatedSystemOverlayPaths(); } ApplicationInfo getCoreAndroidApplication() {