Handle keyguard visibility states separately.
Previous to this change the forceHiding variable was a boolean. This
change recognizes the different configurations of the keyguard by
defining separate states for forceHiding and testing for window
visibility differently in each state.
Fixes bug 6786114.
Change-Id: I078e0df7865ddafe498ee46e02110c3a017386d0
diff --git a/services/java/com/android/server/wm/WindowAnimator.java b/services/java/com/android/server/wm/WindowAnimator.java
index dda6b10..eb98e7d 100644
--- a/services/java/com/android/server/wm/WindowAnimator.java
+++ b/services/java/com/android/server/wm/WindowAnimator.java
@@ -254,7 +254,13 @@
ArrayList<WindowStateAnimator> unForceHiding = null;
boolean wallpaperInUnForceHiding = false;
- boolean forceHiding = false;
+ // forceHiding states.
+ final int KEYGUARD_NOT_SHOWN = 0;
+ final int KEYGUARD_ANIMATING_IN = 1;
+ final int KEYGUARD_SHOWN = 2;
+ final int KEYGUARD_ANIMATING_OUT = 3;
+ int forceHiding = KEYGUARD_NOT_SHOWN;
+
for (int i = mWinAnimators.size() - 1; i >= 0; i--) {
WindowStateAnimator winAnimator = mWinAnimators.get(i);
WindowState win = winAnimator.mWin;
@@ -291,8 +297,16 @@
}
mService.mFocusMayChange = true;
}
- if (win.isReadyForDisplay() && winAnimator.mAnimationIsEntrance) {
- forceHiding = true;
+ if (win.isReadyForDisplay()) {
+ if (nowAnimating) {
+ if (winAnimator.mAnimationIsEntrance) {
+ forceHiding = KEYGUARD_ANIMATING_IN;
+ } else {
+ forceHiding = KEYGUARD_ANIMATING_OUT;
+ }
+ } else {
+ forceHiding = KEYGUARD_SHOWN;
+ }
}
if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG,
"Force hide " + forceHiding
@@ -304,9 +318,12 @@
+ " hidden=" + win.mRootToken.hidden
+ " anim=" + win.mWinAnimator.mAnimation);
} else if (mPolicy.canBeForceHidden(win, win.mAttrs)) {
+ final boolean hideWhenLocked =
+ (winAnimator.mAttrFlags & FLAG_SHOW_WHEN_LOCKED) == 0;
final boolean changed;
- if (forceHiding && (!winAnimator.isAnimating()
- || (winAnimator.mAttrFlags & FLAG_SHOW_WHEN_LOCKED) == 0)) {
+ if (((forceHiding == KEYGUARD_ANIMATING_IN)
+ && (!winAnimator.isAnimating() || hideWhenLocked))
+ || ((forceHiding == KEYGUARD_SHOWN) && hideWhenLocked)) {
changed = win.hideLw(false, false);
if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG,
"Now policy hidden: " + win);