Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c3f0b06c authored by Amin Shaikh's avatar Amin Shaikh
Browse files

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
parent 7d7c8698
Loading
Loading
Loading
Loading
+13 −8
Original line number Diff line number Diff line
@@ -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;
    }
+7 −0
Original line number Diff line number Diff line
@@ -369,6 +369,13 @@ public class StatusBarNotification implements Parcelable {
        return overrideGroupKey;
    }

    /**
     * @hide
     */
    public void clearPackageContext() {
        mContext = null;
    }

    /**
     * @hide
     */
+1 −0
Original line number Diff line number Diff line
@@ -1213,6 +1213,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
            l.initView();
            l.reInflateViews();
        }
        mStatusBarNotification.clearPackageContext();
        mNotificationInflater.clearCachesAndReInflate();
        onNotificationUpdated();
    }