diff options
| author | 2017-07-13 01:52:55 +0000 | |
|---|---|---|
| committer | 2017-07-13 01:52:55 +0000 | |
| commit | dfee7bea20c6c3f928de8077bd3831e67808b88c (patch) | |
| tree | 01ef20afc23671defc0642defc37e47b2937c5ee | |
| parent | a6ce4cee9fcb0387a7d2ebc74d13e7e5f5bc39d5 (diff) | |
| parent | 3de5101c128774b43c46eced8f4865b844ab8655 (diff) | |
Merge "Use configuration delta to determine if still in orientation change." into oc-dr1-dev
am: 3de5101c12
Change-Id: I16cb39a8734799649b78a811e8b97eb87eb0c55d
4 files changed, 39 insertions, 19 deletions
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 9fe73815b380..05f4626259d7 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -1073,7 +1073,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo } if (w.mHasSurface && !rotateSeamlessly) { if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "Set mOrientationChanging of " + w); - w.mOrientationChanging = true; + w.setOrientationChanging(true); mService.mRoot.mOrientationChangeComplete = false; w.mLastFreezeDuration = 0; } @@ -2679,10 +2679,10 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo mService.mWindowsFreezingScreen = WINDOWS_FREEZING_SCREENS_TIMEOUT; forAllWindows(w -> { - if (!w.mOrientationChanging) { + if (!w.getOrientationChanging()) { return; } - w.mOrientationChanging = false; + w.setOrientationChanging(false); w.mLastFreezeDuration = (int)(SystemClock.elapsedRealtime() - mService.mDisplayFreezeTime); Slog.w(TAG_WM, "Force clearing orientation change: " + w); diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index ebfeac339083..1b4c34d21257 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -5789,7 +5789,7 @@ public class WindowManagerService extends IWindowManager.Stub // orientation. if (!okToDisplay() && mWindowsFreezingScreen != WINDOWS_FREEZING_SCREENS_TIMEOUT) { if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "Changing surface while display frozen: " + w); - w.mOrientationChanging = true; + w.setOrientationChanging(true); w.mLastFreezeDuration = 0; mRoot.mOrientationChangeComplete = false; if (mWindowsFreezingScreen == WINDOWS_FREEZING_SCREENS_NONE) { diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 1e0acbcfd0de..23fff2d41b4c 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -441,7 +441,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP * Set when the orientation is changing and this window has not yet * been updated for the new orientation. */ - boolean mOrientationChanging; + private boolean mOrientationChanging; /** * The orientation during the last visible call to relayout. If our @@ -1184,7 +1184,8 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP // then we need to hold off on unfreezing the display until this window has been // redrawn; to do that, we need to go through the process of getting informed by the // application when it has finished drawing. - if (mOrientationChanging || dragResizingChanged || isResizedWhileNotDragResizing()) { + if (getOrientationChanging() || dragResizingChanged + || isResizedWhileNotDragResizing()) { if (DEBUG_SURFACE_TRACE || DEBUG_ANIM || DEBUG_ORIENTATION || DEBUG_RESIZE) { Slog.v(TAG_WM, "Orientation or resize start waiting for draw" + ", mDrawState=DRAW_PENDING in " + this @@ -1199,17 +1200,33 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP if (DEBUG_RESIZE || DEBUG_ORIENTATION) Slog.v(TAG_WM, "Resizing window " + this); mService.mResizingWindows.add(this); } - } else if (mOrientationChanging) { + } else if (getOrientationChanging()) { if (isDrawnLw()) { if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "Orientation not waiting for draw in " + this + ", surfaceController " + winAnimator.mSurfaceController); - mOrientationChanging = false; + setOrientationChanging(false); mLastFreezeDuration = (int)(SystemClock.elapsedRealtime() - mService.mDisplayFreezeTime); } } } + boolean getOrientationChanging() { + // In addition to the local state flag, we must also consider the difference in the last + // reported configuration vs. the current state. If the client code has not been informed of + // the change, logic dependent on having finished processing the orientation, such as + // unfreezing, could be improperly triggered. + // TODO(b/62846907): Checking against {@link mLastReportedConfiguration} could be flaky as + // this is not necessarily what the client has processed yet. Find a + // better indicator consistent with the client. + return mOrientationChanging || (isVisible() + && getConfiguration().orientation != mLastReportedConfiguration.orientation); + } + + void setOrientationChanging(boolean changing) { + mOrientationChanging = changing; + } + DisplayContent getDisplayContent() { return mToken.getDisplayContent(); } @@ -2669,10 +2686,10 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP mAppFreezing = false; - if (mHasSurface && !mOrientationChanging + if (mHasSurface && !getOrientationChanging() && mService.mWindowsFreezingScreen != WINDOWS_FREEZING_SCREENS_TIMEOUT) { if (DEBUG_ORIENTATION) Slog.v(TAG_WM, "set mOrientationChanging of " + this); - mOrientationChanging = true; + setOrientationChanging(true); mService.mRoot.mOrientationChangeComplete = false; } mLastFreezeDuration = 0; @@ -3091,7 +3108,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP mWinAnimator.mSurfaceResized = false; mReportOrientationChanged = false; } catch (RemoteException e) { - mOrientationChanging = false; + setOrientationChanging(false); mLastFreezeDuration = (int)(SystemClock.elapsedRealtime() - mService.mDisplayFreezeTime); // We are assuming the hosting process is dead or in a zombie state. @@ -3450,10 +3467,13 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP pw.print(" mDestroying="); pw.print(mDestroying); pw.print(" mRemoved="); pw.println(mRemoved); } - if (mOrientationChanging || mAppFreezing || mTurnOnScreen + if (getOrientationChanging() || mAppFreezing || mTurnOnScreen || mReportOrientationChanged) { pw.print(prefix); pw.print("mOrientationChanging="); pw.print(mOrientationChanging); + pw.print(" configOrientationChanging="); + pw.print(mLastReportedConfiguration.orientation + != getConfiguration().orientation); pw.print(" mAppFreezing="); pw.print(mAppFreezing); pw.print(" mTurnOnScreen="); pw.print(mTurnOnScreen); pw.print(" mReportOrientationChanged="); pw.println(mReportOrientationChanged); diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java index cd55156a67a9..8f1065f75642 100644 --- a/services/core/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java @@ -1527,11 +1527,11 @@ class WindowStateAnimator { // There is no need to wait for an animation change if our window is gone for layout // already as we'll never be visible. - if (w.mOrientationChanging && w.isGoneForLayoutLw()) { + if (w.getOrientationChanging() && w.isGoneForLayoutLw()) { if (DEBUG_ORIENTATION) { Slog.v(TAG, "Orientation change skips hidden " + w); } - w.mOrientationChanging = false; + w.setOrientationChanging(false); } return; } @@ -1564,8 +1564,8 @@ class WindowStateAnimator { // really hidden (gone for layout), there is no point in still waiting for it. // Note that this does introduce a potential glitch if the window becomes unhidden // before it has drawn for the new orientation. - if (w.mOrientationChanging && w.isGoneForLayoutLw()) { - w.mOrientationChanging = false; + if (w.getOrientationChanging() && w.isGoneForLayoutLw()) { + w.setOrientationChanging(false); if (DEBUG_ORIENTATION) Slog.v(TAG, "Orientation change skips hidden " + w); } @@ -1618,7 +1618,7 @@ class WindowStateAnimator { mAnimator.setPendingLayoutChanges(w.getDisplayId(), WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM); } else { - w.mOrientationChanging = false; + w.setOrientationChanging(false); } } if (hasSurface()) { @@ -1631,14 +1631,14 @@ class WindowStateAnimator { displayed = true; } - if (w.mOrientationChanging) { + if (w.getOrientationChanging()) { if (!w.isDrawnLw()) { mAnimator.mBulkUpdateParams &= ~SET_ORIENTATION_CHANGE_COMPLETE; mAnimator.mLastWindowFreezeSource = w; if (DEBUG_ORIENTATION) Slog.v(TAG, "Orientation continue waiting for draw in " + w); } else { - w.mOrientationChanging = false; + w.setOrientationChanging(false); if (DEBUG_ORIENTATION) Slog.v(TAG, "Orientation change complete in " + w); } } |