From 7d5eb9543fd3deba691cf0994f7add204e26f1b7 Mon Sep 17 00:00:00 2001 From: Beth Thibodeau Date: Mon, 21 Dec 2020 15:46:01 -0500 Subject: [PATCH] Use default color when artwork is too small Fixes: 175833333 Test: atest SystemUITests:MediaDataManagerTest Change-Id: I12e0bd8c32f3f5f824f83312d4b3b3cf181fd486 (cherry picked from commit 8d15cc48fb51e359d7c7296be19d4c1ac212a3b9) --- .../systemui/media/MediaDataManager.kt | 9 +++++--- .../systemui/media/MediaDataManagerTest.kt | 23 +++++++++++++++++++ 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt b/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt index 2be509a138163..2d7aafc497d8b 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt @@ -70,6 +70,7 @@ private const val DEBUG = true private const val DEFAULT_LUMINOSITY = 0.25f private const val LUMINOSITY_THRESHOLD = 0.05f private const val SATURATION_MULTIPLIER = 0.8f +const val DEFAULT_COLOR = Color.DKGRAY private val LOADING = MediaData(-1, false, 0, null, null, null, null, null, emptyList(), emptyList(), "INVALID", null, null, null, true, null) @@ -380,7 +381,7 @@ class MediaDataManager( } else { null } - val bgColor = artworkBitmap?.let { computeBackgroundColor(it) } ?: Color.DKGRAY + val bgColor = artworkBitmap?.let { computeBackgroundColor(it) } ?: DEFAULT_COLOR val mediaAction = getResumeMediaAction(resumeAction) foregroundExecutor.execute { @@ -559,12 +560,14 @@ class MediaDataManager( private fun computeBackgroundColor(artworkBitmap: Bitmap?): Int { var color = Color.WHITE - if (artworkBitmap != null) { - // If we have art, get colors from that + if (artworkBitmap != null && artworkBitmap.width > 1 && artworkBitmap.height > 1) { + // If we have valid art, get colors from that val p = MediaNotificationProcessor.generateArtworkPaletteBuilder(artworkBitmap) .generate() val swatch = MediaNotificationProcessor.findBackgroundSwatch(p) color = swatch.rgb + } else { + return DEFAULT_COLOR } // Adapt background color, so it's always subdued and text is legible val tmpHsl = floatArrayOf(0f, 0f, 0f) diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataManagerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataManagerTest.kt index b47ee29213803..2f99b2a2a449f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataManagerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataManagerTest.kt @@ -2,6 +2,7 @@ package com.android.systemui.media import android.app.Notification.MediaStyle import android.app.PendingIntent +import android.graphics.Bitmap import android.media.MediaDescription import android.media.MediaMetadata import android.media.session.MediaController @@ -246,4 +247,26 @@ class MediaDataManagerTest : SysuiTestCase() { verify(listener).onMediaDataRemoved(eq(KEY)) } + + @Test + fun testBadArtwork_doesNotUse() { + // WHEN notification has a too-small artwork + val artwork = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888) + val notif = SbnBuilder().run { + setPkg(PACKAGE_NAME) + modifyNotification(context).also { + it.setSmallIcon(android.R.drawable.ic_media_pause) + it.setStyle(MediaStyle().apply { setMediaSession(session.sessionToken) }) + it.setLargeIcon(artwork) + } + build() + } + mediaDataManager.onNotificationAdded(KEY, notif) + + // THEN it loads and uses the default background color + assertThat(backgroundExecutor.runAllReady()).isEqualTo(1) + assertThat(foregroundExecutor.runAllReady()).isEqualTo(1) + verify(listener).onMediaDataLoaded(eq(KEY), eq(null), capture(mediaDataCaptor)) + assertThat(mediaDataCaptor.value!!.backgroundColor).isEqualTo(DEFAULT_COLOR) + } }