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

Commit 2645b3ef authored by Jeff DeCew's avatar Jeff DeCew
Browse files

Fix notification colors on theme change.

Causes:
* The theme is implemented with RROs
* RRO state is stored in the ApplicationInfo's overlayPaths
* Notification.extras contains the ApplicationInfo from when the notification was posted

The fix here is to fetch and inject the latest ApplicationInfo (using a method which has a correctly-invalidated cache) right before recovering the builder from the notification to bind content.
Also, because this codepath is operating on the background thread, there are no SystemUI jank risks during the overlay change.

Fixes: 182662365
Test: change theme; notifications change color
Change-Id: Ibdfaf811155d64e0ecb7c70075e3ba4429c6d920
parent 4f1ad7e4
Loading
Loading
Loading
Loading
+18 −0
Original line number Diff line number Diff line
@@ -27,8 +27,10 @@ import android.app.Notification;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.os.AsyncTask;
import android.os.CancellationSignal;
import android.os.UserHandle;
import android.service.notification.StatusBarNotification;
import android.util.Log;
import android.view.View;
@@ -768,10 +770,26 @@ public class NotificationContentInflater implements NotificationRowContentBinder
            return mReInflateFlags;
        }

        void updateApplicationInfo(StatusBarNotification sbn) {
            String packageName = sbn.getPackageName();
            int userId = UserHandle.getUserId(sbn.getUid());
            final ApplicationInfo appInfo;
            try {
                // This method has an internal cache, so we don't need to add our own caching here.
                appInfo = mContext.getPackageManager().getApplicationInfoAsUser(packageName,
                        PackageManager.MATCH_UNINSTALLED_PACKAGES, userId);
            } catch (PackageManager.NameNotFoundException e) {
                return;
            }
            Notification.addFieldsFromContext(appInfo, sbn.getNotification());
        }

        @Override
        protected InflationProgress doInBackground(Void... params) {
            try {
                final StatusBarNotification sbn = mEntry.getSbn();
                // Ensure the ApplicationInfo is updated before a builder is recovered.
                updateApplicationInfo(sbn);
                final Notification.Builder recoveredBuilder
                        = Notification.Builder.recoverBuilder(mContext,
                        sbn.getNotification());