Merge "Use standard touch path for drawable state" into rvc-dev
diff --git a/packages/SystemUI/res/drawable/qs_media_background.xml b/packages/SystemUI/res/drawable/qs_media_background.xml
index 80db3be..656d2e4 100644
--- a/packages/SystemUI/res/drawable/qs_media_background.xml
+++ b/packages/SystemUI/res/drawable/qs_media_background.xml
@@ -16,7 +16,5 @@
   -->
 <com.android.systemui.media.IlluminationDrawable
     xmlns:systemui="http://schemas.android.com/apk/res-auto"
-    systemui:rippleMinSize="30dp"
-    systemui:rippleMaxSize="135dp"
     systemui:highlight="15"
     systemui:cornerRadius="?android:attr/dialogCornerRadius" />
\ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/qs_media_light_source.xml b/packages/SystemUI/res/drawable/qs_media_light_source.xml
new file mode 100644
index 0000000..b2647c1
--- /dev/null
+++ b/packages/SystemUI/res/drawable/qs_media_light_source.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2020 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<com.android.systemui.media.LightSourceDrawable
+    xmlns:systemui="http://schemas.android.com/apk/res-auto"
+    systemui:rippleMinSize="25dp"
+    systemui:rippleMaxSize="135dp" />
\ No newline at end of file
diff --git a/packages/SystemUI/res/layout/media_view.xml b/packages/SystemUI/res/layout/media_view.xml
index 1a1fddb..d721818 100644
--- a/packages/SystemUI/res/layout/media_view.xml
+++ b/packages/SystemUI/res/layout/media_view.xml
@@ -94,7 +94,8 @@
         android:id="@+id/media_seamless"
         android:layout_width="0dp"
         android:layout_height="wrap_content"
-        android:background="@*android:drawable/media_seamless_background"
+        android:foreground="@*android:drawable/media_seamless_background"
+        android:background="@drawable/qs_media_light_source"
         android:orientation="horizontal"
         android:forceHasOverlappingRendering="false"
         android:paddingLeft="12dp"
diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml
index 07ba5eb..ed36bdb 100644
--- a/packages/SystemUI/res/values/styles.xml
+++ b/packages/SystemUI/res/values/styles.xml
@@ -623,7 +623,7 @@
     </style>
 
     <style name="MediaPlayer.Button" parent="@android:style/Widget.Material.Button.Borderless.Small">
-        <item name="android:background">@null</item>
+        <item name="android:background">@drawable/qs_media_light_source</item>
         <item name="android:tint">@android:color/white</item>
         <item name="android:stateListAnimator">@anim/media_button_state_list_animator</item>
     </style>
diff --git a/packages/SystemUI/src/com/android/systemui/media/IlluminationDrawable.kt b/packages/SystemUI/src/com/android/systemui/media/IlluminationDrawable.kt
index 7432165..10b36e9 100644
--- a/packages/SystemUI/src/com/android/systemui/media/IlluminationDrawable.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/IlluminationDrawable.kt
@@ -1,8 +1,23 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
 package com.android.systemui.media
 
 import android.animation.Animator
 import android.animation.AnimatorListenerAdapter
-import android.animation.AnimatorSet
 import android.animation.ValueAnimator
 import android.content.res.ColorStateList
 import android.content.res.Resources
@@ -10,16 +25,12 @@
 import android.graphics.Canvas
 import android.graphics.Color
 import android.graphics.ColorFilter
+import android.graphics.Outline
 import android.graphics.Paint
 import android.graphics.PixelFormat
-import android.graphics.RadialGradient
-import android.graphics.Rect
-import android.graphics.Shader
 import android.graphics.drawable.Drawable
 import android.util.AttributeSet
 import android.util.MathUtils
-import android.util.MathUtils.lerp
-import android.view.MotionEvent
 import android.view.View
 import androidx.annotation.Keep
 import com.android.internal.graphics.ColorUtils
@@ -29,20 +40,6 @@
 import org.xmlpull.v1.XmlPullParser
 
 private const val BACKGROUND_ANIM_DURATION = 370L
