Loading packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/compose/modifiers/NeverDecreaseWidth.kt→packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/compose/ChipContent.kt +131 −0 Original line number Diff line number Diff line Loading @@ -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) } Loading packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/compose/OngoingActivityChip.kt +1 −69 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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) { Loading Loading @@ -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) } } } Loading Loading @@ -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, Loading Loading
packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/compose/modifiers/NeverDecreaseWidth.kt→packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/compose/ChipContent.kt +131 −0 Original line number Diff line number Diff line Loading @@ -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) } Loading
packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/compose/OngoingActivityChip.kt +1 −69 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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) { Loading Loading @@ -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) } } } Loading Loading @@ -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, Loading