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
This commit is contained in:
@ -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);
|
||||
|
@ -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.
|
||||
|
Reference in New Issue
Block a user