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

Commit 89c62f2c authored by Ahmed Mehfooz's avatar Ahmed Mehfooz Committed by Android (Google) Code Review
Browse files

Merge changes If39ab08d,If637e4cd,If1fbfa15 into main

* changes:
  [DesktopStatusBar] Add new notification bell icon
  [DesktopStatusBar] Add support for background color changes
  [DesktopStatusBar] Add OngoingActivityChips
parents ad753ce2 f83e49fe
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import android.graphics.Rect
import android.graphics.RectF
import android.view.View
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import com.android.systemui.lifecycle.ExclusiveActivatable
import com.android.systemui.lifecycle.Hydrator
import com.android.systemui.plugins.DarkIconDispatcher
@@ -172,6 +173,12 @@ class FakeHomeStatusBarViewModel(
            initialValue = false,
        )

    val isQuickSettingsChipHighlightedSource = mutableStateOf(false)
    override val isQuickSettingsChipHighlighted: Boolean by isQuickSettingsChipHighlightedSource

    val isNotificationsChipHighlightedSource = mutableStateOf(false)
    override val isNotificationsChipHighlighted: Boolean by isNotificationsChipHighlightedSource

    override suspend fun onActivated(): Nothing {
        hydrator.activate()
    }
+9 −0
Original line number Diff line number Diff line
<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="12dp"
        android:height="14dp"
        android:viewportWidth="10.23"
        android:viewportHeight="13.53">
    <path
        android:pathData="M0.82,11.437C0.598,11.437 0.403,11.359 0.237,11.203C0.081,11.048 0.003,10.853 0.003,10.62C0.003,10.398 0.081,10.209 0.237,10.053C0.392,9.887 0.587,9.803 0.82,9.803L0.687,9.803L0.687,6.12C0.687,5.076 0.998,4.148 1.62,3.337C2.253,2.526 3.081,2.02 4.103,1.82L4.103,1.02C4.103,0.731 4.198,0.492 4.387,0.303C4.587,0.103 4.831,0.003 5.12,0.003C5.409,0.003 5.648,0.103 5.837,0.303C6.037,0.492 6.137,0.731 6.137,1.02L6.137,1.82C7.159,2.02 7.981,2.526 8.603,3.337C9.237,4.148 9.553,5.076 9.553,6.12L9.553,9.803L9.42,9.803C9.653,9.803 9.848,9.887 10.003,10.053C10.159,10.209 10.237,10.398 10.237,10.62C10.237,10.842 10.159,11.037 10.003,11.203C9.848,11.359 9.653,11.437 9.42,11.437L0.82,11.437ZM5.12,13.537C4.764,13.537 4.459,13.414 4.203,13.17C3.948,12.914 3.82,12.603 3.82,12.237L6.437,12.237C6.437,12.603 6.309,12.914 6.053,13.17C5.798,13.414 5.487,13.537 5.12,13.537Z"
        android:fillColor="#FFFFFFFF"/>
</vector>
+118 −34
Original line number Diff line number Diff line
@@ -16,36 +16,46 @@

package com.android.systemui.statusbar.pipeline.shared.ui.composable

import android.graphics.Rect
import android.view.ContextThemeWrapper
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.onLayoutRectChanged
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.unit.dp
import com.android.compose.theme.colorAttr
import com.android.settingslib.Utils
import com.android.systemui.clock.ui.composable.ClockLegacy
import com.android.systemui.clock.ui.viewmodel.AmPmStyle
import com.android.systemui.clock.ui.viewmodel.ClockViewModel
import com.android.systemui.common.shared.model.Icon
import com.android.systemui.common.ui.compose.Icon
import com.android.systemui.compose.modifiers.sysUiResTagContainer
import com.android.systemui.lifecycle.rememberViewModel
import com.android.systemui.media.controls.ui.controller.MediaHierarchyManager
import com.android.systemui.media.controls.ui.view.MediaHost
import com.android.systemui.res.R
import com.android.systemui.shade.ui.composable.ShadeHeader
import com.android.systemui.shade.ui.composable.ShadeHighlightChip
import com.android.systemui.shade.ui.composable.VariableDayDate
import com.android.systemui.statusbar.chips.ui.compose.OngoingActivityChips
import com.android.systemui.statusbar.featurepods.popups.StatusBarPopupChips
import com.android.systemui.statusbar.featurepods.popups.ui.compose.StatusBarPopupChipsContainer
import com.android.systemui.statusbar.notification.icon.ui.viewbinder.NotificationIconContainerViewBinder
import com.android.systemui.statusbar.phone.StatusBarLocation
import com.android.systemui.statusbar.phone.StatusIconContainer
import com.android.systemui.statusbar.phone.ui.StatusBarIconController
@@ -64,7 +74,7 @@ object DesktopStatusBar {
    }
}

