From c3f0b06ccc18ec3c558af4c596cf88f33347a966 Mon Sep 17 00:00:00 2001 From: Amin Shaikh Date: Tue, 12 Feb 2019 19:00:17 -0500 Subject: [PATCH] Update notification layouts when overlays change. - Use the overlay directories specified in the ApplicationInfo retrieved from PackageManager. The resources directories cached in LoadedApk in ActvityThread may contain stale values for remote applications. - Clear StatusBarNotification#mContext when overlays change to ensure that the Resources for remote Contexts are not stale. These Contexts will be recreated in the subsequent AsyncInflationTask. Bug: 120987987 Test: mp core sysuig; change theme using theme picker Change-Id: I100d164facdd4208610ee6409dd3868d6f304712 --- core/java/android/app/ContextImpl.java | 21 ++++++++++++------- .../notification/StatusBarNotification.java | 7 +++++++ .../row/ExpandableNotificationRow.java | 1 + 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java index 1a728c12e1384..6908ca27480c2 100644 --- a/core/java/android/app/ContextImpl.java +++ b/core/java/android/app/ContextImpl.java @@ -2101,7 +2101,8 @@ class ContextImpl extends Context { } private static Resources createResources(IBinder activityToken, LoadedApk pi, String splitName, - int displayId, Configuration overrideConfig, CompatibilityInfo compatInfo) { + int displayId, Configuration overrideConfig, CompatibilityInfo compatInfo, + String[] overlayDirs) { final String[] splitResDirs; final ClassLoader classLoader; try { @@ -2113,7 +2114,7 @@ class ContextImpl extends Context { return ResourcesManager.getInstance().getResources(activityToken, pi.getResDir(), splitResDirs, - pi.getOverlayDirs(), + overlayDirs, pi.getApplicationInfo().sharedLibraryFiles, displayId, overrideConfig, @@ -2131,9 +2132,11 @@ class ContextImpl extends Context { new UserHandle(UserHandle.getUserId(application.uid)), flags, null, null); final int displayId = getDisplayId(); - + // overlayDirs is retrieved directly from ApplicationInfo since ActivityThread may have + // a LoadedApk containing Resources with stale overlays for a remote application. + final String[] overlayDirs = application.resourceDirs; c.setResources(createResources(mActivityToken, pi, null, displayId, null, - getDisplayAdjustments(displayId).getCompatibilityInfo())); + getDisplayAdjustments(displayId).getCompatibilityInfo(), overlayDirs)); if (c.mResources != null) { return c; } @@ -2168,7 +2171,7 @@ class ContextImpl extends Context { final int displayId = getDisplayId(); c.setResources(createResources(mActivityToken, pi, null, displayId, null, - getDisplayAdjustments(displayId).getCompatibilityInfo())); + getDisplayAdjustments(displayId).getCompatibilityInfo(), pi.getOverlayDirs())); if (c.mResources != null) { return c; } @@ -2218,7 +2221,8 @@ class ContextImpl extends Context { final int displayId = getDisplayId(); context.setResources(createResources(mActivityToken, mPackageInfo, mSplitName, displayId, - overrideConfiguration, getDisplayAdjustments(displayId).getCompatibilityInfo())); + overrideConfiguration, getDisplayAdjustments(displayId).getCompatibilityInfo(), + mPackageInfo.getOverlayDirs())); return context; } @@ -2233,7 +2237,8 @@ class ContextImpl extends Context { final int displayId = display.getDisplayId(); context.setResources(createResources(mActivityToken, mPackageInfo, mSplitName, displayId, - null, getDisplayAdjustments(displayId).getCompatibilityInfo())); + null, getDisplayAdjustments(displayId).getCompatibilityInfo(), + mPackageInfo.getOverlayDirs())); context.mDisplay = display; return context; } @@ -2416,7 +2421,7 @@ class ContextImpl extends Context { ContextImpl context = new ContextImpl(null, systemContext.mMainThread, packageInfo, null, null, null, 0, null, null); context.setResources(createResources(null, packageInfo, null, displayId, null, - packageInfo.getCompatibilityInfo())); + packageInfo.getCompatibilityInfo(), packageInfo.getOverlayDirs())); context.updateDisplay(displayId); return context; } diff --git a/core/java/android/service/notification/StatusBarNotification.java b/core/java/android/service/notification/StatusBarNotification.java index 551bb8ada0440..954dc39430193 100644 --- a/core/java/android/service/notification/StatusBarNotification.java +++ b/core/java/android/service/notification/StatusBarNotification.java @@ -369,6 +369,13 @@ public class StatusBarNotification implements Parcelable { return overrideGroupKey; } + /** + * @hide + */ + public void clearPackageContext() { + mContext = null; + } + /** * @hide */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java index 8f7778b4a351f..69828c1664635 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java @@ -1213,6 +1213,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView l.initView(); l.reInflateViews(); } + mStatusBarNotification.clearPackageContext(); mNotificationInflater.clearCachesAndReInflate(); onNotificationUpdated(); }