Fix incorrect colors for CustomTile in QS

Add support for Supplier<Icon> 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
This commit is contained in:
Evan Laird
2017-10-17 16:00:29 -04:00
parent 0f6e9b5a79
commit b3daf2b88c
3 changed files with 21 additions and 7 deletions

View File

@@ -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<Icon> 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);

View File

@@ -305,7 +305,15 @@ public class CustomTile extends QSTileImpl<State> 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();

View File

@@ -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) {