-private const val RIPPLE_ANIM_DURATION = 800L
-private const val RIPPLE_DOWN_PROGRESS = 0.05f
-private const val RIPPLE_CANCEL_DURATION = 200L
-private val GRADIENT_STOPS = floatArrayOf(0.2f, 1f)
-
-private data class RippleData(
-    var x: Float,
-    var y: Float,
-    var alpha: Float,
-    var progress: Float,
-    var minSize: Float,
-    var maxSize: Float,
-    var highlight: Float
-)
 
 /**
  * Drawable that can draw an animated gradient when tapped.
@@ -53,9 +50,10 @@
     private var themeAttrs: IntArray? = null
     private var cornerRadius = 0f
     private var highlightColor = Color.TRANSPARENT
-    private val rippleData = RippleData(0f, 0f, 0f, 0f, 0f, 0f, 0f)
     private var tmpHsl = floatArrayOf(0f, 0f, 0f)
     private var paint = Paint()
+    private var highlight = 0f
+    private val lightSources = arrayListOf<LightSourceDrawable>()
 
     private var backgroundColor = Color.TRANSPARENT
     set(value) {
@@ -66,70 +64,20 @@
         animateBackground()
     }
 
-    /**
-     * Draw a small highlight under the finger before expanding (or cancelling) it.
-     */
-    private var pressed: Boolean = false
-        set(value) {
-            if (value == field) {
-                return
-            }
-            field = value
-
-            if (value) {
-                rippleAnimation?.cancel()
-                rippleData.alpha = 1f
-                rippleData.progress = RIPPLE_DOWN_PROGRESS
-            } else {
-                rippleAnimation?.cancel()
-                rippleAnimation = ValueAnimator.ofFloat(rippleData.alpha, 0f).apply {
-                    duration = RIPPLE_CANCEL_DURATION
-                    interpolator = Interpolators.LINEAR_OUT_SLOW_IN
-                    addUpdateListener {
-                        rippleData.alpha = it.animatedValue as Float
-                        invalidateSelf()
-                    }
-                    addListener(object : AnimatorListenerAdapter() {
-                        var cancelled = false
-                        override fun onAnimationCancel(animation: Animator?) {
-                            cancelled = true;
-                        }
-
-                        override fun onAnimationEnd(animation: Animator?) {
-                            if (cancelled) {
-                                return
-                            }
-                            rippleData.progress = 0f
-                            rippleData.alpha = 0f
-                            rippleAnimation = null
-                            invalidateSelf()
-                        }
-                    })
-                    start()
-                }
-            }
-            invalidateSelf()
-        }
-
-    private var rippleAnimation: Animator? = null
     private var backgroundAnimation: ValueAnimator? = null
 
     /**
      * Draw background and gradient.
      */
     override fun draw(canvas: Canvas) {
-        paint.shader = if (rippleData.progress > 0) {
-            val radius = lerp(rippleData.minSize, rippleData.maxSize, rippleData.progress)
-            val centerColor = blendARGB(paint.color, highlightColor, rippleData.alpha)
-            RadialGradient(rippleData.x, rippleData.y, radius, intArrayOf(centerColor, paint.color),
-                    GRADIENT_STOPS, Shader.TileMode.CLAMP)
-        } else {
-            null
-        }
         canvas.drawRoundRect(0f, 0f, bounds.width().toFloat(), bounds.height().toFloat(),
                 cornerRadius, cornerRadius, paint)
     }
 
+    override fun getOutline(outline: Outline) {
+        outline.setRoundRect(bounds, cornerRadius)
+    }
+
     override fun getOpacity(): Int {
         return PixelFormat.TRANSPARENT
     }
@@ -151,14 +99,8 @@
             cornerRadius = a.getDimension(R.styleable.IlluminationDrawable_cornerRadius,
                     cornerRadius)
         }
