Merge "Implementing new visd for backlight indicator" into udc-dev

This commit is contained in:
Michał Brzeziński
2023-05-19 11:45:00 +00:00
committed by Android (Google) Code Review
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)
}
}