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

Commit 62ae51f7 authored by Jordan Demeulenaere's avatar Jordan Demeulenaere
Browse files

Support scrolls consumed during preScroll in NestedScrollController

Bug: 394813692
Test: atest NestedScrollControllerTest
Flag: com.android.systemui.scene_container
Change-Id: Ibbf8d97e00fe52f4c94af07a13e42964f624974d
parent c680802d
Loading
Loading
Loading
Loading
+11 −1
Original line number Diff line number Diff line
@@ -134,6 +134,7 @@ private class NestedScrollControllerNode(
    private var bounds: NestedScrollableBound,
) : DelegatingNode(), NestedScrollConnection {
    private var childrenConsumedAnyScroll = false
    private var availableOnPreScroll = Offset.Zero

    init {
        delegate(nestedScrollModifierNode(this, dispatcher = null))
@@ -153,12 +154,21 @@ private class NestedScrollControllerNode(
        this.bounds = bounds
    }

    override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {
        availableOnPreScroll = available
        return Offset.Zero
    }

    override fun onPostScroll(
        consumed: Offset,
        available: Offset,
        source: NestedScrollSource,
    ): Offset {
        if (hasConsumedScrollInBounds(consumed.x) || hasConsumedScrollInBounds(consumed.y)) {
        val consumedIncludingPreScroll = availableOnPreScroll - available
        if (
            hasConsumedScrollInBounds(consumedIncludingPreScroll.x) ||
                hasConsumedScrollInBounds(consumedIncludingPreScroll.y)
        ) {
            childrenConsumedAnyScroll = true
        }

+35 −0
Original line number Diff line number Diff line
@@ -23,9 +23,13 @@ import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.input.nestedscroll.NestedScrollConnection
import androidx.compose.ui.input.nestedscroll.NestedScrollSource
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.test.junit4.createComposeRule
import androidx.compose.ui.test.onRoot
import androidx.compose.ui.test.performTouchInput
@@ -103,4 +107,35 @@ class NestedScrollControllerTest {
        rule.waitForIdle()
        assertThat(state.isOuterScrollAllowed).isTrue()
    }

    @Test
    fun supportsPreScrolls() {
        val state = NestedScrollControlState()
        rule.setContent {
            Box(
                Modifier.fillMaxSize()
                    .nestedScrollController(state)
                    .nestedScroll(
                        remember {
                            object : NestedScrollConnection {
                                override fun onPreScroll(
                                    available: Offset,
                                    source: NestedScrollSource,
                                ): Offset = available
                            }
                        }
                    )
                    .scrollable(rememberScrollableState { 0f }, Orientation.Vertical)
            )
        }

        rule.onRoot().performTouchInput {
            down(topLeft)
            moveBy(Offset(0f, bottom))
        }
        assertThat(state.isOuterScrollAllowed).isFalse()

        rule.onRoot().performTouchInput { up() }
        assertThat(state.isOuterScrollAllowed).isTrue()
    }
}