Fix mode icon sharing in modes list
Modes sharing the same icon would also share the applied tint (e.g. all with the "active" tint even if only the last one of them is active).
(Although it should never happen, also removed a potential NPE for mode icons without ConstantState).
Fixes: 367131481
Test: manual
Flag: android.app.modes_ui
Change-Id: I56867783310ea57f2e92c866ff0b5b53ac86bf37
diff --git a/src/com/android/settings/notification/modes/IconUtil.java b/src/com/android/settings/notification/modes/IconUtil.java
index 33d0d96..23817cb 100644
--- a/src/com/android/settings/notification/modes/IconUtil.java
+++ b/src/com/android/settings/notification/modes/IconUtil.java
@@ -60,7 +60,7 @@
private static Drawable applyTint(@NonNull Context context, @NonNull Drawable icon,
@AttrRes int colorAttr) {
- icon = icon.mutate();
+ icon = mutateDrawable(context.getResources(), icon);
icon.setTintList(Utils.getColorAttr(context, colorAttr));
return icon;
}
@@ -218,9 +218,9 @@
private static Drawable composeIcons(Resources res, Drawable outer, ColorStateList outerColor,
@Px int outerSizePx, Drawable icon, ColorStateList iconColor, @Px int iconSizePx) {
- Drawable background = checkNotNull(outer.getConstantState()).newDrawable(res).mutate();
+ Drawable background = mutateDrawable(res, outer);
background.setTintList(outerColor);
- Drawable foreground = checkNotNull(icon.getConstantState()).newDrawable(res).mutate();
+ Drawable foreground = mutateDrawable(res, icon);
foreground.setTintList(iconColor);
LayerDrawable layerDrawable = new LayerDrawable(new Drawable[] { background, foreground });
@@ -232,4 +232,13 @@
layerDrawable.setBounds(0, 0, outerSizePx, outerSizePx);
return layerDrawable;
}
+
+ private static Drawable mutateDrawable(Resources res, Drawable drawable) {
+ Drawable.ConstantState cs = drawable.getConstantState();
+ if (cs != null) {
+ return cs.newDrawable(res).mutate();
+ } else {
+ return drawable.mutate();
+ }
+ }
}