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

Commit 66f02fee authored by Matt Pietal's avatar Matt Pietal
Browse files

Fix race condition with 'leaveShadeOpen'

Transition view models capture state on start, including
whether the shade should remain open after unlock. This
could sometimes happen too late, like during
ALTERNATE_BOUNCER->GONE. Only reset the flag after the
GONE transition has completed.

Fixes: 338603686
Test: atest KeyguardRootViewModelTest
Flag: ACONFIG com.android.systemui.migrate_clocks_to_blueprint
TEAMFOOD

Change-Id: I59651b380fc149b44899f74ad123c04a4fdbcdb3
parent 1fc94796
Loading
Loading
Loading
Loading
+26 −1
Original line number Diff line number Diff line
@@ -33,7 +33,10 @@ import com.android.systemui.flags.EnableSceneContainer
import com.android.systemui.flags.parameterizeSceneContainerFlag
import com.android.systemui.jank.interactionJankMonitor
import com.android.systemui.keyguard.data.repository.fakeDeviceEntryFingerprintAuthRepository
import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository
import com.android.systemui.keyguard.domain.interactor.keyguardClockInteractor
import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
import com.android.systemui.keyguard.shared.model.KeyguardState
import com.android.systemui.keyguard.shared.model.SuccessFingerprintAuthenticationStatus
import com.android.systemui.kosmos.testScope
import com.android.systemui.plugins.statusbar.StatusBarStateController
@@ -69,7 +72,7 @@ class StatusBarStateControllerImplTest(flags: FlagsParameterization) : SysuiTest

    private val kosmos = testKosmos()
    private val testScope = kosmos.testScope

    private val keyguardTransitionRepository = kosmos.fakeKeyguardTransitionRepository
    private val mockDarkAnimator = mock<ObjectAnimator>()

    private lateinit var underTest: StatusBarStateControllerImpl
@@ -98,6 +101,7 @@ class StatusBarStateControllerImplTest(flags: FlagsParameterization) : SysuiTest
                    uiEventLogger,
                    { kosmos.interactionJankMonitor },
                    JavaAdapter(testScope.backgroundScope),
                    { kosmos.keyguardTransitionInteractor },
                    { kosmos.shadeInteractor },
                    { kosmos.deviceUnlockedInteractor },
                    { kosmos.sceneInteractor },
@@ -330,4 +334,25 @@ class StatusBarStateControllerImplTest(flags: FlagsParameterization) : SysuiTest
            assertThat(currentScene).isEqualTo(Scenes.QuickSettings)
            assertThat(statusBarState).isEqualTo(StatusBarState.SHADE)
        }

    @Test
    fun leaveOpenOnKeyguard_whenGone_isFalse() =
        testScope.runTest {
            underTest.start()
            underTest.setLeaveOpenOnKeyguardHide(true)

            keyguardTransitionRepository.sendTransitionSteps(
                from = KeyguardState.AOD,
                to = KeyguardState.LOCKSCREEN,
                testScope = testScope,
            )
            assertThat(underTest.leaveOpenOnKeyguardHide()).isEqualTo(true)

            keyguardTransitionRepository.sendTransitionSteps(
                from = KeyguardState.LOCKSCREEN,
                to = KeyguardState.GONE,
                testScope = testScope,
            )
            assertThat(underTest.leaveOpenOnKeyguardHide()).isEqualTo(false)
        }
}
+13 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.systemui.statusbar;

import static com.android.internal.jank.InteractionJankMonitor.CUJ_LOCKSCREEN_TRANSITION_FROM_AOD;
import static com.android.internal.jank.InteractionJankMonitor.CUJ_LOCKSCREEN_TRANSITION_TO_AOD;
import static com.android.systemui.keyguard.shared.model.KeyguardState.GONE;
import static com.android.systemui.util.kotlin.JavaAdapterKt.combineFlows;

import android.animation.Animator;
@@ -49,6 +50,7 @@ import com.android.systemui.deviceentry.domain.interactor.DeviceUnlockedInteract
import com.android.systemui.deviceentry.shared.model.DeviceUnlockStatus;
import com.android.systemui.keyguard.MigrateClocksToBlueprint;
import com.android.systemui.keyguard.domain.interactor.KeyguardClockInteractor;
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor;
import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener;
import com.android.systemui.res.R;
import com.android.systemui.scene.domain.interactor.SceneInteractor;
@@ -108,6 +110,7 @@ public class StatusBarStateControllerImpl implements
    private final UiEventLogger mUiEventLogger;
    private final Lazy<InteractionJankMonitor> mInteractionJankMonitorLazy;
    private final JavaAdapter mJavaAdapter;
    private final Lazy<KeyguardTransitionInteractor> mKeyguardTransitionInteractorLazy;
    private final Lazy<ShadeInteractor> mShadeInteractorLazy;
    private final Lazy<DeviceUnlockedInteractor> mDeviceUnlockedInteractorLazy;
    private final Lazy<SceneInteractor> mSceneInteractorLazy;
