summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Dianne Hackborn <hackbod@google.com> 2012-01-12 14:05:03 -0800
committer Dianne Hackborn <hackbod@google.com> 2012-01-20 11:01:01 -0800
commitcfbf7dedaddd825b608e87d3dcf46adf80a46976 (patch)
tree75601703069be05b1da575fdb95be34ef2fd8c52
parent820b45c0a21980a43532b9fb9823f8aa08c64a15 (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
-rw-r--r--core/java/android/view/WindowManagerPolicy.java5
-rwxr-xr-xpolicy/src/com/android/internal/policy/impl/PhoneWindowManager.java6
-rw-r--r--services/java/com/android/server/wm/WindowManagerService.java32
-rw-r--r--services/java/com/android/server/wm/WindowState.java10
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.