diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 8c5481d1a4d85..6451c7492fa82 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -3081,6 +3081,9 @@ public class WindowManagerService extends IWindowManager.Stub if (oldVisibility == View.GONE) { winAnimator.mEnterAnimationPending = true; } + + win.mLastVisibleLayoutRotation = mRotation; + winAnimator.mEnteringAnimation = true; if ((result & WindowManagerGlobal.RELAYOUT_RES_FIRST_TIME) != 0) { win.prepareWindowToDisplayDuringRelayout(outConfig); diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 25ad07ef07a76..155d8d05b1ffa 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -394,6 +394,13 @@ final class WindowState implements WindowManagerPolicy.WindowState { */ boolean mOrientationChanging; + /** + * The orientation during the last visible call to relayout. If our + * current orientation is different, the window can't be ready + * to be shown. + */ + int mLastVisibleLayoutRotation = -1; + /** * How long we last kept the screen frozen. */ @@ -2095,6 +2102,7 @@ final class WindowState implements WindowManagerPolicy.WindowState { Slog.v(TAG, "Destroying saved surface: " + this); } mWinAnimator.destroySurfaceLocked(); + mSurfaceSaved = false; } mWasVisibleBeforeClientHidden = false; } @@ -2103,7 +2111,18 @@ final class WindowState implements WindowManagerPolicy.WindowState { if (!mSurfaceSaved) { return; } + + // Sometimes we save surfaces due to layout invisible + // directly after rotation occurs. However this means + // the surface was never laid out in the new orientation. + // We can only restore to the last rotation we were + // laid out as visible in. + if (mLastVisibleLayoutRotation != mService.mRotation) { + destroySavedSurface(); + return; + } mSurfaceSaved = false; + if (mWinAnimator.mSurfaceController != null) { setHasSurface(true); mWinAnimator.mDrawState = WindowStateAnimator.READY_TO_SHOW;