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

Commit 6a3f83e7 authored by Pierre Barbier de Reuille's avatar Pierre Barbier de Reuille
Browse files

Check colors actually change for App Widget

If new colors are set but do not change, do not re-inflate the App
Widget.

Bug: 187852819
Test: Added logs and added a widget, moved it to see
Change-Id: I672ee7984cab8966f79d839494ac8a7b91679102
parent 9172401c
Loading
Loading
Loading
Loading
+24 −1
Original line number Diff line number Diff line
@@ -78,6 +78,10 @@ public class AppWidgetHostView extends FrameLayout {
    static final int VIEW_MODE_ERROR = 2;
    static final int VIEW_MODE_DEFAULT = 3;

    // Set of valid colors resources.
    private static final int FIRST_RESOURCE_COLOR_ID = android.R.color.system_neutral1_0;
    private static final int LAST_RESOURCE_COLOR_ID = android.R.color.system_accent3_1000;

    // When we're inflating the initialLayout for a AppWidget, we only allow
    // views that are allowed in RemoteViews.
    private static final LayoutInflater.Filter INFLATER_FILTER =
@@ -97,6 +101,7 @@ public class AppWidgetHostView extends FrameLayout {
    private boolean mOnLightBackground;
    private SizeF mCurrentSize = null;
    private RemoteViews.ColorResources mColorResources = null;
    private SparseIntArray mColorMapping = null;
    // Stores the last remote views last inflated.
    private RemoteViews mLastInflatedRemoteViews = null;
    private long mLastInflatedRemoteViewsId = -1;
@@ -888,12 +893,29 @@ public class AppWidgetHostView extends FrameLayout {
     * {@link android.R.color#system_neutral1_500}.
     */
    public void setColorResources(@NonNull SparseIntArray colorMapping) {
        mColorResources = RemoteViews.ColorResources.create(mContext, colorMapping);
        if (mColorMapping != null && isSameColorMapping(mColorMapping, colorMapping)) {
            return;
        }
        mColorMapping = colorMapping.clone();
        mColorResources = RemoteViews.ColorResources.create(mContext, mColorMapping);
        mLayoutId = -1;
        mViewMode = VIEW_MODE_NOINIT;
        reapplyLastRemoteViews();
    }

    /** Check if, in the current context, the two color mappings are equivalent. */
    private boolean isSameColorMapping(SparseIntArray oldColors, SparseIntArray newColors) {
        if (oldColors.size() != newColors.size()) {
            return false;
        }
        for (int i = 0; i < oldColors.size(); i++) {
            if (oldColors.valueAt(i) != newColors.get(oldColors.keyAt(i))) {
                return false;
            }
        }
        return true;
    }

    /**
     * Reset the dynamically overloaded resources, reverting to the default values for
     * all the colors.
@@ -904,6 +926,7 @@ public class AppWidgetHostView extends FrameLayout {
    public void resetColorResources() {
        if (mColorResources != null) {
            mColorResources = null;
            mColorMapping = null;
            mLayoutId = -1;
            mViewMode = VIEW_MODE_NOINIT;
            reapplyLastRemoteViews();