From 4474f54f4eedbdf5d0b225647d50c0b05466a448 Mon Sep 17 00:00:00 2001 From: Jorim Jaggi Date: Thu, 9 Jul 2015 16:08:02 -0700 Subject: [PATCH] Fix empty keyguard for once and all When a Keyguard exit animation was played while the screen was turning off, the window animation was cancelled. However, since we didn't reset mPostKeyguardExitAnimation, we thought we need to apply it again, with a start time of Long.MIN_VALUE. For some reason, this animation never ended, and it was stuck at the beginning. Thus, the alpha was 0 and the user just saw a blank wallpaper. In addition, we also forbid starting the Keyguard exit animation when the screen is about to turn off. Bug: 21124013 Change-Id: Ief022c5bd758a9fedcaab3fe9fc385fa4234b37f --- .../android/systemui/keyguard/KeyguardViewMediator.java | 7 +++++++ .../core/java/com/android/server/wm/WindowAnimator.java | 4 ++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index 7f61fc1d29c65..009a0d629c947 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -253,6 +253,7 @@ public class KeyguardViewMediator extends SystemUI { private KeyguardUpdateMonitor mUpdateMonitor; private boolean mDeviceInteractive; + private boolean mGoingToSleep; // last known state of the cellular connection private String mPhoneState = TelephonyManager.EXTRA_STATE_IDLE; @@ -639,6 +640,7 @@ public class KeyguardViewMediator extends SystemUI { if (DEBUG) Log.d(TAG, "onStartedGoingToSleep(" + why + ")"); synchronized (this) { mDeviceInteractive = false; + mGoingToSleep = true; // Lock immediately based on setting if secure (user has a pin/pattern/password). // This also "locks" the device when not secure to provide easy access to the @@ -678,6 +680,7 @@ public class KeyguardViewMediator extends SystemUI { if (DEBUG) Log.d(TAG, "onFinishedGoingToSleep(" + why + ")"); synchronized (this) { mDeviceInteractive = false; + mGoingToSleep = false; resetKeyguardDonePendingLocked(); mHideAnimationRun = false; @@ -1239,6 +1242,10 @@ public class KeyguardViewMediator extends SystemUI { } mUpdateMonitor.clearFingerprintRecognized(); + if (mGoingToSleep) { + Log.i(TAG, "Device is going to sleep, aborting keyguardDone"); + return; + } if (mExitSecureCallback != null) { try { mExitSecureCallback.onKeyguardExitResult(authenticated); diff --git a/services/core/java/com/android/server/wm/WindowAnimator.java b/services/core/java/com/android/server/wm/WindowAnimator.java index 11eb57264eaa0..76301781f4d64 100644 --- a/services/core/java/com/android/server/wm/WindowAnimator.java +++ b/services/core/java/com/android/server/wm/WindowAnimator.java @@ -349,6 +349,7 @@ public class WindowAnimator { "Now policy hidden: " + win); } else { boolean applyExistingExitAnimation = mPostKeyguardExitAnimation != null + && !mPostKeyguardExitAnimation.hasEnded() && !winAnimator.mKeyguardGoingAwayAnimation && win.hasDrawnLw() && win.mAttachedWindow == null @@ -499,8 +500,7 @@ public class WindowAnimator { mPostKeyguardExitAnimation.getStartOffset(), mPostKeyguardExitAnimation.getDuration()); mKeyguardGoingAway = false; - } else if (mCurrentTime - mPostKeyguardExitAnimation.getStartTime() - > mPostKeyguardExitAnimation.getDuration()) { + } else if (mPostKeyguardExitAnimation.hasEnded()) { // Done with the animation, reset. if (DEBUG_KEYGUARD) Slog.v(TAG, "Done with Keyguard exit animations."); mPostKeyguardExitAnimation = null;