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

Commit 1a325acb authored by amehfooz's avatar amehfooz Committed by Ahmed Mehfooz
Browse files

Create ChipContent Composable

Moves ChipContent to its own file. This makes it easier to move
the NeverDecreaseWidth modifier into a private function.

Test: N/A
Bug: b/390530157
Flag: com.android.systemui.status_bar_chips_modernization

Change-Id: I934b0a32c625f2b15bee29e095e1685ae4b82e29
parent 16357e24
Loading
Loading
Loading
Loading
+131 −0
Original line number Diff line number Diff line
@@ -14,19 +14,92 @@
 * limitations under the License.
 */

package com.android.systemui.statusbar.chips.ui.compose.modifiers
package com.android.systemui.statusbar.chips.ui.compose

import androidx.compose.foundation.layout.padding
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.Measurable
import androidx.compose.ui.layout.MeasureResult
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.res.dimensionResource
import androidx.compose.ui.unit.Constraints
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.OngoingActivityChipModel
import com.android.systemui.statusbar.chips.ui.viewmodel.rememberChronometerState

@Composable
fun ChipContent(viewModel: OngoingActivityChipModel.Shown, modifier: Modifier = Modifier) {
    val context = LocalContext.current
    val isTextOnly = viewModel.icon == null
    val hasEmbeddedIcon =
        viewModel.icon is OngoingActivityChipModel.ChipIcon.StatusBarView ||
            viewModel.icon is OngoingActivityChipModel.ChipIcon.StatusBarNotificationIcon
    val startPadding =
        if (isTextOnly || hasEmbeddedIcon) {
            0.dp
        } else {
            dimensionResource(id = R.dimen.ongoing_activity_chip_icon_text_padding)
        }
    val endPadding =
        if (hasEmbeddedIcon) {
            dimensionResource(
                id = R.dimen.ongoing_activity_chip_text_end_padding_for_embedded_padding_icon
            )
        } else {
            0.dp
        }
    val textStyle = MaterialTheme.typography.labelLarge
    val textColor = Color(viewModel.colors.text(context))
    when (viewModel) {
        is OngoingActivityChipModel.Shown.Timer -> {
            val timerState = rememberChronometerState(startTimeMillis = viewModel.startTimeMs)
            Text(
                text = timerState.currentTimeText,
                style = textStyle,
                color = textColor,
                modifier =
                    modifier.padding(start = startPadding, end = endPadding).neverDecreaseWidth(),
            )
        }

        is OngoingActivityChipModel.Shown.Countdown -> {
            ChipText(
                text = viewModel.secondsUntilStarted.toString(),
                style = textStyle,
                color = textColor,
                modifier =
                    modifier.padding(start = startPadding, end = endPadding).neverDecreaseWidth(),
                backgroundColor = Color(viewModel.colors.background(context).defaultColor),
            )
        }

        is OngoingActivityChipModel.Shown.Text -> {
            ChipText(
                text = viewModel.text,
                style = textStyle,
                color = textColor,
                modifier = modifier.padding(start = startPadding, end = endPadding),
                backgroundColor = Color(viewModel.colors.background(context).defaultColor),
            )
        }

        is OngoingActivityChipModel.Shown.ShortTimeDelta -> {
            // TODO(b/372657935): Implement ShortTimeDelta content in compose.
        }
    }
}

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

+1 −69
Original line number Diff line number Diff line
@@ -29,8 +29,6 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.widthIn
import androidx.compose.foundation.shape.RoundedCornerShape
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
@@ -45,10 +43,8 @@ import com.android.compose.animation.Expandable
import com.android.systemui.animation.Expandable
import com.android.systemui.common.ui.compose.Icon
import com.android.systemui.res.R
import com.android.systemui.statusbar.chips.ui.compose.modifiers.neverDecreaseWidth
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.rememberChronometerState

@Composable
fun OngoingActivityChip(model: OngoingActivityChipModel.Shown, modifier: Modifier = Modifier) {
@@ -123,32 +119,8 @@ private fun ChipBody(
            model.icon?.let { ChipIcon(viewModel = it, colors = model.colors) }

            val isIconOnly = model is OngoingActivityChipModel.Shown.IconOnly
            val isTextOnly = model.icon == null
            if (!isIconOnly) {
                ChipContent(
                    viewModel = model,
                    modifier =
                        Modifier.padding(
                            start =
                                if (isTextOnly || hasEmbeddedIcon) {
                                    0.dp
                                } else {
                                    dimensionResource(
                                        id = R.dimen.ongoing_activity_chip_icon_text_padding
                                    )
                                },
                            end =
                                if (hasEmbeddedIcon) {
                                    dimensionResource(
                                        id =
                                            R.dimen
                                                .ongoing_activity_chip_text_end_padding_for_embedded_padding_icon
                                    )
                                } else {
                                    0.dp
                                },
                        ),
                )
                ChipContent(viewModel = model)
            }
        }
    }
@@ -195,46 +167,6 @@ private fun ChipIcon(
    }
}

@Composable
private fun ChipContent(viewModel: OngoingActivityChipModel.Shown, modifier: Modifier = Modifier) {
    val context = LocalContext.current
    when (viewModel) {
        is OngoingActivityChipModel.Shown.Timer -> {
            val timerState = rememberChronometerState(startTimeMillis = viewModel.startTimeMs)
            Text(
                text = timerState.currentTimeText,
                style = MaterialTheme.typography.labelLarge,
                color = Color(viewModel.colors.text(context)),
                modifier = modifier.neverDecreaseWidth(),
            )
        }

        is OngoingActivityChipModel.Shown.Countdown -> {
            ChipText(
                text = viewModel.secondsUntilStarted.toString(),
                color = Color(viewModel.colors.text(context)),
                style = MaterialTheme.typography.labelLarge,
                modifier = modifier.neverDecreaseWidth(),
                backgroundColor = Color(viewModel.colors.background(context).defaultColor),
            )
        }

        is OngoingActivityChipModel.Shown.Text -> {
            ChipText(
                text = viewModel.text,
                color = Color(viewModel.colors.text(context)),
                style = MaterialTheme.typography.labelLarge,
                modifier = modifier,
                backgroundColor = Color(viewModel.colors.background(context).defaultColor),
            )
        }

        is OngoingActivityChipModel.Shown.ShortTimeDelta -> {
            // TODO(b/372657935): Implement ShortTimeDelta content in compose.
        }
    }
}

@Composable
private fun ExpandableChip(
    color: () -> Color,