summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Treehugger Robot <android-test-infra-autosubmit@system.gserviceaccount.com> 2024-12-10 08:51:22 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2024-12-10 08:51:22 +0000
commit305de0b338083a7ad6a82c3673dfeced6d0d8921 (patch)
treeee8eaef7d36dbd26ebcee27aabe261fb1d142b97
parent2935e9a90cf51efef65b33fe9d6587c3a5130805 (diff)
parentfb21945865077681d5631671b02a6c622b2521d4 (diff)
Merge "STL skipAnimation should depends on canChangeContent" into main
-rw-r--r--packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SwipeAnimation.kt15
-rw-r--r--packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/DraggableHandlerTest.kt23
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) }