Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 50622554 authored by Josh Tsuji's avatar Josh Tsuji Committed by Android (Google) Code Review
Browse files

Merge "Fix bug with isInTransition* methods." into main

parents 566191e0 b7309afd
Loading
Loading
Loading
Loading
+30 −53
Original line number Diff line number Diff line
@@ -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
@@ -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.
@@ -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 }
    }

    /**
@@ -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)
    }

    /**
@@ -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 }
    }

    /**
@@ -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 })
    }

    /**
@@ -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()
    }
}
+428 −0
Original line number Diff line number Diff line
@@ -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()
        }
    }
}