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