Merge "Fix logic problems in AnimationDrawable and View."
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index fc95724..2734abc 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -11325,10 +11325,9 @@
                 attachInfo.mHandler.removeCallbacks(action);
                 attachInfo.mViewRootImpl.mChoreographer.removeCallbacks(
                         Choreographer.CALLBACK_ANIMATION, action, null);
-            } else {
-                // Assume that post will succeed later
-                ViewRootImpl.getRunQueue().removeCallbacks(action);
             }
+            // Assume that post will succeed later
+            ViewRootImpl.getRunQueue().removeCallbacks(action);
         }
         return true;
     }
@@ -15103,9 +15102,8 @@
             if (mAttachInfo != null) {
                 mAttachInfo.mViewRootImpl.mChoreographer.removeCallbacks(
                         Choreographer.CALLBACK_ANIMATION, what, who);
-            } else {
-                ViewRootImpl.getRunQueue().removeCallbacks(what);
             }
+            ViewRootImpl.getRunQueue().removeCallbacks(what);
         }
     }
 
diff --git a/graphics/java/android/graphics/drawable/AnimationDrawable.java b/graphics/java/android/graphics/drawable/AnimationDrawable.java
index bde978d..02b2588 100644
--- a/graphics/java/android/graphics/drawable/AnimationDrawable.java
+++ b/graphics/java/android/graphics/drawable/AnimationDrawable.java
@@ -81,6 +81,7 @@
 public class AnimationDrawable extends DrawableContainer implements Runnable, Animatable {
     private final AnimationState mAnimationState;
     private int mCurFrame = -1;
+    private boolean mAnimating;
     private boolean mMutated;
 
     public AnimationDrawable() {
@@ -137,7 +138,7 @@
      * @return true if the animation is running, false otherwise
      */
     public boolean isRunning() {
-        return mCurFrame > -1;
+        return mAnimating;
     }
 
     /**
@@ -153,6 +154,7 @@
     @Override
     public void unscheduleSelf(Runnable what) {
         mCurFrame = -1;
+        mAnimating = false;
         super.unscheduleSelf(what);
     }
 
@@ -222,12 +224,13 @@
         }
         mCurFrame = frame;
         selectDrawable(frame);
-        if (unschedule) {
+        if (unschedule || animate) {
             unscheduleSelf(this);
         }
         if (animate) {
-            // Unscheduling may have clobbered this value; restore it to record that we're animating
+            // Unscheduling may have clobbered these values; restore them
             mCurFrame = frame;
+            mAnimating = true;
             scheduleSelf(this, SystemClock.uptimeMillis() + mAnimationState.mDurations[frame]);
         }
     }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/AnimatedImageView.java b/packages/SystemUI/src/com/android/systemui/statusbar/AnimatedImageView.java
index 7d3e870..9839fe9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/AnimatedImageView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/AnimatedImageView.java
@@ -38,7 +38,7 @@
     }
 
     private void updateAnim() {
-        Drawable drawable = mAttached ? getDrawable() : null;
+        Drawable drawable = getDrawable();
         if (mAttached && mAnim != null) {
             mAnim.stop();
         }