diff options
author | Craig Mautner <cmautner@google.com> | 2012-04-02 13:49:53 -0700 |
---|---|---|
committer | Craig Mautner <cmautner@google.com> | 2012-04-02 13:49:53 -0700 |
commit | 749a7bb28b2aff7a77a8c7dce01e086c2bd82c6b (patch) | |
tree | 802ed222902653a617c5e59c482595cf31d5630a /services/java/com/android | |
parent | 48ba1e7f530dab01bd2e733b6466246380720a92 (diff) | |
download | frameworks_base-749a7bb28b2aff7a77a8c7dce01e086c2bd82c6b.zip frameworks_base-749a7bb28b2aff7a77a8c7dce01e086c2bd82c6b.tar.gz frameworks_base-749a7bb28b2aff7a77a8c7dce01e086c2bd82c6b.tar.bz2 |
Refactor to convert four state booleans to int.
Replace four booleans (mDrawPending, mCommitDrawPending, mReadyToShow
and mHasDrawn) with a single int that can take on the four states.
Move mLastHidden from WindowState to WindowStateAnimator.
Change-Id: Ieff319dfa19123bf5a6cdc98e9ab28fd432b8153
Diffstat (limited to 'services/java/com/android')
5 files changed, 69 insertions, 81 deletions
diff --git a/services/java/com/android/server/wm/AppWindowToken.java b/services/java/com/android/server/wm/AppWindowToken.java index 09e99a5..3069b74 100644 --- a/services/java/com/android/server/wm/AppWindowToken.java +++ b/services/java/com/android/server/wm/AppWindowToken.java @@ -394,8 +394,7 @@ class AppWindowToken extends WindowToken { if (!win.isDrawnLw()) { Slog.v(WindowManagerService.TAG, "Not displayed: s=" + win.mWinAnimator.mSurface + " pv=" + win.mPolicyVisibility - + " dp=" + win.mWinAnimator.mDrawPending - + " cdp=" + win.mWinAnimator.mCommitDrawPending + + " mDrawState=" + win.mWinAnimator.mDrawState + " ah=" + win.mAttachedHidden + " th=" + (win.mAppToken != null diff --git a/services/java/com/android/server/wm/WindowAnimator.java b/services/java/com/android/server/wm/WindowAnimator.java index 26f4d0d..5a104b2 100644 --- a/services/java/com/android/server/wm/WindowAnimator.java +++ b/services/java/com/android/server/wm/WindowAnimator.java @@ -299,8 +299,7 @@ public class WindowAnimator { if (!w.isDrawnLw()) { Slog.v(TAG, "Not displayed: s=" + winAnimator.mSurface + " pv=" + w.mPolicyVisibility - + " dp=" + winAnimator.mDrawPending - + " cdp=" + winAnimator.mCommitDrawPending + + " mDrawState=" + winAnimator.mDrawState + " ah=" + w.mAttachedHidden + " th=" + atoken.hiddenRequested + " a=" + winAnimator.mAnimating); @@ -323,7 +322,7 @@ public class WindowAnimator { atoken.startingDisplayed = true; } } - } else if (w.mReadyToShow) { + } else if (winAnimator.mDrawState == WindowStateAnimator.READY_TO_SHOW) { if (winAnimator.performShowLocked()) { mPendingLayoutChanges |= WindowManagerPolicy.FINISH_LAYOUT_REDO_ANIM; if (WindowManagerService.DEBUG_LAYOUT_REPEATS) { diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java index a4c387c..a0a0591 100644 --- a/services/java/com/android/server/wm/WindowManagerService.java +++ b/services/java/com/android/server/wm/WindowManagerService.java @@ -1589,8 +1589,7 @@ public class WindowManagerService extends IWindowManager.Stub } } if (DEBUG_WALLPAPER) Slog.v(TAG, "Win " + w + ": readyfordisplay=" - + w.isReadyForDisplay() + " drawpending=" + w.mWinAnimator.mDrawPending - + " commitdrawpending=" + w.mWinAnimator.mCommitDrawPending); + + w.isReadyForDisplay() + " mDrawState=" + w.mWinAnimator.mDrawState); if ((w.mAttrs.flags&FLAG_SHOW_WALLPAPER) != 0 && w.isReadyForDisplay() && (mWallpaperTarget == w || w.isDrawnLw())) { if (DEBUG_WALLPAPER) Slog.v(TAG, @@ -8111,9 +8110,7 @@ public class WindowManagerService extends IWindowManager.Stub if (DEBUG_ORIENTATION) Slog.v(TAG, "Orientation start waiting for draw in " + w + ", surface " + w.mWinAnimator.mSurface); - winAnimator.mDrawPending = true; - winAnimator.mCommitDrawPending = false; - w.mReadyToShow = false; + winAnimator.mDrawState = WindowStateAnimator.DRAW_PENDING; if (w.mAppToken != null) { w.mAppToken.allDrawn = false; } @@ -8498,12 +8495,14 @@ public class WindowManagerService extends IWindowManager.Stub + Integer.toHexString(diff)); } win.mConfiguration = mCurConfiguration; - if (DEBUG_ORIENTATION && winAnimator.mDrawPending) Slog.i( + if (DEBUG_ORIENTATION && + winAnimator.mDrawState == WindowStateAnimator.DRAW_PENDING) Slog.i( TAG, "Resizing " + win + " WITH DRAW PENDING"); win.mClient.resized((int)winAnimator.mSurfaceW, (int)winAnimator.mSurfaceH, win.mLastContentInsets, win.mLastVisibleInsets, - winAnimator.mDrawPending, configChanged ? win.mConfiguration : null); + winAnimator.mDrawState == WindowStateAnimator.DRAW_PENDING, + configChanged ? win.mConfiguration : null); win.mContentInsetsChanged = false; win.mVisibleInsetsChanged = false; winAnimator.mSurfaceResized = false; diff --git a/services/java/com/android/server/wm/WindowState.java b/services/java/com/android/server/wm/WindowState.java index f8795e3..b74aa61 100644 --- a/services/java/com/android/server/wm/WindowState.java +++ b/services/java/com/android/server/wm/WindowState.java @@ -83,7 +83,6 @@ final class WindowState implements WindowManagerPolicy.WindowState { boolean mPolicyVisibilityAfterAnim = true; boolean mAppFreezing; boolean mAttachedHidden; // is our parent window hidden? - boolean mLastHidden; // was this window last hidden? boolean mWallpaperVisible; // for wallpaper, what was last vis report? /** @@ -206,15 +205,6 @@ final class WindowState implements WindowManagerPolicy.WindowState { // when in that case until the layout is done. boolean mLayoutNeeded; - // This is set during the time after the window's drawing has been - // committed, and before its surface is actually shown. It is used - // to delay showing the surface until all windows in a token are ready - // to be shown. - boolean mReadyToShow; - - // Set when the window has been shown in the screen the first time. - boolean mHasDrawn; - // Currently running an exit animation? boolean mExiting; @@ -744,7 +734,8 @@ final class WindowState implements WindowManagerPolicy.WindowState { */ public boolean isDrawnLw() { return mHasSurface && !mDestroying && - !mWinAnimator.mDrawPending && !mWinAnimator.mCommitDrawPending; + (mWinAnimator.mDrawState == WindowStateAnimator.READY_TO_SHOW + || mWinAnimator.mDrawState == WindowStateAnimator.HAS_DRAWN); } /** @@ -764,7 +755,7 @@ final class WindowState implements WindowManagerPolicy.WindowState { * sense to call from performLayoutAndPlaceSurfacesLockedInner().) */ boolean shouldAnimateMove() { - return mContentChanged && !mExiting && !mLastHidden && mService.okToDisplay() + return mContentChanged && !mExiting && !mWinAnimator.mLastHidden && mService.okToDisplay() && (mFrame.top != mLastFrame.top || mFrame.left != mLastFrame.left) && (mAttachedWindow == null || !mAttachedWindow.shouldAnimateMove()); @@ -837,10 +828,12 @@ final class WindowState implements WindowManagerPolicy.WindowState { && ((mAttrs.flags & WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE) == 0); } + @Override public boolean hasDrawnLw() { - return mHasDrawn; + return mWinAnimator.mDrawState == WindowStateAnimator.HAS_DRAWN; } + @Override public boolean showLw(boolean doAnimation) { return showLw(doAnimation, true); } @@ -985,7 +978,6 @@ final class WindowState implements WindowManagerPolicy.WindowState { } pw.print(prefix); pw.print("mViewVisibility=0x"); pw.print(Integer.toHexString(mViewVisibility)); - pw.print(" mLastHidden="); pw.print(mLastHidden); pw.print(" mHaveFrame="); pw.print(mHaveFrame); pw.print(" mObscured="); pw.println(mObscured); pw.print(prefix); pw.print("mSeq="); pw.print(mSeq); @@ -1048,12 +1040,6 @@ final class WindowState implements WindowManagerPolicy.WindowState { pw.println(); } mWinAnimator.dump(pw, prefix, dumpAll); - if (dumpAll) { - pw.print(prefix); pw.print("mDrawPending="); pw.print(mWinAnimator.mDrawPending); - pw.print(" mCommitDrawPending="); pw.print(mWinAnimator.mCommitDrawPending); - pw.print(" mReadyToShow="); pw.print(mReadyToShow); - pw.print(" mHasDrawn="); pw.println(mHasDrawn); - } if (mExiting || mRemoveOnExit || mDestroying || mRemoved) { pw.print(prefix); pw.print("mExiting="); pw.print(mExiting); pw.print(" mRemoveOnExit="); pw.print(mRemoveOnExit); diff --git a/services/java/com/android/server/wm/WindowStateAnimator.java b/services/java/com/android/server/wm/WindowStateAnimator.java index 8066e00..4979a4c 100644 --- a/services/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/java/com/android/server/wm/WindowStateAnimator.java @@ -100,14 +100,24 @@ class WindowStateAnimator { // an enter animation. boolean mEnterAnimationPending; - // This is set after the Surface has been created but before the - // window has been drawn. During this time the surface is hidden. - boolean mDrawPending; - - // This is set after the window has finished drawing for the first - // time but before its surface is shown. The surface will be - // displayed when the next layout is run. - boolean mCommitDrawPending; + /** This is set when there is no Surface */ + static final int NO_SURFACE = 0; + /** This is set after the Surface has been created but before the window has been drawn. During + * this time the surface is hidden. */ + static final int DRAW_PENDING = 1; + /** This is set after the window has finished drawing for the first time but before its surface + * is shown. The surface will be displayed when the next layout is run. */ + static final int COMMIT_DRAW_PENDING = 2; + /** This is set during the time after the window's drawing has been committed, and before its + * surface is actually shown. It is used to delay showing the surface until all windows in a + * token are ready to be shown. */ + static final int READY_TO_SHOW = 3; + /** Set when the window has been shown in the screen the first time. */ + static final int HAS_DRAWN = 4; + int mDrawState; + + /** Was this window last hidden? */ + boolean mLastHidden; public WindowStateAnimator(final WindowManagerService service, final WindowState win, final WindowState attachedWindow) { @@ -130,7 +140,7 @@ class WindowStateAnimator { mAnimation.scaleCurrentDuration(mService.mWindowAnimationScale); // Start out animation gone if window is gone, or visible if window is visible. mTransformation.clear(); - mTransformation.setAlpha(mWin.mLastHidden ? 0 : 1); + mTransformation.setAlpha(mLastHidden ? 0 : 1); mHasLocalTransformation = true; } @@ -291,7 +301,7 @@ class WindowStateAnimator { } } mTransformation.clear(); - if (mWin.mHasDrawn + if (mDrawState == HAS_DRAWN && mWin.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING && mWin.mAppToken != null && mWin.mAppToken.firstWindowDrawn @@ -347,7 +357,7 @@ class WindowStateAnimator { } catch (RuntimeException e) { Slog.w(TAG, "Error hiding surface in " + this, e); } - mWin.mLastHidden = true; + mLastHidden = true; } mWin.mExiting = false; if (mWin.mRemoveOnExit) { @@ -357,11 +367,10 @@ class WindowStateAnimator { } boolean finishDrawingLocked() { - if (mDrawPending) { + if (mDrawState == DRAW_PENDING) { if (SHOW_TRANSACTIONS || DEBUG_ORIENTATION) Slog.v( TAG, "finishDrawingLocked: " + this + " in " + mSurface); - mCommitDrawPending = true; - mDrawPending = false; + mDrawState = COMMIT_DRAW_PENDING; return true; } return false; @@ -370,11 +379,10 @@ class WindowStateAnimator { // This must be called while inside a transaction. boolean commitFinishDrawingLocked(long currentTime) { //Slog.i(TAG, "commitFinishDrawingLocked: " + mSurface); - if (!mCommitDrawPending) { + if (mDrawState != COMMIT_DRAW_PENDING) { return false; } - mCommitDrawPending = false; - mWin.mReadyToShow = true; + mDrawState = READY_TO_SHOW; final boolean starting = mWin.mAttrs.type == TYPE_APPLICATION_STARTING; final AppWindowToken atoken = mWin.mAppToken; if (atoken == null || atoken.allDrawn || starting) { @@ -389,9 +397,7 @@ class WindowStateAnimator { mSurfacePendingDestroy = false; if (DEBUG_ORIENTATION) Slog.i(TAG, "createSurface " + this + ": DRAW NOW PENDING"); - mDrawPending = true; - mCommitDrawPending = false; - mWin.mReadyToShow = false; + mDrawState = DRAW_PENDING; if (mWin.mAppToken != null) { mWin.mAppToken.allDrawn = false; } @@ -456,10 +462,12 @@ class WindowStateAnimator { mWin.mHasSurface = false; Slog.w(TAG, "OutOfResourcesException creating surface"); mService.reclaimSomeSurfaceMemoryLocked(this, "create", true); + mDrawState = NO_SURFACE; return null; } catch (Exception e) { mWin.mHasSurface = false; Slog.e(TAG, "Exception creating surface", e); + mDrawState = NO_SURFACE; return null; } @@ -492,7 +500,7 @@ class WindowStateAnimator { Slog.w(TAG, "Error creating surface in " + w, e); mService.reclaimSomeSurfaceMemoryLocked(this, "create-init", true); } - mWin.mLastHidden = true; + mLastHidden = true; } finally { Surface.closeTransaction(); if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, @@ -509,10 +517,8 @@ class WindowStateAnimator { mWin.mAppToken.startingDisplayed = false; } + mDrawState = NO_SURFACE; if (mSurface != null) { - mDrawPending = false; - mCommitDrawPending = false; - mWin.mReadyToShow = false; int i = mWin.mChildWindows.size(); while (i > 0) { @@ -823,9 +829,9 @@ class WindowStateAnimator { } if (w.mAttachedHidden || !w.isReadyForDisplay()) { - if (!w.mLastHidden) { + if (!mLastHidden) { //dump(); - w.mLastHidden = true; + mLastHidden = true; if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(w, "HIDE (performLayout)", null); if (mSurface != null) { @@ -856,7 +862,7 @@ class WindowStateAnimator { || mLastDtDy != mDtDy || w.mLastHScale != w.mHScale || w.mLastVScale != w.mVScale - || w.mLastHidden) { + || mLastHidden) { displayed = true; mLastAlpha = mShownAlpha; mLastLayer = mAnimLayer; @@ -881,6 +887,21 @@ class WindowStateAnimator { mSurface.setMatrix( mDsDx*w.mHScale, mDtDx*w.mVScale, mDsDy*w.mHScale, mDtDy*w.mVScale); + + if (mLastHidden && mDrawState == HAS_DRAWN) { + if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(w, + "SHOW (performLayout)", null); + if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG, "Showing " + w + + " during relayout"); + if (showSurfaceRobustlyLocked()) { + mLastHidden = false; + } else { + w.mOrientationChanging = false; + } + } + if (mSurface != null) { + w.mToken.hasVisible = true; + } } catch (RuntimeException e) { Slog.w(TAG, "Error updating surface in " + w, e); if (!recoveringMemory) { @@ -888,23 +909,6 @@ class WindowStateAnimator { } } } - - if (w.mLastHidden && w.isDrawnLw() - && !w.mReadyToShow) { - if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(w, - "SHOW (performLayout)", null); - if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG, "Showing " + w - + " during relayout"); - if (showSurfaceRobustlyLocked()) { - w.mHasDrawn = true; - w.mLastHidden = false; - } else { - w.mOrientationChanging = false; - } - } - if (mSurface != null) { - w.mToken.hasVisible = true; - } } else { displayed = true; } @@ -961,11 +965,11 @@ class WindowStateAnimator { e.fillInStackTrace(); } Slog.v(TAG, "performShow on " + this - + ": readyToShow=" + mWin.mReadyToShow + " readyForDisplay=" + + ": mDrawState=" + mDrawState + " readyForDisplay=" + mWin.isReadyForDisplay() + " starting=" + (mWin.mAttrs.type == TYPE_APPLICATION_STARTING), e); } - if (mWin.mReadyToShow && mWin.isReadyForDisplay()) { + if (mDrawState == READY_TO_SHOW && mWin.isReadyForDisplay()) { if (SHOW_TRANSACTIONS || DEBUG_ORIENTATION) WindowManagerService.logSurface(mWin, "SHOW (performShowLocked)", null); if (DEBUG_VISIBILITY) Slog.v(TAG, "Showing " + this @@ -987,9 +991,8 @@ class WindowStateAnimator { applyEnterAnimationLocked(); mLastAlpha = -1; - mWin.mHasDrawn = true; - mWin.mLastHidden = false; - mWin.mReadyToShow = false; + mLastHidden = false; + mDrawState = HAS_DRAWN; int i = mWin.mChildWindows.size(); while (i > 0) { @@ -1170,6 +1173,8 @@ class WindowStateAnimator { if (mSurface != null) { if (dumpAll) { pw.print(prefix); pw.print("mSurface="); pw.println(mSurface); + pw.print(prefix); pw.print("mDrawState="); pw.print(mDrawState); + pw.print(" mLastHidden="); pw.println(mLastHidden); } pw.print(prefix); pw.print("Surface: shown="); pw.print(mSurfaceShown); pw.print(" layer="); pw.print(mSurfaceLayer); |