From 235607589c78d952b5210e27738df5bc37a63e38 Mon Sep 17 00:00:00 2001 From: Jorim Jaggi Date: Thu, 13 Nov 2014 23:54:15 +0100 Subject: [PATCH] Always set correct policy visibility Windows without a surface didn't get the correct policy visibility applied after dismissing lockscreen. Thus, when launching something from lockscreen, home activity was hidden but never set to visible again. Before executing the transition to home, we didn't consider home as a wallpaper target because it was still invisible, and thus we picked the wrong transition. Always applying policy visibility when lockscreen changes fixes this outdated state. Bug: 18369599 Change-Id: I2933eaf0ab55fe31cb382c46c411033e33a756e0 --- .../com/android/server/wm/WindowAnimator.java | 50 ++++++++++++------- 1 file changed, 32 insertions(+), 18 deletions(-) diff --git a/services/core/java/com/android/server/wm/WindowAnimator.java b/services/core/java/com/android/server/wm/WindowAnimator.java index 345e8af9a9963..fe2e0a65a209c 100644 --- a/services/core/java/com/android/server/wm/WindowAnimator.java +++ b/services/core/java/com/android/server/wm/WindowAnimator.java @@ -221,6 +221,24 @@ public class WindowAnimator { } } + private boolean shouldForceHide(WindowState win) { + final WindowState imeTarget = mService.mInputMethodTarget; + final boolean showImeOverKeyguard = imeTarget != null && imeTarget.isVisibleNow() && + (imeTarget.getAttrs().flags & FLAG_SHOW_WHEN_LOCKED) != 0; + + final WindowState winShowWhenLocked = (WindowState) mPolicy.getWinShowWhenLockedLw(); + final AppWindowToken appShowWhenLocked = winShowWhenLocked == null ? + null : winShowWhenLocked.mAppToken; + final boolean hideWhenLocked = + !(((win.mIsImWindow || imeTarget == win) && showImeOverKeyguard) + || (appShowWhenLocked != null && (appShowWhenLocked == win.mAppToken || + // Show error dialogs over apps that dismiss keyguard. + (win.mAttrs.privateFlags & PRIVATE_FLAG_SYSTEM_ERROR) != 0))); + return ((mForceHiding == KEYGUARD_ANIMATING_IN) + && (!win.mWinAnimator.isAnimating() || hideWhenLocked)) + || ((mForceHiding == KEYGUARD_SHOWN) && hideWhenLocked); + } + private void updateWindowsLocked(final int displayId) { ++mAnimTransactionSequence; @@ -256,14 +274,6 @@ public class WindowAnimator { mForceHiding = KEYGUARD_NOT_SHOWN; - final WindowState imeTarget = mService.mInputMethodTarget; - final boolean showImeOverKeyguard = imeTarget != null && imeTarget.isVisibleNow() && - (imeTarget.getAttrs().flags & FLAG_SHOW_WHEN_LOCKED) != 0; - - final WindowState winShowWhenLocked = (WindowState) mPolicy.getWinShowWhenLockedLw(); - final AppWindowToken appShowWhenLocked = winShowWhenLocked == null ? - null : winShowWhenLocked.mAppToken; - boolean wallpaperInUnForceHiding = false; boolean startingInUnForceHiding = false; ArrayList unForceHiding = null; @@ -272,7 +282,8 @@ public class WindowAnimator { WindowState win = windows.get(i); WindowStateAnimator winAnimator = win.mWinAnimator; final int flags = win.mAttrs.flags; - + boolean canBeForceHidden = mPolicy.canBeForceHidden(win, win.mAttrs); + boolean shouldBeForceHidden = shouldForceHide(win); if (winAnimator.mSurfaceControl != null) { final boolean wasAnimating = winAnimator.mWasAnimating; final boolean nowAnimating = winAnimator.stepAnimationLocked(mCurrentTime); @@ -332,15 +343,8 @@ public class WindowAnimator { + " vis=" + win.mViewVisibility + " hidden=" + win.mRootToken.hidden + " anim=" + win.mWinAnimator.mAnimation); - } else if (mPolicy.canBeForceHidden(win, win.mAttrs)) { - final boolean hideWhenLocked = - !(((win.mIsImWindow || imeTarget == win) && showImeOverKeyguard) - || (appShowWhenLocked != null && (appShowWhenLocked == win.mAppToken || - // Show error dialogs over apps that dismiss keyguard. - (win.mAttrs.privateFlags & PRIVATE_FLAG_SYSTEM_ERROR) != 0))); - if (((mForceHiding == KEYGUARD_ANIMATING_IN) - && (!winAnimator.isAnimating() || hideWhenLocked)) - || ((mForceHiding == KEYGUARD_SHOWN) && hideWhenLocked)) { + } else if (canBeForceHidden) { + if (shouldBeForceHidden) { if (!win.hideLw(false, false)) { // Was already hidden continue; @@ -411,6 +415,16 @@ public class WindowAnimator { } } + // If the window doesn't have a surface, the only thing we care about is the correct + // policy visibility. + else if (canBeForceHidden) { + if (shouldBeForceHidden) { + win.hideLw(false, false); + } else { + win.showLw(false, false); + } + } + final AppWindowToken atoken = win.mAppToken; if (winAnimator.mDrawState == WindowStateAnimator.READY_TO_SHOW) { if (atoken == null || atoken.allDrawn) {