Loading packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsShadeOverlay.kt +16 −2 Original line number Diff line number Diff line Loading @@ -50,6 +50,8 @@ import com.android.systemui.brightness.ui.compose.BrightnessSliderContainer import com.android.systemui.compose.modifiers.sysuiResTag import com.android.systemui.dagger.SysUISingleton import com.android.systemui.lifecycle.rememberViewModel import com.android.systemui.media.controls.ui.composable.MediaCarousel import com.android.systemui.media.controls.ui.view.MediaHostState.Companion.COLLAPSED import com.android.systemui.notifications.ui.composable.SnoozeableHeadsUpNotificationSpace import com.android.systemui.qs.composefragment.ui.GridAnchor import com.android.systemui.qs.flags.QsDetailedView Loading Loading @@ -104,7 +106,10 @@ constructor( } val quickSettingsContainerViewModel = rememberViewModel("QuickSettingsShadeOverlayContainer") { quickSettingsContainerViewModelFactory.create(supportsBrightnessMirroring = true) quickSettingsContainerViewModelFactory.create( supportsBrightnessMirroring = true, expansion = COLLAPSED, ) } val hunPlaceholderViewModel = rememberViewModel("QuickSettingsShadeOverlayPlaceholder") { Loading Loading @@ -232,12 +237,20 @@ fun ContentScope.QuickSettingsLayout( Toolbar( modifier = Modifier.fillMaxWidth().requiredHeight(QuickSettingsShade.Dimensions.ToolbarHeight), toolbarViewModelFactory = viewModel.toolbarViewModelFactory, viewModel = viewModel.toolbarViewModel, ) Column( verticalArrangement = Arrangement.spacedBy(QuickSettingsShade.Dimensions.Padding), modifier = Modifier.fillMaxWidth().verticalScroll(rememberScrollState()), ) { MediaCarousel( isVisible = viewModel.showMedia, mediaHost = viewModel.mediaHost, carouselController = viewModel.mediaCarouselController, usingCollapsedLandscapeMedia = true, modifier = Modifier.padding(horizontal = QuickSettingsShade.Dimensions.Padding), ) BrightnessSliderContainer( viewModel = viewModel.brightnessSliderViewModel, containerColor = OverlayShade.Colors.PanelBackground, Loading @@ -245,6 +258,7 @@ fun ContentScope.QuickSettingsLayout( Modifier.fillMaxWidth() .height(QuickSettingsShade.Dimensions.BrightnessSliderHeight), ) Box { GridAnchor() TileGrid( Loading packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsContainerViewModelTest.kt +23 −0 Original line number Diff line number Diff line Loading @@ -24,17 +24,22 @@ import com.android.systemui.coroutines.collectLastValue import com.android.systemui.flags.EnableSceneContainer import com.android.systemui.kosmos.testScope import com.android.systemui.lifecycle.activateIn import com.android.systemui.media.controls.data.repository.mediaFilterRepository import com.android.systemui.media.controls.shared.model.MediaData import com.android.systemui.qs.composefragment.dagger.usingMediaInComposeFragment import com.android.systemui.scene.domain.startable.sceneContainerStartable import com.android.systemui.shade.domain.interactor.enableDualShade import com.android.systemui.shade.domain.interactor.shadeModeInteractor import com.android.systemui.testKosmos import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runCurrent import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Test import org.junit.runner.RunWith @OptIn(ExperimentalCoroutinesApi::class) @SmallTest @RunWith(AndroidJUnit4::class) @TestableLooper.RunWithLooper Loading Loading @@ -79,4 +84,22 @@ class QuickSettingsContainerViewModelTest : SysuiTestCase() { assertThat(underTest.showHeader).isFalse() } @Test fun showMedia_activeMedia_true() = testScope.runTest { kosmos.mediaFilterRepository.addSelectedUserMediaEntry(MediaData(active = true)) runCurrent() assertThat(underTest.showMedia).isTrue() } @Test fun showMedia_noActiveMedia_false() = testScope.runTest { kosmos.mediaFilterRepository.addSelectedUserMediaEntry(MediaData(active = false)) runCurrent() assertThat(underTest.showMedia).isFalse() } } packages/SystemUI/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModel.kt +6 −8 Original line number Diff line number Diff line Loading @@ -35,7 +35,6 @@ import com.android.systemui.animation.ShadeInterpolation import com.android.systemui.classifier.Classifier import com.android.systemui.classifier.domain.interactor.FalsingInteractor import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.deviceentry.domain.interactor.DeviceEntryInteractor import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor import com.android.systemui.keyguard.shared.model.Edge Loading @@ -43,7 +42,6 @@ import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.lifecycle.ExclusiveActivatable import com.android.systemui.lifecycle.Hydrator import com.android.systemui.log.table.TableLogBuffer import com.android.systemui.media.controls.ui.controller.MediaHierarchyManager import com.android.systemui.media.controls.ui.controller.MediaHierarchyManager.Companion.LOCATION_QQS import com.android.systemui.media.controls.ui.controller.MediaHierarchyManager.Companion.LOCATION_QS import com.android.systemui.media.controls.ui.view.MediaHost Loading Loading @@ -101,7 +99,7 @@ constructor( private val footerActionsController: FooterActionsController, private val sysuiStatusBarStateController: SysuiStatusBarStateController, deviceEntryInteractor: DeviceEntryInteractor, DisableFlagsInteractor: DisableFlagsInteractor, disableFlagsInteractor: DisableFlagsInteractor, keyguardTransitionInteractor: KeyguardTransitionInteractor, private val largeScreenShadeInterpolator: LargeScreenShadeInterpolator, shadeInteractor: ShadeInteractor, Loading @@ -119,7 +117,7 @@ constructor( @Assisted private val lifecycleScope: LifecycleCoroutineScope, ) : Dumpable, ExclusiveActivatable() { val containerViewModel = containerViewModelFactory.create(true) val containerViewModel = containerViewModelFactory.create(supportsBrightnessMirroring = true) val quickQuickSettingsViewModel = quickQuickSettingsViewModelFactory.create() private val qqsMediaInRowViewModel = mediaInRowInLandscapeViewModelFactory.create(LOCATION_QQS) Loading Loading @@ -199,8 +197,8 @@ constructor( val isQsEnabled by hydrator.hydratedStateOf( traceName = "isQsEnabled", initialValue = DisableFlagsInteractor.disableFlags.value.isQuickSettingsEnabled(), source = DisableFlagsInteractor.disableFlags.map { it.isQuickSettingsEnabled() }, initialValue = disableFlagsInteractor.disableFlags.value.isQuickSettingsEnabled(), source = disableFlagsInteractor.disableFlags.map { it.isQuickSettingsEnabled() }, ) var isInSplitShade by mutableStateOf(false) Loading Loading @@ -490,12 +488,12 @@ constructor( qqsMediaHost.apply { expansion = qqsMediaExpansion showsOnlyActiveMedia = true init(MediaHierarchyManager.LOCATION_QQS) init(LOCATION_QQS) } qsMediaHost.apply { expansion = MediaHostState.EXPANDED showsOnlyActiveMedia = false init(MediaHierarchyManager.LOCATION_QS) init(LOCATION_QS) } } Loading packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/PaginatedGridLayout.kt +7 −2 Original line number Diff line number Diff line Loading @@ -144,12 +144,17 @@ private fun FooterBar( pagerState: PagerState, editButtonViewModelFactory: EditModeButtonViewModel.Factory, ) { val editButtonViewModel = rememberViewModel(traceName = "PaginatedGridLayout-editButtonViewModel") { editButtonViewModelFactory.create() } // Use requiredHeight so it won't be squished if the view doesn't quite fit. As this is // expected to be inside a scrollable container, this should not be an issue. // Also, we construct the layout this way to do the following: // * PagerDots is centered in the row, taking as much space as it needs. // * On the start side, we place the BuildNumber, taking as much space as it needs, but // constrained by the available space left over after PagerDots // constrained by the available space left over after PagerDots. // * On the end side, we place the edit mode button, with the same constraints as for // BuildNumber (but it will usually fit, as it's just a square button). Row( Loading Loading @@ -178,7 +183,7 @@ private fun FooterBar( ) Row(Modifier.weight(1f)) { Spacer(modifier = Modifier.weight(1f)) EditModeButton(viewModelFactory = editButtonViewModelFactory) EditModeButton(viewModel = editButtonViewModel) } } } packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/toolbar/EditModeButton.kt +1 −6 Original line number Diff line number Diff line Loading @@ -29,17 +29,12 @@ import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import com.android.systemui.lifecycle.rememberViewModel import com.android.systemui.qs.panels.ui.viewmodel.toolbar.EditModeButtonViewModel import com.android.systemui.qs.ui.compose.borderOnFocus import com.android.systemui.res.R @Composable fun EditModeButton( viewModelFactory: EditModeButtonViewModel.Factory, modifier: Modifier = Modifier, ) { val viewModel = rememberViewModel(traceName = "EditModeButton") { viewModelFactory.create() } fun EditModeButton(viewModel: EditModeButtonViewModel, modifier: Modifier = Modifier) { CompositionLocalProvider( value = LocalContentColor provides MaterialTheme.colorScheme.onSurface ) { Loading Loading
packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsShadeOverlay.kt +16 −2 Original line number Diff line number Diff line Loading @@ -50,6 +50,8 @@ import com.android.systemui.brightness.ui.compose.BrightnessSliderContainer import com.android.systemui.compose.modifiers.sysuiResTag import com.android.systemui.dagger.SysUISingleton import com.android.systemui.lifecycle.rememberViewModel import com.android.systemui.media.controls.ui.composable.MediaCarousel import com.android.systemui.media.controls.ui.view.MediaHostState.Companion.COLLAPSED import com.android.systemui.notifications.ui.composable.SnoozeableHeadsUpNotificationSpace import com.android.systemui.qs.composefragment.ui.GridAnchor import com.android.systemui.qs.flags.QsDetailedView Loading Loading @@ -104,7 +106,10 @@ constructor( } val quickSettingsContainerViewModel = rememberViewModel("QuickSettingsShadeOverlayContainer") { quickSettingsContainerViewModelFactory.create(supportsBrightnessMirroring = true) quickSettingsContainerViewModelFactory.create( supportsBrightnessMirroring = true, expansion = COLLAPSED, ) } val hunPlaceholderViewModel = rememberViewModel("QuickSettingsShadeOverlayPlaceholder") { Loading Loading @@ -232,12 +237,20 @@ fun ContentScope.QuickSettingsLayout( Toolbar( modifier = Modifier.fillMaxWidth().requiredHeight(QuickSettingsShade.Dimensions.ToolbarHeight), toolbarViewModelFactory = viewModel.toolbarViewModelFactory, viewModel = viewModel.toolbarViewModel, ) Column( verticalArrangement = Arrangement.spacedBy(QuickSettingsShade.Dimensions.Padding), modifier = Modifier.fillMaxWidth().verticalScroll(rememberScrollState()), ) { MediaCarousel( isVisible = viewModel.showMedia, mediaHost = viewModel.mediaHost, carouselController = viewModel.mediaCarouselController, usingCollapsedLandscapeMedia = true, modifier = Modifier.padding(horizontal = QuickSettingsShade.Dimensions.Padding), ) BrightnessSliderContainer( viewModel = viewModel.brightnessSliderViewModel, containerColor = OverlayShade.Colors.PanelBackground, Loading @@ -245,6 +258,7 @@ fun ContentScope.QuickSettingsLayout( Modifier.fillMaxWidth() .height(QuickSettingsShade.Dimensions.BrightnessSliderHeight), ) Box { GridAnchor() TileGrid( Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsContainerViewModelTest.kt +23 −0 Original line number Diff line number Diff line Loading @@ -24,17 +24,22 @@ import com.android.systemui.coroutines.collectLastValue import com.android.systemui.flags.EnableSceneContainer import com.android.systemui.kosmos.testScope import com.android.systemui.lifecycle.activateIn import com.android.systemui.media.controls.data.repository.mediaFilterRepository import com.android.systemui.media.controls.shared.model.MediaData import com.android.systemui.qs.composefragment.dagger.usingMediaInComposeFragment import com.android.systemui.scene.domain.startable.sceneContainerStartable import com.android.systemui.shade.domain.interactor.enableDualShade import com.android.systemui.shade.domain.interactor.shadeModeInteractor import com.android.systemui.testKosmos import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runCurrent import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Test import org.junit.runner.RunWith @OptIn(ExperimentalCoroutinesApi::class) @SmallTest @RunWith(AndroidJUnit4::class) @TestableLooper.RunWithLooper Loading Loading @@ -79,4 +84,22 @@ class QuickSettingsContainerViewModelTest : SysuiTestCase() { assertThat(underTest.showHeader).isFalse() } @Test fun showMedia_activeMedia_true() = testScope.runTest { kosmos.mediaFilterRepository.addSelectedUserMediaEntry(MediaData(active = true)) runCurrent() assertThat(underTest.showMedia).isTrue() } @Test fun showMedia_noActiveMedia_false() = testScope.runTest { kosmos.mediaFilterRepository.addSelectedUserMediaEntry(MediaData(active = false)) runCurrent() assertThat(underTest.showMedia).isFalse() } }
packages/SystemUI/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModel.kt +6 −8 Original line number Diff line number Diff line Loading @@ -35,7 +35,6 @@ import com.android.systemui.animation.ShadeInterpolation import com.android.systemui.classifier.Classifier import com.android.systemui.classifier.domain.interactor.FalsingInteractor import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.deviceentry.domain.interactor.DeviceEntryInteractor import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor import com.android.systemui.keyguard.shared.model.Edge Loading @@ -43,7 +42,6 @@ import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.lifecycle.ExclusiveActivatable import com.android.systemui.lifecycle.Hydrator import com.android.systemui.log.table.TableLogBuffer import com.android.systemui.media.controls.ui.controller.MediaHierarchyManager import com.android.systemui.media.controls.ui.controller.MediaHierarchyManager.Companion.LOCATION_QQS import com.android.systemui.media.controls.ui.controller.MediaHierarchyManager.Companion.LOCATION_QS import com.android.systemui.media.controls.ui.view.MediaHost Loading Loading @@ -101,7 +99,7 @@ constructor( private val footerActionsController: FooterActionsController, private val sysuiStatusBarStateController: SysuiStatusBarStateController, deviceEntryInteractor: DeviceEntryInteractor, DisableFlagsInteractor: DisableFlagsInteractor, disableFlagsInteractor: DisableFlagsInteractor, keyguardTransitionInteractor: KeyguardTransitionInteractor, private val largeScreenShadeInterpolator: LargeScreenShadeInterpolator, shadeInteractor: ShadeInteractor, Loading @@ -119,7 +117,7 @@ constructor( @Assisted private val lifecycleScope: LifecycleCoroutineScope, ) : Dumpable, ExclusiveActivatable() { val containerViewModel = containerViewModelFactory.create(true) val containerViewModel = containerViewModelFactory.create(supportsBrightnessMirroring = true) val quickQuickSettingsViewModel = quickQuickSettingsViewModelFactory.create() private val qqsMediaInRowViewModel = mediaInRowInLandscapeViewModelFactory.create(LOCATION_QQS) Loading Loading @@ -199,8 +197,8 @@ constructor( val isQsEnabled by hydrator.hydratedStateOf( traceName = "isQsEnabled", initialValue = DisableFlagsInteractor.disableFlags.value.isQuickSettingsEnabled(), source = DisableFlagsInteractor.disableFlags.map { it.isQuickSettingsEnabled() }, initialValue = disableFlagsInteractor.disableFlags.value.isQuickSettingsEnabled(), source = disableFlagsInteractor.disableFlags.map { it.isQuickSettingsEnabled() }, ) var isInSplitShade by mutableStateOf(false) Loading Loading @@ -490,12 +488,12 @@ constructor( qqsMediaHost.apply { expansion = qqsMediaExpansion showsOnlyActiveMedia = true init(MediaHierarchyManager.LOCATION_QQS) init(LOCATION_QQS) } qsMediaHost.apply { expansion = MediaHostState.EXPANDED showsOnlyActiveMedia = false init(MediaHierarchyManager.LOCATION_QS) init(LOCATION_QS) } } Loading
packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/PaginatedGridLayout.kt +7 −2 Original line number Diff line number Diff line Loading @@ -144,12 +144,17 @@ private fun FooterBar( pagerState: PagerState, editButtonViewModelFactory: EditModeButtonViewModel.Factory, ) { val editButtonViewModel = rememberViewModel(traceName = "PaginatedGridLayout-editButtonViewModel") { editButtonViewModelFactory.create() } // Use requiredHeight so it won't be squished if the view doesn't quite fit. As this is // expected to be inside a scrollable container, this should not be an issue. // Also, we construct the layout this way to do the following: // * PagerDots is centered in the row, taking as much space as it needs. // * On the start side, we place the BuildNumber, taking as much space as it needs, but // constrained by the available space left over after PagerDots // constrained by the available space left over after PagerDots. // * On the end side, we place the edit mode button, with the same constraints as for // BuildNumber (but it will usually fit, as it's just a square button). Row( Loading Loading @@ -178,7 +183,7 @@ private fun FooterBar( ) Row(Modifier.weight(1f)) { Spacer(modifier = Modifier.weight(1f)) EditModeButton(viewModelFactory = editButtonViewModelFactory) EditModeButton(viewModel = editButtonViewModel) } } }
packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/toolbar/EditModeButton.kt +1 −6 Original line number Diff line number Diff line Loading @@ -29,17 +29,12 @@ import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import com.android.systemui.lifecycle.rememberViewModel import com.android.systemui.qs.panels.ui.viewmodel.toolbar.EditModeButtonViewModel import com.android.systemui.qs.ui.compose.borderOnFocus import com.android.systemui.res.R @Composable fun EditModeButton( viewModelFactory: EditModeButtonViewModel.Factory, modifier: Modifier = Modifier, ) { val viewModel = rememberViewModel(traceName = "EditModeButton") { viewModelFactory.create() } fun EditModeButton(viewModel: EditModeButtonViewModel, modifier: Modifier = Modifier) { CompositionLocalProvider( value = LocalContentColor provides MaterialTheme.colorScheme.onSurface ) { Loading