diff options
author | Craig Mautner <cmautner@google.com> | 2012-03-15 11:28:53 -0700 |
---|---|---|
committer | Craig Mautner <cmautner@google.com> | 2012-03-15 11:34:24 -0700 |
commit | bf90eaa5d2410bfb60ef84a0efcf3b5eb5022d9f (patch) | |
tree | 3f32a8542fe6bcc78acc08900a1c59b394c4bd95 /services | |
parent | 6c25ffb77069a9f39884b8e91e1810254c3e2f03 (diff) | |
download | frameworks_base-bf90eaa5d2410bfb60ef84a0efcf3b5eb5022d9f.zip frameworks_base-bf90eaa5d2410bfb60ef84a0efcf3b5eb5022d9f.tar.gz frameworks_base-bf90eaa5d2410bfb60ef84a0efcf3b5eb5022d9f.tar.bz2 |
Separate layout ops from surface ops.
Further work to isolate layout from animation and surface operations.
Remove cruft and minor refactoring.
Change-Id: I6f910ed72c7c614996641c353870c2b2ab5e8bb4
Diffstat (limited to 'services')
3 files changed, 103 insertions, 100 deletions
diff --git a/services/java/com/android/server/wm/ScreenRotationAnimation.java b/services/java/com/android/server/wm/ScreenRotationAnimation.java index 58187b6..ab084f9 100644 --- a/services/java/com/android/server/wm/ScreenRotationAnimation.java +++ b/services/java/com/android/server/wm/ScreenRotationAnimation.java @@ -41,7 +41,6 @@ class ScreenRotationAnimation { BlackFrame mBlackFrame; int mWidth, mHeight; - int mSnapshotRotation; int mSnapshotDeltaRotation; int mOriginalRotation; int mOriginalWidth, mOriginalHeight; @@ -125,8 +124,7 @@ class ScreenRotationAnimation { if (mBlackFrame != null) { mBlackFrame.printTo(prefix + " ", pw); } - pw.print(prefix); pw.print("mSnapshotRotation="); pw.print(mSnapshotRotation); - pw.print(" mSnapshotDeltaRotation="); pw.print(mSnapshotDeltaRotation); + pw.print(prefix); pw.print(" mSnapshotDeltaRotation="); pw.print(mSnapshotDeltaRotation); pw.print(" mCurRotation="); pw.println(mCurRotation); pw.print(prefix); pw.print("mOriginalRotation="); pw.print(mOriginalRotation); pw.print(" mOriginalWidth="); pw.print(mOriginalWidth); @@ -173,7 +171,6 @@ class ScreenRotationAnimation { mContext = context; // Screenshot does NOT include rotation! - mSnapshotRotation = 0; if (originalRotation == Surface.ROTATION_90 || originalRotation == Surface.ROTATION_270) { mWidth = originalHeight; @@ -197,7 +194,7 @@ class ScreenRotationAnimation { try { mSurface = new Surface(session, 0, "FreezeSurface", -1, mWidth, mHeight, PixelFormat.OPAQUE, Surface.FX_SURFACE_SCREENSHOT | Surface.HIDDEN); - if (mSurface == null || !mSurface.isValid()) { + if (!mSurface.isValid()) { // Screenshot failed, punt. mSurface = null; return; @@ -281,7 +278,7 @@ class ScreenRotationAnimation { // Compute the transformation matrix that must be applied // to the snapshot to make it stay in the same original position // with the current screen rotation. - int delta = deltaRotation(rotation, mSnapshotRotation); + int delta = deltaRotation(rotation, Surface.ROTATION_0); createRotationMatrix(delta, mWidth, mHeight, mSnapshotInitialMatrix); if (DEBUG_STATE) Slog.v(TAG, "**** ROTATION: " + delta); @@ -703,20 +700,18 @@ class ScreenRotationAnimation { } void updateSurfaces() { - if (!mMoreStartExit && !mMoreFinishExit && !mMoreRotateExit) { - if (mSurface != null) { + if (mSurface != null) { + if (!mMoreStartExit && !mMoreFinishExit && !mMoreRotateExit) { if (DEBUG_STATE) Slog.v(TAG, "Exit animations done, hiding screenshot surface"); mSurface.hide(); } } - if (!mMoreStartFrame && !mMoreFinishFrame && !mMoreRotateFrame) { - if (mBlackFrame != null) { + if (mBlackFrame != null) { + if (!mMoreStartFrame && !mMoreFinishFrame && !mMoreRotateFrame) { if (DEBUG_STATE) Slog.v(TAG, "Frame animations done, hiding black frame"); mBlackFrame.hide(); - } - } else { - if (mBlackFrame != null) { + } else { mBlackFrame.setMatrix(mFrameTransformation.getMatrix()); } } diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java index 4f55217..f4c4069 100644 --- a/services/java/com/android/server/wm/WindowManagerService.java +++ b/services/java/com/android/server/wm/WindowManagerService.java @@ -1581,8 +1581,7 @@ public class WindowManagerService extends IWindowManager.Stub + w.isReadyForDisplay() + " drawpending=" + w.mDrawPending + " commitdrawpending=" + w.mCommitDrawPending); if ((w.mAttrs.flags&FLAG_SHOW_WALLPAPER) != 0 && w.isReadyForDisplay() - && (mWallpaperTarget == w - || (!w.mDrawPending && !w.mCommitDrawPending))) { + && (mWallpaperTarget == w || w.isDrawnLw())) { if (DEBUG_WALLPAPER) Slog.v(TAG, "Found wallpaper activity: #" + i + "=" + w); foundW = w; @@ -2688,8 +2687,7 @@ public class WindowManagerService extends IWindowManager.Stub win.mEnterAnimationPending = true; } if (displayed) { - if (win.mSurface != null && !win.mDrawPending - && !win.mCommitDrawPending && !mDisplayFrozen + if (win.isDrawnLw() && !mDisplayFrozen && mDisplayEnabled && mPolicy.isScreenOnFully()) { applyEnterAnimationLocked(win); } @@ -3983,8 +3981,7 @@ public class WindowManagerService extends IWindowManager.Stub // If we are being set visible, and the starting window is // not yet displayed, then make sure it doesn't get displayed. WindowState swin = wtoken.startingWindow; - if (swin != null && (swin.mDrawPending - || swin.mCommitDrawPending)) { + if (swin != null && !swin.isDrawnLw()) { swin.mPolicyVisibility = false; swin.mPolicyVisibilityAfterAnim = false; } @@ -7669,21 +7666,76 @@ public class WindowManagerService extends IWindowManager.Stub } } - if (mScreenRotationAnimation != null) { - if (mScreenRotationAnimation.isAnimating() || - mScreenRotationAnimation.mFinishAnimReady) { - if (mScreenRotationAnimation.stepAnimationLocked(currentTime)) { - mInnerFields.mUpdateRotation = false; - mInnerFields.mAnimating = true; + if (mScreenRotationAnimation != null && + (mScreenRotationAnimation.isAnimating() || + mScreenRotationAnimation.mFinishAnimReady)) { + if (mScreenRotationAnimation.stepAnimationLocked(currentTime)) { + mInnerFields.mUpdateRotation = false; + mInnerFields.mAnimating = true; + } else { + mInnerFields.mUpdateRotation = true; + mScreenRotationAnimation.kill(); + mScreenRotationAnimation = null; + } + } + } + + private void animateAndUpdateSurfaces(final long currentTime, final int dw, final int dh, + final int innerDw, final int innerDh, + final boolean recoveringMemory) { + // Update animations of all applications, including those + // associated with exiting/removed apps + Surface.openTransaction(); + + try { + mPendingLayoutChanges = performAnimationsLocked(currentTime, dw, dh, + innerDw, innerDh); + updateWindowsAppsAndRotationAnimationsLocked(currentTime, innerDw, innerDh); + + // THIRD LOOP: Update the surfaces of all windows. + + if (mScreenRotationAnimation != null) { + mScreenRotationAnimation.updateSurfaces(); + } + + final int N = mWindows.size(); + for (int i=N-1; i>=0; i--) { + WindowState w = mWindows.get(i); + prepareSurfaceLocked(w, recoveringMemory); + } + + if (mDimAnimator != null && mDimAnimator.mDimShown) { + mInnerFields.mAnimating |= + mDimAnimator.updateSurface(mInnerFields.mDimming, currentTime, + mDisplayFrozen || !mDisplayEnabled || !mPolicy.isScreenOnFully()); + } + + if (!mInnerFields.mBlurring && mBlurShown) { + if (SHOW_TRANSACTIONS) Slog.i(TAG, " BLUR " + mBlurSurface + + ": HIDE"); + try { + mBlurSurface.hide(); + } catch (IllegalArgumentException e) { + Slog.w(TAG, "Illegal argument exception hiding blur surface"); + } + mBlurShown = false; + } + + if (mBlackFrame != null) { + if (mScreenRotationAnimation != null) { + mBlackFrame.setMatrix( + mScreenRotationAnimation.getEnterTransformation().getMatrix()); } else { - mInnerFields.mUpdateRotation = true; - mScreenRotationAnimation.kill(); - mScreenRotationAnimation = null; + mBlackFrame.clearMatrix(); } } + } catch (RuntimeException e) { + Log.wtf(TAG, "Unhandled exception in Window Manager", e); + } finally { + Surface.closeTransaction(); } } - + /** * Extracted from {@link #performLayoutAndPlaceSurfacesLockedInner} to reduce size of method. * @@ -8357,7 +8409,7 @@ public class WindowManagerService extends IWindowManager.Stub mResizingWindows.add(w); } } else if (w.mOrientationChanging) { - if (!w.mDrawPending && !w.mCommitDrawPending) { + if (w.isDrawnLw()) { if (DEBUG_ORIENTATION) Slog.v(TAG, "Orientation not waiting for draw in " + w + ", surface " + w.mSurface); @@ -8388,6 +8440,16 @@ public class WindowManagerService extends IWindowManager.Stub // cases while they are hidden such as when first showing a // window. + if (w.mSurface == null) { + if (w.mOrientationChanging) { + if (DEBUG_ORIENTATION) { + Slog.v(TAG, "Orientation change skips hidden " + w); + } + w.mOrientationChanging = false; + } + return; + } + boolean displayed = false; w.computeShownFrameLocked(); @@ -8521,8 +8583,7 @@ public class WindowManagerService extends IWindowManager.Stub } } - if (w.mLastHidden && !w.mDrawPending - && !w.mCommitDrawPending + if (w.mLastHidden && w.isDrawnLw() && !w.mReadyToShow) { if (SHOW_TRANSACTIONS) logSurface(w, "SHOW (performLayout)", null); @@ -8544,7 +8605,7 @@ public class WindowManagerService extends IWindowManager.Stub if (displayed) { if (w.mOrientationChanging) { - if (w.mDrawPending || w.mCommitDrawPending) { + if (!w.isDrawnLw()) { mInnerFields.mOrientationChangeComplete = false; if (DEBUG_ORIENTATION) Slog.v(TAG, "Orientation continue waiting for draw in " + w); @@ -8832,48 +8893,20 @@ public class WindowManagerService extends IWindowManager.Stub } while (mPendingLayoutChanges != 0); - // Update animations of all applications, including those - // associated with exiting/removed apps - - mPendingLayoutChanges = performAnimationsLocked(currentTime, dw, dh, - innerDw, innerDh); - updateWindowsAppsAndRotationAnimationsLocked(currentTime, innerDw, innerDh); - - // THIRD LOOP: Update the surfaces of all windows. - - final boolean someoneLosingFocus = mLosingFocus.size() != 0; + final boolean someoneLosingFocus = !mLosingFocus.isEmpty(); mInnerFields.mObscured = false; mInnerFields.mBlurring = false; mInnerFields.mDimming = false; mInnerFields.mSyswin = false; - - if (mScreenRotationAnimation != null) { - mScreenRotationAnimation.updateSurfaces(); - } - + final int N = mWindows.size(); - for (i=N-1; i>=0; i--) { WindowState w = mWindows.get(i); + //Slog.i(TAG, "Window " + this + " clearing mContentChanged - done placing"); + w.mContentChanged = false; - if (w.mSurface != null) { - prepareSurfaceLocked(w, recoveringMemory); - } else if (w.mOrientationChanging) { - if (DEBUG_ORIENTATION) { - Slog.v(TAG, "Orientation change skips hidden " + w); - } - w.mOrientationChanging = false; - } - - if (w.mContentChanged) { - //Slog.i(TAG, "Window " + this + " clearing mContentChanged - done placing"); - w.mContentChanged = false; - } - - final boolean canBeSeen = w.isDisplayedLw(); - - if (someoneLosingFocus && w == mCurrentFocus && canBeSeen) { + if (someoneLosingFocus && w == mCurrentFocus && w.isDisplayedLw()) { focusDisplayed = true; } @@ -8892,37 +8925,15 @@ public class WindowManagerService extends IWindowManager.Stub updateWallpaperVisibilityLocked(); } } - - if (mDimAnimator != null && mDimAnimator.mDimShown) { - mInnerFields.mAnimating |= - mDimAnimator.updateSurface(mInnerFields.mDimming, currentTime, - mDisplayFrozen || !mDisplayEnabled || !mPolicy.isScreenOnFully()); - } - - if (!mInnerFields.mBlurring && mBlurShown) { - if (SHOW_TRANSACTIONS) Slog.i(TAG, " BLUR " + mBlurSurface - + ": HIDE"); - try { - mBlurSurface.hide(); - } catch (IllegalArgumentException e) { - Slog.w(TAG, "Illegal argument exception hiding blur surface"); - } - mBlurShown = false; - } - - if (mBlackFrame != null) { - if (mScreenRotationAnimation != null) { - mBlackFrame.setMatrix( - mScreenRotationAnimation.getEnterTransformation().getMatrix()); - } else { - mBlackFrame.clearMatrix(); - } - } } catch (RuntimeException e) { Log.wtf(TAG, "Unhandled exception in Window Manager", e); + } finally { + Surface.closeTransaction(); } - Surface.closeTransaction(); + // Update animations of all applications, including those + // associated with exiting/removed apps + animateAndUpdateSurfaces(currentTime, dw, dh, innerDw, innerDh, recoveringMemory); if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, "<<< CLOSE TRANSACTION performLayoutAndPlaceSurfaces"); diff --git a/services/java/com/android/server/wm/WindowState.java b/services/java/com/android/server/wm/WindowState.java index 48788e7..42ce291 100644 --- a/services/java/com/android/server/wm/WindowState.java +++ b/services/java/com/android/server/wm/WindowState.java @@ -1018,7 +1018,7 @@ final class WindowState implements WindowManagerPolicy.WindowState { if (!mService.mDisplayFrozen && mService.mPolicy.isScreenOnFully()) { // We will run animations as long as the display isn't frozen. - if (!mDrawPending && !mCommitDrawPending && mAnimation != null) { + if (isDrawnLw() && mAnimation != null) { mHasTransformation = true; mHasLocalTransformation = true; if (!mLocalAnimating) { @@ -1478,8 +1478,7 @@ final class WindowState implements WindowManagerPolicy.WindowState { */ public boolean isDisplayedLw() { final AppWindowToken atoken = mAppToken; - return mSurface != null && mPolicyVisibility && !mDestroying - && !mDrawPending && !mCommitDrawPending + return isDrawnLw() && mPolicyVisibility && ((!mAttachedHidden && (atoken == null || !atoken.hiddenRequested)) || mAnimating); @@ -1500,7 +1499,6 @@ final class WindowState implements WindowManagerPolicy.WindowState { * complete UI in to. */ public boolean isDrawnLw() { - final AppWindowToken atoken = mAppToken; return mSurface != null && !mDestroying && !mDrawPending && !mCommitDrawPending; } @@ -1512,9 +1510,8 @@ final class WindowState implements WindowManagerPolicy.WindowState { boolean isOpaqueDrawn() { return (mAttrs.format == PixelFormat.OPAQUE || mAttrs.type == TYPE_WALLPAPER) - && mSurface != null && mAnimation == null - && (mAppToken == null || mAppToken.animation == null) - && !mDrawPending && !mCommitDrawPending; + && isDrawnLw() && mAnimation == null + && (mAppToken == null || mAppToken.animation == null); } /** |