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

Commit 7a11e18f authored by Caitlin Shkuratov's avatar Caitlin Shkuratov
Browse files

[SB][Chips] Re-calculate chip timer minWidth when font size changes.

When the font size decreases, our chip should probably take less room,
so update the NeverDecreaseWidth Modifier to reset the minimum whenever
the density changes.

Fixes: 395607413
Bug: 372657935
Flag: com.android.systemui.status_bar_chips_modernization

Test: Trigger screen share chip, then increase then decrease font size
-> verify chip isn't too wide
Test: Trigger phone call chip, then increase then decrease font size ->
verify chip isn't too wide

Change-Id: I8818436e855c486ea3918e8b0d9dc21ef2e83c5c
parent a0f47383
Loading
Loading
Loading
Loading
+17 −6
Original line number Diff line number Diff line
@@ -27,11 +27,13 @@ import androidx.compose.ui.layout.MeasureScope
import androidx.compose.ui.node.LayoutModifierNode
import androidx.compose.ui.node.ModifierNodeElement
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.res.dimensionResource
import androidx.compose.ui.text.TextMeasurer
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.rememberTextMeasurer
import androidx.compose.ui.unit.Constraints
import androidx.compose.ui.unit.Density
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.constrain
import androidx.compose.ui.unit.dp
@@ -45,6 +47,7 @@ import kotlin.math.min
@Composable
fun ChipContent(viewModel: OngoingActivityChipModel.Active, modifier: Modifier = Modifier) {
    val context = LocalContext.current
    val density = LocalDensity.current
    val isTextOnly = viewModel.icon == null
    val hasEmbeddedIcon =
        viewModel.icon is OngoingActivityChipModel.ChipIcon.StatusBarView ||
@@ -86,7 +89,7 @@ fun ChipContent(viewModel: OngoingActivityChipModel.Active, modifier: Modifier =
                            startPadding = startPadding,
                            endPadding = endPadding,
                        )
                        .neverDecreaseWidth(),
                        .neverDecreaseWidth(density),
            )
        }

@@ -97,7 +100,7 @@ fun ChipContent(viewModel: OngoingActivityChipModel.Active, modifier: Modifier =
                style = textStyle,
                color = textColor,
                softWrap = false,
                modifier = modifier.neverDecreaseWidth(),
                modifier = modifier.neverDecreaseWidth(density),
            )
        }

@@ -150,23 +153,31 @@ fun ChipContent(viewModel: OngoingActivityChipModel.Active, modifier: Modifier =
}

/** A modifier that ensures the width of the content only increases and never decreases. */
private fun Modifier.neverDecreaseWidth(): Modifier {
    return this.then(NeverDecreaseWidthElement)
private fun Modifier.neverDecreaseWidth(density: Density): Modifier {
    return this.then(NeverDecreaseWidthElement(density))
}

private data object NeverDecreaseWidthElement : ModifierNodeElement<NeverDecreaseWidthNode>() {
private data class NeverDecreaseWidthElement(val density: Density) :
    ModifierNodeElement<NeverDecreaseWidthNode>() {
    override fun create(): NeverDecreaseWidthNode {
        return NeverDecreaseWidthNode()
    }

    override fun update(node: NeverDecreaseWidthNode) {
        error("This should never be called")
        node.onDensityUpdated()
    }
}

private class NeverDecreaseWidthNode : Modifier.Node(), LayoutModifierNode {
    private var minWidth = 0

    fun onDensityUpdated() {
        // When the font or display size changes, we should re-determine what our minWidth is from
        // scratch (e.g. if the font size decreased, we may be able to take *less* room).
        // See b/395607413.
        minWidth = 0
    }

    override fun MeasureScope.measure(
        measurable: Measurable,
        constraints: Constraints,