Only restore saved surfaces in the last visible rotation. am: 237028ae3b

am: 5db2a3bb4c

Change-Id: Ib760b0917d4a4de8c75528cedf2fd05db7c8ba44
This commit is contained in:
Robert Carr
2016-07-27 22:28:40 +00:00
committed by android-build-merger
2 changed files with 22 additions and 0 deletions

View File

@@ -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);

View File

@@ -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;