Prevent multiple workspace state animators from being started

-> Probably an issue with the way we're wrapping ViewPropertyAnimator
   which can lead to us acting like it's valid to have multiple
   instances of a VPA. In reality I think this is very problematic.
-> For now, we can just make sure the previous animation is canceled
   if it hasn't yet completed.

Bug 18428886

Change-Id: I097eec08ec68ed098e68866fb5eda72734c51b00
diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java
index 2b520c5..8bd7991 100644
--- a/src/com/android/launcher3/Workspace.java
+++ b/src/com/android/launcher3/Workspace.java
@@ -283,6 +283,7 @@
     private float[] mNewAlphas;
     private int mLastChildCount = -1;
     private float mTransitionProgress;
+    private Animator mStateAnimator = null;
 
     float mOverScrollEffect = 0f;
 
@@ -2243,6 +2244,13 @@
 
         AnimatorSet anim = animated ? LauncherAnimUtils.createAnimatorSet() : null;
 
+        // We only want a single instance of a workspace animation to be running at once, so
+        // we cancel any incomplete transition.
+        if (mStateAnimator != null) {
+            mStateAnimator.cancel();
+        }
+        mStateAnimator = anim;
+
         final State oldState = mState;
         final boolean oldStateIsNormal = (oldState == State.NORMAL);
         final boolean oldStateIsSpringLoaded = (oldState == State.SPRING_LOADED);
@@ -2440,6 +2448,12 @@
             anim.play(hotseatAlpha);
             anim.play(pageIndicatorAlpha);
             anim.setStartDelay(delay);
+            anim.addListener(new AnimatorListenerAdapter() {
+                @Override
+                public void onAnimationEnd(Animator animation) {
+                    mStateAnimator = null;
+                }
+            });
         } else {
             overviewPanel.setAlpha(finalOverviewPanelAlpha);
             AlphaUpdateListener.updateVisibility(overviewPanel);