Merge "Flicker free screen-on from AOD" into oc-dr1-dev
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java b/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java
index 0be4eda..a1dfeb3 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java
@@ -91,6 +91,7 @@
case UNINITIALIZED:
case INITIALIZED:
case DOZE:
+ case DOZE_REQUEST_PULSE:
case DOZE_AOD_PAUSED:
return Display.STATE_OFF;
case DOZE_PULSING:
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
index 6d10d94..e23875f 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
@@ -811,6 +811,7 @@
synchronized (this) {
mDeviceInteractive = false;
mGoingToSleep = false;
+ mWakeAndUnlocking = false;
resetKeyguardDonePendingLocked();
mHideAnimationRun = false;
@@ -1957,7 +1958,6 @@
if (DEBUG) Log.d(TAG, "handleNotifyScreenTurnedOff");
mStatusBarKeyguardViewManager.onScreenTurnedOff();
mDrawnCallback = null;
- mWakeAndUnlocking = false;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java
index f591524..2dc467f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java
@@ -114,6 +114,7 @@
// be invoked when we're done so that the caller can drop the pulse wakelock.
mPulseCallback = callback;
mPulseReason = reason;
+ mScrimController.setDozeInFrontAlpha(1f);
mHandler.post(mPulseIn);
}
@@ -290,10 +291,6 @@
// Signal that the pulse is ready to turn the screen on and draw.
pulseStarted();
-
- if (mDozeParameters.getAlwaysOn()) {
- mHandler.post(DozeScrimController.this::onScreenTurnedOn);
- }
}
};
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java
index 5af80f5..df059e3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java
@@ -285,7 +285,7 @@
if (!mUpdateMonitor.isDeviceInteractive()) {
if (!mStatusBarKeyguardViewManager.isShowing()) {
return MODE_ONLY_WAKE;
- } else if (pulsingOrAod() && unlockingAllowed) {
+ } else if (mDozeScrimController.isPulsing() && unlockingAllowed) {
return MODE_WAKE_AND_UNLOCK_PULSING;
} else if (unlockingAllowed || !mUnlockMethodCache.isMethodSecure()) {
return MODE_WAKE_AND_UNLOCK;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
index a8b1c91..62d4b73 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
@@ -25,7 +25,6 @@
import android.graphics.Color;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
-import android.util.Log;
import android.util.MathUtils;
import android.view.View;
import android.view.ViewGroup;
@@ -120,6 +119,12 @@
private boolean mKeyguardFadingOutInProgress;
private boolean mAnimatingDozeUnlock;
private ValueAnimator mKeyguardFadeoutAnimation;
+ /** Wake up from AOD transition is starting; need fully opaque front scrim */
+ private boolean mWakingUpFromAodStarting;
+ /** Wake up from AOD transition is in progress; need black tint */
+ private boolean mWakingUpFromAodInProgress;
+ /** Wake up from AOD transition is animating; need to reset when animation finishes */
+ private boolean mWakingUpFromAodAnimationRunning;
public ScrimController(LightBarController lightBarController, ScrimView scrimBehind,
ScrimView scrimInFront, View headsUpScrim) {
@@ -187,9 +192,32 @@
scheduleUpdate();
}
+ public void prepareWakeUpFromAod() {
+ mWakingUpFromAodInProgress = true;
+ mWakingUpFromAodStarting = true;
+ mAnimateChange = false;
+ scheduleUpdate();
+ onPreDraw();
+ }
+
+ public void wakeUpFromAod() {
+ if (mWakeAndUnlocking || mAnimateKeyguardFadingOut) {
+ // Wake and unlocking has a separate transition that must not be interfered with.
+ mWakingUpFromAodStarting = false;
+ return;
+ }
+ if (mWakingUpFromAodStarting) {
+ mWakingUpFromAodInProgress = true;
+ mWakingUpFromAodStarting = false;
+ mAnimateChange = true;
+ scheduleUpdate();
+ }
+ }
+
public void setWakeAndUnlocking() {
mWakeAndUnlocking = true;
mAnimatingDozeUnlock = true;
+ mWakingUpFromAodStarting = false;
scheduleUpdate();
}
@@ -356,7 +384,11 @@
setScrimBehindAlpha(mScrimBehindAlpha);
} else {
float fraction = Math.max(0, Math.min(mFraction, 1));
- setScrimInFrontAlpha(0f);
+ if (mWakingUpFromAodStarting) {
+ setScrimInFrontAlpha(1f);
+ } else {
+ setScrimInFrontAlpha(0f);
+ }
setScrimBehindAlpha(fraction
* (mScrimBehindAlphaKeyguard - mScrimBehindAlphaUnlocking)
+ mScrimBehindAlphaUnlocking);
@@ -426,7 +458,10 @@
scrimView.setViewAlpha(alpha);
int dozeTint = Color.TRANSPARENT;
- if (mAnimatingDozeUnlock || mDozing) {
+
+ boolean dozing = mAnimatingDozeUnlock || mDozing;
+ boolean frontScrimDozing = mWakingUpFromAodInProgress;
+ if (dozing || frontScrimDozing && scrim == mScrimInFront) {
dozeTint = Color.BLACK;
}
scrimView.setTint(dozeTint);
@@ -458,6 +493,10 @@
mKeyguardFadingOutInProgress = false;
mAnimatingDozeUnlock = false;
}
+ if (mWakingUpFromAodAnimationRunning) {
+ mWakingUpFromAodAnimationRunning = false;
+ mWakingUpFromAodInProgress = false;
+ }
scrim.setTag(TAG_KEY_ANIM, null);
scrim.setTag(TAG_KEY_ANIM_TARGET, null);
}
@@ -467,6 +506,9 @@
mKeyguardFadingOutInProgress = true;
mKeyguardFadeoutAnimation = anim;
}
+ if (mWakingUpFromAodInProgress) {
+ mWakingUpFromAodAnimationRunning = true;
+ }
if (mSkipFirstFrame) {
anim.setCurrentPlayTime(16);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
index e90d1c1..9e1a2a2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -21,6 +21,9 @@
import static android.app.StatusBarManager.windowStateToString;
import static android.content.res.Configuration.UI_MODE_TYPE_CAR;
+import static com.android.systemui.keyguard.WakefulnessLifecycle.WAKEFULNESS_ASLEEP;
+import static com.android.systemui.keyguard.WakefulnessLifecycle.WAKEFULNESS_AWAKE;
+import static com.android.systemui.keyguard.WakefulnessLifecycle.WAKEFULNESS_WAKING;
import static com.android.systemui.statusbar.notification.NotificationInflater.InflationCallback;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_LIGHTS_OUT;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_LIGHTS_OUT_TRANSPARENT;
@@ -4208,13 +4211,16 @@
}
private boolean updateIsKeyguard() {
+ boolean wakeAndUnlocking = mFingerprintUnlockController.getMode()
+ == FingerprintUnlockController.MODE_WAKE_AND_UNLOCK;
+
// For dozing, keyguard needs to be shown whenever the device is non-interactive. Otherwise
// there's no surface we can show to the user. Note that the device goes fully interactive
// late in the transition, so we also allow the device to start dozing once the screen has
// turned off fully.
boolean keyguardForDozing = mDozingRequested &&
(!mDeviceInteractive || isGoingToSleep() && (isScreenFullyOff() || mIsKeyguard));
- boolean shouldBeKeyguard = mKeyguardRequested || keyguardForDozing;
+ boolean shouldBeKeyguard = (mKeyguardRequested || keyguardForDozing) && !wakeAndUnlocking;
if (keyguardForDozing) {
updatePanelExpansionForKeyguard();
}
@@ -4256,7 +4262,8 @@
}
private void updatePanelExpansionForKeyguard() {
- if (mState == StatusBarState.KEYGUARD) {
+ if (mState == StatusBarState.KEYGUARD && mFingerprintUnlockController.getMode()
+ != FingerprintUnlockController.MODE_WAKE_AND_UNLOCK) {
instantExpandNotificationsPanel();
} else if (mState == StatusBarState.FULLSCREEN_USER_SWITCHER) {
instantCollapseNotificationPanel();
@@ -5156,6 +5163,13 @@
public void onScreenTurningOn() {
mFalsingManager.onScreenTurningOn();
mNotificationPanel.onScreenTurningOn();
+
+ int wakefulness = mWakefulnessLifecycle.getWakefulness();
+ if (mDozing && (wakefulness == WAKEFULNESS_WAKING
+ || wakefulness == WAKEFULNESS_ASLEEP) && !isPulsing()) {
+ mScrimController.prepareWakeUpFromAod();
+ }
+
if (mLaunchCameraOnScreenTurningOn) {
mNotificationPanel.launchCamera(false, mLastCameraLaunchSource);
mLaunchCameraOnScreenTurningOn = false;
@@ -5164,13 +5178,18 @@
@Override
public void onScreenTurnedOn() {
+ mScrimController.wakeUpFromAod();
mDozeScrimController.onScreenTurnedOn();
}
@Override
public void onScreenTurnedOff() {
mFalsingManager.onScreenOff();
- updateIsKeyguard();
+ // If we pulse in from AOD, we turn the screen off first. However, updatingIsKeyguard
+ // in that case destroys the HeadsUpManager state, so don't do it in that case.
+ if (!isPulsing()) {
+ updateIsKeyguard();
+ }
}
};
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenStateTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenStateTest.java
index 203876b..e54c792 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenStateTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenStateTest.java
@@ -86,13 +86,13 @@
}
@Test
- public void testScreen_onInRequestPulseWithAoD() {
+ public void testScreen_offInRequestPulseWithAoD() {
mScreen.transitionTo(UNINITIALIZED, INITIALIZED);
mScreen.transitionTo(INITIALIZED, DOZE_AOD);
mScreen.transitionTo(DOZE, DOZE_REQUEST_PULSE);
- assertEquals(Display.STATE_DOZE_SUSPEND, mServiceFake.screenState);
+ assertEquals(Display.STATE_OFF, mServiceFake.screenState);
}
}
\ No newline at end of file