// TODO(433589833): Add support for color themes in this composable.
// TODO(b/343358983): Add support for color themes in this composable.
/** Top level composable responsible for all UI shown for the Status Bar for DesktopMode. */
@Composable
fun DesktopStatusBar(
@@ -74,16 +84,23 @@ fun DesktopStatusBar(
    iconManagerFactory: TintedIconManager.Factory,
    mediaHierarchyManager: MediaHierarchyManager,
    mediaHost: MediaHost,
    iconViewStore: NotificationIconContainerViewBinder.IconViewStore?,
    modifier: Modifier = Modifier,
) {
    // TODO(433589833): Update padding values to match UX specs.
    Row(modifier = modifier.fillMaxWidth().padding(top = 8.dp, start = 12.dp, end = 12.dp)) {
    Row(modifier = modifier.fillMaxWidth().padding(top = 4.dp, start = 12.dp, end = 12.dp)) {
        WithAdaptiveTint(
            isDarkProvider = { bounds -> viewModel.areaDark.isDarkTheme(bounds) },
            isHighlighted = false,
        ) { tint ->
            Row(
                horizontalArrangement =
                Arrangement.spacedBy(DesktopStatusBar.Dimensions.ElementSpacing, Alignment.Start),
            modifier = Modifier.padding(vertical = 4.dp),
                    Arrangement.spacedBy(
                        DesktopStatusBar.Dimensions.ElementSpacing,
                        Alignment.Start,
                    )
            ) {
            ClockLegacy(textColor = Color.White, onClick = null)
                ClockLegacy(textColor = tint, onClick = null)

                val clockViewModel =
                    rememberViewModel("HomeStatusBar.Clock") {
@@ -92,16 +109,26 @@ fun DesktopStatusBar(
                VariableDayDate(
                    longerDateText = clockViewModel.longerDateText,
                    shorterDateText = clockViewModel.shorterDateText,
                textColor = colorAttr(R.attr.wallpaperTextColor),
                    textColor = tint,
                )
            }

        }
        Spacer(modifier = Modifier.weight(1f))

        Row(
            horizontalArrangement =
                Arrangement.spacedBy(DesktopStatusBar.Dimensions.ElementSpacing, Alignment.End)
        ) {
            val chipsVisibilityModel = viewModel.ongoingActivityChips
            if (chipsVisibilityModel.areChipsAllowed) {
                OngoingActivityChips(
                    chips = chipsVisibilityModel.chips,
                    iconViewStore = iconViewStore,
                    onChipBoundsChanged = viewModel::onChipBoundsChanged,
                    modifier = Modifier.sysUiResTagContainer(),
                )
            }

            if (StatusBarPopupChips.isEnabled) {
                StatusBarPopupChipsContainer(
                    chips = viewModel.popupChips,
@@ -124,21 +151,34 @@ fun DesktopStatusBar(
}

@Composable
private fun NotificationsChip(viewModel: HomeStatusBarViewModel) {
private fun NotificationsChip(viewModel: HomeStatusBarViewModel, modifier: Modifier = Modifier) {
    ShadeHighlightChip(
        modifier = modifier,
        onClick = { viewModel.onNotificationIconChipClicked() },
        // TODO(433589833): Add support for ChipHighlight when Notifications Panel is visible.
        backgroundColor = Color.Transparent,
        backgroundColor =
            if (viewModel.isNotificationsChipHighlighted) {
                ShadeHeader.ChipHighlight.Strong.backgroundColor
            } else {
                Color.Transparent
            },
        onHoveredBackgroundColor = ShadeHeader.ChipHighlight.Transparent.onHoveredBackgroundColor,
        horizontalArrangement =
            Arrangement.spacedBy(DesktopStatusBar.Dimensions.ChipInternalSpacing, Alignment.Start),
    ) {
        // TODO(433589833): Add new icon resources for the notification chip icon.
        WithAdaptiveTint(
            isHighlighted = viewModel.isNotificationsChipHighlighted,
            isDarkProvider = { bounds -> viewModel.areaDark.isDarkTheme(bounds) },
        ) { tint ->
            Icon(
            icon = Icon.Resource(res = R.drawable.ic_volume_ringer, contentDescription = null),
            tint = Color.White,
                icon =
                    Icon.Resource(res = R.drawable.ic_notification_bell, contentDescription = null),
                tint = tint,
                modifier = Modifier.size(20.dp).padding(1.dp),
            )
        }
    }
}

@Composable
private fun QuickSettingsChip(
@@ -147,20 +187,30 @@ private fun QuickSettingsChip(
    iconManagerFactory: TintedIconManager.Factory,
    modifier: Modifier = Modifier,
) {

    ShadeHighlightChip(
        modifier = modifier,
        onClick = { viewModel.onQuickSettingsChipClicked() },
        // TODO(433589833): Add support for ChipHighlight when QS Panel is visible.
        backgroundColor = Color.Transparent,
        backgroundColor =
            if (viewModel.isQuickSettingsChipHighlighted) {
                ShadeHeader.ChipHighlight.Strong.backgroundColor
            } else {
                Color.Transparent
            },
        onHoveredBackgroundColor = ShadeHeader.ChipHighlight.Transparent.onHoveredBackgroundColor,
        horizontalArrangement =
            Arrangement.spacedBy(DesktopStatusBar.Dimensions.ChipInternalSpacing, Alignment.Start),
    ) {
        if (SystemStatusIconsInCompose.isEnabled) {
            WithAdaptiveTint(
                isHighlighted = viewModel.isQuickSettingsChipHighlighted,
                isDarkProvider = { bounds -> viewModel.areaDark.isDarkTheme(bounds) },
            ) { tint ->
                SystemStatusIcons(
                    viewModelFactory = viewModel.systemStatusIconsViewModelFactory,
                tint = Color.White,
                    tint = tint,
                    modifier = modifier,
                )
            }
        } else {
            val localContext = LocalContext.current
            val themedContext = ContextThemeWrapper(localContext, R.style.Theme_SystemUI)
@@ -213,3 +263,37 @@ private fun QuickSettingsChip(
        )
    }
}

/**
 * A helper composable that calculates the correct tint for UI elements.
 *
 * It manages its own bounds state and provides the calculated tint and a modifier to its content,
 * abstracting away the boilerplate of tint calculation.
 */
@Composable
private fun WithAdaptiveTint(
    isDarkProvider: (Rect) -> Boolean,
    isHighlighted: Boolean,
    modifier: Modifier = Modifier,
    content: @Composable (tint: Color) -> Unit,
) {
    var bounds by remember { mutableStateOf(Rect()) }
    val tint =
        if (isHighlighted) {
            ShadeHeader.ChipHighlight.Strong.foregroundColor
        } else if (isDarkProvider(bounds)) {
            Color.White
        } else {
            Color.Black
        }

    Box(
        propagateMinConstraints = true,
        modifier =
            modifier.onLayoutRectChanged { layoutCoordinates ->
                bounds = with(layoutCoordinates.boundsInScreen) { Rect(left, top, right, bottom) }
            },
    ) {
        content(tint)
    }
}
+9 −3
Original line number Diff line number Diff line
@@ -233,6 +233,7 @@ fun StatusBarRoot(
            iconManagerFactory = tintedIconManagerFactory,
            mediaHierarchyManager = mediaHierarchyManager,
            mediaHost = mediaHost,
            iconViewStore = iconViewStore,
        )
        return
    }
@@ -308,7 +309,8 @@ fun StatusBarRoot(
                                    chips = statusBarViewModel.popupChips,
                                    mediaHost = mediaHost,
                                    onMediaControlPopupVisibilityChanged = { popupShowing ->
                                        mediaHierarchyManager.isMediaControlPopupShowing = popupShowing
                                        mediaHierarchyManager.isMediaControlPopupShowing =
                                            popupShowing
                                    },
                                )
                            }
@@ -319,7 +321,8 @@ fun StatusBarRoot(
                // If the flag is enabled, create and add a compose section to the end
                // of the system_icons container
                if (SystemStatusIconsInCompose.isEnabled) {
                    phoneStatusBarView.requireViewById<View>(R.id.system_icons).visibility = View.GONE
                    phoneStatusBarView.requireViewById<View>(R.id.system_icons).visibility =
                        View.GONE
                    addSystemStatusIconsComposable(phoneStatusBarView, statusBarViewModel)
                } else {
                    val statusIconContainer =
@@ -347,7 +350,10 @@ fun StatusBarRoot(
                    }
                }

                notificationIconsBinder.bindWhileAttached(notificationIconContainer, context.displayId)
                notificationIconsBinder.bindWhileAttached(
                    notificationIconContainer,
                    context.displayId,
                )

                if (StatusBarAlwaysUseRegionSampling.isAnyRegionSamplingEnabled) {
                    bindRegionSamplingViewModel(
+20 −0
Original line number Diff line number Diff line
@@ -167,6 +167,12 @@ interface HomeStatusBarViewModel : Activatable {
    /** Notifies that the notification icons container was clicked. */
    fun onNotificationIconChipClicked()

    /** Whether the QS Chip should be highlighted. */
    val isQuickSettingsChipHighlighted: Boolean

    /** Whether the Notifications chip should be highlighted. */
    val isNotificationsChipHighlighted: Boolean

    /**
     * The multiple ongoing activity chips that should be shown on the left-hand side of the status
     * bar.
@@ -444,6 +450,20 @@ constructor(
            source = desktopInteractor.isDesktopFeatureSetEnabled,
        )

    override val isQuickSettingsChipHighlighted: Boolean by
        hydrator.hydratedStateOf(
            traceName = "isQsChipHighlighted",
            initialValue = false,
            source = shadeInteractor.isQsExpanded,
        )

    override val isNotificationsChipHighlighted: Boolean by
        hydrator.hydratedStateOf(
            traceName = "isNotificationsChipHighlighted",
            initialValue = false,
            source = shadeInteractor.isNotificationsExpanded,
        )

    /**
     * True if the current SysUI state can show the home status bar (aka this status bar), and false
     * if we shouldn't be showing any part of the home status bar.