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

Commit 8422e265 authored by Caitlin Shkuratov's avatar Caitlin Shkuratov
Browse files

[SB][Chips] Only pass in `Content` data object to ChipContent Composable

Then we don't re-compose ChipContent if the content is unchanged.

Fixes: 406754016
Flag: com.android.systemui.status_bar_chips_modernization
Test: Update icon or click listener of chip -> verify ChipContent
doesn't recompose (verified via logging)
Test: Update content of chip -> verify ChipContent *does* recompose

Change-Id: Iab728f0a0644c08c82f66d46364910c9cce129cc
parent ba850b5a
Loading
Loading
Loading
Loading
+16 −13
Original line number Diff line number Diff line
@@ -39,6 +39,7 @@ import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.constrain
import androidx.compose.ui.unit.dp
import com.android.systemui.res.R
import com.android.systemui.statusbar.chips.ui.model.ColorsModel
import com.android.systemui.statusbar.chips.ui.model.OngoingActivityChipModel
import com.android.systemui.statusbar.chips.ui.viewmodel.formatTimeRemainingData
import com.android.systemui.statusbar.chips.ui.viewmodel.rememberChronometerState
@@ -47,15 +48,17 @@ import kotlin.math.min

@OptIn(ExperimentalMaterial3ExpressiveApi::class)
@Composable
// TODO(b/406754016): Only take in the chip's [OngoingActivityChipModel.Active.content] field
//  instead of the full model.
fun ChipContent(viewModel: OngoingActivityChipModel.Active, modifier: Modifier = Modifier) {
fun ChipContent(
    viewModel: OngoingActivityChipModel.Content,
    icon: OngoingActivityChipModel.ChipIcon?,
    colors: ColorsModel,
    modifier: Modifier = Modifier,
) {
    val context = LocalContext.current
    val density = LocalDensity.current
    val textStyle = MaterialTheme.typography.labelLargeEmphasized
    val textColor = Color(viewModel.colors.text(context))
    val textColor = Color(colors.text(context))
    val maxTextWidth = dimensionResource(id = R.dimen.ongoing_activity_chip_max_text_width)
    val icon = viewModel.icon
    val startPadding =
        if (icon != null && !icon.hasEmbeddedPadding) {
            // Add padding only if this text is next to an icon that doesn't embed its own padding
@@ -74,13 +77,13 @@ fun ChipContent(viewModel: OngoingActivityChipModel.Active, modifier: Modifier =
            0.dp
        }
    val textMeasurer = rememberTextMeasurer()
    when (val content = viewModel.content) {
    when (viewModel) {
        is OngoingActivityChipModel.Content.Timer -> {
            val timerState =
                rememberChronometerState(
                    eventTimeMillis = content.startTimeMs,
                    isCountDown = content.isEventInFuture,
                    timeSource = content.timeSource,
                    eventTimeMillis = viewModel.startTimeMs,
                    isCountDown = viewModel.isEventInFuture,
                    timeSource = viewModel.timeSource,
                )
            timerState.currentTimeText?.let { text ->
                Text(
@@ -104,7 +107,7 @@ fun ChipContent(viewModel: OngoingActivityChipModel.Active, modifier: Modifier =
        }

        is OngoingActivityChipModel.Content.Countdown -> {
            val text = content.secondsUntilStarted.toString()
            val text = viewModel.secondsUntilStarted.toString()
            Text(
                text = text,
                style = textStyle,
@@ -115,7 +118,7 @@ fun ChipContent(viewModel: OngoingActivityChipModel.Active, modifier: Modifier =
        }

        is OngoingActivityChipModel.Content.Text -> {
            val text = content.text
            val text = viewModel.text
            Text(
                text = text,
                color = textColor,
@@ -136,8 +139,8 @@ fun ChipContent(viewModel: OngoingActivityChipModel.Active, modifier: Modifier =
        is OngoingActivityChipModel.Content.ShortTimeDelta -> {
            val timeRemainingState =
                rememberTimeRemainingState(
                    futureTimeMillis = content.time,
                    timeSource = content.timeSource,
                    futureTimeMillis = viewModel.time,
                    timeSource = viewModel.timeSource,
                )

            timeRemainingState.timeRemainingData?.let {
+1 −1
Original line number Diff line number Diff line
@@ -179,7 +179,7 @@ private fun ChipBody(

        val isIconOnly = model.content is OngoingActivityChipModel.Content.IconOnly
        if (!isIconOnly) {
            ChipContent(viewModel = model)
            ChipContent(viewModel = model.content, icon = model.icon, colors = model.colors)
        }
    }
}