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

Commit 595b489e authored by Ahmed Mehfooz's avatar Ahmed Mehfooz
Browse files

[DesktopStatusBar] Add QuickSettings chip

Test: manual
Bug: 433589833
Flag: com.android.systemui.status_bar_for_desktop
Change-Id: I8d7118e88a16d49913cb5e13121717a41eaf6d59
parent f8322e45
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -65,7 +65,7 @@ class FakeHomeStatusBarViewModel(

    override fun onChipBoundsChanged(key: String, bounds: RectF) {}

    override fun onSystemIconChipClicked() {}
    override fun onQuickSettingsChipClicked() {}

    override fun onNotificationIconChipClicked() {}

+4 −4
Original line number Diff line number Diff line
@@ -1907,7 +1907,7 @@ class HomeStatusBarViewModelImplTest(flags: FlagsParameterization) : SysuiTestCa
    @Test
    @EnableSceneContainer
    @EnableFlags(StatusBarForDesktop.FLAG_NAME)
    fun onSystemIconChipClicked_qsShadeIsOpen_collapsesShade() =
    fun onQuickSettingsChipClicked_qsShadeIsOpen_collapsesShade() =
        kosmos.runTest {
            enableDualShade()
            val currentOverlays by collectLastValue(sceneInteractor.currentOverlays)
@@ -1921,21 +1921,21 @@ class HomeStatusBarViewModelImplTest(flags: FlagsParameterization) : SysuiTestCa
            )
            assertThat(currentOverlays).containsExactly(Overlays.QuickSettingsShade)

            underTest.onSystemIconChipClicked()
            underTest.onQuickSettingsChipClicked()
            assertThat(currentOverlays).doesNotContain(Overlays.QuickSettingsShade)
        }

    @Test
    @EnableSceneContainer
    @EnableFlags(StatusBarForDesktop.FLAG_NAME)
    fun onSystemIconChipClicked_qsShadeIsClosed_expandsShade() =
    fun onQuickSettingsChipClicked_qsShadeIsClosed_expandsShade() =
        kosmos.runTest {
            enableDualShade()
            val currentOverlays by collectLastValue(sceneInteractor.currentOverlays)

            assertThat(currentOverlays).doesNotContain(Overlays.QuickSettingsShade)

            underTest.onSystemIconChipClicked()
            underTest.onQuickSettingsChipClicked()

            assertThat(currentOverlays).contains(Overlays.QuickSettingsShade)
        }
+106 −2
Original line number Diff line number Diff line
@@ -16,38 +16,59 @@

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

import android.view.ContextThemeWrapper
import androidx.compose.foundation.layout.Arrangement
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.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
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.lifecycle.rememberViewModel
import com.android.systemui.res.R
import com.android.systemui.shade.ui.composable.ShadeHighlightChip
import com.android.systemui.shade.ui.composable.VariableDayDate
import com.android.systemui.statusbar.phone.StatusBarLocation
import com.android.systemui.statusbar.phone.StatusIconContainer
import com.android.systemui.statusbar.phone.ui.StatusBarIconController
import com.android.systemui.statusbar.phone.ui.TintedIconManager
import com.android.systemui.statusbar.pipeline.battery.ui.composable.UnifiedBattery
import com.android.systemui.statusbar.pipeline.battery.ui.viewmodel.BatteryViewModel
import com.android.systemui.statusbar.pipeline.shared.ui.viewmodel.HomeStatusBarViewModel
import com.android.systemui.statusbar.systemstatusicons.SystemStatusIconsInCompose
import com.android.systemui.statusbar.systemstatusicons.ui.compose.SystemStatusIcons
import com.android.systemui.statusbar.systemstatusicons.ui.compose.SystemStatusIconsLegacy

// TODO(433589833): 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(
    viewModel: HomeStatusBarViewModel,
    clockViewModelFactory: ClockViewModel.Factory,
    statusBarIconController: StatusBarIconController,
    iconManagerFactory: TintedIconManager.Factory,
    modifier: Modifier = Modifier,
) {
    val elementSpacing = 8.dp

    // TODO(433589833): Update padding values to match UX specs.
    Row(modifier = modifier.fillMaxWidth().padding(top = 8.dp, start = 12.dp, end = 12.dp)) {
        Row(
            horizontalArrangement = Arrangement.spacedBy(8.dp, Alignment.Start),
            horizontalArrangement = Arrangement.spacedBy(elementSpacing, Alignment.Start),
            modifier = Modifier.padding(vertical = 4.dp),
        ) {
            // TODO(433589833): Add support for color themes.
            ClockLegacy(textColor = Color.White, onClick = null)

            val clockViewModel =
@@ -60,5 +81,88 @@ fun DesktopStatusBar(
                textColor = colorAttr(R.attr.wallpaperTextColor),
            )
        }

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

        Row(horizontalArrangement = Arrangement.spacedBy(elementSpacing, Alignment.End)) {
            QuickSettingsChip(
                viewModel = viewModel,
                statusBarIconController = statusBarIconController,
                iconManagerFactory = iconManagerFactory,
            )
        }
    }
}

