diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 9bede979880a6..943a3c12e5edd 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -1863,7 +1863,7 @@ public class WindowManagerService extends IWindowManager.Stub ProtoLog.v(WM_DEBUG_ADD_REMOVE, "addWindow: New client %s" + ": window=%s Callers=%s", client.asBinder(), win, Debug.getCallers(5)); - if (win.isVisibleOrAdding() && displayContent.updateOrientation()) { + if (win.isVisibleRequestedOrAdding() && displayContent.updateOrientation()) { displayContent.sendNewConfiguration(); } diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index ef0cba973e72e..e0c3cf968f5c3 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -1993,14 +1993,20 @@ class WindowState extends WindowContainer implements WindowManagerP } /** - * Same as isVisible(), but we also count it as visible between the - * call to IWindowSession.add() and the first relayout(). + * Is this window capable of being visible (policy and content), in a visible part of the + * hierarchy, and, if an activity window, the activity is visible-requested. Note, this means + * if the activity is going-away, this will be {@code false} even when the window is visible. + * + * The 'adding' part refers to the period of time between IWindowSession.add() and the first + * relayout() -- which, for activities, is the same as visibleRequested. + * + * TODO(b/206005136): This is very similar to isVisibleRequested(). Investigate merging them. */ - boolean isVisibleOrAdding() { + boolean isVisibleRequestedOrAdding() { final ActivityRecord atoken = mActivityRecord; return (mHasSurface || (!mRelayoutCalled && mViewVisibility == View.VISIBLE)) && isVisibleByPolicy() && !isParentWindowHidden() - && (atoken == null || atoken.isVisible()) + && (atoken == null || atoken.mVisibleRequested) && !mAnimatingExit && !mDestroying; } @@ -2732,8 +2738,9 @@ class WindowState extends WindowContainer implements WindowManagerP } if (DEBUG_INPUT_METHOD) { - Slog.i(TAG_WM, "isVisibleOrAdding " + this + ": " + isVisibleOrAdding()); - if (!isVisibleOrAdding()) { + Slog.i(TAG_WM, "isVisibleRequestedOrAdding " + this + ": " + + isVisibleRequestedOrAdding()); + if (!isVisibleRequestedOrAdding()) { Slog.i(TAG_WM, " mSurfaceController=" + mWinAnimator.mSurfaceController + " relayoutCalled=" + mRelayoutCalled + " viewVis=" + mViewVisibility @@ -2747,7 +2754,7 @@ class WindowState extends WindowContainer implements WindowManagerP } } } - return isVisibleOrAdding(); + return isVisibleRequestedOrAdding(); } private final class DeadWindowEventReceiver extends InputEventReceiver { @@ -3173,7 +3180,7 @@ class WindowState extends WindowContainer implements WindowManagerP public String canReceiveKeysReason(boolean fromUserTouch) { return "fromTouch= " + fromUserTouch - + " isVisibleOrAdding=" + isVisibleOrAdding() + + " isVisibleRequestedOrAdding=" + isVisibleRequestedOrAdding() + " mViewVisibility=" + mViewVisibility + " mRemoveOnExit=" + mRemoveOnExit + " flags=" + mAttrs.flags @@ -3185,7 +3192,7 @@ class WindowState extends WindowContainer implements WindowManagerP } public boolean canReceiveKeys(boolean fromUserTouch) { - final boolean canReceiveKeys = isVisibleOrAdding() + final boolean canReceiveKeys = isVisibleRequestedOrAdding() && (mViewVisibility == View.VISIBLE) && !mRemoveOnExit && ((mAttrs.flags & WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE) == 0) && (mActivityRecord == null || mActivityRecord.windowsAreFocusable(fromUserTouch)) @@ -3451,7 +3458,7 @@ class WindowState extends WindowContainer implements WindowManagerP } public void pokeDrawLockLw(long timeout) { - if (isVisibleOrAdding()) { + if (isVisibleRequestedOrAdding()) { if (mDrawLock == null) { // We want the tag name to be somewhat stable so that it is easier to correlate // in wake lock statistics. So in particular, we don't want to include the