diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index c9af62bcfd610..b1606c9e5d2d7 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -776,6 +776,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp if (mTmpInitial) { w.resetContentChanged(); } + w.mSurfacePlacementNeeded = true; w.mLayoutNeeded = false; w.prelayout(); final boolean firstLayout = !w.isLaidOut(); @@ -818,6 +819,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp //Slog.i(TAG, "Window " + this + " clearing mContentChanged - initial"); w.resetContentChanged(); } + w.mSurfacePlacementNeeded = true; w.mLayoutNeeded = false; w.prelayout(); getDisplayPolicy().layoutWindowLw(w, w.getParentWindow(), mDisplayFrames); diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 95f3c3711136e..35482566b8edd 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -513,6 +513,13 @@ class WindowState extends WindowContainer implements WindowManagerP */ boolean mLayoutNeeded; + /** + * If the application is not currently visible but requires a layout, + * then make sure we call performSurfacePlacement as well. This is set + * in layout if mLayoutNeeded is set until surface placement is done. + */ + boolean mSurfacePlacementNeeded; + /** Currently running an exit animation? */ boolean mAnimatingExit; @@ -5367,7 +5374,7 @@ class WindowState extends WindowContainer implements WindowManagerP mIsDimming = false; applyDims(); updateSurfacePositionNonOrganized(); - // Send information to SufaceFlinger about the priority of the current window. + // Send information to SurfaceFlinger about the priority of the current window. updateFrameRateSelectionPriorityIfNeeded(); if (isVisibleRequested()) updateGlobalScaleIfNeeded(); @@ -5381,13 +5388,16 @@ class WindowState extends WindowContainer implements WindowManagerP if (mSurfaceControl == null) { return; } - if (mWmService.mWindowPlacerLocked.isLayoutDeferred() || isGoneForLayout()) { + + if ((mWmService.mWindowPlacerLocked.isLayoutDeferred() || isGoneForLayout()) + && !mSurfacePlacementNeeded) { // Since this relies on mWindowFrames, changes made while layout is deferred are // likely to be invalid. Similarly, if it's goneForLayout, mWindowFrames may not be // up-to-date and thus can't be relied on. return; } + mSurfacePlacementNeeded = false; transformFrameToSurfacePosition(mWindowFrames.mFrame.left, mWindowFrames.mFrame.top, mSurfacePosition);