@@ -175,6 +178,7 @@ public class StatusBarStateControllerImpl implements
            UiEventLogger uiEventLogger,
            Lazy<InteractionJankMonitor> interactionJankMonitorLazy,
            JavaAdapter javaAdapter,
            Lazy<KeyguardTransitionInteractor> keyguardTransitionInteractor,
            Lazy<ShadeInteractor> shadeInteractorLazy,
            Lazy<DeviceUnlockedInteractor> deviceUnlockedInteractorLazy,
            Lazy<SceneInteractor> sceneInteractorLazy,
@@ -182,6 +186,7 @@ public class StatusBarStateControllerImpl implements
        mUiEventLogger = uiEventLogger;
        mInteractionJankMonitorLazy = interactionJankMonitorLazy;
        mJavaAdapter = javaAdapter;
        mKeyguardTransitionInteractorLazy = keyguardTransitionInteractor;
        mShadeInteractorLazy = shadeInteractorLazy;
        mDeviceUnlockedInteractorLazy = deviceUnlockedInteractorLazy;
        mSceneInteractorLazy = sceneInteractorLazy;
@@ -193,6 +198,14 @@ public class StatusBarStateControllerImpl implements

    @Override
    public void start() {
        mJavaAdapter.alwaysCollectFlow(
                mKeyguardTransitionInteractorLazy.get().isFinishedInState(GONE),
                (Boolean isFinishedInState) -> {
                    if (isFinishedInState) {
                        setLeaveOpenOnKeyguardHide(false);
                    }
                });

        mJavaAdapter.alwaysCollectFlow(mShadeInteractorLazy.get().isAnyExpanded(),
                this::onShadeOrQsExpanded);

+3 −1
Original line number Diff line number Diff line
@@ -2184,8 +2184,10 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces {
        }
        if (mStatusBarStateController.leaveOpenOnKeyguardHide()) {
            if (!mStatusBarStateController.isKeyguardRequested()) {
                if (!MigrateClocksToBlueprint.isEnabled()) {
                    mStatusBarStateController.setLeaveOpenOnKeyguardHide(false);
                }
            }
            long delay = mKeyguardStateController.calculateGoingToFullShadeDelay();
            mLockscreenShadeTransitionController.onHideKeyguard(delay, previousState);

+2 −0
Original line number Diff line number Diff line
@@ -446,6 +446,7 @@ public class NotificationPanelViewControllerBaseTest extends SysuiTestCase {
                mUiEventLogger,
                () -> mKosmos.getInteractionJankMonitor(),
                mJavaAdapter,
                () -> mKeyguardTransitionInteractor,
                () -> mShadeInteractor,
                () -> mKosmos.getDeviceUnlockedInteractor(),
                () -> mKosmos.getSceneInteractor(),
@@ -600,6 +601,7 @@ public class NotificationPanelViewControllerBaseTest extends SysuiTestCase {
                                new UiEventLoggerFake(),
                                () -> mKosmos.getInteractionJankMonitor(),
                                mJavaAdapter,
                                () -> mKeyguardTransitionInteractor,
                                () -> mShadeInteractor,
                                () -> mKosmos.getDeviceUnlockedInteractor(),
                                () -> mKosmos.getSceneInteractor(),
+2 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import com.android.internal.logging.uiEventLogger
import com.android.systemui.deviceentry.domain.interactor.deviceUnlockedInteractor
import com.android.systemui.jank.interactionJankMonitor
import com.android.systemui.keyguard.domain.interactor.keyguardClockInteractor
import com.android.systemui.keyguard.domain.interactor.keyguardTransitionInteractor
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.scene.domain.interactor.sceneInteractor
import com.android.systemui.shade.domain.interactor.shadeInteractor
@@ -33,6 +34,7 @@ var Kosmos.statusBarStateController: SysuiStatusBarStateController by
            uiEventLogger,
            { interactionJankMonitor },
            mock(),
            { keyguardTransitionInteractor },
            { shadeInteractor },
            { deviceUnlockedInteractor },
            { sceneInteractor },