diff options
| author | 2012-01-12 14:05:03 -0800 | |
|---|---|---|
| committer | 2012-01-20 11:01:01 -0800 | |
| commit | cfbf7dedaddd825b608e87d3dcf46adf80a46976 (patch) | |
| tree | 75601703069be05b1da575fdb95be34ef2fd8c52 | |
| parent | 820b45c0a21980a43532b9fb9823f8aa08c64a15 (diff) | |
Fix issue #5823276 again: home repaints after full-screen app is exited
Don't consider a window as a candidate for the top fullscreen window
if it is not going to be a candiate for layout.
This fix does not include the change to ignore app tokens that are
hidden. This causes problems in some dialogs that stay hidden until
their app is ready to display, but need to perform a series of relayouts
during that time to get to the right size. Dropping this part of
the change still (mostly?) seems to allow us to avoid the bad states.
Change-Id: Ic052cb1499d3287f47e9ffeac5cd2470ee5a308c
4 files changed, 36 insertions, 17 deletions
diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java index 41c225d6f80c..cbaa3dffd47e 100644 --- a/core/java/android/view/WindowManagerPolicy.java +++ b/core/java/android/view/WindowManagerPolicy.java @@ -298,6 +298,11 @@ public interface WindowManagerPolicy { boolean isDisplayedLw(); /** + * Is this window considered to be gone for purposes of layout? + */ + boolean isGoneForLayoutLw(); + + /** * Returns true if this window has been shown on screen at some time in * the past. Must be called with the window manager lock held. * diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java index 6e163910fcee..7c9f0b5d4a42 100755 --- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java @@ -2336,7 +2336,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (DEBUG_LAYOUT) Slog.i(TAG, "Win " + win + ": isVisibleOrBehindKeyguardLw=" + win.isVisibleOrBehindKeyguardLw()); if (mTopFullscreenOpaqueWindowState == null && - win.isVisibleOrBehindKeyguardLw()) { + win.isVisibleOrBehindKeyguardLw() && !win.isGoneForLayoutLw()) { if ((attrs.flags & FLAG_FORCE_NOT_FULLSCREEN) != 0) { mForceStatusBar = true; } @@ -2391,7 +2391,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { // case though. if (topIsFullscreen) { if (mStatusBarCanHide) { - if (DEBUG_LAYOUT) Log.v(TAG, "Hiding status bar"); + if (DEBUG_LAYOUT) Log.v(TAG, "** HIDING status bar"); if (mStatusBar.hideLw(true)) { changes |= FINISH_LAYOUT_REDO_LAYOUT; @@ -2407,7 +2407,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { Log.v(TAG, "Preventing status bar from hiding by policy"); } } else { - if (DEBUG_LAYOUT) Log.v(TAG, "Showing status bar: top is not fullscreen"); + if (DEBUG_LAYOUT) Log.v(TAG, "** SHOWING status bar: top is not fullscreen"); if (mStatusBar.showLw(true)) changes |= FINISH_LAYOUT_REDO_LAYOUT; } } diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java index 9fb064f22bbd..4dcf59b0564e 100644 --- a/services/java/com/android/server/wm/WindowManagerService.java +++ b/services/java/com/android/server/wm/WindowManagerService.java @@ -7391,8 +7391,11 @@ public class WindowManagerService extends IWindowManager.Stub final int N = mWindows.size(); int i; - if (DEBUG_LAYOUT) Slog.v(TAG, "performLayout: needed=" - + mLayoutNeeded + " dw=" + dw + " dh=" + dh); + if (DEBUG_LAYOUT) { + Slog.v(TAG, "-------------------------------------"); + Slog.v(TAG, "performLayout: needed=" + + mLayoutNeeded + " dw=" + dw + " dh=" + dh); + } mPolicy.beginLayoutLw(dw, dh, mRotation); @@ -7409,19 +7412,20 @@ public class WindowManagerService extends IWindowManager.Stub // Don't do layout of a window if it is not visible, or // soon won't be visible, to avoid wasting time and funky // changes while a window is animating away. - final AppWindowToken atoken = win.mAppToken; - final boolean gone = win.mViewVisibility == View.GONE - || !win.mRelayoutCalled - || (atoken == null && win.mRootToken.hidden) - || (atoken != null && atoken.hiddenRequested) - || win.mAttachedHidden - || win.mExiting || win.mDestroying; + final boolean gone = win.isGoneForLayoutLw(); if (DEBUG_LAYOUT && !win.mLayoutAttached) { - Slog.v(TAG, "First pass " + win + Slog.v(TAG, "1ST PASS " + win + ": gone=" + gone + " mHaveFrame=" + win.mHaveFrame + " mLayoutAttached=" + win.mLayoutAttached); - if (gone) Slog.v(TAG, " (mViewVisibility=" + final AppWindowToken atoken = win.mAppToken; + if (gone) Slog.v(TAG, " GONE: mViewVisibility=" + + win.mViewVisibility + " mRelayoutCalled=" + + win.mRelayoutCalled + " hidden=" + + win.mRootToken.hidden + " hiddenRequested=" + + (atoken != null && atoken.hiddenRequested) + + " mAttachedHidden=" + win.mAttachedHidden); + else Slog.v(TAG, " VIS: mViewVisibility=" + win.mViewVisibility + " mRelayoutCalled=" + win.mRelayoutCalled + " hidden=" + win.mRootToken.hidden + " hiddenRequested=" @@ -7443,7 +7447,7 @@ public class WindowManagerService extends IWindowManager.Stub win.prelayout(); mPolicy.layoutWindowLw(win, win.mAttrs, null); win.mLayoutSeq = seq; - if (DEBUG_LAYOUT) Slog.v(TAG, "-> mFrame=" + if (DEBUG_LAYOUT) Slog.v(TAG, " LAYOUT: mFrame=" + win.mFrame + " mContainingFrame=" + win.mContainingFrame + " mDisplayFrame=" + win.mDisplayFrame); @@ -7461,7 +7465,7 @@ public class WindowManagerService extends IWindowManager.Stub WindowState win = mWindows.get(i); if (win.mLayoutAttached) { - if (DEBUG_LAYOUT) Slog.v(TAG, "Second pass " + win + if (DEBUG_LAYOUT) Slog.v(TAG, "2ND PASS " + win + " mHaveFrame=" + win.mHaveFrame + " mViewVisibility=" + win.mViewVisibility + " mRelayoutCalled=" + win.mRelayoutCalled); @@ -7479,7 +7483,7 @@ public class WindowManagerService extends IWindowManager.Stub win.prelayout(); mPolicy.layoutWindowLw(win, win.mAttrs, win.mAttachedWindow); win.mLayoutSeq = seq; - if (DEBUG_LAYOUT) Slog.v(TAG, "-> mFrame=" + if (DEBUG_LAYOUT) Slog.v(TAG, " LAYOUT: mFrame=" + win.mFrame + " mContainingFrame=" + win.mContainingFrame + " mDisplayFrame=" + win.mDisplayFrame); diff --git a/services/java/com/android/server/wm/WindowState.java b/services/java/com/android/server/wm/WindowState.java index 75bda4155295..91183814b21c 100644 --- a/services/java/com/android/server/wm/WindowState.java +++ b/services/java/com/android/server/wm/WindowState.java @@ -1444,6 +1444,16 @@ final class WindowState implements WindowManagerPolicy.WindowState { || mAnimating); } + public boolean isGoneForLayoutLw() { + final AppWindowToken atoken = mAppToken; + return mViewVisibility == View.GONE + || !mRelayoutCalled + || (atoken == null && mRootToken.hidden) + || (atoken != null && atoken.hiddenRequested) + || mAttachedHidden + || mExiting || mDestroying; + } + /** * Returns true if the window has a surface that it has drawn a * complete UI in to. |