diff options
| -rw-r--r-- | services/core/java/com/android/server/wm/DisplayContent.java | 2 | ||||
| -rw-r--r-- | services/core/java/com/android/server/wm/WindowState.java | 14 | 
2 files changed, 14 insertions, 2 deletions
| diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index a9d33dc29467..e5f0cc55ea1d 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 171e93fb4df9..808a014ff6df 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<WindowState> 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; @@ -5368,7 +5375,7 @@ class WindowState extends WindowContainer<WindowState> 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(); @@ -5382,13 +5389,16 @@ class WindowState extends WindowContainer<WindowState> 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); |