Merge "Refactor to convert four state booleans to int."
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 @@
                 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 @@
                         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 @@
                         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 b4b10b1..afbc348 100644
--- a/services/java/com/android/server/wm/WindowManagerService.java
+++ b/services/java/com/android/server/wm/WindowManagerService.java
@@ -1589,8 +1589,7 @@
                 }
             }
             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 @@
                     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 @@
                                 + 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 @@
     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 @@
     // 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 @@
      */
     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 @@
      * 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 @@
                 && ((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 @@
             }
             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 @@
                     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 @@
     // 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 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;
 
-    // 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;
+    /** Was this window last hidden? */
+    boolean mLastHidden;
 
     public WindowStateAnimator(final WindowManagerService service, final WindowState win,
                                final WindowState attachedWindow) {
@@ -130,7 +140,7 @@
         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 @@
             }
         }
         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 @@
             } 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 @@
     }
 
     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 @@
     // 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 @@
             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 @@
                 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 @@
                     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 @@
             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 @@
         }
 
         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 @@
                 || mLastDtDy != mDtDy
                 || w.mLastHScale != w.mHScale
                 || w.mLastVScale != w.mVScale
-                || w.mLastHidden) {
+                || mLastHidden) {
             displayed = true;
             mLastAlpha = mShownAlpha;
             mLastLayer = mAnimLayer;
@@ -881,6 +887,21 @@
                     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 @@
                     }
                 }
             }
-
-            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 @@
                 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 @@
             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 @@
         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);