diff options
| -rw-r--r-- | packages/SystemUI/res/layout/bindable_status_bar_compose_icon.xml | 1 | ||||
| -rw-r--r-- | packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/composable/StackedMobileIcon.kt | 93 |
2 files changed, 74 insertions, 20 deletions
diff --git a/packages/SystemUI/res/layout/bindable_status_bar_compose_icon.xml b/packages/SystemUI/res/layout/bindable_status_bar_compose_icon.xml index fa9318bc151c..6b55ac2e0398 100644 --- a/packages/SystemUI/res/layout/bindable_status_bar_compose_icon.xml +++ b/packages/SystemUI/res/layout/bindable_status_bar_compose_icon.xml @@ -27,7 +27,6 @@ android:layout_height="@dimen/status_bar_bindable_icon_size" android:layout_width="wrap_content" android:layout_gravity="center_vertical" - android:padding="4sp" /> </com.android.systemui.statusbar.pipeline.shared.ui.view.SingleBindableStatusBarComposeIconView> diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/composable/StackedMobileIcon.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/composable/StackedMobileIcon.kt index 465a43fbfb9e..a51da0e4cc73 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/composable/StackedMobileIcon.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/composable/StackedMobileIcon.kt @@ -17,9 +17,12 @@ package com.android.systemui.statusbar.pipeline.shared.ui.composable import androidx.compose.foundation.Canvas +import androidx.compose.foundation.layout.Arrangement.spacedBy import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width import androidx.compose.material3.LocalContentColor import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment @@ -27,23 +30,28 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.CornerRadius import androidx.compose.ui.geometry.Offset import androidx.compose.ui.geometry.Size +import androidx.compose.ui.graphics.BlendMode import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.drawscope.DrawScope import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.unit.TextUnit -import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import com.android.compose.modifiers.height -import com.android.compose.modifiers.width import com.android.systemui.common.ui.compose.Icon import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.StackedMobileIconViewModel import com.android.systemui.statusbar.pipeline.shared.ui.composable.StackedMobileIconDimensions.BarBaseHeightFiveBarsSp import com.android.systemui.statusbar.pipeline.shared.ui.composable.StackedMobileIconDimensions.BarBaseHeightFourBarsSp import com.android.systemui.statusbar.pipeline.shared.ui.composable.StackedMobileIconDimensions.BarsLevelIncrementSp import com.android.systemui.statusbar.pipeline.shared.ui.composable.StackedMobileIconDimensions.BarsVerticalPaddingSp +import com.android.systemui.statusbar.pipeline.shared.ui.composable.StackedMobileIconDimensions.ExclamationCutoutRadiusSp +import com.android.systemui.statusbar.pipeline.shared.ui.composable.StackedMobileIconDimensions.ExclamationDiameterSp +import com.android.systemui.statusbar.pipeline.shared.ui.composable.StackedMobileIconDimensions.ExclamationHeightSp +import com.android.systemui.statusbar.pipeline.shared.ui.composable.StackedMobileIconDimensions.ExclamationHorizontalOffset +import com.android.systemui.statusbar.pipeline.shared.ui.composable.StackedMobileIconDimensions.ExclamationVerticalSpacing import com.android.systemui.statusbar.pipeline.shared.ui.composable.StackedMobileIconDimensions.HorizontalPaddingFiveBarsSp import com.android.systemui.statusbar.pipeline.shared.ui.composable.StackedMobileIconDimensions.HorizontalPaddingFourBarsSp import com.android.systemui.statusbar.pipeline.shared.ui.composable.StackedMobileIconDimensions.IconHeightSp +import com.android.systemui.statusbar.pipeline.shared.ui.composable.StackedMobileIconDimensions.IconPaddingSp +import com.android.systemui.statusbar.pipeline.shared.ui.composable.StackedMobileIconDimensions.IconSpacingSp import com.android.systemui.statusbar.pipeline.shared.ui.composable.StackedMobileIconDimensions.IconWidthFiveBarsSp import com.android.systemui.statusbar.pipeline.shared.ui.composable.StackedMobileIconDimensions.IconWidthFourBarsSp import com.android.systemui.statusbar.pipeline.shared.ui.composable.StackedMobileIconDimensions.SecondaryBarHeightSp @@ -58,15 +66,16 @@ fun StackedMobileIcon(viewModel: StackedMobileIconViewModel, modifier: Modifier val dualSim = viewModel.dualSim ?: return val contentColor = LocalContentColor.current - - Row(verticalAlignment = Alignment.CenterVertically, modifier = modifier) { + val padding = with(LocalDensity.current) { IconPaddingSp.toDp() } + val horizontalArrangement = with(LocalDensity.current) { spacedBy(IconSpacingSp.toDp()) } + + Row( + horizontalArrangement = horizontalArrangement, + verticalAlignment = Alignment.CenterVertically, + modifier = modifier.padding(horizontal = padding), + ) { viewModel.networkTypeIcon?.let { - Icon( - it, - tint = contentColor, - modifier = - Modifier.height { IconHeightSp.roundToPx() }.padding(start = 1.dp, end = 2.dp), - ) + Icon(it, tint = contentColor, modifier = Modifier.fillMaxHeight()) } StackedMobileIcon(dualSim, contentColor) @@ -79,23 +88,23 @@ private fun StackedMobileIcon( color: Color, modifier: Modifier = Modifier, ) { - val maxNumberOfLevels = - max(viewModel.primary.numberOfLevels, viewModel.secondary.numberOfLevels) - val dimensions = if (maxNumberOfLevels == 6) FiveBarsDimensions else FourBarsDimensions + // Removing 1 to get the real number of bars + val numberOfBars = max(viewModel.primary.numberOfLevels, viewModel.secondary.numberOfLevels) - 1 + val dimensions = if (numberOfBars == 5) FiveBarsDimensions else FourBarsDimensions val iconSize = with(LocalDensity.current) { dimensions.totalWidth.toDp() to IconHeightSp.toDp() } - Canvas(modifier.size(width = iconSize.first, height = iconSize.second)) { + Canvas(modifier.width(iconSize.first).height(iconSize.second)) { val verticalPaddingPx = BarsVerticalPaddingSp.roundToPx() val horizontalPaddingPx = dimensions.barsHorizontalPadding.roundToPx() - val totalPaddingWidthPx = horizontalPaddingPx * (maxNumberOfLevels - 1) + val totalPaddingWidthPx = horizontalPaddingPx * (numberOfBars - 1) - val barWidthPx = (size.width - totalPaddingWidthPx) / maxNumberOfLevels + val barWidthPx = (size.width - totalPaddingWidthPx) / numberOfBars val dotHeightPx = SecondaryBarHeightSp.toPx() val baseBarHeightPx = dimensions.barBaseHeight.toPx() var xOffsetPx = 0f - for (bar in 1..maxNumberOfLevels) { + for (bar in 1..numberOfBars) { // Bottom dots representing secondary sim val dotYOffsetPx = size.height - dotHeightPx if (bar <= viewModel.secondary.numberOfLevels) { @@ -123,6 +132,10 @@ private fun StackedMobileIcon( xOffsetPx += barWidthPx + horizontalPaddingPx } + + if (viewModel.primary.showExclamationMark) { + drawExclamationCutout(color) + } } } @@ -143,6 +156,39 @@ private fun DrawScope.drawMobileIconBar( ) } +private fun DrawScope.drawExclamationCutout(color: Color) { + // Exclamation mark is bottom aligned with the canvas + val exclamationDiameterPx = ExclamationDiameterSp.toPx() + val exclamationRadiusPx = ExclamationDiameterSp.toPx() / 2 + val exclamationTotalHeight = + ExclamationHeightSp.toPx() + ExclamationVerticalSpacing.toPx() + exclamationDiameterPx + val exclamationDotCenter = + Offset(size.width - ExclamationHorizontalOffset.toPx(), size.height - exclamationRadiusPx) + val exclamationMarkTopLeft = + Offset(exclamationDotCenter.x - exclamationRadiusPx, size.height - exclamationTotalHeight) + val exclamationCornerRadius = CornerRadius(exclamationRadiusPx) + val cutoutCenter = Offset(exclamationDotCenter.x, size.height - (exclamationTotalHeight / 2)) + + // Transparent cutout + drawCircle( + color = Color.Transparent, + radius = ExclamationCutoutRadiusSp.toPx(), + center = cutoutCenter, + blendMode = BlendMode.SrcIn, + ) + + // Top bar for the exclamation mark + drawRoundRect( + color = color, + topLeft = exclamationMarkTopLeft, + size = Size(exclamationDiameterPx, ExclamationHeightSp.toPx()), + cornerRadius = exclamationCornerRadius, + ) + + // Bottom circle for the exclamation mark + drawCircle(color = color, center = exclamationDotCenter, radius = exclamationRadiusPx) +} + private abstract class BarsDependentDimensions( val totalWidth: TextUnit, val barsHorizontalPadding: TextUnit, @@ -166,10 +212,19 @@ private object FiveBarsDimensions : private object StackedMobileIconDimensions { // Common dimensions val IconHeightSp = 12.sp + val IconPaddingSp = 4.sp + val IconSpacingSp = 2.sp val BarsVerticalPaddingSp = 1.5.sp val BarsLevelIncrementSp = 1.sp val SecondaryBarHeightSp = 3.sp + // Exclamation cutout dimensions + val ExclamationCutoutRadiusSp = 5.sp + val ExclamationDiameterSp = 1.5.sp + val ExclamationHeightSp = 4.5.sp + val ExclamationVerticalSpacing = 1.sp + val ExclamationHorizontalOffset = 1.sp + // Dimensions dependant on the number of total bars val IconWidthFiveBarsSp = 18.5.sp val IconWidthFourBarsSp = 16.sp |