diff options
3 files changed, 33 insertions, 5 deletions
diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java index 826fb455b6e2..1eedc28fbad4 100644 --- a/services/core/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java @@ -591,6 +591,17 @@ class WindowStateAnimator { } } + private int getLayerStack() { + return mWin.getDisplayContent().getDisplay().getLayerStack(); + } + + void updateLayerStackInTransaction() { + if (mSurfaceController != null) { + mSurfaceController.setLayerStackInTransaction( + getLayerStack()); + } + } + WindowSurfaceController createSurfaceLocked(int windowType, int ownerUid) { final WindowState w = mWin; if (w.restoreSavedSurface()) { @@ -703,8 +714,7 @@ class WindowStateAnimator { } // Start a new transaction and apply position & offset. - final int layerStack = w.getDisplayContent().getDisplay().getLayerStack(); - mSurfaceController.setPositionAndLayer(mTmpSize.left, mTmpSize.top, layerStack, mAnimLayer); + mSurfaceController.setPositionAndLayer(mTmpSize.left, mTmpSize.top, getLayerStack(), mAnimLayer); mLastHidden = true; if (WindowManagerService.localLOGV) Slog.v(TAG, "Created surface " + this); @@ -1435,7 +1445,6 @@ class WindowStateAnimator { WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER); w.applyDimLayerIfNeeded(); } - } void prepareSurfaceLocked(final boolean recoveringMemory) { diff --git a/services/core/java/com/android/server/wm/WindowSurfaceController.java b/services/core/java/com/android/server/wm/WindowSurfaceController.java index b08bb70ca0b9..fb40a65005f0 100644 --- a/services/core/java/com/android/server/wm/WindowSurfaceController.java +++ b/services/core/java/com/android/server/wm/WindowSurfaceController.java @@ -276,6 +276,12 @@ class WindowSurfaceController { } } + void setLayerStackInTransaction(int layerStack) { + if (mSurfaceControl != null) { + mSurfaceControl.setLayerStack(layerStack); + } + } + void setPositionInTransaction(float left, float top, boolean recoveringMemory) { final boolean surfaceMoved = mSurfaceX != left || mSurfaceY != top; if (surfaceMoved) { @@ -357,7 +363,8 @@ class WindowSurfaceController { return false; } - boolean prepareToShowInTransaction(float alpha, int layer, float dsdx, float dtdx, float dsdy, + boolean prepareToShowInTransaction(float alpha, int layer, + float dsdx, float dtdx, float dsdy, float dtdy, boolean recoveringMemory) { if (mSurfaceControl != null) { try { @@ -371,7 +378,6 @@ class WindowSurfaceController { mLastDtdy = dtdy; mSurfaceControl.setMatrix( dsdx, dtdx, dsdy, dtdy); - } catch (RuntimeException e) { Slog.w(TAG, "Error updating surface in " + title, e); if (!recoveringMemory) { diff --git a/services/core/java/com/android/server/wm/WindowToken.java b/services/core/java/com/android/server/wm/WindowToken.java index fab59d6c8f08..e3033c9c01a8 100644 --- a/services/core/java/com/android/server/wm/WindowToken.java +++ b/services/core/java/com/android/server/wm/WindowToken.java @@ -30,6 +30,7 @@ import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_NORMAL; import android.os.Debug; import android.os.IBinder; import android.util.Slog; +import android.view.SurfaceControl; import java.io.PrintWriter; @@ -245,6 +246,18 @@ class WindowToken extends WindowContainer<WindowState> { void onDisplayChanged(DisplayContent dc) { dc.reParentWindowToken(this); mDisplayContent = dc; + + // TODO(b/36740756): One day this should perhaps be hooked + // up with goodToGo, so we don't move a window + // to another display before the window behind + // it is ready. + SurfaceControl.openTransaction(); + for (int i = mChildren.size() - 1; i >= 0; --i) { + final WindowState win = mChildren.get(i); + win.mWinAnimator.updateLayerStackInTransaction(); + } + SurfaceControl.closeTransaction(); + super.onDisplayChanged(dc); } |