Loading packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt +32 −25 Original line number Diff line number Diff line Loading @@ -55,6 +55,7 @@ import androidx.compose.ui.unit.dp import com.android.compose.animation.scene.ElementKey import com.android.compose.animation.scene.LowestZIndexScenePicker import com.android.compose.animation.scene.SceneScope import com.android.compose.animation.scene.TransitionState import com.android.compose.animation.scene.UserAction import com.android.compose.animation.scene.UserActionResult import com.android.compose.animation.scene.animateSceneFloatAsState Loading Loading @@ -294,6 +295,7 @@ private fun SceneScope.SplitShade( } val quickSettingsScrollState = rememberScrollState() val isScrollable = layoutState.transitionState is TransitionState.Idle LaunchedEffect(isCustomizing, quickSettingsScrollState) { if (isCustomizing) { quickSettingsScrollState.scrollTo(0) Loading Loading @@ -322,15 +324,24 @@ private fun SceneScope.SplitShade( Column( verticalArrangement = Arrangement.Top, modifier = Modifier.weight(1f).fillMaxHeight().thenIf(!isCustomizing) { Modifier.weight(1f).fillMaxSize().thenIf(!isCustomizing) { Modifier.padding(bottom = navBarBottomHeight) }, ) { Column( modifier = Modifier.fillMaxSize().weight(1f).thenIf(!isCustomizing) { Modifier.verticalNestedScrollToScene() .verticalScroll(quickSettingsScrollState) .verticalScroll( quickSettingsScrollState, enabled = isScrollable ) .clipScrollableContainer(Orientation.Horizontal) .padding(bottom = navBarBottomHeight) } ) { Box( modifier = Modifier.element(QuickSettings.Elements.SplitShadeQuickSettings) modifier = Modifier.element(QuickSettings.Elements.SplitShadeQuickSettings) ) { QuickSettings( qsSceneAdapter = viewModel.qsSceneAdapter, Loading @@ -347,11 +358,7 @@ private fun SceneScope.SplitShade( mediaHost = mediaHost, modifier = Modifier.fillMaxWidth(), ) Spacer( modifier = Modifier.weight(1f), ) } FooterActionsWithAnimatedVisibility( viewModel = footerActionsViewModel, isCustomizing = isCustomizing, Loading packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModelTest.kt +16 −2 Original line number Diff line number Diff line Loading @@ -95,7 +95,7 @@ class ShadeSceneViewModelTest : SysuiTestCase() { scope = testScope.backgroundScope, ) private val qsFlexiglassAdapter = FakeQSSceneAdapter({ mock() }) private val qsSceneAdapter = FakeQSSceneAdapter({ mock() }) private lateinit var shadeHeaderViewModel: ShadeHeaderViewModel Loading @@ -122,7 +122,7 @@ class ShadeSceneViewModelTest : SysuiTestCase() { applicationScope = testScope.backgroundScope, deviceEntryInteractor = deviceEntryInteractor, shadeHeaderViewModel = shadeHeaderViewModel, qsSceneAdapter = qsFlexiglassAdapter, qsSceneAdapter = qsSceneAdapter, notifications = kosmos.notificationsPlaceholderViewModel, mediaDataManager = mediaDataManager, shadeInteractor = kosmos.shadeInteractor, Loading Loading @@ -278,6 +278,20 @@ class ShadeSceneViewModelTest : SysuiTestCase() { .isEqualTo(Scenes.QuickSettings) } @Test fun upTransitionSceneKey_customizing_noTransition() = testScope.runTest { val destinationScenes by collectLastValue(underTest.destinationScenes) qsSceneAdapter.setCustomizing(true) assertThat( destinationScenes!! .keys .filterIsInstance<Swipe>() .filter { it.direction == SwipeDirection.Up } ).isEmpty() } @Test fun shadeMode() = testScope.runTest { Loading packages/SystemUI/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsSceneViewModel.kt +2 −0 Original line number Diff line number Diff line Loading @@ -48,6 +48,8 @@ constructor( qsSceneAdapter.isCustomizing.map { customizing -> if (customizing) { mapOf<UserAction, UserActionResult>(Back to UserActionResult(Scenes.QuickSettings)) // TODO(b/330200163) Add an Up from Bottom to be able to collapse the shade // while customizing } else { mapOf( Back to UserActionResult(Scenes.Shade), Loading packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModel.kt +8 −2 Original line number Diff line number Diff line Loading @@ -66,11 +66,13 @@ constructor( deviceEntryInteractor.isUnlocked, deviceEntryInteractor.canSwipeToEnter, shadeInteractor.shadeMode, ) { isUnlocked, canSwipeToDismiss, shadeMode -> qsSceneAdapter.isCustomizing ) { isUnlocked, canSwipeToDismiss, shadeMode, isCustomizing -> destinationScenes( isUnlocked = isUnlocked, canSwipeToDismiss = canSwipeToDismiss, shadeMode = shadeMode, isCustomizing = isCustomizing ) } .stateIn( Loading @@ -81,6 +83,7 @@ constructor( isUnlocked = deviceEntryInteractor.isUnlocked.value, canSwipeToDismiss = deviceEntryInteractor.canSwipeToEnter.value, shadeMode = shadeInteractor.shadeMode.value, isCustomizing = qsSceneAdapter.isCustomizing.value, ), ) Loading Loading @@ -120,6 +123,7 @@ constructor( isUnlocked: Boolean, canSwipeToDismiss: Boolean?, shadeMode: ShadeMode, isCustomizing: Boolean, ): Map<UserAction, UserActionResult> { val up = when { Loading @@ -131,7 +135,9 @@ constructor( val down = Scenes.QuickSettings.takeIf { shadeMode is ShadeMode.Single } return buildMap { if (!isCustomizing) { this[Swipe(SwipeDirection.Up)] = UserActionResult(up) } // TODO(b/330200163) Add an else to be able to collapse the shade while customizing down?.let { this[Swipe(SwipeDirection.Down)] = UserActionResult(down) } } } Loading Loading
packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt +32 −25 Original line number Diff line number Diff line Loading @@ -55,6 +55,7 @@ import androidx.compose.ui.unit.dp import com.android.compose.animation.scene.ElementKey import com.android.compose.animation.scene.LowestZIndexScenePicker import com.android.compose.animation.scene.SceneScope import com.android.compose.animation.scene.TransitionState import com.android.compose.animation.scene.UserAction import com.android.compose.animation.scene.UserActionResult import com.android.compose.animation.scene.animateSceneFloatAsState Loading Loading @@ -294,6 +295,7 @@ private fun SceneScope.SplitShade( } val quickSettingsScrollState = rememberScrollState() val isScrollable = layoutState.transitionState is TransitionState.Idle LaunchedEffect(isCustomizing, quickSettingsScrollState) { if (isCustomizing) { quickSettingsScrollState.scrollTo(0) Loading Loading @@ -322,15 +324,24 @@ private fun SceneScope.SplitShade( Column( verticalArrangement = Arrangement.Top, modifier = Modifier.weight(1f).fillMaxHeight().thenIf(!isCustomizing) { Modifier.weight(1f).fillMaxSize().thenIf(!isCustomizing) { Modifier.padding(bottom = navBarBottomHeight) }, ) { Column( modifier = Modifier.fillMaxSize().weight(1f).thenIf(!isCustomizing) { Modifier.verticalNestedScrollToScene() .verticalScroll(quickSettingsScrollState) .verticalScroll( quickSettingsScrollState, enabled = isScrollable ) .clipScrollableContainer(Orientation.Horizontal) .padding(bottom = navBarBottomHeight) } ) { Box( modifier = Modifier.element(QuickSettings.Elements.SplitShadeQuickSettings) modifier = Modifier.element(QuickSettings.Elements.SplitShadeQuickSettings) ) { QuickSettings( qsSceneAdapter = viewModel.qsSceneAdapter, Loading @@ -347,11 +358,7 @@ private fun SceneScope.SplitShade( mediaHost = mediaHost, modifier = Modifier.fillMaxWidth(), ) Spacer( modifier = Modifier.weight(1f), ) } FooterActionsWithAnimatedVisibility( viewModel = footerActionsViewModel, isCustomizing = isCustomizing, Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModelTest.kt +16 −2 Original line number Diff line number Diff line Loading @@ -95,7 +95,7 @@ class ShadeSceneViewModelTest : SysuiTestCase() { scope = testScope.backgroundScope, ) private val qsFlexiglassAdapter = FakeQSSceneAdapter({ mock() }) private val qsSceneAdapter = FakeQSSceneAdapter({ mock() }) private lateinit var shadeHeaderViewModel: ShadeHeaderViewModel Loading @@ -122,7 +122,7 @@ class ShadeSceneViewModelTest : SysuiTestCase() { applicationScope = testScope.backgroundScope, deviceEntryInteractor = deviceEntryInteractor, shadeHeaderViewModel = shadeHeaderViewModel, qsSceneAdapter = qsFlexiglassAdapter, qsSceneAdapter = qsSceneAdapter, notifications = kosmos.notificationsPlaceholderViewModel, mediaDataManager = mediaDataManager, shadeInteractor = kosmos.shadeInteractor, Loading Loading @@ -278,6 +278,20 @@ class ShadeSceneViewModelTest : SysuiTestCase() { .isEqualTo(Scenes.QuickSettings) } @Test fun upTransitionSceneKey_customizing_noTransition() = testScope.runTest { val destinationScenes by collectLastValue(underTest.destinationScenes) qsSceneAdapter.setCustomizing(true) assertThat( destinationScenes!! .keys .filterIsInstance<Swipe>() .filter { it.direction == SwipeDirection.Up } ).isEmpty() } @Test fun shadeMode() = testScope.runTest { Loading
packages/SystemUI/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsSceneViewModel.kt +2 −0 Original line number Diff line number Diff line Loading @@ -48,6 +48,8 @@ constructor( qsSceneAdapter.isCustomizing.map { customizing -> if (customizing) { mapOf<UserAction, UserActionResult>(Back to UserActionResult(Scenes.QuickSettings)) // TODO(b/330200163) Add an Up from Bottom to be able to collapse the shade // while customizing } else { mapOf( Back to UserActionResult(Scenes.Shade), Loading
packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModel.kt +8 −2 Original line number Diff line number Diff line Loading @@ -66,11 +66,13 @@ constructor( deviceEntryInteractor.isUnlocked, deviceEntryInteractor.canSwipeToEnter, shadeInteractor.shadeMode, ) { isUnlocked, canSwipeToDismiss, shadeMode -> qsSceneAdapter.isCustomizing ) { isUnlocked, canSwipeToDismiss, shadeMode, isCustomizing -> destinationScenes( isUnlocked = isUnlocked, canSwipeToDismiss = canSwipeToDismiss, shadeMode = shadeMode, isCustomizing = isCustomizing ) } .stateIn( Loading @@ -81,6 +83,7 @@ constructor( isUnlocked = deviceEntryInteractor.isUnlocked.value, canSwipeToDismiss = deviceEntryInteractor.canSwipeToEnter.value, shadeMode = shadeInteractor.shadeMode.value, isCustomizing = qsSceneAdapter.isCustomizing.value, ), ) Loading Loading @@ -120,6 +123,7 @@ constructor( isUnlocked: Boolean, canSwipeToDismiss: Boolean?, shadeMode: ShadeMode, isCustomizing: Boolean, ): Map<UserAction, UserActionResult> { val up = when { Loading @@ -131,7 +135,9 @@ constructor( val down = Scenes.QuickSettings.takeIf { shadeMode is ShadeMode.Single } return buildMap { if (!isCustomizing) { this[Swipe(SwipeDirection.Up)] = UserActionResult(up) } // TODO(b/330200163) Add an else to be able to collapse the shade while customizing down?.let { this[Swipe(SwipeDirection.Down)] = UserActionResult(down) } } } Loading