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

Commit 2aaeb254 authored by Beverly's avatar Beverly
Browse files

Manually control the animation LS => bouncer when dragging

Set the animator to null instead of using the
default animator. The animation wasn't being properly set back to
the lockscreen when the bouncer dragging was quickly abandoned
since the default animator was being used instead of the
manual animation.

Test: manual
Test: atest KeyguardTransitionScenariosTest
Fixes: 299172035

Change-Id: Ic66eb13e7ac0101031622104500d2ebeb85b4032
parent b498ab84
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -265,7 +265,11 @@ constructor(
                                !isKeyguardUnlocked &&
                                statusBarState == KEYGUARD
                        ) {
                            transitionId = startTransitionTo(KeyguardState.PRIMARY_BOUNCER)
                            transitionId =
                                startTransitionTo(
                                    toState = KeyguardState.PRIMARY_BOUNCER,
                                    animator = null, // transition will be manually controlled
                                )
                        }
                    }
                }
+58 −2
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ import com.android.systemui.keyguard.shared.model.BiometricUnlockModel
import com.android.systemui.keyguard.shared.model.DozeStateModel
import com.android.systemui.keyguard.shared.model.DozeTransitionModel
import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.keyguard.shared.model.StatusBarState
import com.android.systemui.keyguard.shared.model.TransitionInfo
import com.android.systemui.keyguard.shared.model.TransitionState
import com.android.systemui.keyguard.shared.model.TransitionStep
@@ -39,11 +40,12 @@ import com.android.systemui.keyguard.shared.model.WakeSleepReason
import com.android.systemui.keyguard.shared.model.WakefulnessModel
import com.android.systemui.keyguard.shared.model.WakefulnessState
import com.android.systemui.shade.data.repository.FakeShadeRepository
import com.android.systemui.shade.data.repository.ShadeRepository
import com.android.systemui.shade.domain.model.ShadeModel
import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.whenever
import com.android.systemui.util.mockito.withArgCaptor
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.cancelChildren
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.advanceUntilIdle
@@ -56,6 +58,7 @@ import org.junit.runners.JUnit4
import org.mockito.ArgumentMatchers.anyBoolean
import org.mockito.ArgumentMatchers.anyInt
import org.mockito.Mock
import org.mockito.Mockito.clearInvocations
import org.mockito.Mockito.never
import org.mockito.Mockito.reset
import org.mockito.Mockito.spy
@@ -66,6 +69,7 @@ import org.mockito.MockitoAnnotations
 * Class for testing user journeys through the interactors. They will all be activated during setup,
 * to ensure the expected transitions are still triggered.
 */
@ExperimentalCoroutinesApi
@SmallTest
@RunWith(JUnit4::class)
class KeyguardTransitionScenariosTest : SysuiTestCase() {
@@ -74,7 +78,7 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() {
    private lateinit var keyguardRepository: FakeKeyguardRepository
    private lateinit var bouncerRepository: FakeKeyguardBouncerRepository
    private lateinit var commandQueue: FakeCommandQueue
    private lateinit var shadeRepository: ShadeRepository
    private lateinit var shadeRepository: FakeShadeRepository
    private lateinit var transitionRepository: FakeKeyguardTransitionRepository
    private lateinit var transitionInteractor: KeyguardTransitionInteractor
    private lateinit var featureFlags: FakeFeatureFlags
@@ -1213,6 +1217,58 @@ class KeyguardTransitionScenariosTest : SysuiTestCase() {
            coroutineContext.cancelChildren()
        }

    @Test
    fun lockscreenToPrimaryBouncerDragging() =
        testScope.runTest {
            // GIVEN a prior transition has run to LOCKSCREEN
            runTransition(KeyguardState.AOD, KeyguardState.LOCKSCREEN)
            runCurrent()

            // GIVEN the keyguard is showing locked
            keyguardRepository.setStatusBarState(StatusBarState.KEYGUARD)
            keyguardRepository.setKeyguardUnlocked(false)
            runCurrent()
            shadeRepository.setShadeModel(
                ShadeModel(
                    expansionAmount = .9f,
                    isUserDragging = true,
                )
            )
            runCurrent()

            // THEN a transition from LOCKSCREEN => PRIMARY_BOUNCER should occur
            val info =
                withArgCaptor<TransitionInfo> {
                    verify(transitionRepository).startTransition(capture(), anyBoolean())
                }
            assertThat(info.ownerName).isEqualTo("FromLockscreenTransitionInteractor")
            assertThat(info.from).isEqualTo(KeyguardState.LOCKSCREEN)
            assertThat(info.to).isEqualTo(KeyguardState.PRIMARY_BOUNCER)
            assertThat(info.animator).isNull() // dragging should be manually animated

            // WHEN the user stops dragging and shade is back to expanded
            clearInvocations(transitionRepository)
            runTransition(KeyguardState.LOCKSCREEN, KeyguardState.PRIMARY_BOUNCER)
            shadeRepository.setShadeModel(
                ShadeModel(
                    expansionAmount = 1f,
                    isUserDragging = false,
                )
            )
            runCurrent()

            // THEN a transition from PRIMARY_BOUNCER => LOCKSCREEN should occur
            val info2 =
                withArgCaptor<TransitionInfo> {
                    verify(transitionRepository).startTransition(capture(), anyBoolean())
                }
            assertThat(info2.from).isEqualTo(KeyguardState.PRIMARY_BOUNCER)
            assertThat(info2.to).isEqualTo(KeyguardState.LOCKSCREEN)
            assertThat(info2.animator).isNotNull()

            coroutineContext.cancelChildren()
        }

    private fun startingToWake() =
        WakefulnessModel(
            WakefulnessState.STARTING_TO_WAKE,
+1 −1
Original line number Diff line number Diff line
@@ -38,7 +38,7 @@ class FakeKeyguardTransitionRepository : KeyguardTransitionRepository {
    }

    override fun startTransition(info: TransitionInfo, resetIfCanceled: Boolean): UUID? {
        return null
        return if (info.animator == null) UUID.randomUUID() else null
    }

    override fun updateTransition(