Loading packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/FakeHomeStatusBarViewModel.kt +1 −1 Original line number Diff line number Diff line Loading @@ -65,7 +65,7 @@ class FakeHomeStatusBarViewModel( override fun onChipBoundsChanged(key: String, bounds: RectF) {} override fun onSystemIconChipClicked() {} override fun onQuickSettingsChipClicked() {} override fun onNotificationIconChipClicked() {} Loading packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModelImplTest.kt +4 −4 Original line number Diff line number Diff line Loading @@ -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) Loading @@ -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) } Loading packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/composable/DesktopStatusBar.kt +106 −2 Original line number Diff line number Diff line Loading @@ -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 = Loading @@ -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), ) } } packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/composable/StatusBarRoot.kt +7 −0 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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, Loading @@ -141,6 +144,7 @@ constructor( iconViewStoreFactory = iconViewStoreFactory, clockViewModelFactory = clockViewModelFactory, darkIconManagerFactory = darkIconManagerFactory, tintedIconManagerFactory = tintedIconManagerFactory, iconController = iconController, ongoingCallController = ongoingCallController, darkIconDispatcher = darkIconDispatcher, Loading Loading @@ -179,6 +183,7 @@ fun StatusBarRoot( iconViewStoreFactory: ConnectedDisplaysStatusBarNotificationIconViewStore.Factory, clockViewModelFactory: ClockViewModel.Factory, darkIconManagerFactory: DarkIconManager.Factory, tintedIconManagerFactory: TintedIconManager.Factory, iconController: StatusBarIconController, ongoingCallController: OngoingCallController, darkIconDispatcher: DarkIconDispatcher, Loading Loading @@ -210,6 +215,8 @@ fun StatusBarRoot( DesktopStatusBar( viewModel = statusBarViewModel, clockViewModelFactory = clockViewModelFactory, statusBarIconController = iconController, iconManagerFactory = tintedIconManagerFactory, ) return } Loading packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModel.kt +3 −3 Original line number Diff line number Diff line Loading @@ -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() Loading Loading @@ -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 Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/FakeHomeStatusBarViewModel.kt +1 −1 Original line number Diff line number Diff line Loading @@ -65,7 +65,7 @@ class FakeHomeStatusBarViewModel( override fun onChipBoundsChanged(key: String, bounds: RectF) {} override fun onSystemIconChipClicked() {} override fun onQuickSettingsChipClicked() {} override fun onNotificationIconChipClicked() {} Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModelImplTest.kt +4 −4 Original line number Diff line number Diff line Loading @@ -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) Loading @@ -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) } Loading
packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/composable/DesktopStatusBar.kt +106 −2 Original line number Diff line number Diff line Loading @@ -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 = Loading @@ -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), ) } }
packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/composable/StatusBarRoot.kt +7 −0 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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, Loading @@ -141,6 +144,7 @@ constructor( iconViewStoreFactory = iconViewStoreFactory, clockViewModelFactory = clockViewModelFactory, darkIconManagerFactory = darkIconManagerFactory, tintedIconManagerFactory = tintedIconManagerFactory, iconController = iconController, ongoingCallController = ongoingCallController, darkIconDispatcher = darkIconDispatcher, Loading Loading @@ -179,6 +183,7 @@ fun StatusBarRoot( iconViewStoreFactory: ConnectedDisplaysStatusBarNotificationIconViewStore.Factory, clockViewModelFactory: ClockViewModel.Factory, darkIconManagerFactory: DarkIconManager.Factory, tintedIconManagerFactory: TintedIconManager.Factory, iconController: StatusBarIconController, ongoingCallController: OngoingCallController, darkIconDispatcher: DarkIconDispatcher, Loading Loading @@ -210,6 +215,8 @@ fun StatusBarRoot( DesktopStatusBar( viewModel = statusBarViewModel, clockViewModelFactory = clockViewModelFactory, statusBarIconController = iconController, iconManagerFactory = tintedIconManagerFactory, ) return } Loading
packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/viewmodel/HomeStatusBarViewModel.kt +3 −3 Original line number Diff line number Diff line Loading @@ -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() Loading Loading @@ -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