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

Commit 30ca69ca authored by Danny Burakov's avatar Danny Burakov Committed by Android (Google) Code Review
Browse files

Merge "[Dual Shade] Always show the date on shade header, never notif icons." into main

parents 20b53c15 c99d8b93
Loading
Loading
Loading
Loading
+37 −78
Original line number Diff line number Diff line
@@ -25,8 +25,8 @@ import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.interaction.collectIsHoveredAsState
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.BoxScope
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.IntrinsicSize
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.RowScope
import androidx.compose.foundation.layout.Spacer
@@ -43,10 +43,8 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.TransformOrigin
import androidx.compose.ui.graphics.graphicsLayer
@@ -80,18 +78,17 @@ import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.shade.ui.composable.ShadeHeader.Colors.chipBackground
import com.android.systemui.shade.ui.composable.ShadeHeader.Colors.chipHighlighted
import com.android.systemui.shade.ui.composable.ShadeHeader.Colors.onScrimDim
import com.android.systemui.shade.ui.composable.ShadeHeader.Dimensions.ChipPaddingHorizontal
import com.android.systemui.shade.ui.composable.ShadeHeader.Dimensions.ChipPaddingVertical
import com.android.systemui.shade.ui.composable.ShadeHeader.Dimensions.CollapsedHeight
import com.android.systemui.shade.ui.composable.ShadeHeader.Values.ClockScale
import com.android.systemui.shade.ui.viewmodel.ShadeHeaderViewModel
import com.android.systemui.shade.ui.viewmodel.ShadeHeaderViewModel.HeaderChipHighlight
import com.android.systemui.statusbar.notification.icon.ui.viewbinder.NotificationIconContainerStatusBarViewBinder
import com.android.systemui.statusbar.phone.NotificationIconContainer
import com.android.systemui.statusbar.phone.StatusBarLocation
import com.android.systemui.statusbar.phone.StatusIconContainer
import com.android.systemui.statusbar.pipeline.mobile.ui.view.ModernShadeCarrierGroupMobileView
import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.ShadeCarrierGroupMobileIconViewModel
import com.android.systemui.statusbar.policy.Clock
import kotlinx.coroutines.launch

