From ef53f601f2b46dfaaef27d7fecb1712178e5c6ea Mon Sep 17 00:00:00 2001 From: Beth Thibodeau Date: Tue, 19 Jul 2022 21:29:29 -0500 Subject: Fix crash when loading album art by resource When the album art is loaded from the notification largeIcon it may be a resource rather than a bitmap, so it has to be loaded as a drawable. Bitmaps are still loaded using `WallpaperColors.fromBitmap` to avoid the extra steps needed by the `fromDrawable` method. Fixes: 239368697 Test: manual Test: atest MediaControlPanelTest Change-Id: I0ba9a4b0f4d308cc360a785b68cbabdcb2480690 --- .../com/android/systemui/media/MediaControlPanel.java | 17 +++++++++++++++-- .../com/android/systemui/media/MediaControlPanelTest.kt | 13 +++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java index aeff2d41bf92..012d76651b23 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java +++ b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java @@ -682,9 +682,22 @@ public class MediaControlPanel { Drawable artwork; boolean isArtworkBound; Icon artworkIcon = data.getArtwork(); + WallpaperColors wallpaperColors = null; if (artworkIcon != null) { - WallpaperColors wallpaperColors = WallpaperColors - .fromBitmap(artworkIcon.getBitmap()); + if (artworkIcon.getType() == Icon.TYPE_BITMAP + || artworkIcon.getType() == Icon.TYPE_ADAPTIVE_BITMAP) { + // Avoids extra processing if this is already a valid bitmap + wallpaperColors = WallpaperColors + .fromBitmap(artworkIcon.getBitmap()); + } else { + Drawable artworkDrawable = artworkIcon.loadDrawable(mContext); + if (artworkDrawable != null) { + wallpaperColors = WallpaperColors + .fromDrawable(artworkIcon.loadDrawable(mContext)); + } + } + } + if (wallpaperColors != null) { mutableColorScheme = new ColorScheme(wallpaperColors, true, Style.CONTENT); Drawable albumArt = getScaledBackground(artworkIcon, width, height); GradientDrawable gradient = (GradientDrawable) mContext diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt index c13c30baed0a..178502269e73 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt @@ -560,6 +560,19 @@ public class MediaControlPanelTest : SysuiTestCase() { verify(albumView).setLayerType(View.LAYER_TYPE_HARDWARE, null) } + @Test + fun bindAlbumView_artUsesResource() { + val albumArt = Icon.createWithResource(context, R.drawable.ic_android) + val state = mediaData.copy(artwork = albumArt) + + player.attachPlayer(viewHolder) + player.bindPlayer(state, PACKAGE) + bgExecutor.runAllReady() + mainExecutor.runAllReady() + + verify(albumView).setImageDrawable(any(Drawable::class.java)) + } + @Test fun bindAlbumView_setAfterExecutors() { val bmp = Bitmap.createBitmap(10, 10, Bitmap.Config.ARGB_8888) -- cgit v1.2.3-59-g8ed1b