Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3b86e162 authored by Evan Laird's avatar Evan Laird
Browse files

[sb] use sp to define the status bar battery metrics

Status bar icons scale with font size AND display density, and this
change enables that for the new battery icon.

Also updates the size and arrangement in the shade header to match
status bar.

Test: manual; change font scale and battery size updates
Bug: 402608850
Fixes: 400376762
Fixes: 402059273
Flag: com.android.settingslib.flags.new_status_bar_icons
Flag: com.android.systemui.status_bar_root_modernization
Change-Id: Ifbbdd959f8c6e00bf19348d13c04cdbfdff86abc
parent 9a681582
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -36,11 +36,10 @@ import android.view.WindowInsets
import android.widget.TextView
import androidx.annotation.VisibleForTesting
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.wrapContentWidth
import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.ComposeView
import androidx.compose.ui.unit.dp
import androidx.constraintlayout.motion.widget.MotionLayout
import androidx.core.view.doOnLayout
import androidx.core.view.isVisible
@@ -369,7 +368,7 @@ constructor(
                        id = R.id.battery_meter_composable_view
                        val showBatteryEstimate by showBatteryEstimate.collectAsStateWithLifecycle()
                        BatteryWithEstimate(
                            modifier = Modifier.height(17.dp).wrapContentWidth(),
                            modifier = Modifier.wrapContentSize(),
                            viewModelFactory = batteryViewModelFactory,
                            isDark = { true },
                            showEstimate = showBatteryEstimate,
+5 −4
Original line number Diff line number Diff line
@@ -22,10 +22,11 @@ import android.util.AttributeSet
import android.view.View
import android.widget.FrameLayout
import android.widget.LinearLayout
import androidx.compose.foundation.layout.aspectRatio
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.width
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.ComposeView
import androidx.compose.ui.platform.LocalDensity
import com.android.systemui.res.R
import com.android.systemui.statusbar.core.NewStatusBarIcons
import com.android.systemui.statusbar.events.BackgroundAnimatableView
@@ -62,10 +63,10 @@ constructor(level: Int, context: Context, attrs: AttributeSet? = null) :
        composeInner.apply {
            setContent {
                val isFull = BatteryInteractor.isBatteryFull(level)
                val height =
                    with(LocalDensity.current) { BatteryViewModel.STATUS_BAR_BATTERY_HEIGHT.toDp() }
                BatteryCanvas(
                    modifier =
                        Modifier.width(BatteryViewModel.STATUS_BAR_BATTERY_WIDTH)
                            .height(BatteryViewModel.STATUS_BAR_BATTERY_HEIGHT),
                    modifier = Modifier.height(height).aspectRatio(BatteryViewModel.ASPECT_RATIO),
                    path = BatteryFrame.pathSpec,
                    // TODO(b/394659067): get a content description for this chip
                    contentDescription = "",
+4 −4
Original line number Diff line number Diff line
@@ -16,11 +16,12 @@

package com.android.systemui.statusbar.pipeline.battery.ui.binder

import androidx.compose.foundation.layout.aspectRatio
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.width
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.ComposeView
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.platform.ViewCompositionStrategy
import androidx.core.view.isVisible
import androidx.lifecycle.Lifecycle
@@ -31,7 +32,6 @@ import com.android.systemui.statusbar.phone.domain.interactor.IsAreaDark
import com.android.systemui.statusbar.pipeline.battery.ui.composable.UnifiedBattery
import com.android.systemui.statusbar.pipeline.battery.ui.viewmodel.BatteryViewModel
import com.android.systemui.statusbar.pipeline.battery.ui.viewmodel.BatteryViewModel.Companion.STATUS_BAR_BATTERY_HEIGHT
import com.android.systemui.statusbar.pipeline.battery.ui.viewmodel.BatteryViewModel.Companion.STATUS_BAR_BATTERY_WIDTH
import kotlinx.coroutines.flow.Flow

/** In cases where the battery needs to be bound to an existing android view */
@@ -52,10 +52,10 @@ object UnifiedBatteryViewBinder {
                    )
                    setContent {
                        val isDark by isAreaDark.collectAsStateWithLifecycle(IsAreaDark { true })
                        val height = with(LocalDensity.current) { STATUS_BAR_BATTERY_HEIGHT.toDp() }
                        UnifiedBattery(
                            modifier =
                                Modifier.height(STATUS_BAR_BATTERY_HEIGHT)
                                    .width(STATUS_BAR_BATTERY_WIDTH),
                                Modifier.height(height).aspectRatio(BatteryViewModel.ASPECT_RATIO),
                            viewModelFactory = viewModelFactory,
                            isDark = isDark,
                        )
+12 −7
Original line number Diff line number Diff line
@@ -19,19 +19,22 @@ package com.android.systemui.statusbar.pipeline.battery.ui.composable
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.aspectRatio
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.width
import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.unit.dp
import com.android.systemui.lifecycle.rememberViewModel
import com.android.systemui.statusbar.phone.domain.interactor.IsAreaDark
import com.android.systemui.statusbar.pipeline.battery.ui.viewmodel.BatteryViewModel

@OptIn(ExperimentalMaterial3ExpressiveApi::class)
@Composable
fun BatteryWithEstimate(
    viewModelFactory: BatteryViewModel.Factory,
@@ -42,20 +45,22 @@ fun BatteryWithEstimate(
    val viewModel =
        rememberViewModel(traceName = "BatteryWithEstimate") { viewModelFactory.create() }

    val batteryHeight =
        with(LocalDensity.current) { BatteryViewModel.STATUS_BAR_BATTERY_HEIGHT.toDp() }

    Row(modifier = modifier, verticalAlignment = Alignment.CenterVertically) {
        UnifiedBattery(
            viewModelFactory = viewModelFactory,
            isDark = isDark,
            modifier =
                Modifier.fillMaxHeight()
                    .padding(vertical = 2.dp)
                    .align(Alignment.Bottom)
                    .aspectRatio(viewModel.aspectRatio),
                Modifier.height(batteryHeight)
                    .align(Alignment.CenterVertically)
                    .aspectRatio(BatteryViewModel.ASPECT_RATIO),
        )
        if (showEstimate) {
            viewModel.batteryTimeRemainingEstimate?.let {
                Spacer(modifier.width(4.dp))
                Text(text = it, color = Color.White)
                Text(text = it, color = Color.White, style = MaterialTheme.typography.bodyMedium)
            }
        }
    }
+13 −5
Original line number Diff line number Diff line
@@ -18,7 +18,7 @@ package com.android.systemui.statusbar.pipeline.battery.ui.viewmodel

import android.content.Context
import androidx.compose.runtime.getValue
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.android.systemui.common.shared.model.ContentDescription
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.lifecycle.ExclusiveActivatable
@@ -50,7 +50,6 @@ constructor(interactor: BatteryInteractor, @Application context: Context) : Excl
    val batteryFrame = BatteryFrame.pathSpec
    val innerWidth = BatteryFrame.innerWidth
    val innerHeight = BatteryFrame.innerHeight
    val aspectRatio = BatteryFrame.innerWidth / BatteryFrame.innerHeight

    val level by
        hydrator.hydratedStateOf(traceName = "level", initialValue = 0, source = interactor.level)
@@ -224,9 +223,18 @@ constructor(interactor: BatteryInteractor, @Application context: Context) : Excl
    }

    companion object {
        // Status bar battery height, based on a 21x12 base canvas
        val STATUS_BAR_BATTERY_HEIGHT = 13.dp
        val STATUS_BAR_BATTERY_WIDTH = 22.75.dp
        /**
         * Status bar battery height, based on a 21x12 base canvas. Defined in [sp] so that the icon
         * properly scales when the font size changes (consistent with other status bar icons)
         */
        val STATUS_BAR_BATTERY_HEIGHT = 12.sp
        /**
         * Status bar battery width, based on a 21x12 base canvas. Defined in [sp] so that the icon
         * properly scales when the font size changes (consistent with other status bar icons)
         */
        val STATUS_BAR_BATTERY_WIDTH = 21.sp

        val ASPECT_RATIO = STATUS_BAR_BATTERY_WIDTH.value / STATUS_BAR_BATTERY_HEIGHT.value

        fun Int.glyphRepresentation(): List<BatteryGlyph> = toString().map { it.toGlyph() }

Loading