From 50f82cd8eccad61e3c153f9b1fbb89fc83e7b61c Mon Sep 17 00:00:00 2001 From: Hawkwood Glazier Date: Thu, 15 Sep 2022 16:53:33 +0000 Subject: [PATCH] MediaPlayer will now transition the background with color scheme This change transitions the media player background whenever the related color scheme has changed. Since the color scheme is usually generated from the background, it should not trigger superflous transitions. Fixes: 246956968 Test: atest MediaControlPanelTest ColorSchemeTransitionTest Change-Id: I963afcf4ba0fd8c2e9ebca4d634098f63454fab6 Merged-In: I963afcf4ba0fd8c2e9ebca4d634098f63454fab6 --- .../systemui/media/ColorSchemeTransition.kt | 12 ++++++---- .../systemui/media/MediaControlPanel.java | 10 ++++---- .../systemui/media/MediaControlPanelTest.kt | 24 ++++++++++++++----- 3 files changed, 32 insertions(+), 14 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/media/ColorSchemeTransition.kt b/packages/SystemUI/src/com/android/systemui/media/ColorSchemeTransition.kt index f1d5e94bfbf3a..258db2d158538 100644 --- a/packages/SystemUI/src/com/android/systemui/media/ColorSchemeTransition.kt +++ b/packages/SystemUI/src/com/android/systemui/media/ColorSchemeTransition.kt @@ -37,7 +37,7 @@ import com.android.systemui.util.getColorWithAlpha * is triggered. */ interface ColorTransition { - fun updateColorScheme(scheme: ColorScheme?) + fun updateColorScheme(scheme: ColorScheme?): Boolean } /** @@ -67,14 +67,16 @@ open class AnimatingColorTransition( applyColor(currentColor) } - override fun updateColorScheme(scheme: ColorScheme?) { + override fun updateColorScheme(scheme: ColorScheme?): Boolean { val newTargetColor = if (scheme == null) defaultColor else extractColor(scheme) if (newTargetColor != targetColor) { sourceColor = currentColor targetColor = newTargetColor valueAnimator.cancel() valueAnimator.start() + return true } + return false } init { @@ -235,9 +237,11 @@ class ColorSchemeTransition internal constructor( return Utils.getColorAttr(context, id).defaultColor } - fun updateColorScheme(colorScheme: ColorScheme?, enableGradient: Boolean) { + fun updateColorScheme(colorScheme: ColorScheme?, enableGradient: Boolean): Boolean { isGradientEnabled = enableGradient - colorTransitions.forEach { it.updateColorScheme(colorScheme) } + var anyChanged = false + colorTransitions.forEach { anyChanged = it.updateColorScheme(colorScheme) || anyChanged } colorScheme?.let { mediaViewHolder.gutsViewHolder.colorScheme = colorScheme } + return anyChanged } } diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java index 159784575b69a..37be0b382c917 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java +++ b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java @@ -673,10 +673,15 @@ public class MediaControlPanel { } mArtworkBoundId = reqId; + // Transition Colors to current color scheme + boolean colorSchemeChanged = mColorSchemeTransition + .updateColorScheme(colorScheme, isArtworkBound); + // Bind the album view to the artwork or a transition drawable ImageView albumView = mMediaViewHolder.getAlbumView(); albumView.setPadding(0, 0, 0, 0); - if (updateBackground || (!mIsArtworkBound && isArtworkBound)) { + if (updateBackground || colorSchemeChanged + || (!mIsArtworkBound && isArtworkBound)) { if (mPrevArtwork == null) { albumView.setImageDrawable(artwork); } else { @@ -699,9 +704,6 @@ public class MediaControlPanel { mIsArtworkBound = isArtworkBound; } - // Transition Colors to current color scheme - mColorSchemeTransition.updateColorScheme(colorScheme, mIsArtworkBound); - // App icon - use notification icon ImageView appIconView = mMediaViewHolder.getAppIcon(); appIconView.clearColorFilter(); 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 6f4579bb14b5e..6cf2e6606fe8d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt @@ -577,14 +577,20 @@ public class MediaControlPanelTest : SysuiTestCase() { @Test fun bindAlbumView_bitmapInLaterStates_setAfterExecutors() { - val bmp = Bitmap.createBitmap(10, 10, Bitmap.Config.ARGB_8888) - val canvas = Canvas(bmp) - canvas.drawColor(Color.RED) - val albumArt = Icon.createWithBitmap(bmp) + val redBmp = Bitmap.createBitmap(10, 10, Bitmap.Config.ARGB_8888) + val redCanvas = Canvas(redBmp) + redCanvas.drawColor(Color.RED) + val redArt = Icon.createWithBitmap(redBmp) + + val greenBmp = Bitmap.createBitmap(10, 10, Bitmap.Config.ARGB_8888) + val greenCanvas = Canvas(greenBmp) + greenCanvas.drawColor(Color.GREEN) + val greenArt = Icon.createWithBitmap(greenBmp) val state0 = mediaData.copy(artwork = null) - val state1 = mediaData.copy(artwork = albumArt) - val state2 = mediaData.copy(artwork = albumArt) + val state1 = mediaData.copy(artwork = redArt) + val state2 = mediaData.copy(artwork = redArt) + val state3 = mediaData.copy(artwork = greenArt) player.attachPlayer(viewHolder) // First binding sets (empty) drawable @@ -613,6 +619,12 @@ public class MediaControlPanelTest : SysuiTestCase() { bgExecutor.runAllReady() mainExecutor.runAllReady() verify(albumView, times(2)).setImageDrawable(any(Drawable::class.java)) + + // Fourth binding to new image runs transition due to color scheme change + player.bindPlayer(state3, PACKAGE) + bgExecutor.runAllReady() + mainExecutor.runAllReady() + verify(albumView, times(3)).setImageDrawable(any(Drawable::class.java)) } @Test