From 58b04ae7cf982c3305312d945e241b1679d405c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=ADas=20Hern=C3=A1ndez?= Date: Fri, 20 Sep 2024 11:40:17 +0200 Subject: [PATCH] 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 --- .../settings/notification/modes/IconUtil.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/com/android/settings/notification/modes/IconUtil.java b/src/com/android/settings/notification/modes/IconUtil.java index 33d0d961698..23817cbd5db 100644 --- a/src/com/android/settings/notification/modes/IconUtil.java +++ b/src/com/android/settings/notification/modes/IconUtil.java @@ -60,7 +60,7 @@ class IconUtil { 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 @@ class IconUtil { 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 @@ class IconUtil { 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(); + } + } }