From b3daf2b88c86243db85dd8425df8d3a59d3b3d4d Mon Sep 17 00:00:00 2001 From: Evan Laird Date: Tue, 17 Oct 2017 16:00:29 -0400 Subject: [PATCH] Fix incorrect colors for CustomTile in QS Add support for Supplier in QSTile.State, allowing a method for CustomTile not to cache the drawable for its IconViews. This fixes the problem that the ImageViews in QQS and QS were trying to use the same drawable and putting it in a bad state. Test: Add 3rd party tile to first position in QS and turn on/off; visual Change-Id: I408d6391a718fcb3f847e72bd303551d2d004dbb Fixes: 67356768 --- .../src/com/android/systemui/plugins/qs/QSTile.java | 5 +++++ .../android/systemui/qs/external/CustomTile.java | 10 +++++++++- .../systemui/qs/tileimpl/QSIconViewImpl.java | 13 +++++++------ 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java index b4b4e19028b01..c52c0aae35568 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java @@ -26,6 +26,7 @@ import com.android.systemui.plugins.qs.QSTile.Icon; import com.android.systemui.plugins.qs.QSTile.State; import java.util.Objects; +import java.util.function.Supplier; @ProvidesInterface(version = QSTile.VERSION) @DependsOn(target = QSIconView.class) @@ -104,6 +105,7 @@ public interface QSTile { public static class State { public static final int VERSION = 1; public Icon icon; + public Supplier iconSupplier; public int state = Tile.STATE_ACTIVE; public CharSequence label; public CharSequence contentDescription; @@ -118,6 +120,7 @@ public interface QSTile { if (other == null) throw new IllegalArgumentException(); if (!other.getClass().equals(getClass())) throw new IllegalArgumentException(); final boolean changed = !Objects.equals(other.icon, icon) + || !Objects.equals(other.iconSupplier, iconSupplier) || !Objects.equals(other.label, label) || !Objects.equals(other.contentDescription, contentDescription) || !Objects.equals(other.dualLabelContentDescription, @@ -130,6 +133,7 @@ public interface QSTile { || !Objects.equals(other.dualTarget, dualTarget) || !Objects.equals(other.slash, slash); other.icon = icon; + other.iconSupplier = iconSupplier; other.label = label; other.contentDescription = contentDescription; other.dualLabelContentDescription = dualLabelContentDescription; @@ -150,6 +154,7 @@ public interface QSTile { protected StringBuilder toStringBuilder() { final StringBuilder sb = new StringBuilder(getClass().getSimpleName()).append('['); sb.append(",icon=").append(icon); + sb.append(",iconSupplier=").append(iconSupplier); sb.append(",label=").append(label); sb.append(",contentDescription=").append(contentDescription); sb.append(",dualLabelContentDescription=").append(dualLabelContentDescription); diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java b/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java index 176112baa2a57..b3244a5947df9 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java @@ -305,7 +305,15 @@ public class CustomTile extends QSTileImpl implements TileChangeListener state.state = Tile.STATE_UNAVAILABLE; drawable = mDefaultIcon.loadDrawable(mContext); } - state.icon = new DrawableIcon(drawable); + + final Drawable drawableF = drawable; + state.iconSupplier = () -> { + Drawable.ConstantState cs = drawableF.getConstantState(); + if (cs != null) { + return new DrawableIcon(cs.newDrawable()); + } + return null; + }; state.label = mTile.getLabel(); if (mTile.getContentDescription() != null) { state.contentDescription = mTile.getContentDescription(); diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSIconViewImpl.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSIconViewImpl.java index e8c8b90757921..c249e3778c0a3 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSIconViewImpl.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSIconViewImpl.java @@ -87,14 +87,15 @@ public class QSIconViewImpl extends QSIconView { } protected void updateIcon(ImageView iv, State state) { - if (!Objects.equals(state.icon, iv.getTag(R.id.qs_icon_tag)) + final QSTile.Icon icon = state.iconSupplier != null ? state.iconSupplier.get() : state.icon; + if (!Objects.equals(icon, iv.getTag(R.id.qs_icon_tag)) || !Objects.equals(state.slash, iv.getTag(R.id.qs_slash_tag))) { boolean shouldAnimate = iv.isShown() && mAnimationEnabled && iv.getDrawable() != null; - Drawable d = state.icon != null - ? shouldAnimate ? state.icon.getDrawable(mContext) - : state.icon.getInvisibleDrawable(mContext) : null; - int padding = state.icon != null ? state.icon.getPadding() : 0; + Drawable d = icon != null + ? shouldAnimate ? icon.getDrawable(mContext) + : icon.getInvisibleDrawable(mContext) : null; + int padding = icon != null ? icon.getPadding() : 0; if (d != null) { d.setAutoMirrored(false); d.setLayoutDirection(getLayoutDirection()); @@ -107,7 +108,7 @@ public class QSIconViewImpl extends QSIconView { iv.setImageDrawable(d); } - iv.setTag(R.id.qs_icon_tag, state.icon); + iv.setTag(R.id.qs_icon_tag, icon); iv.setTag(R.id.qs_slash_tag, state.slash); iv.setPadding(0, padding, 0, padding); if (d instanceof Animatable2) {