diff options
author | Craig Mautner <cmautner@google.com> | 2012-04-17 13:18:45 -0700 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2012-04-17 13:18:45 -0700 |
commit | c843642fbb76619520f960043adaa268e252a657 (patch) | |
tree | 1309dae3f15c0a60c3d8658dd632d80c2d7c0cdb | |
parent | 26c246a3f12553c9c4667d7ee32ce137638a9b07 (diff) | |
parent | acaf9cca865902e6f1823e771f4234bfda53cfd1 (diff) | |
download | frameworks_base-c843642fbb76619520f960043adaa268e252a657.zip frameworks_base-c843642fbb76619520f960043adaa268e252a657.tar.gz frameworks_base-c843642fbb76619520f960043adaa268e252a657.tar.bz2 |
Merge changes I4752bdf1,I37690cf2
* changes:
Move Surface operations into existing transaction.
Clear orientation variable until rotation is done.
3 files changed, 106 insertions, 84 deletions
diff --git a/services/java/com/android/server/wm/ScreenRotationAnimation.java b/services/java/com/android/server/wm/ScreenRotationAnimation.java index 11af6ea..13013a8 100644 --- a/services/java/com/android/server/wm/ScreenRotationAnimation.java +++ b/services/java/com/android/server/wm/ScreenRotationAnimation.java @@ -121,6 +121,7 @@ class ScreenRotationAnimation { private boolean mMoreStartEnter; private boolean mMoreStartExit; private boolean mMoreStartFrame; + long mHalfwayPoint; public void printTo(String prefix, PrintWriter pw) { pw.print(prefix); pw.print("mSurface="); pw.print(mSurface); @@ -655,6 +656,9 @@ class ScreenRotationAnimation { } private boolean stepAnimation(long now) { + if (now > mHalfwayPoint) { + mHalfwayPoint = Long.MAX_VALUE; + } if (mFinishAnimReady && mFinishAnimStartTime < 0) { if (DEBUG_STATE) Slog.v(TAG, "Step: finish anim now ready"); mFinishAnimStartTime = now; @@ -915,6 +919,7 @@ class ScreenRotationAnimation { mRotateExitAnimation.setStartTime(now); } mAnimRunning = true; + mHalfwayPoint = now + mRotateEnterAnimation.getDuration() / 2; } return stepAnimation(now); diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java index 0458a67..72aab7b 100644 --- a/services/java/com/android/server/wm/WindowManagerService.java +++ b/services/java/com/android/server/wm/WindowManagerService.java @@ -4245,6 +4245,7 @@ public class WindowManagerService extends IWindowManager.Stub if (w.mHasSurface && !w.mOrientationChanging) { if (DEBUG_ORIENTATION) Slog.v(TAG, "set mOrientationChanging of " + w); w.mOrientationChanging = true; + mInnerFields.mOrientationChangeComplete = false; } unfrozeWindows = true; } @@ -5550,6 +5551,7 @@ public class WindowManagerService extends IWindowManager.Stub if (w.mHasSurface) { if (DEBUG_ORIENTATION) Slog.v(TAG, "Set mOrientationChanging of " + w); w.mOrientationChanging = true; + mInnerFields.mOrientationChangeComplete = false; } } for (int i=mRotationWatchers.size()-1; i>=0; i--) { @@ -7654,6 +7656,7 @@ public class WindowManagerService extends IWindowManager.Stub if (DEBUG_ORIENTATION) Slog.v(TAG, "Changing surface while display frozen: " + w); w.mOrientationChanging = true; + mInnerFields.mOrientationChangeComplete = false; if (!mWindowsFreezingScreen) { mWindowsFreezingScreen = true; // XXX should probably keep timeout from @@ -8022,7 +8025,7 @@ public class WindowManagerService extends IWindowManager.Stub Slog.v(TAG, "Resize reasons: " + " contentInsetsChanged=" + w.mContentInsetsChanged + " visibleInsetsChanged=" + w.mVisibleInsetsChanged - + " surfaceResized=" + w.mWinAnimator.mSurfaceResized + + " surfaceResized=" + winAnimator.mSurfaceResized + " configChanged=" + configChanged); } @@ -8037,7 +8040,7 @@ public class WindowManagerService extends IWindowManager.Stub if (w.mOrientationChanging) { if (DEBUG_ORIENTATION) Slog.v(TAG, "Orientation start waiting for draw in " - + w + ", surface " + w.mWinAnimator.mSurface); + + w + ", surface " + winAnimator.mSurface); winAnimator.mDrawState = WindowStateAnimator.DRAW_PENDING; if (w.mAppToken != null) { w.mAppToken.allDrawn = false; @@ -8045,15 +8048,15 @@ public class WindowManagerService extends IWindowManager.Stub } if (!mResizingWindows.contains(w)) { if (DEBUG_RESIZE || DEBUG_ORIENTATION) Slog.v(TAG, - "Resizing window " + w + " to " + w.mWinAnimator.mSurfaceW - + "x" + w.mWinAnimator.mSurfaceH); + "Resizing window " + w + " to " + winAnimator.mSurfaceW + + "x" + winAnimator.mSurfaceH); mResizingWindows.add(w); } } else if (w.mOrientationChanging) { if (w.isDrawnLw()) { if (DEBUG_ORIENTATION) Slog.v(TAG, "Orientation not waiting for draw in " - + w + ", surface " + w.mWinAnimator.mSurface); + + w + ", surface " + winAnimator.mSurface); w.mOrientationChanging = false; } } @@ -8125,7 +8128,8 @@ public class WindowManagerService extends IWindowManager.Stub private final void performLayoutAndPlaceSurfacesLockedInner( boolean recoveringMemory) { if (DEBUG_WINDOW_TRACE) { - Slog.v(TAG, "performLayoutAndPlaceSurfacesLockedInner: entry"); + Slog.v(TAG, "performLayoutAndPlaceSurfacesLockedInner: entry. Called by " + + getCallers(3)); } if (mDisplay == null) { Slog.i(TAG, "skipping performLayoutAndPlaceSurfacesLockedInner with no mDisplay"); @@ -8145,7 +8149,7 @@ public class WindowManagerService extends IWindowManager.Stub updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES, false /*updateInputWindows*/); } - + // Initialize state of exiting tokens. for (i=mExitingTokens.size()-1; i>=0; i--) { mExitingTokens.get(i).hasVisible = false; @@ -8174,7 +8178,7 @@ public class WindowManagerService extends IWindowManager.Stub try { int repeats = 0; - + do { repeats++; if (repeats > 6) { @@ -8234,7 +8238,7 @@ public class WindowManagerService extends IWindowManager.Stub mInnerFields.mObscured = false; mInnerFields.mDimming = false; mInnerFields.mSyswin = false; - + boolean focusDisplayed = false; final int N = mWindows.size(); for (i=N-1; i>=0; i--) { @@ -8258,7 +8262,52 @@ public class WindowManagerService extends IWindowManager.Stub // has been updated accordingly. updateWallpaperVisibilityLocked(); } + + final WindowStateAnimator winAnimator = w.mWinAnimator; + + // If the window has moved due to its containing + // content frame changing, then we'd like to animate + // it. + if (w.mHasSurface && w.shouldAnimateMove()) { + // Frame has moved, containing content frame + // has also moved, and we're not currently animating... + // let's do something. + Animation a = AnimationUtils.loadAnimation(mContext, + com.android.internal.R.anim.window_move_from_decor); + winAnimator.setAnimation(a); + winAnimator.mAnimDw = w.mLastFrame.left - w.mFrame.left; + winAnimator.mAnimDh = w.mLastFrame.top - w.mFrame.top; + } else { + winAnimator.mAnimDw = innerDw; + winAnimator.mAnimDh = innerDh; + } + + //Slog.i(TAG, "Window " + this + " clearing mContentChanged - done placing"); + w.mContentChanged = false; + + // Moved from updateWindowsAndWallpaperLocked(). + if (w.mHasSurface) { + // Take care of the window being ready to display. + if (winAnimator.commitFinishDrawingLocked(currentTime)) { + if ((w.mAttrs.flags + & WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER) != 0) { + if (WindowManagerService.DEBUG_WALLPAPER) Slog.v(TAG, + "First draw done in potential wallpaper target " + w); + mInnerFields.mWallpaperMayChange = true; + mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER; + if (WindowManagerService.DEBUG_LAYOUT_REPEATS) { + debugLayoutRepeats("updateWindowsAndWallpaperLocked 1", + mPendingLayoutChanges); + } + } + } + + winAnimator.setSurfaceBoundaries(recoveringMemory); + } + + updateResizingWindows(w); } + if (focusDisplayed) { mH.sendEmptyMessage(H.REPORT_LOSING_FOCUS); } @@ -8340,68 +8389,10 @@ public class WindowManagerService extends IWindowManager.Stub if (DEBUG_LAYOUT_REPEATS) debugLayoutRepeats("mLayoutNeeded", mPendingLayoutChanges); } - final int N = mWindows.size(); - for (i=N-1; i>=0; i--) { - final WindowState w = mWindows.get(i); - final WindowStateAnimator winAnimator = w.mWinAnimator; - - // If the window has moved due to its containing - // content frame changing, then we'd like to animate - // it. - if (w.mHasSurface && w.shouldAnimateMove()) { - // Frame has moved, containing content frame - // has also moved, and we're not currently animating... - // let's do something. - Animation a = AnimationUtils.loadAnimation(mContext, - com.android.internal.R.anim.window_move_from_decor); - winAnimator.setAnimation(a); - winAnimator.mAnimDw = w.mLastFrame.left - w.mFrame.left; - winAnimator.mAnimDh = w.mLastFrame.top - w.mFrame.top; - } else { - winAnimator.mAnimDw = innerDw; - winAnimator.mAnimDh = innerDh; - } - - //Slog.i(TAG, "Window " + this + " clearing mContentChanged - done placing"); - w.mContentChanged = false; - - // TODO(cmautner): Can this move up to the loop at the end of try/catch above? - updateResizingWindows(w); - - // Moved from updateWindowsAndWallpaperLocked(). - if (w.mHasSurface) { - // Take care of the window being ready to display. - if (winAnimator.commitFinishDrawingLocked(currentTime)) { - if ((w.mAttrs.flags - & WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER) != 0) { - if (WindowManagerService.DEBUG_WALLPAPER) Slog.v(TAG, - "First draw done in potential wallpaper target " + w); - mInnerFields.mWallpaperMayChange = true; - mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER; - if (WindowManagerService.DEBUG_LAYOUT_REPEATS) { - debugLayoutRepeats("updateWindowsAndWallpaperLocked 1", - mPendingLayoutChanges); - } - } - } - } - } - - if (DEBUG_ORIENTATION && mDisplayFrozen) Slog.v(TAG, - "With display frozen, orientationChangeComplete=" - + mInnerFields.mOrientationChangeComplete); - if (mInnerFields.mOrientationChangeComplete) { - if (mWindowsFreezingScreen) { - mWindowsFreezingScreen = false; - mH.removeMessages(H.WINDOW_FREEZE_TIMEOUT); - } - stopFreezingDisplayLocked(); - } - if (!mResizingWindows.isEmpty()) { for (i = mResizingWindows.size() - 1; i >= 0; i--) { WindowState win = mResizingWindows.get(i); - final WindowStateAnimator winAnimator = win.mWinAnimator; + final WindowStateAnimator winAnimator = win.mWinAnimator; try { if (DEBUG_RESIZE || DEBUG_ORIENTATION) Slog.v(TAG, "Reporting new frame to " + win + ": " + win.mCompatFrame); @@ -8420,7 +8411,7 @@ public class WindowManagerService extends IWindowManager.Stub win.mConfiguration = mCurConfiguration; if (DEBUG_ORIENTATION && winAnimator.mDrawState == WindowStateAnimator.DRAW_PENDING) Slog.i( - TAG, "Resizing " + win + " WITH DRAW PENDING"); + TAG, "Resizing " + win + " WITH DRAW PENDING"); win.mClient.resized((int)winAnimator.mSurfaceW, (int)winAnimator.mSurfaceH, win.mLastContentInsets, win.mLastVisibleInsets, @@ -8436,6 +8427,17 @@ public class WindowManagerService extends IWindowManager.Stub mResizingWindows.clear(); } + if (DEBUG_ORIENTATION && mDisplayFrozen) Slog.v(TAG, + "With display frozen, orientationChangeComplete=" + + mInnerFields.mOrientationChangeComplete); + if (mInnerFields.mOrientationChangeComplete) { + if (mWindowsFreezingScreen) { + mWindowsFreezingScreen = false; + mH.removeMessages(H.WINDOW_FREEZE_TIMEOUT); + } + stopFreezingDisplayLocked(); + } + // Destroy the surface of any windows that are no longer visible. boolean wallpaperDestroyed = false; i = mDestroySurface.size(); diff --git a/services/java/com/android/server/wm/WindowStateAnimator.java b/services/java/com/android/server/wm/WindowStateAnimator.java index 90b63a6..b61ccbf 100644 --- a/services/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/java/com/android/server/wm/WindowStateAnimator.java @@ -499,6 +499,14 @@ class WindowStateAnimator { sSurfaces.remove(this); } + @Override + public void release() { + super.release(); + Slog.v(SURFACE_TAG, "release: " + this + ". Called by " + + WindowManagerService.getCallers(3)); + sSurfaces.remove(this); + } + static void dumpAllSurfaces() { final int N = sSurfaces.size(); for (int i = 0; i < N; i++) { @@ -886,22 +894,8 @@ class WindowStateAnimator { mDtDy = mWin.mGlobalScale; } - public void prepareSurfaceLocked(final boolean recoveringMemory) { + void setSurfaceBoundaries(final boolean recoveringMemory) { final WindowState w = mWin; - if (mSurface == null) { - if (w.mOrientationChanging) { - if (DEBUG_ORIENTATION) { - Slog.v(TAG, "Orientation change skips hidden " + w); - } - w.mOrientationChanging = false; - } - return; - } - - boolean displayed = false; - - computeShownFrameLocked(); - int width, height; if ((w.mAttrs.flags & LayoutParams.FLAG_SCALED) != 0) { // for a scaled surface, we just want to use @@ -950,6 +944,8 @@ class WindowStateAnimator { "SIZE " + width + "x" + height, null); mSurfaceResized = true; mSurface.setSize(width, height); + mAnimator.mPendingLayoutChanges |= + WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER; } catch (RuntimeException e) { // If something goes wrong with the surface (such // as running out of memory), don't take down the @@ -961,6 +957,25 @@ class WindowStateAnimator { } } } + } + + public void prepareSurfaceLocked(final boolean recoveringMemory) { + final WindowState w = mWin; + if (mSurface == null) { + if (w.mOrientationChanging) { + if (DEBUG_ORIENTATION) { + Slog.v(TAG, "Orientation change skips hidden " + w); + } + w.mOrientationChanging = false; + } + return; + } + + boolean displayed = false; + + computeShownFrameLocked(); + + setSurfaceBoundaries(recoveringMemory); if (w.mAttachedHidden || !w.isReadyForDisplay()) { if (!mLastHidden) { |