diff options
| author | 2023-05-02 16:17:40 +0100 | |
|---|---|---|
| committer | 2023-05-18 13:02:22 +0000 | |
| commit | 73756d9218a536511243cf28f2bbe7cd84d6af47 (patch) | |
| tree | 5dfccc1225c1ce4b4556db1c16ca1cdb1e4d36bb | |
| parent | 3cb272064061bb2ed7467b9f59c67508399ff7a9 (diff) | |
Implementing new visd for backlight indicator
With new design first tile with backlight icon has different shape than rest of the tiles. Also it changes color when backlight it turned off (level set to 0).
Besides there are a few small changes with paddings/corners.
Flag: KEYBOARD_BACKLIGHT_INDICATOR
Test: KeyboardBacklightDialogScreenshotTest
Fixes: 270374251
Change-Id: I8bfbafc2e637a5df6e8df536784187146ddc10ca
3 files changed, 98 insertions, 60 deletions
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 271fab17e0af..a62dead7834b 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -1730,15 +1730,15 @@ <!-- Keyboard backlight indicator--> <dimen name="backlight_indicator_root_corner_radius">48dp</dimen> <dimen name="backlight_indicator_root_vertical_padding">8dp</dimen> - <dimen name="backlight_indicator_root_horizontal_padding">4dp</dimen> + <dimen name="backlight_indicator_root_horizontal_padding">6dp</dimen> <dimen name="backlight_indicator_icon_width">22dp</dimen> <dimen name="backlight_indicator_icon_height">11dp</dimen> - <dimen name="backlight_indicator_icon_left_margin">2dp</dimen> + <dimen name="backlight_indicator_icon_padding">10dp</dimen> <dimen name="backlight_indicator_step_width">52dp</dimen> <dimen name="backlight_indicator_step_height">40dp</dimen> - <dimen name="backlight_indicator_step_horizontal_margin">4dp</dimen> + <dimen name="backlight_indicator_step_horizontal_margin">2dp</dimen> <dimen name="backlight_indicator_step_small_radius">4dp</dimen> - <dimen name="backlight_indicator_step_large_radius">48dp</dimen> + <dimen name="backlight_indicator_step_large_radius">28dp</dimen> <!-- Broadcast dialog --> <dimen name="broadcast_dialog_title_img_margin_top">18dp</dimen> diff --git a/packages/SystemUI/res/values/ids.xml b/packages/SystemUI/res/values/ids.xml index eaeaabe8779a..e5c946156e46 100644 --- a/packages/SystemUI/res/values/ids.xml +++ b/packages/SystemUI/res/values/ids.xml @@ -203,5 +203,8 @@ <item type="id" name="log_access_dialog_allow_button" /> <item type="id" name="log_access_dialog_deny_button" /> + + <!-- keyboard backlight indicator--> + <item type="id" name="backlight_icon" /> </resources> diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/backlight/ui/view/KeyboardBacklightDialog.kt b/packages/SystemUI/src/com/android/systemui/keyboard/backlight/ui/view/KeyboardBacklightDialog.kt index d3678b5a2a4e..70783418ddb4 100644 --- a/packages/SystemUI/src/com/android/systemui/keyboard/backlight/ui/view/KeyboardBacklightDialog.kt +++ b/packages/SystemUI/src/com/android/systemui/keyboard/backlight/ui/view/KeyboardBacklightDialog.kt @@ -22,9 +22,12 @@ import android.annotation.ColorInt import android.app.Dialog import android.content.Context import android.graphics.drawable.ShapeDrawable +import android.graphics.drawable.shapes.OvalShape import android.graphics.drawable.shapes.RoundRectShape import android.os.Bundle import android.view.Gravity +import android.view.View +import android.view.ViewGroup.MarginLayoutParams import android.view.Window import android.view.WindowManager import android.widget.FrameLayout @@ -32,9 +35,10 @@ import android.widget.ImageView import android.widget.LinearLayout import android.widget.LinearLayout.LayoutParams import android.widget.LinearLayout.LayoutParams.WRAP_CONTENT +import androidx.annotation.IdRes +import androidx.core.view.setPadding import com.android.settingslib.Utils import com.android.systemui.R -import com.android.systemui.util.children class KeyboardBacklightDialog( context: Context, @@ -51,7 +55,7 @@ class KeyboardBacklightDialog( private data class BacklightIconProperties( val width: Int, val height: Int, - val leftMargin: Int, + val padding: Int, ) private data class StepViewProperties( @@ -71,6 +75,7 @@ class KeyboardBacklightDialog( private lateinit var rootProperties: RootProperties private lateinit var iconProperties: BacklightIconProperties private lateinit var stepProperties: StepViewProperties + @ColorInt var filledRectangleColor = getColorFromStyle(com.android.internal.R.attr.materialColorPrimary) @ColorInt @@ -78,7 +83,16 @@ class KeyboardBacklightDialog( getColorFromStyle(com.android.internal.R.attr.materialColorOutlineVariant) @ColorInt var backgroundColor = getColorFromStyle(com.android.internal.R.attr.materialColorSurfaceBright) - @ColorInt var iconColor = getColorFromStyle(com.android.internal.R.attr.materialColorOnPrimary) + @ColorInt + var defaultIconColor = getColorFromStyle(com.android.internal.R.attr.materialColorOnPrimary) + @ColorInt + var defaultIconBackgroundColor = + getColorFromStyle(com.android.internal.R.attr.materialColorPrimary) + @ColorInt + var dimmedIconColor = getColorFromStyle(com.android.internal.R.attr.materialColorOnSurface) + @ColorInt + var dimmedIconBackgroundColor = + getColorFromStyle(com.android.internal.R.attr.materialColorSurfaceDim) init { currentLevel = initialCurrentLevel @@ -111,8 +125,7 @@ class KeyboardBacklightDialog( BacklightIconProperties( width = getDimensionPixelSize(R.dimen.backlight_indicator_icon_width), height = getDimensionPixelSize(R.dimen.backlight_indicator_icon_height), - leftMargin = - getDimensionPixelSize(R.dimen.backlight_indicator_icon_left_margin), + padding = getDimensionPixelSize(R.dimen.backlight_indicator_icon_padding), ) stepProperties = StepViewProperties( @@ -139,23 +152,34 @@ class KeyboardBacklightDialog( if (maxLevel != max || forceRefresh) { maxLevel = max rootView.removeAllViews() + rootView.addView(buildIconTile()) buildStepViews().forEach { rootView.addView(it) } } currentLevel = current - updateLevel() + updateIconTile() + updateStepColors() } - private fun updateLevel() { - rootView.children.forEachIndexed( - action = { index, v -> - val drawable = v.background as ShapeDrawable - if (index <= currentLevel) { - updateColor(drawable, filledRectangleColor) - } else { - updateColor(drawable, emptyRectangleColor) - } - } - ) + private fun updateIconTile() { + val iconTile = rootView.findViewById(BACKLIGHT_ICON_ID) as ImageView + val backgroundDrawable = iconTile.background as ShapeDrawable + if (currentLevel == 0) { + iconTile.setColorFilter(dimmedIconColor) + updateColor(backgroundDrawable, dimmedIconBackgroundColor) + } else { + iconTile.setColorFilter(defaultIconColor) + updateColor(backgroundDrawable, defaultIconBackgroundColor) + } + } + + private fun updateStepColors() { + (1 until rootView.childCount).forEach { index -> + val drawable = rootView.getChildAt(index).background as ShapeDrawable + updateColor( + drawable, + if (index <= currentLevel) filledRectangleColor else emptyRectangleColor, + ) + } } private fun updateColor(drawable: ShapeDrawable, @ColorInt color: Int) { @@ -192,9 +216,33 @@ class KeyboardBacklightDialog( } private fun buildStepViews(): List<FrameLayout> { - val stepViews = (0..maxLevel).map { i -> createStepViewAt(i) } - stepViews[0].addView(createBacklightIconView()) - return stepViews + return (1..maxLevel).map { i -> createStepViewAt(i) } + } + + private fun buildIconTile(): View { + val diameter = stepProperties.height + val circleDrawable = + ShapeDrawable(OvalShape()).apply { + intrinsicHeight = diameter + intrinsicWidth = diameter + } + + return ImageView(context).apply { + setImageResource(R.drawable.ic_keyboard_backlight) + id = BACKLIGHT_ICON_ID + setColorFilter(defaultIconColor) + setPadding(iconProperties.padding) + layoutParams = + MarginLayoutParams(diameter, diameter).apply { + setMargins( + /* left= */ stepProperties.horizontalMargin, + /* top= */ 0, + /* right= */ stepProperties.horizontalMargin, + /* bottom= */ 0 + ) + } + background = circleDrawable + } } private fun createStepViewAt(i: Int): FrameLayout { @@ -221,18 +269,6 @@ class KeyboardBacklightDialog( } } - private fun createBacklightIconView(): ImageView { - return ImageView(context).apply { - setImageResource(R.drawable.ic_keyboard_backlight) - setColorFilter(iconColor) - layoutParams = - FrameLayout.LayoutParams(iconProperties.width, iconProperties.height).apply { - gravity = Gravity.CENTER - leftMargin = iconProperties.leftMargin - } - } - } - private fun setWindowPosition() { window?.apply { setGravity(Gravity.BOTTOM or Gravity.CENTER_HORIZONTAL) @@ -262,30 +298,29 @@ class KeyboardBacklightDialog( private fun radiiForIndex(i: Int, last: Int): FloatArray { val smallRadius = stepProperties.smallRadius val largeRadius = stepProperties.largeRadius - return when (i) { - 0 -> // left radii bigger - floatArrayOf( - largeRadius, - largeRadius, - smallRadius, - smallRadius, - smallRadius, - smallRadius, - largeRadius, - largeRadius - ) - last -> // right radii bigger - floatArrayOf( - smallRadius, - smallRadius, - largeRadius, - largeRadius, - largeRadius, - largeRadius, - smallRadius, - smallRadius - ) - else -> FloatArray(8) { smallRadius } // all radii equal + val radii = FloatArray(8) { smallRadius } + if (i == 1) { + radii.setLeftCorners(largeRadius) } + // note "first" and "last" might be the same tile + if (i == last) { + radii.setRightCorners(largeRadius) + } + return radii + } + + private fun FloatArray.setLeftCorners(radius: Float) { + LEFT_CORNERS_INDICES.forEach { this[it] = radius } + } + private fun FloatArray.setRightCorners(radius: Float) { + RIGHT_CORNERS_INDICES.forEach { this[it] = radius } + } + + private companion object { + @IdRes val BACKLIGHT_ICON_ID = R.id.backlight_icon + + // indices used to define corners radii in ShapeDrawable + val LEFT_CORNERS_INDICES: IntArray = intArrayOf(0, 1, 6, 7) + val RIGHT_CORNERS_INDICES: IntArray = intArrayOf(2, 3, 4, 5) } } |