From 6311c4b2e1d833bd63d36ed5c841364bcc597148 Mon Sep 17 00:00:00 2001 From: Bryce Lee Date: Thu, 6 Jul 2017 14:09:29 -0700 Subject: [PATCH] Do not gate updating allDrawn on all child WindowStates. A recent change prevents allDrawn in AppWindowToken from being updated until all child WindowStates have been considered. However, children that are not visible do not affect allDrawn and therefore need to be excluded. This changelist adds an additional check to make sure the child can affect the allDrawn state before considering blocking on it. It also adds additional logs to the WindowState dump to better understand this scenario. Change-Id: I76d0f75496ed3da6a16c4a1d7bf2e7dc5b8bbe1e Bug: 63380251 Test: go/wm-smoke --- .../java/com/android/server/wm/AppWindowToken.java | 6 ++++-- .../core/java/com/android/server/wm/WindowState.java | 10 ++++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index 839ee0ec7efd1..b9d02a900d1c3 100644 --- a/services/core/java/com/android/server/wm/AppWindowToken.java +++ b/services/core/java/com/android/server/wm/AppWindowToken.java @@ -1357,8 +1357,10 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree * @return {@code true} If all children have been considered, {@code false}. */ private boolean allDrawnStatesConsidered() { - for (WindowState child : mChildren) { - if (!child.getDrawnStatedEvaluated()) { + for (int i = mChildren.size() - 1; i >= 0; --i) { + final WindowState child = mChildren.get(i); + if (child.mightAffectAllDrawn(false /*visibleOnly*/ ) + && !child.getDrawnStateEvaluated()) { return false; } } diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 1ec8e54cad36a..5de0aa98c5ecc 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -685,7 +685,7 @@ class WindowState extends WindowContainer implements WindowManagerP /** * Returns whether this {@link WindowState} has been considered for drawing by its parent. */ - boolean getDrawnStatedEvaluated() { + boolean getDrawnStateEvaluated() { return mDrawnStateEvaluated; } @@ -3344,7 +3344,11 @@ class WindowState extends WindowContainer implements WindowManagerP pw.print(prefix); pw.print("mAppToken="); pw.println(mAppToken); pw.print(prefix); pw.print(" isAnimatingWithSavedSurface()="); pw.print(isAnimatingWithSavedSurface()); - pw.print(" mAppDied=");pw.println(mAppDied); + pw.print(" mAppDied=");pw.print(mAppDied); + pw.print(prefix); pw.print("drawnStateEvaluated="); + pw.print(getDrawnStateEvaluated()); + pw.print(prefix); pw.print("mightAffectAllDrawn="); + pw.println(mightAffectAllDrawn(false /*visibleOnly*/)); } pw.print(prefix); pw.print("mViewVisibility=0x"); pw.print(Integer.toHexString(mViewVisibility)); @@ -3484,6 +3488,8 @@ class WindowState extends WindowContainer implements WindowManagerP if (computeDragResizing()) { pw.print(prefix); pw.println("computeDragResizing=" + computeDragResizing()); } + pw.print(prefix); pw.println("isOnScreen=" + isOnScreen()); + pw.print(prefix); pw.println("isVisible=" + isVisible()); } @Override