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
This commit is contained in:
Amin Shaikh
2019-02-12 19:00:17 -05:00
parent 7d7c8698ab
commit c3f0b06ccc
3 changed files with 21 additions and 8 deletions

View File

@@ -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;
}

View File

@@ -369,6 +369,13 @@ public class StatusBarNotification implements Parcelable {
return overrideGroupKey;
}
/**
* @hide
*/
public void clearPackageContext() {
mContext = null;
}
/**
* @hide
*/

View File

@@ -1213,6 +1213,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
l.initView();
l.reInflateViews();
}
mStatusBarNotification.clearPackageContext();
mNotificationInflater.clearCachesAndReInflate();
onNotificationUpdated();
}