@Composable
private fun QuickSettingsChip(
    viewModel: HomeStatusBarViewModel,
    statusBarIconController: StatusBarIconController,
    iconManagerFactory: TintedIconManager.Factory,
    modifier: Modifier = Modifier,
) {

    ShadeHighlightChip(
        onClick = { viewModel.onQuickSettingsChipClicked() },
        // TODO(433589833): Add support for ChipHighlight when QS Panel is visible.
        backgroundColor = Color.Transparent,
        horizontalArrangement = Arrangement.spacedBy(6.dp, Alignment.Start),
    ) {
        if (SystemStatusIconsInCompose.isEnabled) {
            SystemStatusIcons(
                viewModelFactory = viewModel.systemStatusIconsViewModelFactory,
                tint = Color.White,
                modifier = modifier,
            )
        } else {
            val localContext = LocalContext.current
            val themedContext = ContextThemeWrapper(localContext, R.style.Theme_SystemUI)
            val foregroundColor =
                Utils.getColorAttrDefaultColor(themedContext, android.R.attr.textColorPrimary)
            val backgroundColor =
                Utils.getColorAttrDefaultColor(
                    themedContext,
                    android.R.attr.textColorPrimaryInverse,
                )

            val iconContainer =
                remember(localContext, iconManagerFactory) {
                    StatusIconContainer(
                        ContextThemeWrapper(localContext, R.style.Theme_SystemUI),
                        null,
                    )
                }
            val iconManager =
                remember(iconContainer) {
                    iconManagerFactory.create(iconContainer, StatusBarLocation.HOME)
                }

            SystemStatusIconsLegacy(
                statusBarIconController = statusBarIconController,
                iconContainer = iconContainer,
                iconManager = iconManager,
                useExpandedFormat = true,
                foregroundColor = foregroundColor,
                backgroundColor = backgroundColor,
                isSingleCarrier = true,
                isMicCameraIndicationEnabled = true,
                isPrivacyChipEnabled = true,
                isTransitioning = false,
                isLocationIndicationEnabled = true,
            )
        }

        val batteryHeight =
            with(LocalDensity.current) {
                BatteryViewModel.getStatusBarBatteryHeight(LocalContext.current).toDp()
            }
        UnifiedBattery(
            viewModel =
                rememberViewModel("DesktopStatusBar.BatteryViewModel") {
                    viewModel.unifiedBatteryViewModel.create()
                },
            isDarkProvider = { viewModel.areaDark },
            modifier = Modifier.height(batteryHeight),
        )
    }
}
+7 −0
Original line number Diff line number Diff line
@@ -91,6 +91,8 @@ import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController
import com.android.systemui.statusbar.phone.ongoingcall.StatusBarChipsModernization
import com.android.systemui.statusbar.phone.ui.DarkIconManager
import com.android.systemui.statusbar.phone.ui.StatusBarIconController
import com.android.systemui.statusbar.phone.ui.TintedIconManager
import com.android.systemui.statusbar.phone.ui.TintedIconManager.Factory
import com.android.systemui.statusbar.pipeline.battery.ui.composable.BatteryWithChargeStatus
import com.android.systemui.statusbar.pipeline.battery.ui.composable.ShowPercentMode
import com.android.systemui.statusbar.pipeline.battery.ui.composable.UnifiedBattery
@@ -118,6 +120,7 @@ constructor(
    private val iconViewStoreFactory: ConnectedDisplaysStatusBarNotificationIconViewStore.Factory,
    private val clockViewModelFactory: ClockViewModel.Factory,
    private val darkIconManagerFactory: DarkIconManager.Factory,
    private val tintedIconManagerFactory: TintedIconManager.Factory,
    private val iconController: StatusBarIconController,
    private val ongoingCallController: OngoingCallController,
    private val eventAnimationInteractor: SystemStatusEventAnimationInteractor,
@@ -141,6 +144,7 @@ constructor(
                        iconViewStoreFactory = iconViewStoreFactory,
                        clockViewModelFactory = clockViewModelFactory,
                        darkIconManagerFactory = darkIconManagerFactory,
                        tintedIconManagerFactory = tintedIconManagerFactory,
                        iconController = iconController,
                        ongoingCallController = ongoingCallController,
                        darkIconDispatcher = darkIconDispatcher,
@@ -179,6 +183,7 @@ fun StatusBarRoot(
    iconViewStoreFactory: ConnectedDisplaysStatusBarNotificationIconViewStore.Factory,
    clockViewModelFactory: ClockViewModel.Factory,
    darkIconManagerFactory: DarkIconManager.Factory,
    tintedIconManagerFactory: TintedIconManager.Factory,
    iconController: StatusBarIconController,
    ongoingCallController: OngoingCallController,
    darkIconDispatcher: DarkIconDispatcher,
@@ -210,6 +215,8 @@ fun StatusBarRoot(
        DesktopStatusBar(
            viewModel = statusBarViewModel,
            clockViewModelFactory = clockViewModelFactory,
            statusBarIconController = iconController,
            iconManagerFactory = tintedIconManagerFactory,
        )
        return
    }
+3 −3
Original line number Diff line number Diff line
@@ -162,7 +162,7 @@ interface HomeStatusBarViewModel : Activatable {
    fun onChipBoundsChanged(key: String, bounds: RectF)

    /** Notifies that the system icons container was clicked. */
    fun onSystemIconChipClicked()
    fun onQuickSettingsChipClicked()

    /** Notifies that the notification icons container was clicked. */
    fun onNotificationIconChipClicked()
@@ -601,12 +601,12 @@ constructor(
        ongoingActivityChipsViewModel.onChipBoundsChanged(key, bounds)
    }

    override fun onSystemIconChipClicked() {
    override fun onQuickSettingsChipClicked() {
        if (SceneContainerFlag.isUnexpectedlyInLegacyMode()) {
            return
        }
        shadeInteractor.toggleQuickSettingsShade(
            loggingReason = "HomeStatusBarViewModel.onSystemIconChipClicked"
            loggingReason = "HomeStatusBarViewModel.onQuickSettingsChipClicked"
        )
    }

Loading