diff options
| author | 2024-12-10 08:51:22 +0000 | |
|---|---|---|
| committer | 2024-12-10 08:51:22 +0000 | |
| commit | 305de0b338083a7ad6a82c3673dfeced6d0d8921 (patch) | |
| tree | ee8eaef7d36dbd26ebcee27aabe261fb1d142b97 | |
| parent | 2935e9a90cf51efef65b33fe9d6587c3a5130805 (diff) | |
| parent | fb21945865077681d5631671b02a6c622b2521d4 (diff) | |
Merge "STL skipAnimation should depends on canChangeContent" into main
2 files changed, 30 insertions, 8 deletions
diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SwipeAnimation.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SwipeAnimation.kt index 35cdf81e8c14..59d0b55c1db8 100644 --- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SwipeAnimation.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SwipeAnimation.kt @@ -337,13 +337,6 @@ internal class SwipeAnimation<T : ContentKey>( check(!isAnimatingOffset()) { "SwipeAnimation.animateOffset() can only be called once" } val initialProgress = progress - // Skip the animation if we have already reached the target content and the overscroll does - // not animate anything. - val hasReachedTargetContent = - (targetContent == toContent && initialProgress >= 1f) || - (targetContent == fromContent && initialProgress <= 0f) - val skipAnimation = - hasReachedTargetContent && !contentTransition.isWithinProgressRange(initialProgress) val targetContent = if (targetContent != currentContent && !canChangeContent(targetContent)) { @@ -352,6 +345,14 @@ internal class SwipeAnimation<T : ContentKey>( targetContent } + // Skip the animation if we have already reached the target content and the overscroll does + // not animate anything. + val hasReachedTargetContent = + (targetContent == toContent && initialProgress >= 1f) || + (targetContent == fromContent && initialProgress <= 0f) + val skipAnimation = + hasReachedTargetContent && !contentTransition.isWithinProgressRange(initialProgress) + val targetOffset = if (targetContent == fromContent) { 0f diff --git a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/DraggableHandlerTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/DraggableHandlerTest.kt index 2c8dc3264b7e..b20056d54de1 100644 --- a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/DraggableHandlerTest.kt +++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/DraggableHandlerTest.kt @@ -42,7 +42,6 @@ import com.android.compose.animation.scene.content.state.TransitionState.Transit import com.android.compose.animation.scene.subjects.assertThat import com.android.compose.test.MonotonicClockTestScope import com.android.compose.test.runMonotonicClockTest -import com.android.compose.test.transition import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Deferred @@ -921,6 +920,28 @@ class DraggableHandlerTest { } @Test + fun blockTransition_animated() = runGestureTest { + assertIdle(SceneA) + layoutState.transitions = transitions { overscrollDisabled(SceneB, Orientation.Vertical) } + + // Swipe up to scene B. Overscroll 50%. + val dragController = onDragStarted(overSlop = up(1.5f), expectedConsumedOverSlop = up(1.0f)) + assertTransition(currentScene = SceneA, fromScene = SceneA, toScene = SceneB, progress = 1f) + + // Block the transition when the user release their finger. + canChangeScene = { false } + val velocityConsumed = + dragController.onDragStoppedAnimateLater(velocity = -velocityThreshold) + + // Start an animation: overscroll and from 1f to 0f. + assertTransition(currentScene = SceneA, fromScene = SceneA, toScene = SceneB, progress = 1f) + + val consumed = velocityConsumed.await() + assertThat(consumed).isEqualTo(-velocityThreshold) + assertIdle(SceneA) + } + + @Test fun scrollFromIdleWithNoTargetScene_shouldUseOverscrollSpecIfAvailable() = runGestureTest { layoutState.transitions = transitions { overscroll(SceneC, Orientation.Vertical) { fade(TestElements.Foo) } |