From d60b33275e4578741ee8056d9dcfeac2d8f12cf3 Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Wed, 15 Apr 2020 18:06:47 -0700 Subject: [PATCH] Dim down controls when slider is active Fixes: 154169450 Test: manual Change-Id: I036c6aca9cc9716279d176afcf833b57bc7fec48 --- packages/SystemUI/res/values/dimens.xml | 1 + .../controls/controller/ControlsController.kt | 8 ++++++++ .../controls/controller/ControlsControllerImpl.kt | 5 +++++ .../controls/ui/ControlActionCoordinator.kt | 5 +++++ .../systemui/controls/ui/ControlViewHolder.kt | 14 +++++++++++++- .../systemui/controls/ui/ControlsUiController.kt | 1 + .../controls/ui/ControlsUiControllerImpl.kt | 14 ++++++++++++++ .../systemui/controls/ui/ToggleRangeBehavior.kt | 2 ++ 8 files changed, 49 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 622e4ccef4874..599ed1696ec9e 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -1253,6 +1253,7 @@ 2dp 3dp 5% + 40% 25dp diff --git a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsController.kt b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsController.kt index 7cab847d52f7f..79a5b0a1ce525 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsController.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsController.kt @@ -23,6 +23,7 @@ import android.service.controls.actions.ControlAction import com.android.systemui.controls.ControlStatus import com.android.systemui.controls.UserAwareController import com.android.systemui.controls.management.ControlsFavoritingActivity +import com.android.systemui.controls.ui.ControlWithState import com.android.systemui.controls.ui.ControlsUiController import java.util.function.Consumer @@ -111,6 +112,13 @@ interface ControlsController : UserAwareController { @ControlAction.ResponseResult response: Int ) + /** + * When a control should be highlighted, dimming down what's around it. + * + * @param cws focused control, or {@code null} if nothing should be highlighted. + */ + fun onFocusChanged(cws: ControlWithState?) + // FAVORITE MANAGEMENT /** diff --git a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsControllerImpl.kt b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsControllerImpl.kt index 6d34009169d50..5626a5de2e3cb 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsControllerImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsControllerImpl.kt @@ -41,6 +41,7 @@ import com.android.systemui.broadcast.BroadcastDispatcher import com.android.systemui.controls.ControlStatus import com.android.systemui.controls.ControlsServiceInfo import com.android.systemui.controls.management.ControlsListingController +import com.android.systemui.controls.ui.ControlWithState import com.android.systemui.controls.ui.ControlsUiController import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.dump.DumpManager @@ -504,6 +505,10 @@ class ControlsControllerImpl @Inject constructor ( } } + override fun onFocusChanged(cws: ControlWithState?) { + uiController.onFocusChanged(cws) + } + override fun refreshStatus(componentName: ComponentName, control: Control) { if (!confirmAvailability()) { Log.d(TAG, "Controls not available") diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinator.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinator.kt index 2c1a91dca2251..b3c6cab2adff0 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinator.kt @@ -25,6 +25,7 @@ import android.service.controls.actions.CommandAction import android.util.Log import android.view.HapticFeedbackConstants import com.android.systemui.R +import com.android.systemui.controls.controller.ControlsController object ControlActionCoordinator { const val MIN_LEVEL = 0 @@ -76,4 +77,8 @@ object ControlActionCoordinator { it.show() } } + + fun setFocusedElement(cvh: ControlViewHolder?, controlsController: ControlsController) { + controlsController.onFocusChanged(cvh?.cws) + } } diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt index 93e1bd4449382..61a323d0b9a85 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt @@ -31,6 +31,7 @@ import android.service.controls.templates.StatelessTemplate import android.service.controls.templates.TemperatureControlTemplate import android.service.controls.templates.ToggleRangeTemplate import android.service.controls.templates.ToggleTemplate +import android.util.MathUtils import android.view.View import android.view.ViewGroup import android.widget.ImageView @@ -68,6 +69,8 @@ class ControlViewHolder( private val toggleBackgroundIntensity: Float = layout.context.resources .getFraction(R.fraction.controls_toggle_bg_intensity, 1, 1) + private val dimmedAlpha: Float = layout.context.resources + .getFraction(R.fraction.controls_dimmed_alpha, 1, 1) private var stateAnimator: ValueAnimator? = null private val baseLayer: GradientDrawable val icon: ImageView = layout.requireViewById(R.id.icon) @@ -82,6 +85,11 @@ class ControlViewHolder( var lastAction: ControlAction? = null val deviceType: Int get() = cws.control?.let { it.getDeviceType() } ?: cws.ci.deviceType + var dimmed: Boolean = false + set(value) { + field = value + bindData(cws) + } init { val ld = layout.getBackground() as LayerDrawable @@ -177,7 +185,8 @@ class ControlViewHolder( val fg = context.resources.getColorStateList(ri.foreground, context.theme) val bg = context.resources.getColor(R.color.control_default_background, context.theme) - val (clip, newAlpha) = if (enabled) { + val dimAlpha = if (dimmed) dimmedAlpha else 1f + var (clip, newAlpha) = if (enabled) { listOf(ri.enabledBackground, ALPHA_ENABLED) } else { listOf(R.color.control_default_background, ALPHA_DISABLED) @@ -202,12 +211,14 @@ class ControlViewHolder( if (animated) { val oldColor = color?.defaultColor ?: newClipColor val oldBaseColor = baseLayer.color?.defaultColor ?: newBaseColor + val oldAlpha = layout.alpha stateAnimator = ValueAnimator.ofInt(clipLayer.alpha, newAlpha).apply { addUpdateListener { alpha = it.animatedValue as Int setColor(ColorUtils.blendARGB(oldColor, newClipColor, it.animatedFraction)) baseLayer.setColor(ColorUtils.blendARGB(oldBaseColor, newBaseColor, it.animatedFraction)) + layout.alpha = MathUtils.lerp(oldAlpha, dimAlpha, it.animatedFraction) } addListener(object : AnimatorListenerAdapter() { override fun onAnimationEnd(animation: Animator?) { @@ -222,6 +233,7 @@ class ControlViewHolder( alpha = newAlpha setColor(newClipColor) baseLayer.setColor(newBaseColor) + layout.alpha = dimAlpha } } } diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiController.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiController.kt index 0f105376847f5..61a1a986c0910 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiController.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiController.kt @@ -36,4 +36,5 @@ interface ControlsUiController { controlId: String, @ControlAction.ResponseResult response: Int ) + fun onFocusChanged(controlWithState: ControlWithState?) } diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt index fab6fc7357dd8..2adfb1bd6d4f0 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt @@ -209,6 +209,20 @@ class ControlsUiControllerImpl @Inject constructor ( } } + override fun onFocusChanged(focusedControl: ControlWithState?) { + controlViewsById.forEach { key: ControlKey, viewHolder: ControlViewHolder -> + val state = controlsById.get(key) ?: return@forEach + val shouldBeDimmed = focusedControl != null && state != focusedControl + if (viewHolder.dimmed == shouldBeDimmed) { + return@forEach + } + + uiExecutor.execute { + viewHolder.dimmed = shouldBeDimmed + } + } + } + private fun startFavoritingActivity(context: Context, si: StructureInfo) { startTargetedActivity(context, si, ControlsFavoritingActivity::class.java) } diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ToggleRangeBehavior.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ToggleRangeBehavior.kt index d8b26e2e68d85..dafd8b25ec2ef 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ToggleRangeBehavior.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ToggleRangeBehavior.kt @@ -175,6 +175,7 @@ class ToggleRangeBehavior : Behavior { fun beginUpdateRange() { status.setTextSize(TypedValue.COMPLEX_UNIT_PX, context.getResources() .getDimensionPixelSize(R.dimen.control_status_expanded).toFloat()) + ControlActionCoordinator.setFocusedElement(cvh, cvh.controlsController) } fun updateRange(level: Int, checked: Boolean, isDragging: Boolean) { @@ -243,6 +244,7 @@ class ToggleRangeBehavior : Behavior { status.setText("$currentStatusText $currentRangeValue") cvh.action(FloatAction(rangeTemplate.getTemplateId(), findNearestStep(levelToRangeValue(clipLayer.getLevel())))) + ControlActionCoordinator.setFocusedElement(null, cvh.controlsController) } fun findNearestStep(value: Float): Float {