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

Commit 311eac82 authored by Lucas Dupin's avatar Lucas Dupin
Browse files

Avoid flickering when unlocking with fingerprint

Fixes issue where scrim state could be set to KEYGUARD
for 1 frame and user would see the notification shade.

Change-Id: I577b969f98573fc481e3d7c283eb5b612b7e5cee
Fixes: 70210651
Test: Unlock with fingerprint from AoD
Test: runtest -x packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
parent 3952e256
Loading
Loading
Loading
Loading
+11 −2
Original line number Original line Diff line number Diff line
@@ -5149,7 +5149,15 @@ public class StatusBar extends SystemUI implements DemoMode,
        Trace.endSection();
        Trace.endSection();
    }
    }


    public void updateScrimController() {
    @VisibleForTesting
    void updateScrimController() {
        Trace.beginSection("StatusBar#updateScrimController");

        // We don't want to end up in KEYGUARD state when we're unlocking with
        // fingerprint from doze. We should cross fade directly from black.
        final boolean wakeAndUnlocking = mFingerprintUnlockController.getMode()
                == FingerprintUnlockController.MODE_WAKE_AND_UNLOCK;

        if (mBouncerShowing) {
        if (mBouncerShowing) {
            mScrimController.transitionTo(ScrimState.BOUNCER);
            mScrimController.transitionTo(ScrimState.BOUNCER);
        } else if (mLaunchCameraOnScreenTurningOn || isInLaunchTransition()) {
        } else if (mLaunchCameraOnScreenTurningOn || isInLaunchTransition()) {
@@ -5160,11 +5168,12 @@ public class StatusBar extends SystemUI implements DemoMode,
            // Handled in DozeScrimController#setPulsing
            // Handled in DozeScrimController#setPulsing
        } else if (mDozing) {
        } else if (mDozing) {
            mScrimController.transitionTo(ScrimState.AOD);
            mScrimController.transitionTo(ScrimState.AOD);
        } else if (mIsKeyguard) {
        } else if (mIsKeyguard && !wakeAndUnlocking) {
            mScrimController.transitionTo(ScrimState.KEYGUARD);
            mScrimController.transitionTo(ScrimState.KEYGUARD);
        } else {
        } else {
            mScrimController.transitionTo(ScrimState.UNLOCKED, mUnlockScrimCallback);
            mScrimController.transitionTo(ScrimState.UNLOCKED, mUnlockScrimCallback);
        }
        }
        Trace.endSection();
    }
    }


    public boolean isKeyguardShowing() {
    public boolean isKeyguardShowing() {
+16 −3
Original line number Original line Diff line number Diff line
@@ -26,6 +26,7 @@ import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.never;
@@ -107,6 +108,7 @@ public class StatusBarTest extends SysuiTestCase {
    ScrimController mScrimController;
    ScrimController mScrimController;
    IStatusBarService mBarService;
    IStatusBarService mBarService;
    ArrayList<Entry> mNotificationList;
    ArrayList<Entry> mNotificationList;
    FingerprintUnlockController mFingerprintUnlockController;
    private DisplayMetrics mDisplayMetrics = new DisplayMetrics();
    private DisplayMetrics mDisplayMetrics = new DisplayMetrics();


    @Before
    @Before
@@ -133,6 +135,7 @@ public class StatusBarTest extends SysuiTestCase {
        when(mNotificationPanelView.getLayoutParams()).thenReturn(new LayoutParams(0, 0));
        when(mNotificationPanelView.getLayoutParams()).thenReturn(new LayoutParams(0, 0));
        mNotificationList = mock(ArrayList.class);
        mNotificationList = mock(ArrayList.class);
        mScrimController = mock(ScrimController.class);
        mScrimController = mock(ScrimController.class);
        mFingerprintUnlockController = mock(FingerprintUnlockController.class);
        IPowerManager powerManagerService = mock(IPowerManager.class);
        IPowerManager powerManagerService = mock(IPowerManager.class);
        HandlerThread handlerThread = new HandlerThread("TestThread");
        HandlerThread handlerThread = new HandlerThread("TestThread");
        handlerThread.start();
        handlerThread.start();
@@ -145,7 +148,7 @@ public class StatusBarTest extends SysuiTestCase {
        mStatusBar = new TestableStatusBar(mStatusBarKeyguardViewManager, mUnlockMethodCache,
        mStatusBar = new TestableStatusBar(mStatusBarKeyguardViewManager, mUnlockMethodCache,
                mKeyguardIndicationController, mStackScroller, mHeadsUpManager,
                mKeyguardIndicationController, mStackScroller, mHeadsUpManager,
                mNotificationData, mPowerManager, mSystemServicesProxy, mNotificationPanelView,
                mNotificationData, mPowerManager, mSystemServicesProxy, mNotificationPanelView,
                mBarService, mScrimController);
                mBarService, mScrimController, mFingerprintUnlockController);
        mStatusBar.mContext = mContext;
        mStatusBar.mContext = mContext;
        mStatusBar.mComponents = mContext.getComponents();
        mStatusBar.mComponents = mContext.getComponents();
        doAnswer(invocation -> {
        doAnswer(invocation -> {
@@ -538,18 +541,27 @@ public class StatusBarTest extends SysuiTestCase {
    @Test
    @Test
    public void testFingerprintNotification_UpdatesScrims() {
    public void testFingerprintNotification_UpdatesScrims() {
        mStatusBar.mStatusBarWindowManager = mock(StatusBarWindowManager.class);
        mStatusBar.mStatusBarWindowManager = mock(StatusBarWindowManager.class);
        mStatusBar.mFingerprintUnlockController = mock(FingerprintUnlockController.class);
        mStatusBar.mDozeScrimController = mock(DozeScrimController.class);
        mStatusBar.mDozeScrimController = mock(DozeScrimController.class);
        mStatusBar.notifyFpAuthModeChanged();
        mStatusBar.notifyFpAuthModeChanged();
        verify(mScrimController).transitionTo(any(), any());
        verify(mScrimController).transitionTo(any(), any());
    }
    }


    @Test
    public void testFingerprintUnlock_UpdatesScrims() {
        // Simulate unlocking from AoD with fingerprint.
        when(mFingerprintUnlockController.getMode())
                .thenReturn(FingerprintUnlockController.MODE_WAKE_AND_UNLOCK);
        mStatusBar.updateScrimController();
        verify(mScrimController).transitionTo(eq(ScrimState.UNLOCKED), any());
    }

    static class TestableStatusBar extends StatusBar {
    static class TestableStatusBar extends StatusBar {
        public TestableStatusBar(StatusBarKeyguardViewManager man,
        public TestableStatusBar(StatusBarKeyguardViewManager man,
                UnlockMethodCache unlock, KeyguardIndicationController key,
                UnlockMethodCache unlock, KeyguardIndicationController key,
                NotificationStackScrollLayout stack, HeadsUpManager hum, NotificationData nd,
                NotificationStackScrollLayout stack, HeadsUpManager hum, NotificationData nd,
                PowerManager pm, SystemServicesProxy ssp, NotificationPanelView panelView,
                PowerManager pm, SystemServicesProxy ssp, NotificationPanelView panelView,
                IStatusBarService barService, ScrimController scrimController) {
                IStatusBarService barService, ScrimController scrimController,
                FingerprintUnlockController fingerprintUnlockController) {
            mStatusBarKeyguardViewManager = man;
            mStatusBarKeyguardViewManager = man;
            mUnlockMethodCache = unlock;
            mUnlockMethodCache = unlock;
            mKeyguardIndicationController = key;
            mKeyguardIndicationController = key;
@@ -563,6 +575,7 @@ public class StatusBarTest extends SysuiTestCase {
            mBarService = barService;
            mBarService = barService;
            mWakefulnessLifecycle = createAwakeWakefulnessLifecycle();
            mWakefulnessLifecycle = createAwakeWakefulnessLifecycle();
            mScrimController = scrimController;
            mScrimController = scrimController;
            mFingerprintUnlockController = fingerprintUnlockController;
        }
        }


        private WakefulnessLifecycle createAwakeWakefulnessLifecycle() {
        private WakefulnessLifecycle createAwakeWakefulnessLifecycle() {