Loading packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutState.kt +14 −0 Original line number Diff line number Diff line Loading @@ -117,6 +117,9 @@ sealed interface MutableSceneTransitionLayoutState : SceneTransitionLayoutState coroutineScope: CoroutineScope, transitionKey: TransitionKey? = null, ): TransitionState.Transition? /** Immediately snap to the given [scene]. */ fun snapToScene(scene: SceneKey) } /** Loading Loading @@ -745,6 +748,17 @@ internal class MutableSceneTransitionLayoutStateImpl( override fun CoroutineScope.onChangeScene(scene: SceneKey) { setTargetScene(scene, coroutineScope = this) } override fun snapToScene(scene: SceneKey) { // Force finish all transitions. while (currentTransitions.isNotEmpty()) { val transition = transitionStates[0] as TransitionState.Transition finishTransition(transition, transition.currentScene) } check(transitionStates.size == 1) transitionStates[0] = TransitionState.Idle(scene) } } private const val TAG = "SceneTransitionLayoutState" Loading packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SceneTransitionLayoutStateTest.kt +15 −0 Original line number Diff line number Diff line Loading @@ -635,4 +635,19 @@ class SceneTransitionLayoutStateTest { Log.setWtfHandler(originalHandler) } } @Test fun snapToScene() = runMonotonicClockTest { val state = MutableSceneTransitionLayoutState(SceneA) // Transition to B. state.setTargetScene(SceneB, coroutineScope = this) val transition = assertThat(state.transitionState).isTransition() assertThat(transition).hasCurrentScene(SceneB) // Snap to C. state.snapToScene(SceneC) assertThat(state.transitionState).isIdle() assertThat(state.transitionState).hasCurrentScene(SceneC) } } Loading
packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutState.kt +14 −0 Original line number Diff line number Diff line Loading @@ -117,6 +117,9 @@ sealed interface MutableSceneTransitionLayoutState : SceneTransitionLayoutState coroutineScope: CoroutineScope, transitionKey: TransitionKey? = null, ): TransitionState.Transition? /** Immediately snap to the given [scene]. */ fun snapToScene(scene: SceneKey) } /** Loading Loading @@ -745,6 +748,17 @@ internal class MutableSceneTransitionLayoutStateImpl( override fun CoroutineScope.onChangeScene(scene: SceneKey) { setTargetScene(scene, coroutineScope = this) } override fun snapToScene(scene: SceneKey) { // Force finish all transitions. while (currentTransitions.isNotEmpty()) { val transition = transitionStates[0] as TransitionState.Transition finishTransition(transition, transition.currentScene) } check(transitionStates.size == 1) transitionStates[0] = TransitionState.Idle(scene) } } private const val TAG = "SceneTransitionLayoutState" Loading
packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SceneTransitionLayoutStateTest.kt +15 −0 Original line number Diff line number Diff line Loading @@ -635,4 +635,19 @@ class SceneTransitionLayoutStateTest { Log.setWtfHandler(originalHandler) } } @Test fun snapToScene() = runMonotonicClockTest { val state = MutableSceneTransitionLayoutState(SceneA) // Transition to B. state.setTargetScene(SceneB, coroutineScope = this) val transition = assertThat(state.transitionState).isTransition() assertThat(transition).hasCurrentScene(SceneB) // Snap to C. state.snapToScene(SceneC) assertThat(state.transitionState).isIdle() assertThat(state.transitionState).hasCurrentScene(SceneC) } }