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

Commit 9ad90b8d authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "PriorityNestedScrollConnection: Add flingToScroll [1/2]" into main

parents 5e4f136b 957f7c99
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -16,11 +16,13 @@

package com.android.systemui.notifications.ui.composable

import androidx.compose.foundation.gestures.FlingBehavior
import androidx.compose.foundation.gestures.Orientation
import androidx.compose.ui.input.nestedscroll.NestedScrollConnection
import androidx.compose.ui.input.nestedscroll.NestedScrollSource
import androidx.compose.ui.util.fastCoerceAtLeast
import androidx.compose.ui.util.fastCoerceAtMost
import com.android.compose.nestedscroll.OnStopScope
import com.android.compose.nestedscroll.PriorityNestedScrollConnection
import com.android.compose.nestedscroll.ScrollController

@@ -43,6 +45,7 @@ fun NotificationScrimNestedScrollConnection(
    isCurrentGestureOverscroll: () -> Boolean,
    onStart: (Float) -> Unit = {},
    onStop: (Float) -> Unit = {},
    flingBehavior: FlingBehavior,
): PriorityNestedScrollConnection {
    return PriorityNestedScrollConnection(
        orientation = Orientation.Vertical,
@@ -77,8 +80,9 @@ fun NotificationScrimNestedScrollConnection(
                    return amountConsumed
                }

                override suspend fun onStop(initialVelocity: Float): Float {
                    onStop(initialVelocity)
                override suspend fun OnStopScope.onStop(initialVelocity: Float): Float {
                    val consumedByScroll = flingToScroll(initialVelocity, flingBehavior)
                    onStop(initialVelocity - consumedByScroll)
                    if (scrimOffset() < minScrimOffset()) {
                        animateScrimOffset(minScrimOffset())
                    }
+36 −28
Original line number Diff line number Diff line
@@ -18,7 +18,9 @@ package com.android.systemui.notifications.ui.composable

import androidx.compose.animation.core.Animatable
import androidx.compose.animation.core.tween
import androidx.compose.foundation.gestures.FlingBehavior
import androidx.compose.foundation.gestures.Orientation
import androidx.compose.foundation.gestures.ScrollableDefaults
import androidx.compose.foundation.layout.offset
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
@@ -30,6 +32,7 @@ import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.dp
import androidx.compose.ui.util.fastCoerceAtLeast
import com.android.compose.nestedscroll.OnStopScope
import com.android.compose.nestedscroll.PriorityNestedScrollConnection
import com.android.compose.nestedscroll.ScrollController
import kotlin.math.max
@@ -46,7 +49,9 @@ fun Modifier.stackVerticalOverscroll(
    val screenHeight =
        with(LocalDensity.current) { LocalConfiguration.current.screenHeightDp.dp.toPx() }
    val overscrollOffset = remember { Animatable(0f) }
    val stackNestedScrollConnection = remember {
    val flingBehavior = ScrollableDefaults.flingBehavior()
    val stackNestedScrollConnection =
        remember(flingBehavior) {
            NotificationStackNestedScrollConnection(
                stackOffset = { overscrollOffset.value },
                canScrollForward = canScrollForward,
@@ -70,6 +75,7 @@ fun Modifier.stackVerticalOverscroll(
                        )
                    }
                },
                flingBehavior = flingBehavior,
            )
        }

@@ -86,6 +92,7 @@ fun NotificationStackNestedScrollConnection(
    onStart: (Float) -> Unit = {},
    onScroll: (Float) -> Unit,
    onStop: (Float) -> Unit = {},
    flingBehavior: FlingBehavior,
): PriorityNestedScrollConnection {
    return PriorityNestedScrollConnection(
        orientation = Orientation.Vertical,
@@ -106,8 +113,9 @@ fun NotificationStackNestedScrollConnection(
                    return consumed
                }

                override suspend fun onStop(initialVelocity: Float): Float {
                    onStop(initialVelocity)
                override suspend fun OnStopScope.onStop(initialVelocity: Float): Float {
                    val consumedByScroll = flingToScroll(initialVelocity, flingBehavior)
                    onStop(initialVelocity - consumedByScroll)
                    return initialVelocity
                }

+4 −0
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import androidx.compose.foundation.ScrollState
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.gestures.Orientation
import androidx.compose.foundation.gestures.ScrollableDefaults
import androidx.compose.foundation.gestures.animateScrollBy
import androidx.compose.foundation.gestures.rememberScrollableState
import androidx.compose.foundation.gestures.scrollBy
@@ -451,12 +452,14 @@ fun SceneScope.NotificationScrollingStack(
        }
    }

    val flingBehavior = ScrollableDefaults.flingBehavior()
    val scrimNestedScrollConnection =
        shadeSession.rememberSession(
            scrimOffset,
            maxScrimTop,
            minScrimTop,
            isCurrentGestureOverscroll,
            flingBehavior,
        ) {
            NotificationScrimNestedScrollConnection(
                scrimOffset = { scrimOffset.value },
@@ -469,6 +472,7 @@ fun SceneScope.NotificationScrollingStack(
                contentHeight = { stackHeight.intValue.toFloat() },
                minVisibleScrimHeight = minVisibleScrimHeight,
                isCurrentGestureOverscroll = { isCurrentGestureOverscroll.value },
                flingBehavior = flingBehavior,
            )
        }

+2 −1
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ import androidx.compose.ui.util.fastCoerceIn
import com.android.compose.animation.scene.content.Content
import com.android.compose.animation.scene.content.state.TransitionState
import com.android.compose.animation.scene.content.state.TransitionState.HasOverscrollProperties.Companion.DistanceUnspecified
import com.android.compose.nestedscroll.OnStopScope
import com.android.compose.nestedscroll.PriorityNestedScrollConnection
import com.android.compose.nestedscroll.ScrollController
import kotlin.math.absoluteValue
@@ -749,7 +750,7 @@ private fun scrollController(
            return dragController.onDrag(delta = deltaScroll)
        }

        override suspend fun onStop(initialVelocity: Float): Float {
        override suspend fun OnStopScope.onStop(initialVelocity: Float): Float {
            return dragController
                .onStop(velocity = initialVelocity, canChangeContent = canChangeScene)
                .invoke()
+14 −4
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.compose.nestedscroll

import androidx.compose.foundation.gestures.FlingBehavior
import androidx.compose.foundation.gestures.Orientation
import androidx.compose.ui.input.nestedscroll.NestedScrollConnection
import androidx.compose.ui.input.nestedscroll.NestedScrollSource
@@ -41,6 +42,7 @@ fun LargeTopAppBarNestedScrollConnection(
    onHeightChanged: (Float) -> Unit,
    minHeight: () -> Float,
    maxHeight: () -> Float,
    flingBehavior: FlingBehavior,
): PriorityNestedScrollConnection {
    return PriorityNestedScrollConnection(
        orientation = Orientation.Vertical,
@@ -55,7 +57,15 @@ fun LargeTopAppBarNestedScrollConnection(
            offsetAvailable > 0 && height() < maxHeight()
        },
        canStartPostFling = { false },
        onStart = { LargeTopAppBarScrollController(height, maxHeight, minHeight, onHeightChanged) },
        onStart = {
            LargeTopAppBarScrollController(
                height = height,
                maxHeight = maxHeight,
                minHeight = minHeight,
                onHeightChanged = onHeightChanged,
                flingBehavior = flingBehavior,
            )
        },
    )
}

@@ -64,6 +74,7 @@ private class LargeTopAppBarScrollController(
    val maxHeight: () -> Float,
    val minHeight: () -> Float,
    val onHeightChanged: (Float) -> Unit,
    val flingBehavior: FlingBehavior,
) : ScrollController {
    override fun onScroll(deltaScroll: Float, source: NestedScrollSource): Float {
        val currentHeight = height()
@@ -79,9 +90,8 @@ private class LargeTopAppBarScrollController(
        return amountConsumed
    }

    override suspend fun onStop(initialVelocity: Float): Float {
        // Don't consume the velocity on pre/post fling
        return 0f
    override suspend fun OnStopScope.onStop(initialVelocity: Float): Float {
        return flingToScroll(initialVelocity, flingBehavior)
    }

    override fun onCancel() {
Loading