-        if (a.hasValue(R.styleable.IlluminationDrawable_rippleMinSize)) {
-            rippleData.minSize = a.getDimension(R.styleable.IlluminationDrawable_rippleMinSize, 0f)
-        }
-        if (a.hasValue(R.styleable.IlluminationDrawable_rippleMaxSize)) {
-            rippleData.maxSize = a.getDimension(R.styleable.IlluminationDrawable_rippleMaxSize, 0f)
-        }
         if (a.hasValue(R.styleable.IlluminationDrawable_highlight)) {
-            rippleData.highlight = a.getInteger(R.styleable.IlluminationDrawable_highlight, 0) /
+            highlight = a.getInteger(R.styleable.IlluminationDrawable_highlight, 0) /
                     100f
         }
     }
@@ -192,10 +134,10 @@
     private fun animateBackground() {
         ColorUtils.colorToHSL(backgroundColor, tmpHsl)
         val L = tmpHsl[2]
-        tmpHsl[2] = MathUtils.constrain(if (L < 1f - rippleData.highlight) {
-            L + rippleData.highlight
+        tmpHsl[2] = MathUtils.constrain(if (L < 1f - highlight) {
+            L + highlight
         } else {
-            L - rippleData.highlight
+            L - highlight
         }, 0f, 1f)
 
         val initialBackground = paint.color
@@ -210,6 +152,7 @@
                 val progress = it.animatedValue as Float
                 paint.color = blendARGB(initialBackground, backgroundColor, progress)
                 highlightColor = blendARGB(initialHighlight, finalHighlight, progress)
+                lightSources.forEach { it.highlightColor = highlightColor }
                 invalidateSelf()
             }
             addListener(object : AnimatorListenerAdapter() {
@@ -226,69 +169,11 @@
         backgroundColor = tint!!.defaultColor
     }
 
-    /**
-     * Draws an animated ripple that expands fading away.
-     */
-    private fun illuminate() {
-        rippleData.alpha = 1f
-        invalidateSelf()
-
-        rippleAnimation?.cancel()
-        rippleAnimation = AnimatorSet().apply {
-            playTogether(ValueAnimator.ofFloat(1f, 0f).apply {
-                startDelay = 133
-                duration = RIPPLE_ANIM_DURATION - startDelay
-                interpolator = Interpolators.LINEAR_OUT_SLOW_IN
-                addUpdateListener {
-                    rippleData.alpha = it.animatedValue as Float
-                    invalidateSelf()
-                }
-            }, ValueAnimator.ofFloat(rippleData.progress, 1f).apply {
-                duration = RIPPLE_ANIM_DURATION
-                interpolator = Interpolators.LINEAR_OUT_SLOW_IN
-                addUpdateListener {
-                    rippleData.progress = it.animatedValue as Float
-                    invalidateSelf()
-                }
-            })
-            addListener(object : AnimatorListenerAdapter() {
-                override fun onAnimationEnd(animation: Animator?) {
-                    rippleData.progress = 0f
-                    rippleAnimation = null
-                    invalidateSelf()
-                }
-            })
-            start()
-        }
-    }
-
-    /**
-     * Setup touch events on a view such as tapping it would trigger effects on this drawable.
-     * @param target View receiving touched.
-     * @param container View that holds this drawable.
-     */
-    fun setupTouch(target: View, container: View) {
-        val containerRect = Rect()
-        target.setOnTouchListener { view: View, event: MotionEvent ->
-            container.getGlobalVisibleRect(containerRect)
-            rippleData.x = event.rawX - containerRect.left
-            rippleData.y = event.rawY - containerRect.top
-
-            when (event.action) {
-                MotionEvent.ACTION_DOWN -> {
-                    pressed = true
-                }
-                MotionEvent.ACTION_MOVE -> {
-                    invalidateSelf()
-                }
-                MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
-                    pressed = false
-                    if (event.action == MotionEvent.ACTION_UP) {
-                        illuminate()
-                    }
-                }
-            }
-            false
+    fun registerLightSource(lightSource: View) {
+        if (lightSource.background is LightSourceDrawable) {
+            lightSources.add(lightSource.background as LightSourceDrawable)
+        } else if (lightSource.foreground is LightSourceDrawable) {
+            lightSources.add(lightSource.foreground as LightSourceDrawable)
         }
     }
 }
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/media/LightSourceDrawable.kt b/packages/SystemUI/src/com/android/systemui/media/LightSourceDrawable.kt
new file mode 100644
index 0000000..cee7101
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/media/LightSourceDrawable.kt
@@ -0,0 +1,291 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.media
+
+import android.animation.Animator
+import android.animation.AnimatorListenerAdapter
+import android.animation.AnimatorSet
+import android.animation.ValueAnimator
+import android.content.res.Resources
+import android.content.res.TypedArray
+import android.graphics.Canvas
+import android.graphics.Color
+import android.graphics.ColorFilter
+import android.graphics.Outline
+import android.graphics.Paint
+import android.graphics.PixelFormat
+import android.graphics.RadialGradient
+import android.graphics.Rect
+import android.graphics.Shader
+import android.graphics.drawable.Drawable
+import android.util.AttributeSet
+import android.util.MathUtils.lerp
+import androidx.annotation.Keep
+import com.android.internal.graphics.ColorUtils
+import com.android.systemui.Interpolators
+import com.android.systemui.R
+import org.xmlpull.v1.XmlPullParser
+
+private const val RIPPLE_ANIM_DURATION = 800L
+private const val RIPPLE_DOWN_PROGRESS = 0.05f
+private const val RIPPLE_CANCEL_DURATION = 200L
+private val GRADIENT_STOPS = floatArrayOf(0.2f, 1f)
+
+private data class RippleData(
+    var x: Float,
+    var y: Float,
+    var alpha: Float,
+    var progress: Float,
+    var minSize: Float,
+    var maxSize: Float,
+    var highlight: Float
+)
+
+/**
+ * Drawable that can draw an animated gradient when tapped.
+ */
+@Keep
+class LightSourceDrawable : Drawable() {
+
+    private var pressed = false
+    private var themeAttrs: IntArray? = null
+    private val rippleData = RippleData(0f, 0f, 0f, 0f, 0f, 0f, 0f)
+    private var paint = Paint()
+
+    var highlightColor = Color.WHITE
+    set(value) {
+        if (field == value) {
+            return
+        }
+        field = value
+        invalidateSelf()
+    }
+
+    /**
+     * Draw a small highlight under the finger before expanding (or cancelling) it.
+     */
+    private var active: Boolean = false
+        set(value) {
+            if (value == field) {
+                return
+            }
+            field = value
+
+            if (value) {
+                rippleAnimation?.cancel()
+                rippleData.alpha = 1f
+                rippleData.progress = RIPPLE_DOWN_PROGRESS
+            } else {
+                rippleAnimation?.cancel()
+                rippleAnimation = ValueAnimator.ofFloat(rippleData.alpha, 0f).apply {
+                    duration = RIPPLE_CANCEL_DURATION
+                    interpolator = Interpolators.LINEAR_OUT_SLOW_IN
+                    addUpdateListener {
+                        rippleData.alpha = it.animatedValue as Float
+                        invalidateSelf()
+                    }
+                    addListener(object : AnimatorListenerAdapter() {
+                        var cancelled = false
+                        override fun onAnimationCancel(animation: Animator?) {
+                            cancelled = true
+                        }
+
+                        override fun onAnimationEnd(animation: Animator?) {
+                            if (cancelled) {
+                                return
+                            }
+                            rippleData.progress = 0f
+                            rippleData.alpha = 0f
+                            rippleAnimation = null
+                            invalidateSelf()
+                        }
+                    })
+                    start()
+                }
+            }
+            invalidateSelf()
+        }
+
+    private var rippleAnimation: Animator? = null
+
+    /**
+     * Draw background and gradient.
+     */
+    override fun draw(canvas: Canvas) {
+        val radius = lerp(rippleData.minSize, rippleData.maxSize, rippleData.progress)
+        val centerColor =
+                ColorUtils.setAlphaComponent(highlightColor, (rippleData.alpha * 255).toInt())
+        paint.shader = RadialGradient(rippleData.x, rippleData.y, radius,
+                intArrayOf(centerColor, Color.TRANSPARENT), GRADIENT_STOPS, Shader.TileMode.CLAMP)
+        canvas.drawCircle(rippleData.x, rippleData.y, radius, paint)
+    }
+
+    override fun getOutline(outline: Outline) {
+        // No bounds, parent will clip it
+    }
+
+    override fun getOpacity(): Int {
+        return PixelFormat.TRANSPARENT
+    }
+
+    override fun inflate(
+        r: Resources,
+        parser: XmlPullParser,
+        attrs: AttributeSet,
+        theme: Resources.Theme?
+    ) {
+        val a = obtainAttributes(r, theme, attrs, R.styleable.IlluminationDrawable)
+        themeAttrs = a.extractThemeAttrs()
+        updateStateFromTypedArray(a)
+        a.recycle()
+    }
+
+    private fun updateStateFromTypedArray(a: TypedArray) {
+        if (a.hasValue(R.styleable.IlluminationDrawable_rippleMinSize)) {
+            rippleData.minSize = a.getDimension(R.styleable.IlluminationDrawable_rippleMinSize, 0f)
+        }
+        if (a.hasValue(R.styleable.IlluminationDrawable_rippleMaxSize)) {
+            rippleData.maxSize = a.getDimension(R.styleable.IlluminationDrawable_rippleMaxSize, 0f)
+        }
+        if (a.hasValue(R.styleable.IlluminationDrawable_highlight)) {
+            rippleData.highlight = a.getInteger(R.styleable.IlluminationDrawable_highlight, 0) /
+                    100f
+        }
+    }
+
+    override fun canApplyTheme(): Boolean {
+        return themeAttrs != null && themeAttrs!!.size > 0 || super.canApplyTheme()
+    }
+
+    override fun applyTheme(t: Resources.Theme) {
+        super.applyTheme(t)
+        themeAttrs?.let {
+            val a = t.resolveAttributes(it, R.styleable.IlluminationDrawable)
+            updateStateFromTypedArray(a)
+            a.recycle()
+        }
+    }
+
+    override fun setColorFilter(p0: ColorFilter?) {
+        throw UnsupportedOperationException("Color filters are not supported")
+    }
+
+    override fun setAlpha(value: Int) {
+        throw UnsupportedOperationException("Alpha is not supported")
+    }
+
+    /**
+     * Draws an animated ripple that expands fading away.
+     */
+    private fun illuminate() {
+        rippleData.alpha = 1f
+        invalidateSelf()
+
+        rippleAnimation?.cancel()
+        rippleAnimation = AnimatorSet().apply {
+            playTogether(ValueAnimator.ofFloat(1f, 0f).apply {
+                startDelay = 133
+                duration = RIPPLE_ANIM_DURATION - startDelay
+                interpolator = Interpolators.LINEAR_OUT_SLOW_IN
+                addUpdateListener {
+                    rippleData.alpha = it.animatedValue as Float
+                    invalidateSelf()
+                }
+            }, ValueAnimator.ofFloat(rippleData.progress, 1f).apply {
+                duration = RIPPLE_ANIM_DURATION
+                interpolator = Interpolators.LINEAR_OUT_SLOW_IN
+                addUpdateListener {
+                    rippleData.progress = it.animatedValue as Float
+                    invalidateSelf()
+                }
+            })
+            addListener(object : AnimatorListenerAdapter() {
+                override fun onAnimationEnd(animation: Animator?) {
+                    rippleData.progress = 0f
+                    rippleAnimation = null
+                    invalidateSelf()
+                }
+            })
+            start()
+        }
+    }
+
+    override fun setHotspot(x: Float, y: Float) {
+        rippleData.x = x
+        rippleData.y = y
+        if (active) {
+            invalidateSelf()
+        }
+    }
+
+    override fun isStateful(): Boolean {
+        return true
+    }
+
+    override fun hasFocusStateSpecified(): Boolean {
+        return true
+    }
+
+    override fun isProjected(): Boolean {
+        return true
+    }
+
+    override fun getDirtyBounds(): Rect {
+        val radius = lerp(rippleData.minSize, rippleData.maxSize, rippleData.progress)
+        val bounds = Rect((rippleData.x - radius).toInt(), (rippleData.y - radius).toInt(),
+                (rippleData.x + radius).toInt(), (rippleData.y + radius).toInt())
+        bounds.union(super.getDirtyBounds())
+        return bounds
+    }
+
+    override fun onStateChange(stateSet: IntArray?): Boolean {
+        val changed = super.onStateChange(stateSet)
+        if (stateSet == null) {
+            return changed
+        }
+
+        val wasPressed = pressed
+        var enabled = false
+        pressed = false
+        var focused = false
+        var hovered = false
+
+        for (state in stateSet) {
+            when (state) {
+                com.android.internal.R.attr.state_enabled -> {
+                    enabled = true
+                }
+                com.android.internal.R.attr.state_focused -> {
+                    focused = true
+                }
+                com.android.internal.R.attr.state_pressed -> {
+                    pressed = true
+                }
+                com.android.internal.R.attr.state_hovered -> {
+                    hovered = true
+                }
+            }
+        }
+
+        active = enabled && (pressed || focused || hovered)
+        if (wasPressed && !pressed) {
+            illuminate()
+        }
+
+        return changed
+    }
+}
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java
index 8e1e1b2..5595201 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java
@@ -304,7 +304,7 @@
         TextView deviceName = mViewHolder.getSeamlessText();
 
         // Update the outline color
-        RippleDrawable bkgDrawable = (RippleDrawable) mViewHolder.getSeamless().getBackground();
+        RippleDrawable bkgDrawable = (RippleDrawable) mViewHolder.getSeamless().getForeground();
         GradientDrawable rect = (GradientDrawable) bkgDrawable.getDrawable(0);
         rect.setStroke(2, deviceName.getCurrentTextColor());
         rect.setColor(Color.TRANSPARENT);
diff --git a/packages/SystemUI/src/com/android/systemui/media/PlayerViewHolder.kt b/packages/SystemUI/src/com/android/systemui/media/PlayerViewHolder.kt
index 60c576b..610e00d 100644
--- a/packages/SystemUI/src/com/android/systemui/media/PlayerViewHolder.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/PlayerViewHolder.kt
@@ -41,7 +41,7 @@
     val artistText = itemView.requireViewById<TextView>(R.id.header_artist)
 
     // Output switcher
-    val seamless = itemView.findViewById<ViewGroup>(R.id.media_seamless)
+    val seamless = itemView.requireViewById<ViewGroup>(R.id.media_seamless)
     val seamlessIcon = itemView.requireViewById<ImageView>(R.id.media_seamless_image)
     val seamlessText = itemView.requireViewById<TextView>(R.id.media_seamless_text)
 
@@ -59,12 +59,12 @@
 
     init {
         (player.background as IlluminationDrawable).let {
-            it.setupTouch(seamless, player)
-            it.setupTouch(action0, player)
-            it.setupTouch(action1, player)
-            it.setupTouch(action2, player)
-            it.setupTouch(action3, player)
-            it.setupTouch(action4, player)
+            it.registerLightSource(seamless)
+            it.registerLightSource(action0)
+            it.registerLightSource(action1)
+            it.registerLightSource(action2)
+            it.registerLightSource(action3)
+            it.registerLightSource(action4)
         }
     }
 
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 b71a62c..9d2b6f4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt
@@ -122,7 +122,7 @@
         whenever(holder.artistText).thenReturn(artistText)
         seamless = FrameLayout(context)
         val seamlessBackground = mock(RippleDrawable::class.java)
-        seamless.setBackground(seamlessBackground)
+        seamless.foreground = seamlessBackground
         whenever(seamlessBackground.getDrawable(0)).thenReturn(mock(GradientDrawable::class.java))
         whenever(holder.seamless).thenReturn(seamless)
         seamlessIcon = ImageView(context)