From 2f4d0ea966c599fd1cc75368c9e28fb1323c148e Mon Sep 17 00:00:00 2001 From: Michael Mikhail Date: Wed, 1 Mar 2023 19:00:08 +0000 Subject: [PATCH] Add a recycle bitmap check before extracting wallpaper color Makes sure we don't call WallpaperColors.fromBitmap if the bitmap of the icon is recycled. Bug: 269079356 Test: atest MediaControlPanelTest Change-Id: Ia57b6f190853bbfeaf588c64f31c88469fb8a807 --- .../media/controls/ui/MediaControlPanel.java | 11 +++++++---- .../media/controls/ui/MediaControlPanelTest.kt | 13 +++++++++++++ 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaControlPanel.java b/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaControlPanel.java index b1d6f97e9b670..4ddff530e6586 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaControlPanel.java +++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaControlPanel.java @@ -928,13 +928,16 @@ public class MediaControlPanel { if (artworkIcon.getType() == Icon.TYPE_BITMAP || artworkIcon.getType() == Icon.TYPE_ADAPTIVE_BITMAP) { // Avoids extra processing if this is already a valid bitmap - return WallpaperColors - .fromBitmap(artworkIcon.getBitmap()); + Bitmap artworkBitmap = artworkIcon.getBitmap(); + if (artworkBitmap.isRecycled()) { + Log.d(TAG, "Cannot load wallpaper color from a recycled bitmap"); + return null; + } + return WallpaperColors.fromBitmap(artworkBitmap); } else { Drawable artworkDrawable = artworkIcon.loadDrawable(mContext); if (artworkDrawable != null) { - return WallpaperColors - .fromDrawable(artworkIcon.loadDrawable(mContext)); + return WallpaperColors.fromDrawable(artworkDrawable); } } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaControlPanelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaControlPanelTest.kt index 9a5f08084e0a7..fd353afff7c0b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaControlPanelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaControlPanelTest.kt @@ -730,6 +730,19 @@ public class MediaControlPanelTest : SysuiTestCase() { .isNotEqualTo(greenArtwork.getDrawable(1).constantState) } + @Test + fun getWallpaperColor_recycledBitmap_notCrashing() { + // Setup redArt icon. + val redBmp = Bitmap.createBitmap(10, 10, Bitmap.Config.ARGB_8888) + val redArt = Icon.createWithBitmap(redBmp) + + // Recycle bitmap of redArt icon. + redArt.bitmap.recycle() + + // get wallpaperColor without illegal exception. + player.getWallpaperColor(redArt) + } + @Test fun bind_seekBarDisabled_hasActions_seekBarVisibilityIsSetToInvisible() { useRealConstraintSets()