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

Commit 968c28cb authored by Fabián Kozynski's avatar Fabián Kozynski
Browse files

Fix QS Edit scrolling in Split shade.

When in customizer Swiping up should not transition to a different
scene. Maybe it should if swiping on the notifications side or from the
bottom, but this is not supported (along with the nested scrolling).

Also, fix the scrolling on the QS side in split shade. The footer should
be fixed and not scroll with the rest of the content.

Test: manual
Test: atest ShadeSceneViewModelTest
Fixes: 329662922
Bug: 330200163
Flag: ACONFIG com.android.systemui.scene_container DEVELOPMENT
Change-Id: Ic69e15fbd402b75dccc75fa7812bcd7dc23412db
parent 001d8f47
Loading
Loading
Loading
Loading
+32 −25
Original line number Diff line number Diff line
@@ -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
@@ -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)
@@ -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,
@@ -347,11 +358,7 @@ private fun SceneScope.SplitShade(
                            mediaHost = mediaHost,
                            modifier = Modifier.fillMaxWidth(),
                        )

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

                    }
                    FooterActionsWithAnimatedVisibility(
                        viewModel = footerActionsViewModel,
                        isCustomizing = isCustomizing,
+16 −2
Original line number Diff line number Diff line
@@ -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

@@ -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,
@@ -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 {
+2 −0
Original line number Diff line number Diff line
@@ -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),
+8 −2
Original line number Diff line number Diff line
@@ -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(
@@ -81,6 +83,7 @@ constructor(
                        isUnlocked = deviceEntryInteractor.isUnlocked.value,
                        canSwipeToDismiss = deviceEntryInteractor.canSwipeToEnter.value,
                        shadeMode = shadeInteractor.shadeMode.value,
                        isCustomizing = qsSceneAdapter.isCustomizing.value,
                    ),
            )

@@ -120,6 +123,7 @@ constructor(
        isUnlocked: Boolean,
        canSwipeToDismiss: Boolean?,
        shadeMode: ShadeMode,
        isCustomizing: Boolean,
    ): Map<UserAction, UserActionResult> {
        val up =
            when {
@@ -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) }
        }
    }