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
This commit is contained in:
Michal Brzezinski
2023-05-02 16:17:40 +01:00
committed by Michał Brzeziński
parent 3cb2720640
commit 73756d9218
3 changed files with 98 additions and 60 deletions

View File

@@ -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>

View File

@@ -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>

View File

@@ -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)
}
}