object ShadeHeader {
    object Elements {
@@ -110,6 +107,8 @@ object ShadeHeader {
    object Dimensions {
        val CollapsedHeight = 48.dp
        val ExpandedHeight = 120.dp
        val ChipPaddingHorizontal = 8.dp
        val ChipPaddingVertical = 4.dp
    }

    object Colors {
@@ -319,19 +318,10 @@ fun ContentScope.OverlayShadeHeader(
                    )
                    Spacer(modifier = Modifier.width(5.dp))
                }
                val chipHighlight = viewModel.notificationsChipHighlight
                NotificationIconChip(
                    chipHighlight = chipHighlight,
                NotificationsChip(
                    chipHighlight = viewModel.notificationsChipHighlight,
                    onClick = viewModel::onNotificationIconChipClicked,
                ) {
                    if (isShadeLayoutWide) {
                        NotificationIcons(
                            chipHighlight = chipHighlight,
                            notificationIconContainerStatusBarViewBinder =
                                viewModel.notificationIconContainerStatusBarViewBinder,
                            modifier = Modifier.width(IntrinsicSize.Min).height(20.dp),
                        )
                    } else {
                    VariableDayDate(
                        longerDateText = viewModel.longerDateText,
                        shorterDateText = viewModel.shorterDateText,
@@ -339,7 +329,6 @@ fun ContentScope.OverlayShadeHeader(
                    )
                }
            }
            }
        },
        endContent = {
            Row(
@@ -559,31 +548,6 @@ private fun ShadeCarrierGroup(viewModel: ShadeHeaderViewModel, modifier: Modifie
    }
}

@Composable
private fun NotificationIcons(
    chipHighlight: HeaderChipHighlight,
    notificationIconContainerStatusBarViewBinder: NotificationIconContainerStatusBarViewBinder,
    modifier: Modifier = Modifier,
) {
    val scope = rememberCoroutineScope()

    AndroidView(
        factory = { context ->
            NotificationIconContainer(context, null).also { view ->
                view.setOverrideIconColor(true)
                scope.launch {
                    notificationIconContainerStatusBarViewBinder.bindWhileAttached(
                        view = view,
                        displayId = context.displayId,
                    )
                }
            }
        },
        update = { it.setUseInverseOverrideIconColor(chipHighlight is HeaderChipHighlight.Strong) },
        modifier = modifier,
    )
}

@Composable
private fun ContentScope.StatusIcons(
    viewModel: ShadeHeaderViewModel,
@@ -664,34 +628,31 @@ private fun ContentScope.StatusIcons(
}

@Composable
private fun NotificationIconChip(
private fun NotificationsChip(
    chipHighlight: HeaderChipHighlight,
    onClick: () -> Unit,
    modifier: Modifier = Modifier,
    content: @Composable RowScope.() -> Unit,
    content: @Composable BoxScope.() -> Unit,
) {
    val interactionSource = remember { MutableInteractionSource() }
    Box(modifier = modifier) {
        Row(
    val chipBackground =
        with(MaterialTheme.colorScheme) {
            if (chipHighlight is HeaderChipHighlight.Strong) chipHighlighted else chipBackground
        }
    Box(
        modifier =
                Modifier.align(Alignment.CenterStart)
            modifier
                .clickable(
                    interactionSource = interactionSource,
                    indication = null,
                        onClick = { onClick() },
                    )
                    .clip(RoundedCornerShape(25.dp))
                    .background(
                        if (chipHighlight is HeaderChipHighlight.Strong)
                            MaterialTheme.colorScheme.chipHighlighted
                        else MaterialTheme.colorScheme.chipBackground
                    onClick = onClick,
                )
                    .padding(horizontal = 8.dp, vertical = 4.dp)
                .background(chipBackground, RoundedCornerShape(25.dp))
                .padding(horizontal = ChipPaddingHorizontal, vertical = ChipPaddingVertical)
    ) {
        content()
    }
}
}

@Composable
private fun SystemIconChip(
@@ -703,23 +664,21 @@ private fun SystemIconChip(
    val interactionSource = remember { MutableInteractionSource() }
    val isHovered by interactionSource.collectIsHoveredAsState()
    val hoverModifier =
        Modifier.clip(RoundedCornerShape(CollapsedHeight / 4))
            .background(MaterialTheme.colorScheme.onScrimDim)
        with(MaterialTheme.colorScheme) {
            Modifier.background(onScrimDim, RoundedCornerShape(CollapsedHeight / 4))
        }
    val backgroundColor =
        if (chipHighlight is HeaderChipHighlight.Strong) MaterialTheme.colorScheme.chipHighlighted
        else MaterialTheme.colorScheme.chipBackground
        with(MaterialTheme.colorScheme) {
            if (chipHighlight is HeaderChipHighlight.Strong) chipHighlighted else chipBackground
        }

    Row(
        verticalAlignment = Alignment.CenterVertically,
        modifier =
            modifier
                .thenIf(chipHighlight !is HeaderChipHighlight.None) {
                    Modifier.graphicsLayer {
                            shape = RoundedCornerShape(25.dp)
                            clip = true
                        }
                        .background(backgroundColor)
                        .padding(horizontal = 8.dp, vertical = 4.dp)
                    Modifier.background(backgroundColor, RoundedCornerShape(25.dp))
                        .padding(horizontal = ChipPaddingHorizontal, vertical = ChipPaddingVertical)
                }
                .thenIf(onClick != null) {
                    Modifier.clickable(
+0 −2
Original line number Diff line number Diff line
@@ -39,7 +39,6 @@ import com.android.systemui.shade.domain.interactor.PrivacyChipInteractor
import com.android.systemui.shade.domain.interactor.ShadeHeaderClockInteractor
import com.android.systemui.shade.domain.interactor.ShadeInteractor
import com.android.systemui.shade.domain.interactor.ShadeModeInteractor
import com.android.systemui.statusbar.notification.icon.ui.viewbinder.NotificationIconContainerStatusBarViewBinder
import com.android.systemui.statusbar.phone.StatusBarLocation
import com.android.systemui.statusbar.phone.ui.StatusBarIconController
import com.android.systemui.statusbar.phone.ui.TintedIconManager
@@ -74,7 +73,6 @@ constructor(
    private val tintedIconManagerFactory: TintedIconManager.Factory,
    private val batteryMeterViewControllerFactory: BatteryMeterViewController.Factory,
    val statusBarIconController: StatusBarIconController,
    val notificationIconContainerStatusBarViewBinder: NotificationIconContainerStatusBarViewBinder,
) : ExclusiveActivatable() {

    private val hydrator = Hydrator("ShadeHeaderViewModel.hydrator")
+0 −3
Original line number Diff line number Diff line
@@ -25,7 +25,6 @@ import com.android.systemui.shade.domain.interactor.privacyChipInteractor
import com.android.systemui.shade.domain.interactor.shadeHeaderClockInteractor
import com.android.systemui.shade.domain.interactor.shadeInteractor
import com.android.systemui.shade.domain.interactor.shadeModeInteractor
import com.android.systemui.statusbar.notification.icon.ui.viewbinder.NotificationIconContainerStatusBarViewBinder
import com.android.systemui.statusbar.phone.ui.StatusBarIconController
import com.android.systemui.statusbar.phone.ui.tintedIconManagerFactory
import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.mobileIconsInteractor
@@ -47,8 +46,6 @@ val Kosmos.shadeHeaderViewModel: ShadeHeaderViewModel by
            tintedIconManagerFactory = tintedIconManagerFactory,
            batteryMeterViewControllerFactory = batteryMeterViewControllerFactory,
            statusBarIconController = mock<StatusBarIconController>(),
            notificationIconContainerStatusBarViewBinder =
                mock<NotificationIconContainerStatusBarViewBinder>(),
        )
    }