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
This commit is contained in:
@@ -5149,7 +5149,15 @@ public class StatusBar extends SystemUI implements DemoMode,
|
||||
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) {
|
||||
mScrimController.transitionTo(ScrimState.BOUNCER);
|
||||
} else if (mLaunchCameraOnScreenTurningOn || isInLaunchTransition()) {
|
||||
@@ -5160,11 +5168,12 @@ public class StatusBar extends SystemUI implements DemoMode,
|
||||
// Handled in DozeScrimController#setPulsing
|
||||
} else if (mDozing) {
|
||||
mScrimController.transitionTo(ScrimState.AOD);
|
||||
} else if (mIsKeyguard) {
|
||||
} else if (mIsKeyguard && !wakeAndUnlocking) {
|
||||
mScrimController.transitionTo(ScrimState.KEYGUARD);
|
||||
} else {
|
||||
mScrimController.transitionTo(ScrimState.UNLOCKED, mUnlockScrimCallback);
|
||||
}
|
||||
Trace.endSection();
|
||||
}
|
||||
|
||||
public boolean isKeyguardShowing() {
|
||||
|
||||
@@ -26,6 +26,7 @@ import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.ArgumentMatchers.anyBoolean;
|
||||
import static org.mockito.ArgumentMatchers.anyInt;
|
||||
import static org.mockito.ArgumentMatchers.anyString;
|
||||
import static org.mockito.ArgumentMatchers.eq;
|
||||
import static org.mockito.Mockito.doAnswer;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.never;
|
||||
@@ -107,6 +108,7 @@ public class StatusBarTest extends SysuiTestCase {
|
||||
ScrimController mScrimController;
|
||||
IStatusBarService mBarService;
|
||||
ArrayList<Entry> mNotificationList;
|
||||
FingerprintUnlockController mFingerprintUnlockController;
|
||||
private DisplayMetrics mDisplayMetrics = new DisplayMetrics();
|
||||
|
||||
@Before
|
||||
@@ -133,6 +135,7 @@ public class StatusBarTest extends SysuiTestCase {
|
||||
when(mNotificationPanelView.getLayoutParams()).thenReturn(new LayoutParams(0, 0));
|
||||
mNotificationList = mock(ArrayList.class);
|
||||
mScrimController = mock(ScrimController.class);
|
||||
mFingerprintUnlockController = mock(FingerprintUnlockController.class);
|
||||
IPowerManager powerManagerService = mock(IPowerManager.class);
|
||||
HandlerThread handlerThread = new HandlerThread("TestThread");
|
||||
handlerThread.start();
|
||||
@@ -145,7 +148,7 @@ public class StatusBarTest extends SysuiTestCase {
|
||||
mStatusBar = new TestableStatusBar(mStatusBarKeyguardViewManager, mUnlockMethodCache,
|
||||
mKeyguardIndicationController, mStackScroller, mHeadsUpManager,
|
||||
mNotificationData, mPowerManager, mSystemServicesProxy, mNotificationPanelView,
|
||||
mBarService, mScrimController);
|
||||
mBarService, mScrimController, mFingerprintUnlockController);
|
||||
mStatusBar.mContext = mContext;
|
||||
mStatusBar.mComponents = mContext.getComponents();
|
||||
doAnswer(invocation -> {
|
||||
@@ -538,18 +541,27 @@ public class StatusBarTest extends SysuiTestCase {
|
||||
@Test
|
||||
public void testFingerprintNotification_UpdatesScrims() {
|
||||
mStatusBar.mStatusBarWindowManager = mock(StatusBarWindowManager.class);
|
||||
mStatusBar.mFingerprintUnlockController = mock(FingerprintUnlockController.class);
|
||||
mStatusBar.mDozeScrimController = mock(DozeScrimController.class);
|
||||
mStatusBar.notifyFpAuthModeChanged();
|
||||
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 {
|
||||
public TestableStatusBar(StatusBarKeyguardViewManager man,
|
||||
UnlockMethodCache unlock, KeyguardIndicationController key,
|
||||
NotificationStackScrollLayout stack, HeadsUpManager hum, NotificationData nd,
|
||||
PowerManager pm, SystemServicesProxy ssp, NotificationPanelView panelView,
|
||||
IStatusBarService barService, ScrimController scrimController) {
|
||||
IStatusBarService barService, ScrimController scrimController,
|
||||
FingerprintUnlockController fingerprintUnlockController) {
|
||||
mStatusBarKeyguardViewManager = man;
|
||||
mUnlockMethodCache = unlock;
|
||||
mKeyguardIndicationController = key;
|
||||
@@ -563,6 +575,7 @@ public class StatusBarTest extends SysuiTestCase {
|
||||
mBarService = barService;
|
||||
mWakefulnessLifecycle = createAwakeWakefulnessLifecycle();
|
||||
mScrimController = scrimController;
|
||||
mFingerprintUnlockController = fingerprintUnlockController;
|
||||
}
|
||||
|
||||
private WakefulnessLifecycle createAwakeWakefulnessLifecycle() {
|
||||
|
||||
Reference in New Issue
Block a user