Merge "Check for non-interactive dreams when wake and unlocking." into udc-dev
This commit is contained in:
@@ -99,6 +99,7 @@ import android.view.WindowManagerPolicyConstants;
|
||||
import android.view.animation.Animation;
|
||||
import android.view.animation.AnimationUtils;
|
||||
|
||||
import androidx.annotation.IntDef;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
@@ -167,6 +168,8 @@ import com.android.wm.shell.keyguard.KeyguardTransitions;
|
||||
import dagger.Lazy;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Objects;
|
||||
@@ -251,6 +254,22 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable,
|
||||
private static final int SYSTEM_READY = 18;
|
||||
private static final int CANCEL_KEYGUARD_EXIT_ANIM = 19;
|
||||
|
||||
/** Enum for reasons behind updating wakeAndUnlock state. */
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
@IntDef(
|
||||
value = {
|
||||
WakeAndUnlockUpdateReason.HIDE,
|
||||
WakeAndUnlockUpdateReason.SHOW,
|
||||
WakeAndUnlockUpdateReason.FULFILL,
|
||||
WakeAndUnlockUpdateReason.WAKE_AND_UNLOCK,
|
||||
})
|
||||
@interface WakeAndUnlockUpdateReason {
|
||||
int HIDE = 0;
|
||||
int SHOW = 1;
|
||||
int FULFILL = 2;
|
||||
int WAKE_AND_UNLOCK = 3;
|
||||
}
|
||||
|
||||
/**
|
||||
* The default amount of time we stay awake (used for all key input)
|
||||
*/
|
||||
@@ -812,7 +831,7 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable,
|
||||
// dreaming. It's time to wake up.
|
||||
if (mUnlockingAndWakingFromDream) {
|
||||
Log.d(TAG, "waking from dream after unlock");
|
||||
mUnlockingAndWakingFromDream = false;
|
||||
setUnlockAndWakeFromDream(false, WakeAndUnlockUpdateReason.FULFILL);
|
||||
|
||||
if (mKeyguardStateController.isShowing()) {
|
||||
Log.d(TAG, "keyguard showing after keyguardGone, dismiss");
|
||||
@@ -2654,7 +2673,7 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable,
|
||||
|
||||
mKeyguardExitAnimationRunner = null;
|
||||
mWakeAndUnlocking = false;
|
||||
mUnlockingAndWakingFromDream = false;
|
||||
setUnlockAndWakeFromDream(false, WakeAndUnlockUpdateReason.SHOW);
|
||||
setPendingLock(false);
|
||||
|
||||
// Force if we we're showing in the middle of hiding, to ensure we end up in the correct
|
||||
@@ -2760,6 +2779,51 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable,
|
||||
tryKeyguardDone();
|
||||
};
|
||||
|
||||
private void setUnlockAndWakeFromDream(boolean updatedValue,
|
||||
@WakeAndUnlockUpdateReason int reason) {
|
||||
if (updatedValue == mUnlockingAndWakingFromDream) {
|
||||
return;
|
||||
}
|
||||
|
||||
final String reasonDescription;
|
||||
|
||||
switch(reason) {
|
||||
case WakeAndUnlockUpdateReason.FULFILL:
|
||||
reasonDescription = "fulfilling existing request";
|
||||
break;
|
||||
case WakeAndUnlockUpdateReason.HIDE:
|
||||
reasonDescription = "hiding keyguard";
|
||||
break;
|
||||
case WakeAndUnlockUpdateReason.SHOW:
|
||||
reasonDescription = "showing keyguard";
|
||||
break;
|
||||
case WakeAndUnlockUpdateReason.WAKE_AND_UNLOCK:
|
||||
reasonDescription = "waking to unlock";
|
||||
break;
|
||||
default:
|
||||
throw new IllegalStateException("Unexpected value: " + reason);
|
||||
}
|
||||
|
||||
final boolean unsetUnfulfilled = !updatedValue
|
||||
&& reason != WakeAndUnlockUpdateReason.FULFILL;
|
||||
|
||||
mUnlockingAndWakingFromDream = updatedValue;
|
||||
|
||||
final String description;
|
||||
|
||||
if (unsetUnfulfilled) {
|
||||
description = "Interrupting request to wake and unlock";
|
||||
} else if (mUnlockingAndWakingFromDream) {
|
||||
description = "Initiating request to wake and unlock";
|
||||
} else {
|
||||
description = "Fulfilling request to wake and unlock";
|
||||
}
|
||||
|
||||
Log.d(TAG, String.format(
|
||||
"Updating waking and unlocking request to %b. description:[%s]. reason:[%s]",
|
||||
mUnlockingAndWakingFromDream, description, reasonDescription));
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle message sent by {@link #hideLocked()}
|
||||
* @see #HIDE
|
||||
@@ -2779,8 +2843,11 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable,
|
||||
|
||||
mHiding = true;
|
||||
|
||||
mUnlockingAndWakingFromDream = mStatusBarStateController.isDreaming()
|
||||
&& !mStatusBarStateController.isDozing();
|
||||
// If waking and unlocking, waking from dream has been set properly.
|
||||
if (!mWakeAndUnlocking) {
|
||||
setUnlockAndWakeFromDream(mStatusBarStateController.isDreaming()
|
||||
&& mPM.isInteractive(), WakeAndUnlockUpdateReason.HIDE);
|
||||
}
|
||||
|
||||
if ((mShowing && !mOccluded) || mUnlockingAndWakingFromDream) {
|
||||
if (mUnlockingAndWakingFromDream) {
|
||||
@@ -3282,9 +3349,14 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable,
|
||||
}
|
||||
}
|
||||
|
||||
public void onWakeAndUnlocking() {
|
||||
/**
|
||||
* Informs the keyguard view mediator that the device is waking and unlocking.
|
||||
* @param fromDream Whether waking and unlocking is happening over an interactive dream.
|
||||
*/
|
||||
public void onWakeAndUnlocking(boolean fromDream) {
|
||||
Trace.beginSection("KeyguardViewMediator#onWakeAndUnlocking");
|
||||
mWakeAndUnlocking = true;
|
||||
setUnlockAndWakeFromDream(fromDream, WakeAndUnlockUpdateReason.WAKE_AND_UNLOCK);
|
||||
|
||||
mKeyguardViewControllerLazy.get().notifyKeyguardAuthenticated(/* primaryAuth */ false);
|
||||
userActivity();
|
||||
|
||||
@@ -463,7 +463,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp
|
||||
};
|
||||
|
||||
final boolean wakingFromDream = mMode == MODE_WAKE_AND_UNLOCK_FROM_DREAM
|
||||
&& !mStatusBarStateController.isDozing();
|
||||
&& mPowerManager.isInteractive();
|
||||
|
||||
if (mMode != MODE_NONE && !wakingFromDream) {
|
||||
wakeUp.run();
|
||||
@@ -501,7 +501,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp
|
||||
// later to awaken.
|
||||
}
|
||||
mNotificationShadeWindowController.setNotificationShadeFocusable(false);
|
||||
mKeyguardViewMediator.onWakeAndUnlocking();
|
||||
mKeyguardViewMediator.onWakeAndUnlocking(wakingFromDream);
|
||||
Trace.endSection();
|
||||
break;
|
||||
case MODE_ONLY_WAKE:
|
||||
|
||||
@@ -243,7 +243,7 @@ public class KeyguardViewMediatorTest extends SysuiTestCase {
|
||||
TestableLooper.get(this).processAllMessages();
|
||||
|
||||
mViewMediator.onStartedGoingToSleep(OFF_BECAUSE_OF_USER);
|
||||
mViewMediator.onWakeAndUnlocking();
|
||||
mViewMediator.onWakeAndUnlocking(false);
|
||||
mViewMediator.onStartedWakingUp(OFF_BECAUSE_OF_USER, false);
|
||||
TestableLooper.get(this).processAllMessages();
|
||||
|
||||
@@ -596,14 +596,14 @@ public class KeyguardViewMediatorTest extends SysuiTestCase {
|
||||
|
||||
@Test
|
||||
public void testWakeAndUnlocking() {
|
||||
mViewMediator.onWakeAndUnlocking();
|
||||
mViewMediator.onWakeAndUnlocking(false);
|
||||
verify(mStatusBarKeyguardViewManager).notifyKeyguardAuthenticated(anyBoolean());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testWakeAndUnlockingOverDream() {
|
||||
// Send signal to wake
|
||||
mViewMediator.onWakeAndUnlocking();
|
||||
mViewMediator.onWakeAndUnlocking(true);
|
||||
|
||||
// Ensure not woken up yet
|
||||
verify(mPowerManager, never()).wakeUp(anyLong(), anyInt(), anyString());
|
||||
@@ -632,7 +632,7 @@ public class KeyguardViewMediatorTest extends SysuiTestCase {
|
||||
@Test
|
||||
public void testWakeAndUnlockingOverDream_signalAuthenticateIfStillShowing() {
|
||||
// Send signal to wake
|
||||
mViewMediator.onWakeAndUnlocking();
|
||||
mViewMediator.onWakeAndUnlocking(true);
|
||||
|
||||
// Ensure not woken up yet
|
||||
verify(mPowerManager, never()).wakeUp(anyLong(), anyInt(), anyString());
|
||||
@@ -661,6 +661,35 @@ public class KeyguardViewMediatorTest extends SysuiTestCase {
|
||||
verify(mStatusBarKeyguardViewManager).notifyKeyguardAuthenticated(anyBoolean());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testWakeAndUnlockingOverNonInteractiveDream_noWakeByKeyguardViewMediator() {
|
||||
// Send signal to wake
|
||||
mViewMediator.onWakeAndUnlocking(false);
|
||||
|
||||
// Ensure not woken up yet
|
||||
verify(mPowerManager, never()).wakeUp(anyLong(), anyInt(), anyString());
|
||||
|
||||
// Verify keyguard told of authentication
|
||||
verify(mStatusBarKeyguardViewManager).notifyKeyguardAuthenticated(anyBoolean());
|
||||
mViewMediator.mViewMediatorCallback.keyguardDonePending(true,
|
||||
mUpdateMonitor.getCurrentUser());
|
||||
mViewMediator.mViewMediatorCallback.readyForKeyguardDone();
|
||||
final ArgumentCaptor<Runnable> animationRunnableCaptor =
|
||||
ArgumentCaptor.forClass(Runnable.class);
|
||||
verify(mStatusBarKeyguardViewManager).startPreHideAnimation(
|
||||
animationRunnableCaptor.capture());
|
||||
|
||||
when(mStatusBarStateController.isDreaming()).thenReturn(true);
|
||||
when(mStatusBarStateController.isDozing()).thenReturn(false);
|
||||
animationRunnableCaptor.getValue().run();
|
||||
|
||||
when(mKeyguardStateController.isShowing()).thenReturn(false);
|
||||
mViewMediator.mViewMediatorCallback.keyguardGone();
|
||||
|
||||
// Verify not woken up.
|
||||
verify(mPowerManager, never()).wakeUp(anyLong(), anyInt(), anyString());
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestableLooper.RunWithLooper(setAsMainLooper = true)
|
||||
public void testDoKeyguardWhileInteractive_resets() {
|
||||
|
||||
@@ -186,7 +186,7 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase {
|
||||
mBiometricUnlockController.onBiometricAuthenticated(UserHandle.USER_CURRENT,
|
||||
BiometricSourceType.FINGERPRINT, true /* isStrongBiometric */);
|
||||
|
||||
verify(mKeyguardViewMediator).onWakeAndUnlocking();
|
||||
verify(mKeyguardViewMediator).onWakeAndUnlocking(false);
|
||||
assertThat(mBiometricUnlockController.getMode())
|
||||
.isEqualTo(BiometricUnlockController.MODE_WAKE_AND_UNLOCK_PULSING);
|
||||
}
|
||||
@@ -204,7 +204,7 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase {
|
||||
mBiometricUnlockController.onBiometricAuthenticated(UserHandle.USER_CURRENT,
|
||||
BiometricSourceType.FINGERPRINT, true /* isStrongBiometric */);
|
||||
|
||||
verify(mKeyguardViewMediator).onWakeAndUnlocking();
|
||||
verify(mKeyguardViewMediator).onWakeAndUnlocking(false);
|
||||
assertThat(mBiometricUnlockController.getMode())
|
||||
.isEqualTo(MODE_WAKE_AND_UNLOCK);
|
||||
}
|
||||
@@ -553,8 +553,9 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase {
|
||||
when(mWakefulnessLifecycle.getLastWakeReason())
|
||||
.thenReturn(PowerManager.WAKE_REASON_POWER_BUTTON);
|
||||
givenDreamingLocked();
|
||||
when(mPowerManager.isInteractive()).thenReturn(true);
|
||||
mBiometricUnlockController.startWakeAndUnlock(BiometricSourceType.FINGERPRINT, true);
|
||||
verify(mKeyguardViewMediator).onWakeAndUnlocking();
|
||||
verify(mKeyguardViewMediator).onWakeAndUnlocking(true);
|
||||
// Ensure that the power hasn't been told to wake up yet.
|
||||
verify(mPowerManager, never()).wakeUp(anyLong(), anyInt(), anyString());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user