Merge "[Device Controls] Fix background not showing up." into sc-dev am: 84f9faa174

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/14589387

Change-Id: Id5c562b3479f54e6ad44af7ba492d83d7fc67278
This commit is contained in:
Caitlin Cassidy
2021-05-17 20:31:25 +00:00
committed by Automerger Merge Worker

View File

@@ -46,6 +46,7 @@ import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.annotation.ColorInt
import com.android.internal.graphics.ColorUtils
import com.android.systemui.R
import com.android.systemui.animation.Interpolators
@@ -313,7 +314,8 @@ class ControlViewHolder(
@ColorRes bgColor: Int
) {
val bg = context.resources.getColor(R.color.control_default_background, context.theme)
var (newClipColor, newAlpha) = if (enabled) {
val (newClipColor, newAlpha) = if (enabled) {
// allow color overrides for the enabled state only
val color = cws.control?.getCustomColor()?.let {
val state = intArrayOf(android.R.attr.state_enabled)
@@ -326,58 +328,87 @@ class ControlViewHolder(
ALPHA_DISABLED
)
}
val newBaseColor = if (behavior is ToggleRangeBehavior) {
ColorUtils.blendARGB(bg, newClipColor, toggleBackgroundIntensity)
} else {
bg
}
clipLayer.getDrawable().apply {
clipLayer.drawable?.apply {
clipLayer.alpha = ALPHA_DISABLED
val newBaseColor = if (behavior is ToggleRangeBehavior) {
ColorUtils.blendARGB(bg, newClipColor, toggleBackgroundIntensity)
} else {
bg
}
stateAnimator?.cancel()
if (animated) {
val oldColor = if (this is GradientDrawable) {
this.color?.defaultColor ?: newClipColor
} else {
newClipColor
}
val oldBaseColor = baseLayer.color?.defaultColor ?: newBaseColor
val oldAlpha = layout.alpha
// Animate both alpha and background colors. Only animate colors for
// GradientDrawables and not static images as used for the ThumbnailTemplate.
stateAnimator = ValueAnimator.ofInt(clipLayer.alpha, newAlpha).apply {
addUpdateListener {
alpha = it.animatedValue as Int
if (this is GradientDrawable) {
this.setColor(ColorUtils.blendARGB(oldColor, newClipColor,
it.animatedFraction))
}
baseLayer.setColor(ColorUtils.blendARGB(oldBaseColor, newBaseColor,
it.animatedFraction))
layout.alpha = MathUtils.lerp(oldAlpha, 1f, it.animatedFraction)
}
addListener(object : AnimatorListenerAdapter() {
override fun onAnimationEnd(animation: Animator?) {
stateAnimator = null
}
})
duration = STATE_ANIMATION_DURATION
interpolator = Interpolators.CONTROL_STATE
start()
}
startBackgroundAnimation(this, newAlpha, newClipColor, newBaseColor)
} else {
alpha = newAlpha
if (this is GradientDrawable) {
this.setColor(newClipColor)
}
baseLayer.setColor(newBaseColor)
layout.alpha = 1f
applyBackgroundChange(
this, newAlpha, newClipColor, newBaseColor, newLayoutAlpha = 1f
)
}
}
}
private fun startBackgroundAnimation(
clipDrawable: Drawable,
newAlpha: Int,
@ColorInt newClipColor: Int,
@ColorInt newBaseColor: Int
) {
val oldClipColor = if (clipDrawable is GradientDrawable) {
clipDrawable.color?.defaultColor ?: newClipColor
} else {
newClipColor
}
val oldBaseColor = baseLayer.color?.defaultColor ?: newBaseColor
val oldAlpha = layout.alpha
stateAnimator = ValueAnimator.ofInt(clipLayer.alpha, newAlpha).apply {
addUpdateListener {
val updatedAlpha = it.animatedValue as Int
val updatedClipColor = ColorUtils.blendARGB(oldClipColor, newClipColor,
it.animatedFraction)
val updatedBaseColor = ColorUtils.blendARGB(oldBaseColor, newBaseColor,
it.animatedFraction)
val updatedLayoutAlpha = MathUtils.lerp(oldAlpha, 1f, it.animatedFraction)
applyBackgroundChange(
clipDrawable,
updatedAlpha,
updatedClipColor,
updatedBaseColor,
updatedLayoutAlpha
)
}
addListener(object : AnimatorListenerAdapter() {
override fun onAnimationEnd(animation: Animator?) {
stateAnimator = null
}
})
duration = STATE_ANIMATION_DURATION
interpolator = Interpolators.CONTROL_STATE
start()
}
}
/**
* Applies a change in background.
*
* Updates both alpha and background colors. Only updates colors for GradientDrawables and not
* static images as used for the ThumbnailTemplate.
*/
private fun applyBackgroundChange(
clipDrawable: Drawable,
newAlpha: Int,
@ColorInt newClipColor: Int,
@ColorInt newBaseColor: Int,
newLayoutAlpha: Float
) {
clipDrawable.alpha = newAlpha
if (clipDrawable is GradientDrawable) {
clipDrawable.setColor(newClipColor)
}
baseLayer.setColor(newBaseColor)
layout.alpha = newLayoutAlpha
}
private fun animateStatusChange(animated: Boolean, statusRowUpdater: () -> Unit) {
statusAnimator?.cancel()