diff options
author | 2024-06-12 08:56:34 +0000 | |
---|---|---|
committer | 2024-06-12 08:56:34 +0000 | |
commit | ee4a566796d049eb526feaa7a54ab1d8636fef63 (patch) | |
tree | 573892e2fe91b8514dcc4a52be8c412823a95989 | |
parent | 47b9d6aa26974f0a0319eb1b391d701fe7e66288 (diff) | |
parent | 28c272fe322ac14eb2e220067305fe3c68283966 (diff) |
Merge "Don't interpolate the STL size when overscrolling" into main
2 files changed, 46 insertions, 1 deletions
diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutImpl.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutImpl.kt index f32720c4716d..7ea8cbdd7a97 100644 --- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutImpl.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutImpl.kt @@ -293,7 +293,15 @@ private class LayoutNode(var layoutImpl: SceneTransitionLayoutImpl) : width = fromSize.width height = fromSize.height } else { - val size = lerp(fromSize, toSize, transition.progress) + val overscrollSpec = transition.currentOverscrollSpec + val progress = + when { + overscrollSpec == null -> transition.progress + overscrollSpec.scene == transition.toScene -> 1f + else -> 0f + } + + val size = lerp(fromSize, toSize, progress) width = size.width.coerceAtLeast(0) height = size.height.coerceAtLeast(0) } diff --git a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SceneTransitionLayoutTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SceneTransitionLayoutTest.kt index 08532bd72e33..a8dd572c4d50 100644 --- a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SceneTransitionLayoutTest.kt +++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SceneTransitionLayoutTest.kt @@ -21,6 +21,7 @@ import androidx.compose.animation.core.FastOutSlowInEasing import androidx.compose.animation.core.LinearEasing import androidx.compose.animation.core.tween import androidx.compose.foundation.background +import androidx.compose.foundation.gestures.Orientation import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.offset @@ -333,6 +334,42 @@ class SceneTransitionLayoutTest { } @Test + fun layoutSizeDoesNotOverscrollWhenOverscrollIsSpecified() { + val state = + rule.runOnUiThread { + MutableSceneTransitionLayoutStateImpl( + SceneA, + transitions { overscroll(SceneB, Orientation.Horizontal) } + ) + } + + val layoutTag = "layout" + rule.setContent { + SceneTransitionLayout(state, Modifier.testTag(layoutTag)) { + scene(SceneA) { Box(Modifier.size(50.dp)) } + scene(SceneB) { Box(Modifier.size(70.dp)) } + } + } + + // Overscroll on A at -100%: size should be interpolated given that there is no overscroll + // defined for scene A. + var progress by mutableStateOf(-1f) + rule.runOnIdle { + state.startTransition(transition(from = SceneA, to = SceneB, progress = { progress })) + } + rule.onNodeWithTag(layoutTag).assertSizeIsEqualTo(30.dp) + + // Middle of the transition. + progress = 0.5f + rule.onNodeWithTag(layoutTag).assertSizeIsEqualTo(60.dp) + + // Overscroll on B at 200%: size should not be interpolated given that there is an + // overscroll defined for scene B. + progress = 2f + rule.onNodeWithTag(layoutTag).assertSizeIsEqualTo(70.dp) + } + + @Test fun multipleTransitionsWillComposeMultipleScenes() { val duration = 10 * 16L |