Merge "Check for non-interactive dreams when wake and unlocking." into udc-dev am: dcfa48821c
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/24248316 Change-Id: Id87767b96b6163e4058ee8db99d973959b143414 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -99,6 +99,7 @@ import android.view.WindowManagerPolicyConstants;
|
|||||||
import android.view.animation.Animation;
|
import android.view.animation.Animation;
|
||||||
import android.view.animation.AnimationUtils;
|
import android.view.animation.AnimationUtils;
|
||||||
|
|
||||||
|
import androidx.annotation.IntDef;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.annotation.VisibleForTesting;
|
import androidx.annotation.VisibleForTesting;
|
||||||
@@ -167,6 +168,8 @@ import com.android.wm.shell.keyguard.KeyguardTransitions;
|
|||||||
import dagger.Lazy;
|
import dagger.Lazy;
|
||||||
|
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Objects;
|
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 SYSTEM_READY = 18;
|
||||||
private static final int CANCEL_KEYGUARD_EXIT_ANIM = 19;
|
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)
|
* 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.
|
// dreaming. It's time to wake up.
|
||||||
if (mUnlockingAndWakingFromDream) {
|
if (mUnlockingAndWakingFromDream) {
|
||||||
Log.d(TAG, "waking from dream after unlock");
|
Log.d(TAG, "waking from dream after unlock");
|
||||||
mUnlockingAndWakingFromDream = false;
|
setUnlockAndWakeFromDream(false, WakeAndUnlockUpdateReason.FULFILL);
|
||||||
|
|
||||||
if (mKeyguardStateController.isShowing()) {
|
if (mKeyguardStateController.isShowing()) {
|
||||||
Log.d(TAG, "keyguard showing after keyguardGone, dismiss");
|
Log.d(TAG, "keyguard showing after keyguardGone, dismiss");
|
||||||
@@ -2654,7 +2673,7 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable,
|
|||||||
|
|
||||||
mKeyguardExitAnimationRunner = null;
|
mKeyguardExitAnimationRunner = null;
|
||||||
mWakeAndUnlocking = false;
|
mWakeAndUnlocking = false;
|
||||||
mUnlockingAndWakingFromDream = false;
|
setUnlockAndWakeFromDream(false, WakeAndUnlockUpdateReason.SHOW);
|
||||||
setPendingLock(false);
|
setPendingLock(false);
|
||||||
|
|
||||||
// Force if we we're showing in the middle of hiding, to ensure we end up in the correct
|
// 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();
|
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()}
|
* Handle message sent by {@link #hideLocked()}
|
||||||
* @see #HIDE
|
* @see #HIDE
|
||||||
@@ -2779,8 +2843,11 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable,
|
|||||||
|
|
||||||
mHiding = true;
|
mHiding = true;
|
||||||
|
|
||||||
mUnlockingAndWakingFromDream = mStatusBarStateController.isDreaming()
|
// If waking and unlocking, waking from dream has been set properly.
|
||||||
&& !mStatusBarStateController.isDozing();
|
if (!mWakeAndUnlocking) {
|
||||||
|
setUnlockAndWakeFromDream(mStatusBarStateController.isDreaming()
|
||||||
|
&& mPM.isInteractive(), WakeAndUnlockUpdateReason.HIDE);
|
||||||
|
}
|
||||||
|
|
||||||
if ((mShowing && !mOccluded) || mUnlockingAndWakingFromDream) {
|
if ((mShowing && !mOccluded) || mUnlockingAndWakingFromDream) {
|
||||||
if (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");
|
Trace.beginSection("KeyguardViewMediator#onWakeAndUnlocking");
|
||||||
mWakeAndUnlocking = true;
|
mWakeAndUnlocking = true;
|
||||||
|
setUnlockAndWakeFromDream(fromDream, WakeAndUnlockUpdateReason.WAKE_AND_UNLOCK);
|
||||||
|
|
||||||
mKeyguardViewControllerLazy.get().notifyKeyguardAuthenticated(/* primaryAuth */ false);
|
mKeyguardViewControllerLazy.get().notifyKeyguardAuthenticated(/* primaryAuth */ false);
|
||||||
userActivity();
|
userActivity();
|
||||||
|
|||||||
@@ -463,7 +463,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp
|
|||||||
};
|
};
|
||||||
|
|
||||||
final boolean wakingFromDream = mMode == MODE_WAKE_AND_UNLOCK_FROM_DREAM
|
final boolean wakingFromDream = mMode == MODE_WAKE_AND_UNLOCK_FROM_DREAM
|
||||||
&& !mStatusBarStateController.isDozing();
|
&& mPowerManager.isInteractive();
|
||||||
|
|
||||||
if (mMode != MODE_NONE && !wakingFromDream) {
|
if (mMode != MODE_NONE && !wakingFromDream) {
|
||||||
wakeUp.run();
|
wakeUp.run();
|
||||||
@@ -501,7 +501,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp
|
|||||||
// later to awaken.
|
// later to awaken.
|
||||||
}
|
}
|
||||||
mNotificationShadeWindowController.setNotificationShadeFocusable(false);
|
mNotificationShadeWindowController.setNotificationShadeFocusable(false);
|
||||||
mKeyguardViewMediator.onWakeAndUnlocking();
|
mKeyguardViewMediator.onWakeAndUnlocking(wakingFromDream);
|
||||||
Trace.endSection();
|
Trace.endSection();
|
||||||
break;
|
break;
|
||||||
case MODE_ONLY_WAKE:
|
case MODE_ONLY_WAKE:
|
||||||
|
|||||||
@@ -243,7 +243,7 @@ public class KeyguardViewMediatorTest extends SysuiTestCase {
|
|||||||
TestableLooper.get(this).processAllMessages();
|
TestableLooper.get(this).processAllMessages();
|
||||||
|
|
||||||
mViewMediator.onStartedGoingToSleep(OFF_BECAUSE_OF_USER);
|
mViewMediator.onStartedGoingToSleep(OFF_BECAUSE_OF_USER);
|
||||||
mViewMediator.onWakeAndUnlocking();
|
mViewMediator.onWakeAndUnlocking(false);
|
||||||
mViewMediator.onStartedWakingUp(OFF_BECAUSE_OF_USER, false);
|
mViewMediator.onStartedWakingUp(OFF_BECAUSE_OF_USER, false);
|
||||||
TestableLooper.get(this).processAllMessages();
|
TestableLooper.get(this).processAllMessages();
|
||||||
|
|
||||||
@@ -596,14 +596,14 @@ public class KeyguardViewMediatorTest extends SysuiTestCase {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testWakeAndUnlocking() {
|
public void testWakeAndUnlocking() {
|
||||||
mViewMediator.onWakeAndUnlocking();
|
mViewMediator.onWakeAndUnlocking(false);
|
||||||
verify(mStatusBarKeyguardViewManager).notifyKeyguardAuthenticated(anyBoolean());
|
verify(mStatusBarKeyguardViewManager).notifyKeyguardAuthenticated(anyBoolean());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testWakeAndUnlockingOverDream() {
|
public void testWakeAndUnlockingOverDream() {
|
||||||
// Send signal to wake
|
// Send signal to wake
|
||||||
mViewMediator.onWakeAndUnlocking();
|
mViewMediator.onWakeAndUnlocking(true);
|
||||||
|
|
||||||
// Ensure not woken up yet
|
// Ensure not woken up yet
|
||||||
verify(mPowerManager, never()).wakeUp(anyLong(), anyInt(), anyString());
|
verify(mPowerManager, never()).wakeUp(anyLong(), anyInt(), anyString());
|
||||||
@@ -632,7 +632,7 @@ public class KeyguardViewMediatorTest extends SysuiTestCase {
|
|||||||
@Test
|
@Test
|
||||||
public void testWakeAndUnlockingOverDream_signalAuthenticateIfStillShowing() {
|
public void testWakeAndUnlockingOverDream_signalAuthenticateIfStillShowing() {
|
||||||
// Send signal to wake
|
// Send signal to wake
|
||||||
mViewMediator.onWakeAndUnlocking();
|
mViewMediator.onWakeAndUnlocking(true);
|
||||||
|
|
||||||
// Ensure not woken up yet
|
// Ensure not woken up yet
|
||||||
verify(mPowerManager, never()).wakeUp(anyLong(), anyInt(), anyString());
|
verify(mPowerManager, never()).wakeUp(anyLong(), anyInt(), anyString());
|
||||||
@@ -661,6 +661,35 @@ public class KeyguardViewMediatorTest extends SysuiTestCase {
|
|||||||
verify(mStatusBarKeyguardViewManager).notifyKeyguardAuthenticated(anyBoolean());
|
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
|
@Test
|
||||||
@TestableLooper.RunWithLooper(setAsMainLooper = true)
|
@TestableLooper.RunWithLooper(setAsMainLooper = true)
|
||||||
public void testDoKeyguardWhileInteractive_resets() {
|
public void testDoKeyguardWhileInteractive_resets() {
|
||||||
|
|||||||
@@ -186,7 +186,7 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase {
|
|||||||
mBiometricUnlockController.onBiometricAuthenticated(UserHandle.USER_CURRENT,
|
mBiometricUnlockController.onBiometricAuthenticated(UserHandle.USER_CURRENT,
|
||||||
BiometricSourceType.FINGERPRINT, true /* isStrongBiometric */);
|
BiometricSourceType.FINGERPRINT, true /* isStrongBiometric */);
|
||||||
|
|
||||||
verify(mKeyguardViewMediator).onWakeAndUnlocking();
|
verify(mKeyguardViewMediator).onWakeAndUnlocking(false);
|
||||||
assertThat(mBiometricUnlockController.getMode())
|
assertThat(mBiometricUnlockController.getMode())
|
||||||
.isEqualTo(BiometricUnlockController.MODE_WAKE_AND_UNLOCK_PULSING);
|
.isEqualTo(BiometricUnlockController.MODE_WAKE_AND_UNLOCK_PULSING);
|
||||||
}
|
}
|
||||||
@@ -204,7 +204,7 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase {
|
|||||||
mBiometricUnlockController.onBiometricAuthenticated(UserHandle.USER_CURRENT,
|
mBiometricUnlockController.onBiometricAuthenticated(UserHandle.USER_CURRENT,
|
||||||
BiometricSourceType.FINGERPRINT, true /* isStrongBiometric */);
|
BiometricSourceType.FINGERPRINT, true /* isStrongBiometric */);
|
||||||
|
|
||||||
verify(mKeyguardViewMediator).onWakeAndUnlocking();
|
verify(mKeyguardViewMediator).onWakeAndUnlocking(false);
|
||||||
assertThat(mBiometricUnlockController.getMode())
|
assertThat(mBiometricUnlockController.getMode())
|
||||||
.isEqualTo(MODE_WAKE_AND_UNLOCK);
|
.isEqualTo(MODE_WAKE_AND_UNLOCK);
|
||||||
}
|
}
|
||||||
@@ -553,8 +553,9 @@ public class BiometricsUnlockControllerTest extends SysuiTestCase {
|
|||||||
when(mWakefulnessLifecycle.getLastWakeReason())
|
when(mWakefulnessLifecycle.getLastWakeReason())
|
||||||
.thenReturn(PowerManager.WAKE_REASON_POWER_BUTTON);
|
.thenReturn(PowerManager.WAKE_REASON_POWER_BUTTON);
|
||||||
givenDreamingLocked();
|
givenDreamingLocked();
|
||||||
|
when(mPowerManager.isInteractive()).thenReturn(true);
|
||||||
mBiometricUnlockController.startWakeAndUnlock(BiometricSourceType.FINGERPRINT, 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.
|
// Ensure that the power hasn't been told to wake up yet.
|
||||||
verify(mPowerManager, never()).wakeUp(anyLong(), anyInt(), anyString());
|
verify(mPowerManager, never()).wakeUp(anyLong(), anyInt(), anyString());
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user