From b4cab87015fa29e23460f4f47d4d06adfe3a9e9a Mon Sep 17 00:00:00 2001 From: conradchen Date: Thu, 3 Feb 2022 10:24:52 -0800 Subject: [PATCH] [Card] Fix crash on Pre-Q devices when checked icon is null LayerDrawable has this bug that if any of the provided drawables are null during creation, it crashes. The fix is only available on Q+. Fixes this by providing a dummy drawable when we find checked icon is null. Resolves https://github.com/material-components/material-components-android/issues/2532 PiperOrigin-RevId: 426179927 --- .../android/material/card/MaterialCardViewHelper.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/java/com/google/android/material/card/MaterialCardViewHelper.java b/lib/java/com/google/android/material/card/MaterialCardViewHelper.java index 26c7e926d35..f4baf4c3f31 100644 --- a/lib/java/com/google/android/material/card/MaterialCardViewHelper.java +++ b/lib/java/com/google/android/material/card/MaterialCardViewHelper.java @@ -25,6 +25,7 @@ import android.content.res.TypedArray; import android.graphics.Color; import android.graphics.Rect; +import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.InsetDrawable; import android.graphics.drawable.LayerDrawable; @@ -88,6 +89,10 @@ class MaterialCardViewHelper { private static final int CHECKED_ICON_LAYER_INDEX = 2; + // We need to create a dummy drawable to avoid LayerDrawable crashes on API 28-. + private static final Drawable CHECKED_ICON_NONE = + VERSION.SDK_INT <= VERSION_CODES.P ? new ColorDrawable() : null; + @NonNull private final MaterialCardView materialCardView; @NonNull private final Rect userContentPadding = new Rect(); @@ -387,11 +392,12 @@ Drawable getCheckedIcon() { } void setCheckedIcon(@Nullable Drawable checkedIcon) { - this.checkedIcon = checkedIcon; if (checkedIcon != null) { this.checkedIcon = DrawableCompat.wrap(checkedIcon).mutate(); DrawableCompat.setTintList(this.checkedIcon, checkedIconTint); setChecked(materialCardView.isChecked()); + } else { + this.checkedIcon = CHECKED_ICON_NONE; } if (clickableForegroundDrawable != null) {