Merge "Fix state machine sequence causing wallpaper flash."
diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java
index 18b51a7..22949f3 100644
--- a/services/java/com/android/server/wm/WindowManagerService.java
+++ b/services/java/com/android/server/wm/WindowManagerService.java
@@ -1535,7 +1535,7 @@
     }
 
     final boolean isWallpaperVisible(WindowState wallpaperTarget) {
-        if (DEBUG_WALLPAPER) Slog.v(TAG, "Wallpaper vis: target obscured="
+        if (DEBUG_WALLPAPER) Slog.v(TAG, "Wallpaper vis: target " + wallpaperTarget + ", obscured="
                 + (wallpaperTarget != null ? Boolean.toString(wallpaperTarget.mObscured) : "??")
                 + " anim=" + ((wallpaperTarget != null && wallpaperTarget.mAppToken != null)
                         ? wallpaperTarget.mAppToken.animation : null)
@@ -8239,6 +8239,7 @@
                         if (!w.mAnimating) {
                             // We set the animation above so it
                             // is not yet running.
+                            // TODO(cmautner): We lose the enter animation when this occurs.
                             w.clearAnimation();
                         }
                     }
@@ -8342,9 +8343,6 @@
         // cases while they are hidden such as when first showing a
         // window.
         
-        if (mScreenRotationAnimation != null) {
-            mScreenRotationAnimation.updateSurfaces();
-        }
         boolean displayed = false;
 
         w.computeShownFrameLocked();
@@ -8852,6 +8850,10 @@
             mInnerFields.mDimming = false;
             mInnerFields.mSyswin = false;
 
+            if (mScreenRotationAnimation != null) {
+                mScreenRotationAnimation.updateSurfaces();
+            }
+
             final int N = mWindows.size();
 
             for (i=N-1; i>=0; i--) {
diff --git a/services/java/com/android/server/wm/WindowState.java b/services/java/com/android/server/wm/WindowState.java
index b9ee660..167746f 100644
--- a/services/java/com/android/server/wm/WindowState.java
+++ b/services/java/com/android/server/wm/WindowState.java
@@ -304,6 +304,11 @@
     int mAnimDw;
     int mAnimDh;
 
+    static final int ANIM_STATE_IDLE = 0;
+    static final int ANIM_STATE_RUNNING = 1;
+    static final int ANIM_STATE_STOPPING = 2;
+    int mAnimState = ANIM_STATE_IDLE;
+
     WindowState(WindowManagerService service, Session s, IWindow c, WindowToken token,
            WindowState attachedWindow, int seq, WindowManager.LayoutParams a,
            int viewVisibility) {
@@ -640,6 +645,7 @@
             mLocalAnimating = false;
             mAnimation.cancel();
             mAnimation = null;
+            mAnimState = ANIM_STATE_IDLE;
         }
     }
 
@@ -651,6 +657,7 @@
             mAnimation.cancel();
             mAnimation = null;
             destroySurfaceLocked();
+            mAnimState = ANIM_STATE_IDLE;
         }
         mExiting = false;
     }
@@ -968,6 +975,7 @@
                         mAnimation = null;
                         // Make sure we clean up the animation.
                         mAnimating = true;
+                        mAnimState = ANIM_STATE_IDLE;
                     }
                     mService.mFinishedStarting.add(mAppToken);
                     mService.mH.sendEmptyMessage(H.FINISHED_STARTING);
@@ -980,7 +988,7 @@
 
     @Override
     public boolean stepAnimation(long currentTime) {
-        if ((mAnimation == null) || !mLocalAnimating) {
+        if ((mAnimation == null) || !mLocalAnimating || (mAnimState != ANIM_STATE_RUNNING)) {
             return false;
         }
         mTransformation.clear();
@@ -989,8 +997,7 @@
             WindowManagerService.TAG, "Stepped animation in " + this +
             ": more=" + more + ", xform=" + mTransformation);
         if (!more) {
-            mAnimation.cancel();
-            mAnimation = null;
+            mAnimState = ANIM_STATE_STOPPING;
         }
         return more;
     }
@@ -1018,8 +1025,10 @@
                     mAnimation.setStartTime(currentTime);
                     mLocalAnimating = true;
                     mAnimating = true;
+                    mAnimState = ANIM_STATE_RUNNING;
                 }
-                if ((mAnimation != null) && mLocalAnimating) {
+                if ((mAnimation != null) && mLocalAnimating && 
+                        (mAnimState != ANIM_STATE_STOPPING)) {
                     return true;
                 }
                 if (WindowManagerService.DEBUG_ANIM) Slog.v(
@@ -1120,6 +1129,7 @@
             mAppToken.updateReportedVisibilityLocked();
         }
 
+        mAnimState = ANIM_STATE_IDLE;
         return false;
     }
 
@@ -1305,12 +1315,15 @@
             }
 
             if (WindowManagerService.localLOGV) Slog.v(
-                WindowManagerService.TAG, "Continuing animation in " + this +
+                WindowManagerService.TAG, "computeShownFrameLocked: Animating " + this +
                 ": " + mShownFrame +
-                ", alpha=" + mTransformation.getAlpha());
+                ", alpha=" + mTransformation.getAlpha() + ", mShownAlpha=" + mShownAlpha);
             return;
         }
 
+        if (WindowManagerService.localLOGV) Slog.v(
+            WindowManagerService.TAG, "computeShownFrameLocked: " + this +
+            " not attached, mAlpha=" + mAlpha);
         mShownFrame.set(mFrame);
         if (mXOffset != 0 || mYOffset != 0) {
             mShownFrame.offset(mXOffset, mYOffset);
@@ -1428,13 +1441,11 @@
                 mService.mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
             return false;
         }
-        final AppWindowToken atoken = mAppToken;
-        final boolean animating = atoken != null
-                ? (atoken.animation != null) : false;
         return mSurface != null && mPolicyVisibility && !mDestroying
                 && ((!mAttachedHidden && mViewVisibility == View.VISIBLE
                                 && !mRootToken.hidden)
-                        || mAnimation != null || animating);
+                        || mAnimation != null
+                        || ((mAppToken != null) && (mAppToken.animation != null)));
     }
 
     /** Is the window or its container currently animating? */