Loading packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractor.kt +30 −53 Original line number Diff line number Diff line Loading @@ -34,16 +34,17 @@ import com.android.systemui.keyguard.shared.model.KeyguardState.OFF import com.android.systemui.keyguard.shared.model.KeyguardState.PRIMARY_BOUNCER import com.android.systemui.keyguard.shared.model.TransitionState import com.android.systemui.keyguard.shared.model.TransitionStep import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.merge import kotlinx.coroutines.flow.stateIn import javax.inject.Inject /** Encapsulates business-logic related to the keyguard transitions. */ @SysUISingleton Loading Loading @@ -176,7 +177,6 @@ constructor( .map { step -> step.to } .stateIn(scope, SharingStarted.Eagerly, LOCKSCREEN) /** * Whether we're currently in a transition to a new [KeyguardState] and haven't yet completed * it. Loading Loading @@ -238,12 +238,7 @@ constructor( fun isInTransitionToState( state: KeyguardState, ): Flow<Boolean> { return combine( startedKeyguardTransitionStep, finishedKeyguardState, ) { startedStep, finishedState -> startedStep.to == state && finishedState != state } return isInTransitionToStateWhere { it == state } } /** Loading @@ -253,12 +248,7 @@ constructor( fun isInTransitionToStateWhere( stateMatcher: (KeyguardState) -> Boolean, ): Flow<Boolean> { return combine( startedKeyguardTransitionStep, finishedKeyguardState, ) { startedStep, finishedState -> stateMatcher(startedStep.to) && finishedState != startedStep.from } return isInTransitionWhere(fromStatePredicate = { true }, toStatePredicate = stateMatcher) } /** Loading @@ -267,12 +257,7 @@ constructor( fun isInTransitionFromState( state: KeyguardState, ): Flow<Boolean> { return combine( startedKeyguardTransitionStep, finishedKeyguardState, ) { startedStep, finishedState -> startedStep.from == state && finishedState != state } return isInTransitionFromStateWhere { it == state } } /** Loading @@ -282,12 +267,7 @@ constructor( fun isInTransitionFromStateWhere( stateMatcher: (KeyguardState) -> Boolean, ): Flow<Boolean> { return combine( startedKeyguardTransitionStep, finishedKeyguardState, ) { startedStep, finishedState -> stateMatcher(startedStep.from) && finishedState != startedStep.from } return isInTransitionWhere(fromStatePredicate = stateMatcher, toStatePredicate = { true }) } /** Loading @@ -302,23 +282,20 @@ constructor( startedKeyguardTransitionStep, finishedKeyguardState, ) { startedStep, finishedState -> fromStatePredicate(startedStep.from) && toStatePredicate(startedStep.to) && finishedState != startedStep.from fromStatePredicate(startedStep.from) && toStatePredicate(startedStep.to) && finishedState != startedStep.to } .distinctUntilChanged() } /** * Whether we've FINISHED a transition to a state that matches the given predicate. */ /** Whether we've FINISHED a transition to a state that matches the given predicate. */ fun isFinishedInStateWhere(stateMatcher: (KeyguardState) -> Boolean): Flow<Boolean> { return finishedKeyguardState.map { stateMatcher(it) } return finishedKeyguardState.map { stateMatcher(it) }.distinctUntilChanged() } /** * Whether we've FINISHED a transition to a state that matches the given predicate. */ /** Whether we've FINISHED a transition to a state that matches the given predicate. */ fun isFinishedInState(state: KeyguardState): Flow<Boolean> { return finishedKeyguardState.map { it == state } return finishedKeyguardState.map { it == state }.distinctUntilChanged() } } packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractorTest.kt +428 −0 Original line number Diff line number Diff line Loading @@ -230,4 +230,432 @@ class KeyguardTransitionInteractorTest : SysuiTestCase() { assertThat(startedSteps).isEqualTo(listOf(0f, 0.5f, 1f, 1f, 0.5f, 0f)) } @Test fun isInTransitionToState() = testScope.runTest { val results by collectValues(underTest.isInTransitionToState(GONE)) sendSteps( TransitionStep(AOD, DOZING, 0f, STARTED), TransitionStep(AOD, DOZING, 0.5f, RUNNING), TransitionStep(AOD, DOZING, 1f, FINISHED), ) assertThat(results).isEqualTo(listOf( false, )) sendSteps( TransitionStep(DOZING, GONE, 0f, STARTED), ) assertThat(results).isEqualTo(listOf( false, true, )) sendSteps( TransitionStep(DOZING, GONE, 0f, RUNNING), ) assertThat(results).isEqualTo(listOf( false, true, )) sendSteps( TransitionStep(DOZING, GONE, 0f, FINISHED), ) assertThat(results).isEqualTo(listOf( false, true, false, )) sendSteps( TransitionStep(GONE, DOZING, 0f, STARTED), TransitionStep(GONE, DOZING, 0f, RUNNING), TransitionStep(GONE, DOZING, 1f, FINISHED), ) assertThat(results).isEqualTo(listOf( false, true, false, )) sendSteps( TransitionStep(DOZING, GONE, 0f, STARTED), TransitionStep(DOZING, GONE, 0f, RUNNING), ) assertThat(results).isEqualTo(listOf( false, true, false, true, )) } @Test fun isInTransitionFromState() = testScope.runTest { val results by collectValues(underTest.isInTransitionFromState(DOZING)) sendSteps( TransitionStep(AOD, DOZING, 0f, STARTED), TransitionStep(AOD, DOZING, 0.5f, RUNNING), TransitionStep(AOD, DOZING, 1f, FINISHED), ) assertThat(results).isEqualTo(listOf( false, )) sendSteps( TransitionStep(DOZING, GONE, 0f, STARTED), ) assertThat(results).isEqualTo(listOf( false, true, )) sendSteps( TransitionStep(DOZING, GONE, 0f, RUNNING), ) assertThat(results).isEqualTo(listOf( false, true, )) sendSteps( TransitionStep(DOZING, GONE, 0f, FINISHED), ) assertThat(results).isEqualTo(listOf( false, true, false, )) sendSteps( TransitionStep(GONE, DOZING, 0f, STARTED), TransitionStep(GONE, DOZING, 0f, RUNNING), TransitionStep(GONE, DOZING, 1f, FINISHED), ) assertThat(results).isEqualTo(listOf( false, true, false, )) sendSteps( TransitionStep(DOZING, GONE, 0f, STARTED), TransitionStep(DOZING, GONE, 0f, RUNNING), ) assertThat(results).isEqualTo(listOf( false, true, false, true, )) } @Test fun isInTransitionFromStateWhere() = testScope.runTest { val results by collectValues(underTest.isInTransitionFromStateWhere { it == DOZING }) sendSteps( TransitionStep(AOD, DOZING, 0f, STARTED), TransitionStep(AOD, DOZING, 0.5f, RUNNING), TransitionStep(AOD, DOZING, 1f, FINISHED), ) assertThat(results).isEqualTo(listOf( false, )) sendSteps( TransitionStep(DOZING, GONE, 0f, STARTED), ) assertThat(results).isEqualTo(listOf( false, true, )) sendSteps( TransitionStep(DOZING, GONE, 0f, RUNNING), ) assertThat(results).isEqualTo(listOf( false, true, )) sendSteps( TransitionStep(DOZING, GONE, 0f, FINISHED), ) assertThat(results).isEqualTo(listOf( false, true, false, )) sendSteps( TransitionStep(GONE, DOZING, 0f, STARTED), TransitionStep(GONE, DOZING, 0f, RUNNING), TransitionStep(GONE, DOZING, 1f, FINISHED), ) assertThat(results).isEqualTo(listOf( false, true, false, )) sendSteps( TransitionStep(DOZING, GONE, 0f, STARTED), TransitionStep(DOZING, GONE, 0f, RUNNING), ) assertThat(results).isEqualTo(listOf( false, true, false, true, )) } @Test fun isInTransitionWhere() = testScope.runTest { val results by collectValues(underTest.isInTransitionWhere( fromStatePredicate = { it == DOZING }, toStatePredicate = { it == GONE }, )) sendSteps( TransitionStep(AOD, DOZING, 0f, STARTED), TransitionStep(AOD, DOZING, 0.5f, RUNNING), TransitionStep(AOD, DOZING, 1f, FINISHED), ) assertThat(results).isEqualTo(listOf( false, )) sendSteps( TransitionStep(DOZING, GONE, 0f, STARTED), ) assertThat(results).isEqualTo(listOf( false, true, )) sendSteps( TransitionStep(DOZING, GONE, 0f, RUNNING), ) assertThat(results).isEqualTo(listOf( false, true, )) sendSteps( TransitionStep(DOZING, GONE, 0f, FINISHED), ) assertThat(results).isEqualTo(listOf( false, true, false, )) sendSteps( TransitionStep(GONE, DOZING, 0f, STARTED), TransitionStep(GONE, DOZING, 0f, RUNNING), TransitionStep(GONE, DOZING, 1f, FINISHED), ) assertThat(results).isEqualTo(listOf( false, true, false, )) sendSteps( TransitionStep(DOZING, GONE, 0f, STARTED), TransitionStep(DOZING, GONE, 0f, RUNNING), ) assertThat(results).isEqualTo(listOf( false, true, false, true, )) } @Test fun isFinishedInStateWhere() = testScope.runTest { val results by collectValues(underTest.isFinishedInStateWhere { it == GONE } ) sendSteps( TransitionStep(AOD, DOZING, 0f, STARTED), TransitionStep(AOD, DOZING, 0.5f, RUNNING), TransitionStep(AOD, DOZING, 1f, FINISHED), ) assertThat(results).isEqualTo(listOf( false, // Finished in DOZING, not GONE. )) sendSteps(TransitionStep(DOZING, GONE, 0f, STARTED)) assertThat(results).isEqualTo(listOf( false, )) sendSteps(TransitionStep(DOZING, GONE, 0f, RUNNING)) assertThat(results).isEqualTo(listOf( false, )) sendSteps(TransitionStep(DOZING, GONE, 1f, FINISHED)) assertThat(results).isEqualTo(listOf( false, true, )) sendSteps( TransitionStep(GONE, DOZING, 0f, STARTED), TransitionStep(GONE, DOZING, 0f, RUNNING), ) assertThat(results).isEqualTo(listOf( false, true, )) sendSteps(TransitionStep(GONE, DOZING, 1f, FINISHED)) assertThat(results).isEqualTo(listOf( false, true, false, )) sendSteps( TransitionStep(DOZING, GONE, 0f, STARTED), TransitionStep(DOZING, GONE, 0f, RUNNING), ) assertThat(results).isEqualTo(listOf( false, true, false, )) sendSteps(TransitionStep(DOZING, GONE, 1f, FINISHED)) assertThat(results).isEqualTo(listOf( false, true, false, true, )) } @Test fun isFinishedInState() = testScope.runTest { val results by collectValues(underTest.isFinishedInState(GONE)) sendSteps( TransitionStep(AOD, DOZING, 0f, STARTED), TransitionStep(AOD, DOZING, 0.5f, RUNNING), TransitionStep(AOD, DOZING, 1f, FINISHED), ) assertThat(results).isEqualTo(listOf( false, // Finished in DOZING, not GONE. )) sendSteps(TransitionStep(DOZING, GONE, 0f, STARTED)) assertThat(results).isEqualTo(listOf( false, )) sendSteps(TransitionStep(DOZING, GONE, 0f, RUNNING)) assertThat(results).isEqualTo(listOf( false, )) sendSteps(TransitionStep(DOZING, GONE, 1f, FINISHED)) assertThat(results).isEqualTo(listOf( false, true, )) sendSteps( TransitionStep(GONE, DOZING, 0f, STARTED), TransitionStep(GONE, DOZING, 0f, RUNNING), ) assertThat(results).isEqualTo(listOf( false, true, )) sendSteps(TransitionStep(GONE, DOZING, 1f, FINISHED)) assertThat(results).isEqualTo(listOf( false, true, false, )) sendSteps( TransitionStep(DOZING, GONE, 0f, STARTED), TransitionStep(DOZING, GONE, 0f, RUNNING), ) assertThat(results).isEqualTo(listOf( false, true, false, )) sendSteps(TransitionStep(DOZING, GONE, 1f, FINISHED)) assertThat(results).isEqualTo(listOf( false, true, false, true, )) } private suspend fun sendSteps(vararg steps: TransitionStep) { steps.forEach { repository.sendTransitionStep(it) testScope.runCurrent() } } } Loading
packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractor.kt +30 −53 Original line number Diff line number Diff line Loading @@ -34,16 +34,17 @@ import com.android.systemui.keyguard.shared.model.KeyguardState.OFF import com.android.systemui.keyguard.shared.model.KeyguardState.PRIMARY_BOUNCER import com.android.systemui.keyguard.shared.model.TransitionState import com.android.systemui.keyguard.shared.model.TransitionStep import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.merge import kotlinx.coroutines.flow.stateIn import javax.inject.Inject /** Encapsulates business-logic related to the keyguard transitions. */ @SysUISingleton Loading Loading @@ -176,7 +177,6 @@ constructor( .map { step -> step.to } .stateIn(scope, SharingStarted.Eagerly, LOCKSCREEN) /** * Whether we're currently in a transition to a new [KeyguardState] and haven't yet completed * it. Loading Loading @@ -238,12 +238,7 @@ constructor( fun isInTransitionToState( state: KeyguardState, ): Flow<Boolean> { return combine( startedKeyguardTransitionStep, finishedKeyguardState, ) { startedStep, finishedState -> startedStep.to == state && finishedState != state } return isInTransitionToStateWhere { it == state } } /** Loading @@ -253,12 +248,7 @@ constructor( fun isInTransitionToStateWhere( stateMatcher: (KeyguardState) -> Boolean, ): Flow<Boolean> { return combine( startedKeyguardTransitionStep, finishedKeyguardState, ) { startedStep, finishedState -> stateMatcher(startedStep.to) && finishedState != startedStep.from } return isInTransitionWhere(fromStatePredicate = { true }, toStatePredicate = stateMatcher) } /** Loading @@ -267,12 +257,7 @@ constructor( fun isInTransitionFromState( state: KeyguardState, ): Flow<Boolean> { return combine( startedKeyguardTransitionStep, finishedKeyguardState, ) { startedStep, finishedState -> startedStep.from == state && finishedState != state } return isInTransitionFromStateWhere { it == state } } /** Loading @@ -282,12 +267,7 @@ constructor( fun isInTransitionFromStateWhere( stateMatcher: (KeyguardState) -> Boolean, ): Flow<Boolean> { return combine( startedKeyguardTransitionStep, finishedKeyguardState, ) { startedStep, finishedState -> stateMatcher(startedStep.from) && finishedState != startedStep.from } return isInTransitionWhere(fromStatePredicate = stateMatcher, toStatePredicate = { true }) } /** Loading @@ -302,23 +282,20 @@ constructor( startedKeyguardTransitionStep, finishedKeyguardState, ) { startedStep, finishedState -> fromStatePredicate(startedStep.from) && toStatePredicate(startedStep.to) && finishedState != startedStep.from fromStatePredicate(startedStep.from) && toStatePredicate(startedStep.to) && finishedState != startedStep.to } .distinctUntilChanged() } /** * Whether we've FINISHED a transition to a state that matches the given predicate. */ /** Whether we've FINISHED a transition to a state that matches the given predicate. */ fun isFinishedInStateWhere(stateMatcher: (KeyguardState) -> Boolean): Flow<Boolean> { return finishedKeyguardState.map { stateMatcher(it) } return finishedKeyguardState.map { stateMatcher(it) }.distinctUntilChanged() } /** * Whether we've FINISHED a transition to a state that matches the given predicate. */ /** Whether we've FINISHED a transition to a state that matches the given predicate. */ fun isFinishedInState(state: KeyguardState): Flow<Boolean> { return finishedKeyguardState.map { it == state } return finishedKeyguardState.map { it == state }.distinctUntilChanged() } }
packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractorTest.kt +428 −0 Original line number Diff line number Diff line Loading @@ -230,4 +230,432 @@ class KeyguardTransitionInteractorTest : SysuiTestCase() { assertThat(startedSteps).isEqualTo(listOf(0f, 0.5f, 1f, 1f, 0.5f, 0f)) } @Test fun isInTransitionToState() = testScope.runTest { val results by collectValues(underTest.isInTransitionToState(GONE)) sendSteps( TransitionStep(AOD, DOZING, 0f, STARTED), TransitionStep(AOD, DOZING, 0.5f, RUNNING), TransitionStep(AOD, DOZING, 1f, FINISHED), ) assertThat(results).isEqualTo(listOf( false, )) sendSteps( TransitionStep(DOZING, GONE, 0f, STARTED), ) assertThat(results).isEqualTo(listOf( false, true, )) sendSteps( TransitionStep(DOZING, GONE, 0f, RUNNING), ) assertThat(results).isEqualTo(listOf( false, true, )) sendSteps( TransitionStep(DOZING, GONE, 0f, FINISHED), ) assertThat(results).isEqualTo(listOf( false, true, false, )) sendSteps( TransitionStep(GONE, DOZING, 0f, STARTED), TransitionStep(GONE, DOZING, 0f, RUNNING), TransitionStep(GONE, DOZING, 1f, FINISHED), ) assertThat(results).isEqualTo(listOf( false, true, false, )) sendSteps( TransitionStep(DOZING, GONE, 0f, STARTED), TransitionStep(DOZING, GONE, 0f, RUNNING), ) assertThat(results).isEqualTo(listOf( false, true, false, true, )) } @Test fun isInTransitionFromState() = testScope.runTest { val results by collectValues(underTest.isInTransitionFromState(DOZING)) sendSteps( TransitionStep(AOD, DOZING, 0f, STARTED), TransitionStep(AOD, DOZING, 0.5f, RUNNING), TransitionStep(AOD, DOZING, 1f, FINISHED), ) assertThat(results).isEqualTo(listOf( false, )) sendSteps( TransitionStep(DOZING, GONE, 0f, STARTED), ) assertThat(results).isEqualTo(listOf( false, true, )) sendSteps( TransitionStep(DOZING, GONE, 0f, RUNNING), ) assertThat(results).isEqualTo(listOf( false, true, )) sendSteps( TransitionStep(DOZING, GONE, 0f, FINISHED), ) assertThat(results).isEqualTo(listOf( false, true, false, )) sendSteps( TransitionStep(GONE, DOZING, 0f, STARTED), TransitionStep(GONE, DOZING, 0f, RUNNING), TransitionStep(GONE, DOZING, 1f, FINISHED), ) assertThat(results).isEqualTo(listOf( false, true, false, )) sendSteps( TransitionStep(DOZING, GONE, 0f, STARTED), TransitionStep(DOZING, GONE, 0f, RUNNING), ) assertThat(results).isEqualTo(listOf( false, true, false, true, )) } @Test fun isInTransitionFromStateWhere() = testScope.runTest { val results by collectValues(underTest.isInTransitionFromStateWhere { it == DOZING }) sendSteps( TransitionStep(AOD, DOZING, 0f, STARTED), TransitionStep(AOD, DOZING, 0.5f, RUNNING), TransitionStep(AOD, DOZING, 1f, FINISHED), ) assertThat(results).isEqualTo(listOf( false, )) sendSteps( TransitionStep(DOZING, GONE, 0f, STARTED), ) assertThat(results).isEqualTo(listOf( false, true, )) sendSteps( TransitionStep(DOZING, GONE, 0f, RUNNING), ) assertThat(results).isEqualTo(listOf( false, true, )) sendSteps( TransitionStep(DOZING, GONE, 0f, FINISHED), ) assertThat(results).isEqualTo(listOf( false, true, false, )) sendSteps( TransitionStep(GONE, DOZING, 0f, STARTED), TransitionStep(GONE, DOZING, 0f, RUNNING), TransitionStep(GONE, DOZING, 1f, FINISHED), ) assertThat(results).isEqualTo(listOf( false, true, false, )) sendSteps( TransitionStep(DOZING, GONE, 0f, STARTED), TransitionStep(DOZING, GONE, 0f, RUNNING), ) assertThat(results).isEqualTo(listOf( false, true, false, true, )) } @Test fun isInTransitionWhere() = testScope.runTest { val results by collectValues(underTest.isInTransitionWhere( fromStatePredicate = { it == DOZING }, toStatePredicate = { it == GONE }, )) sendSteps( TransitionStep(AOD, DOZING, 0f, STARTED), TransitionStep(AOD, DOZING, 0.5f, RUNNING), TransitionStep(AOD, DOZING, 1f, FINISHED), ) assertThat(results).isEqualTo(listOf( false, )) sendSteps( TransitionStep(DOZING, GONE, 0f, STARTED), ) assertThat(results).isEqualTo(listOf( false, true, )) sendSteps( TransitionStep(DOZING, GONE, 0f, RUNNING), ) assertThat(results).isEqualTo(listOf( false, true, )) sendSteps( TransitionStep(DOZING, GONE, 0f, FINISHED), ) assertThat(results).isEqualTo(listOf( false, true, false, )) sendSteps( TransitionStep(GONE, DOZING, 0f, STARTED), TransitionStep(GONE, DOZING, 0f, RUNNING), TransitionStep(GONE, DOZING, 1f, FINISHED), ) assertThat(results).isEqualTo(listOf( false, true, false, )) sendSteps( TransitionStep(DOZING, GONE, 0f, STARTED), TransitionStep(DOZING, GONE, 0f, RUNNING), ) assertThat(results).isEqualTo(listOf( false, true, false, true, )) } @Test fun isFinishedInStateWhere() = testScope.runTest { val results by collectValues(underTest.isFinishedInStateWhere { it == GONE } ) sendSteps( TransitionStep(AOD, DOZING, 0f, STARTED), TransitionStep(AOD, DOZING, 0.5f, RUNNING), TransitionStep(AOD, DOZING, 1f, FINISHED), ) assertThat(results).isEqualTo(listOf( false, // Finished in DOZING, not GONE. )) sendSteps(TransitionStep(DOZING, GONE, 0f, STARTED)) assertThat(results).isEqualTo(listOf( false, )) sendSteps(TransitionStep(DOZING, GONE, 0f, RUNNING)) assertThat(results).isEqualTo(listOf( false, )) sendSteps(TransitionStep(DOZING, GONE, 1f, FINISHED)) assertThat(results).isEqualTo(listOf( false, true, )) sendSteps( TransitionStep(GONE, DOZING, 0f, STARTED), TransitionStep(GONE, DOZING, 0f, RUNNING), ) assertThat(results).isEqualTo(listOf( false, true, )) sendSteps(TransitionStep(GONE, DOZING, 1f, FINISHED)) assertThat(results).isEqualTo(listOf( false, true, false, )) sendSteps( TransitionStep(DOZING, GONE, 0f, STARTED), TransitionStep(DOZING, GONE, 0f, RUNNING), ) assertThat(results).isEqualTo(listOf( false, true, false, )) sendSteps(TransitionStep(DOZING, GONE, 1f, FINISHED)) assertThat(results).isEqualTo(listOf( false, true, false, true, )) } @Test fun isFinishedInState() = testScope.runTest { val results by collectValues(underTest.isFinishedInState(GONE)) sendSteps( TransitionStep(AOD, DOZING, 0f, STARTED), TransitionStep(AOD, DOZING, 0.5f, RUNNING), TransitionStep(AOD, DOZING, 1f, FINISHED), ) assertThat(results).isEqualTo(listOf( false, // Finished in DOZING, not GONE. )) sendSteps(TransitionStep(DOZING, GONE, 0f, STARTED)) assertThat(results).isEqualTo(listOf( false, )) sendSteps(TransitionStep(DOZING, GONE, 0f, RUNNING)) assertThat(results).isEqualTo(listOf( false, )) sendSteps(TransitionStep(DOZING, GONE, 1f, FINISHED)) assertThat(results).isEqualTo(listOf( false, true, )) sendSteps( TransitionStep(GONE, DOZING, 0f, STARTED), TransitionStep(GONE, DOZING, 0f, RUNNING), ) assertThat(results).isEqualTo(listOf( false, true, )) sendSteps(TransitionStep(GONE, DOZING, 1f, FINISHED)) assertThat(results).isEqualTo(listOf( false, true, false, )) sendSteps( TransitionStep(DOZING, GONE, 0f, STARTED), TransitionStep(DOZING, GONE, 0f, RUNNING), ) assertThat(results).isEqualTo(listOf( false, true, false, )) sendSteps(TransitionStep(DOZING, GONE, 1f, FINISHED)) assertThat(results).isEqualTo(listOf( false, true, false, true, )) } private suspend fun sendSteps(vararg steps: TransitionStep) { steps.forEach { repository.sendTransitionStep(it) testScope.runCurrent() } } }