From 5bdfba4755103254e78214f6f597532a69c50cbb Mon Sep 17 00:00:00 2001 From: Matt Pietal Date: Fri, 14 Feb 2020 09:14:43 -0500 Subject: [PATCH 1/2] Controls UI - Support thumbnail template Allow the background image to be changed. Use the i18n 'Loading...' text. Bug: 148207527 Test: manual, home mock apk for camera Change-Id: I705648c948aaf34ab624ded4fdbef415791c2481 --- core/res/res/values/symbols.xml | 2 + .../systemui/controls/ui/ControlViewHolder.kt | 13 ++-- .../controls/ui/ControlsUiControllerImpl.kt | 2 +- .../systemui/controls/ui/CornerDrawable.kt | 57 ++++++++++++++++ .../systemui/controls/ui/StaticBehavior.kt | 65 +++++++++++++++++++ .../systemui/controls/ui/UnknownBehavior.kt | 2 +- 6 files changed, 133 insertions(+), 8 deletions(-) create mode 100644 packages/SystemUI/src/com/android/systemui/controls/ui/CornerDrawable.kt create mode 100644 packages/SystemUI/src/com/android/systemui/controls/ui/StaticBehavior.kt diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 5aefe11712463..b3dd1fc949b82 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -3902,4 +3902,6 @@ + + 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 55c1b6a1e369a..aec207518b9f1 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlViewHolder.kt @@ -17,14 +17,15 @@ package com.android.systemui.controls.ui import android.content.Context +import android.graphics.BlendMode import android.graphics.drawable.ClipDrawable -import android.graphics.drawable.GradientDrawable import android.graphics.drawable.Icon import android.graphics.drawable.LayerDrawable import android.service.controls.Control import android.service.controls.actions.ControlAction import android.service.controls.templates.ControlTemplate import android.service.controls.templates.TemperatureControlTemplate +import android.service.controls.templates.ThumbnailTemplate import android.service.controls.templates.ToggleRangeTemplate import android.service.controls.templates.ToggleTemplate import android.view.View @@ -41,7 +42,8 @@ private const val UPDATE_DELAY_IN_MILLIS = 3000L class ControlViewHolder( val layout: ViewGroup, val controlsController: ControlsController, - val uiExecutor: DelayableExecutor + val uiExecutor: DelayableExecutor, + val bgExecutor: DelayableExecutor ) { val icon: ImageView = layout.requireViewById(R.id.icon) val status: TextView = layout.requireViewById(R.id.status) @@ -50,7 +52,6 @@ class ControlViewHolder( val subtitle: TextView = layout.requireViewById(R.id.subtitle) val context: Context = layout.getContext() val clipLayer: ClipDrawable - val gd: GradientDrawable lateinit var cws: ControlWithState var cancelUpdate: Runnable? = null @@ -58,7 +59,6 @@ class ControlViewHolder( val ld = layout.getBackground() as LayerDrawable ld.mutate() clipLayer = ld.findDrawableByLayerId(R.id.clip_layer) as ClipDrawable - gd = clipLayer.getDrawable() as GradientDrawable } fun bindData(cws: ControlWithState) { @@ -121,6 +121,7 @@ class ControlViewHolder( template is ToggleTemplate -> ToggleBehavior() template is ToggleRangeTemplate -> ToggleRangeBehavior() template is TemperatureControlTemplate -> TemperatureControlBehavior() + template is ThumbnailTemplate -> StaticBehavior(uiExecutor, bgExecutor) else -> { object : Behavior { override fun apply(cvh: ControlViewHolder, cws: ControlWithState) { @@ -141,9 +142,9 @@ class ControlViewHolder( icon.setImageIcon(Icon.createWithResource(context, ri.iconResourceId)) icon.setImageTintList(fg) - gd.setColor(bg) + clipLayer.getDrawable().setTintBlendMode(BlendMode.HUE) + clipLayer.getDrawable().setTintList(bg) } - fun setEnabled(enabled: Boolean) { status.setEnabled(enabled) icon.setEnabled(enabled) 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 9e6636fca97d3..98cdf288f1a1f 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlsUiControllerImpl.kt @@ -223,7 +223,7 @@ class ControlsUiControllerImpl @Inject constructor ( val item = inflater.inflate( R.layout.controls_base_item, lastRow, false) as ViewGroup lastRow.addView(item) - val cvh = ControlViewHolder(item, controlsController.get(), uiExecutor) + val cvh = ControlViewHolder(item, controlsController.get(), uiExecutor, bgExecutor) val key = ControlKey(it.component, it.controlId) cvh.bindData(controlsById.getValue(key)) controlViewsById.put(key, cvh) diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/CornerDrawable.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/CornerDrawable.kt new file mode 100644 index 0000000000000..af581e1aa53b9 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/CornerDrawable.kt @@ -0,0 +1,57 @@ +/* + * 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.controls.ui + +import android.graphics.Canvas +import android.graphics.Path +import android.graphics.Rect +import android.graphics.RectF +import android.graphics.drawable.Drawable +import android.graphics.drawable.DrawableWrapper + +/** + * Use a path to add mask for corners around the drawable, to match the radius + * of the underlying shape. + */ +class CornerDrawable(val wrapped: Drawable, val cornerRadius: Float) : DrawableWrapper(wrapped) { + val path: Path = Path() + + init { + val b = getBounds() + updatePath(RectF(b)) + } + + override fun draw(canvas: Canvas) { + canvas.clipPath(path) + super.draw(canvas) + } + + override fun setBounds(l: Int, t: Int, r: Int, b: Int) { + updatePath(RectF(l.toFloat(), t.toFloat(), r.toFloat(), b.toFloat())) + super.setBounds(l, t, r, b) + } + + override fun setBounds(r: Rect) { + updatePath(RectF(r)) + super.setBounds(r) + } + + private fun updatePath(r: RectF) { + path.reset() + path.addRoundRect(r, cornerRadius, cornerRadius, Path.Direction.CW) + } +} diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/StaticBehavior.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/StaticBehavior.kt new file mode 100644 index 0000000000000..c69e45159ec89 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/StaticBehavior.kt @@ -0,0 +1,65 @@ +/* + * 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.controls.ui + +import android.graphics.drawable.ClipDrawable +import android.graphics.drawable.LayerDrawable +import android.service.controls.Control +import android.service.controls.templates.ThumbnailTemplate + +import com.android.systemui.R +import com.android.systemui.controls.ui.ControlActionCoordinator.MAX_LEVEL + +import java.util.concurrent.Executor + +/** + * Used for controls that cannot be interacted with. Information is presented to the user + * but no actions can be taken. If using a ThumbnailTemplate, the background image will + * be changed. + */ +class StaticBehavior( + val uiExecutor: Executor, + val bgExecutor: Executor +) : Behavior { + lateinit var control: Control + + override fun apply(cvh: ControlViewHolder, cws: ControlWithState) { + this.control = cws.control!! + + cvh.status.setText(control.getStatusText()) + + val ld = cvh.layout.getBackground() as LayerDrawable + val clipLayer = ld.findDrawableByLayerId(R.id.clip_layer) as ClipDrawable + + clipLayer.setLevel(MAX_LEVEL) + cvh.setEnabled(true) + cvh.applyRenderInfo(RenderInfo.lookup(control.getDeviceType(), true)) + + val template = control.getControlTemplate() + if (template is ThumbnailTemplate) { + bgExecutor.execute { + val drawable = template.getThumbnail().loadDrawable(cvh.context) + uiExecutor.execute { + val radius = cvh.context.getResources() + .getDimensionPixelSize(R.dimen.control_corner_radius).toFloat() + clipLayer.setDrawable(CornerDrawable(drawable, radius)) + cvh.applyRenderInfo(RenderInfo.lookup(control.getDeviceType(), true)) + } + } + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/UnknownBehavior.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/UnknownBehavior.kt index 5a6e5b4815447..27f1b336e6b23 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/UnknownBehavior.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/UnknownBehavior.kt @@ -18,7 +18,7 @@ package com.android.systemui.controls.ui class UnknownBehavior : Behavior { override fun apply(cvh: ControlViewHolder, cws: ControlWithState) { - cvh.status.setText("Loading...") + cvh.status.setText(cvh.context.getString(com.android.internal.R.string.loading)) cvh.setEnabled(false) cvh.applyRenderInfo(RenderInfo.lookup(cws.ci.deviceType, false)) } From f8cf084c543dd5d12ec812f48296313403579655 Mon Sep 17 00:00:00 2001 From: Matt Pietal Date: Fri, 14 Feb 2020 10:25:11 -0500 Subject: [PATCH 2/2] Controls UI - Theme + color alignment Ignore theme colors and use dark colors by default at all times for controls. Apply latest color changes to match design. Bug: 149485215 Test: visual Change-Id: I179b9b3a4469f7373f7a2d5174d435fdda1b6ac0 --- packages/SystemUI/res/color/control_background.xml | 3 ++- packages/SystemUI/res/color/control_foreground.xml | 2 +- packages/SystemUI/res/color/light_background.xml | 3 ++- packages/SystemUI/res/color/light_foreground.xml | 2 +- packages/SystemUI/res/color/thermo_cool_background.xml | 3 ++- packages/SystemUI/res/color/thermo_cool_foreground.xml | 2 +- packages/SystemUI/res/color/thermo_heat_background.xml | 3 ++- packages/SystemUI/res/color/thermo_heat_foreground.xml | 2 +- packages/SystemUI/res/drawable/control_background.xml | 2 +- packages/SystemUI/res/values/colors.xml | 8 ++++++-- packages/SystemUI/res/values/styles.xml | 6 +++--- .../com/android/systemui/controls/ui/StaticBehavior.kt | 4 +++- 12 files changed, 25 insertions(+), 15 deletions(-) diff --git a/packages/SystemUI/res/color/control_background.xml b/packages/SystemUI/res/color/control_background.xml index 646fe5dfe712d..977310cfae01a 100644 --- a/packages/SystemUI/res/color/control_background.xml +++ b/packages/SystemUI/res/color/control_background.xml @@ -2,5 +2,6 @@ - + diff --git a/packages/SystemUI/res/color/control_foreground.xml b/packages/SystemUI/res/color/control_foreground.xml index bf028f18a7def..339f1e20b8b93 100644 --- a/packages/SystemUI/res/color/control_foreground.xml +++ b/packages/SystemUI/res/color/control_foreground.xml @@ -2,5 +2,5 @@ - + diff --git a/packages/SystemUI/res/color/light_background.xml b/packages/SystemUI/res/color/light_background.xml index 2effd991f666c..12994646a346d 100644 --- a/packages/SystemUI/res/color/light_background.xml +++ b/packages/SystemUI/res/color/light_background.xml @@ -2,5 +2,6 @@ - + diff --git a/packages/SystemUI/res/color/light_foreground.xml b/packages/SystemUI/res/color/light_foreground.xml index 8143028795dfc..7c02075e1bab6 100644 --- a/packages/SystemUI/res/color/light_foreground.xml +++ b/packages/SystemUI/res/color/light_foreground.xml @@ -2,5 +2,5 @@ - + diff --git a/packages/SystemUI/res/color/thermo_cool_background.xml b/packages/SystemUI/res/color/thermo_cool_background.xml index 646fe5dfe712d..977310cfae01a 100644 --- a/packages/SystemUI/res/color/thermo_cool_background.xml +++ b/packages/SystemUI/res/color/thermo_cool_background.xml @@ -2,5 +2,6 @@ - + diff --git a/packages/SystemUI/res/color/thermo_cool_foreground.xml b/packages/SystemUI/res/color/thermo_cool_foreground.xml index bf028f18a7def..339f1e20b8b93 100644 --- a/packages/SystemUI/res/color/thermo_cool_foreground.xml +++ b/packages/SystemUI/res/color/thermo_cool_foreground.xml @@ -2,5 +2,5 @@ - + diff --git a/packages/SystemUI/res/color/thermo_heat_background.xml b/packages/SystemUI/res/color/thermo_heat_background.xml index 6f29ed5f60ac1..2709ebe4dcfd8 100644 --- a/packages/SystemUI/res/color/thermo_heat_background.xml +++ b/packages/SystemUI/res/color/thermo_heat_background.xml @@ -2,5 +2,6 @@ - + diff --git a/packages/SystemUI/res/color/thermo_heat_foreground.xml b/packages/SystemUI/res/color/thermo_heat_foreground.xml index 72f4b8d134580..ffcf550981036 100644 --- a/packages/SystemUI/res/color/thermo_heat_foreground.xml +++ b/packages/SystemUI/res/color/thermo_heat_foreground.xml @@ -2,5 +2,5 @@ - + diff --git a/packages/SystemUI/res/drawable/control_background.xml b/packages/SystemUI/res/drawable/control_background.xml index b246ea0a39352..29b4efa48fa1c 100644 --- a/packages/SystemUI/res/drawable/control_background.xml +++ b/packages/SystemUI/res/drawable/control_background.xml @@ -19,7 +19,7 @@ - + diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml index 09058f2460cb1..43ceb4ecaee89 100644 --- a/packages/SystemUI/res/values/colors.xml +++ b/packages/SystemUI/res/values/colors.xml @@ -201,6 +201,7 @@ #202124 #FCE8E6 + #F6AEA9 #F28B82 #B71C1C #C5221F @@ -213,6 +214,7 @@ #1967D2 #FEF7E0 + #FDE293 #FFFBBC04 #FF34A853 @@ -222,6 +224,8 @@ #FF9900 - ?android:attr/textColorPrimary - ?android:attr/colorBackgroundFloating + @*android:color/foreground_material_dark + @*android:color/dim_foreground_dark + @*android:color/foreground_material_dark + @*android:color/background_floating_material_dark diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml index 6fedac0a775d4..fecb75cdf9b3a 100644 --- a/packages/SystemUI/res/values/styles.xml +++ b/packages/SystemUI/res/values/styles.xml @@ -635,16 +635,16 @@ diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/StaticBehavior.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/StaticBehavior.kt index c69e45159ec89..340cdc0c854b3 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/StaticBehavior.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/StaticBehavior.kt @@ -52,12 +52,14 @@ class StaticBehavior( val template = control.getControlTemplate() if (template is ThumbnailTemplate) { bgExecutor.execute { + // clear the default tinting in favor of only using alpha val drawable = template.getThumbnail().loadDrawable(cvh.context) + drawable.setTintList(null) + drawable.setAlpha((0.45 * 255).toInt()) uiExecutor.execute { val radius = cvh.context.getResources() .getDimensionPixelSize(R.dimen.control_corner_radius).toFloat() clipLayer.setDrawable(CornerDrawable(drawable, radius)) - cvh.applyRenderInfo(RenderInfo.lookup(control.getDeviceType(), true)) } } }