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

Commit d3454243 authored by Josh Tsuji's avatar Josh Tsuji
Browse files

Fix boot issues with keyguard_wm_state_refactor.

a) alwaysCollect lockscreen visibility since the keyguard view is null when this is first called. This flow is very important and should always be collected anyway.
b) Don't transition to GONE on a null swipe, or you'll get stuck on "Pixel is starting" when rebooting.

Bug: 307976454
Test: atest FromLockscreenTransitionInteractorTest
Flag: ACONFIG com.android.systemui.keyguard_wm_state_refactor DEVELOPMENT
Change-Id: I769f4733fa5b08e0cb771125db86a06212a7d012
parent be0aeae3
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -44,6 +44,7 @@ import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.onStart
import kotlinx.coroutines.launch
@@ -287,7 +288,7 @@ constructor(
        if (KeyguardWmStateRefactor.isEnabled) {
            // When the refactor is enabled, we no longer use isKeyguardGoingAway.
            scope.launch {
                swipeToDismissInteractor.dismissFling.collect { _ ->
                swipeToDismissInteractor.dismissFling.filterNotNull().collect { _ ->
                    startTransitionTo(KeyguardState.GONE)
                }
            }
+7 −4
Original line number Diff line number Diff line
@@ -23,7 +23,6 @@ import static com.android.systemui.bouncer.shared.constants.KeyguardBouncerConst
import static com.android.systemui.plugins.ActivityStarter.OnDismissAction;
import static com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_WAKE_AND_UNLOCK;
import static com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_WAKE_AND_UNLOCK_PULSING;
import static com.android.systemui.util.kotlin.JavaAdapterKt.collectFlow;
import static com.android.systemui.util.kotlin.JavaAdapterKt.combineFlows;

import android.content.Context;
@@ -98,6 +97,7 @@ import com.android.systemui.statusbar.policy.KeyguardStateController;
import com.android.systemui.unfold.FoldAodAnimationController;
import com.android.systemui.unfold.SysUIUnfoldComponent;
import com.android.systemui.user.domain.interactor.SelectedUserInteractor;
import com.android.systemui.util.kotlin.JavaAdapter;

import dagger.Lazy;

@@ -348,6 +348,8 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
    private Lazy<KeyguardSurfaceBehindInteractor> mSurfaceBehindInteractor;
    private Lazy<KeyguardDismissActionInteractor> mKeyguardDismissActionInteractor;

    private final JavaAdapter mJavaAdapter;

    @Inject
    public StatusBarKeyguardViewManager(
            Context context,
@@ -378,7 +380,8 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
            Lazy<WindowManagerLockscreenVisibilityInteractor> wmLockscreenVisibilityInteractor,
            Lazy<KeyguardDismissActionInteractor> keyguardDismissActionInteractorLazy,
            SelectedUserInteractor selectedUserInteractor,
            Lazy<KeyguardSurfaceBehindInteractor> surfaceBehindInteractor
            Lazy<KeyguardSurfaceBehindInteractor> surfaceBehindInteractor,
            JavaAdapter javaAdapter
    ) {
        mContext = context;
        mViewMediatorCallback = callback;
@@ -411,6 +414,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb
        mKeyguardDismissActionInteractor = keyguardDismissActionInteractorLazy;
        mSelectedUserInteractor = selectedUserInteractor;
        mSurfaceBehindInteractor = surfaceBehindInteractor;
        mJavaAdapter = javaAdapter;
    }

    KeyguardTransitionInteractor mKeyguardTransitionInteractor;
@@ -481,8 +485,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb

        if (KeyguardWmStateRefactor.isEnabled()) {
            // Show the keyguard views whenever we've told WM that the lockscreen is visible.
            collectFlow(
                    getViewRootImpl().getView(),
            mJavaAdapter.alwaysCollectFlow(
                    combineFlows(
                            mWmLockscreenVisibilityInteractor.get().getLockscreenVisibility(),
                            mSurfaceBehindInteractor.get().isAnimatingSurface(),
+19 −1
Original line number Diff line number Diff line
@@ -126,7 +126,7 @@ class FromLockscreenTransitionInteractorTest : SysuiTestCase() {
            keyguardRepository.setKeyguardDismissible(true)
            runCurrent()
            shadeRepository.setCurrentFling(
                FlingInfo(expand = true) // Not a dismiss fling (expand = true).
                FlingInfo(expand = false) // Is a dismiss fling upward (expand = false).
            )
            runCurrent()

@@ -151,6 +151,24 @@ class FromLockscreenTransitionInteractorTest : SysuiTestCase() {
            )
            runCurrent()

            assertThatRepository(transitionRepository).noTransitionsStarted()
        }

    @Test
    @DisableFlags(Flags.FLAG_KEYGUARD_WM_STATE_REFACTOR)
    fun testDoesNotTransitionToGone_whenDismissFling_emitsNull() =
        testScope.runTest {
            underTest.start()
            verify(transitionRepository, never()).startTransition(any())

            keyguardRepository.setKeyguardDismissible(true)
            runCurrent()

            // The fling is null when it a) initializes b) ends and in either case we should not
            // swipe to unlock.
            shadeRepository.setCurrentFling(null)
            runCurrent()

            assertThatRepository(transitionRepository).noTransitionsStarted()
        }
}
+5 −2
Original line number Diff line number Diff line
@@ -97,6 +97,7 @@ import com.android.systemui.statusbar.SysuiStatusBarStateController;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.unfold.SysUIUnfoldComponent;
import com.android.systemui.user.domain.interactor.SelectedUserInteractor;
import com.android.systemui.util.kotlin.JavaAdapter;

import com.google.common.truth.Truth;

@@ -222,7 +223,8 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase {
                        () -> mock(WindowManagerLockscreenVisibilityInteractor.class),
                        () -> mock(KeyguardDismissActionInteractor.class),
                        mSelectedUserInteractor,
                        () -> mock(KeyguardSurfaceBehindInteractor.class)) {
                        () -> mock(KeyguardSurfaceBehindInteractor.class),
                        mock(JavaAdapter.class)) {
                    @Override
                    public ViewRootImpl getViewRootImpl() {
                        return mViewRootImpl;
@@ -730,7 +732,8 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase {
                        () -> mock(WindowManagerLockscreenVisibilityInteractor.class),
                        () -> mock(KeyguardDismissActionInteractor.class),
                        mSelectedUserInteractor,
                        () -> mock(KeyguardSurfaceBehindInteractor.class)) {
                        () -> mock(KeyguardSurfaceBehindInteractor.class),
                        mock(JavaAdapter.class)) {
                    @Override
                    public ViewRootImpl getViewRootImpl() {
                        return mViewRootImpl;