Cleaning up animation code

- replacing ValueAnimators with ObjectAnimators
- using ViewPropertyAnimator for All Apps->Workspace transition
- add multiple listener support to LauncherViewPropertyAnimator

Change-Id: I794dab6138fb23c5be963e2eb562965b5de857cf
diff --git a/src/com/android/launcher2/Launcher.java b/src/com/android/launcher2/Launcher.java
index 45a9e31..438a5d9 100644
--- a/src/com/android/launcher2/Launcher.java
+++ b/src/com/android/launcher2/Launcher.java
@@ -2236,13 +2236,10 @@
 
             toView.setVisibility(View.VISIBLE);
             toView.setAlpha(0f);
-            ValueAnimator alphaAnim = ValueAnimator.ofFloat(0f, 1f).setDuration(fadeDuration);
+            final ObjectAnimator alphaAnim = ObjectAnimator
+                .ofFloat(toView, "alpha", 0f, 1f)
+                .setDuration(fadeDuration);
             alphaAnim.setInterpolator(new DecelerateInterpolator(1.5f));
-            alphaAnim.addUpdateListener(new LauncherAnimatorUpdateListener() {
-                public void onAnimationUpdate(float a, float b) {
-                    toView.setAlpha(a * 0f + b * 1f);
-                }
-            });
 
             // toView should appear right at the end of the workspace shrink
             // animation
@@ -2264,11 +2261,6 @@
                 }
                 @Override
                 public void onAnimationEnd(Animator animation) {
-                    // If we don't set the final scale values here, if this animation is cancelled
-                    // it will have the wrong scale value and subsequent cameraPan animations will
-                    // not fix that
-                    toView.setScaleX(1.0f);
-                    toView.setScaleY(1.0f);
                     if (toView instanceof LauncherTransitionable) {
                         ((LauncherTransitionable) toView).onLauncherTransitionEnd(instance,
                                 scaleAnim, false);
@@ -2365,6 +2357,8 @@
         final Launcher instance = this;
 
         final int duration = res.getInteger(R.integer.config_appsCustomizeZoomOutTime);
+        final int fadeOutDuration =
+                res.getInteger(R.integer.config_appsCustomizeFadeOutTime);
         final float scaleFactor = (float)
                 res.getInteger(R.integer.config_appsCustomizeZoomScaleFactor);
         final View fromView = mAppsCustomizeTabHost;
@@ -2386,22 +2380,18 @@
             final float oldScaleX = fromView.getScaleX();
             final float oldScaleY = fromView.getScaleY();
 
-            ValueAnimator scaleAnim = ValueAnimator.ofFloat(0f, 1f).setDuration(duration);
-            scaleAnim.setInterpolator(new Workspace.ZoomInInterpolator());
-            scaleAnim.addUpdateListener(new LauncherAnimatorUpdateListener() {
-                public void onAnimationUpdate(float a, float b) {
-                    fromView.setScaleX(a * oldScaleX + b * scaleFactor);
-                    fromView.setScaleY(a * oldScaleY + b * scaleFactor);
-                }
-            });
-            final ValueAnimator alphaAnim = ValueAnimator.ofFloat(0f, 1f);
-            alphaAnim.setDuration(res.getInteger(R.integer.config_appsCustomizeFadeOutTime));
+            final LauncherViewPropertyAnimator scaleAnim =
+                    new LauncherViewPropertyAnimator(fromView);
+            scaleAnim.
+                scaleX(scaleFactor).scaleY(scaleFactor).
+                setDuration(duration).
+                setInterpolator(new Workspace.ZoomInInterpolator());
+
+            final ObjectAnimator alphaAnim = ObjectAnimator
+                .ofFloat(fromView, "alpha", 1f, 0f)
+                .setDuration(fadeOutDuration);
             alphaAnim.setInterpolator(new AccelerateDecelerateInterpolator());
-            alphaAnim.addUpdateListener(new LauncherAnimatorUpdateListener() {
-                public void onAnimationUpdate(float a, float b) {
-                    fromView.setAlpha(a * 1f + b * 0f);
-                }
-            });
+
             if (fromView instanceof LauncherTransitionable) {
                 ((LauncherTransitionable) fromView).onLauncherTransitionStart(instance, alphaAnim,
                         true);
diff --git a/src/com/android/launcher2/LauncherViewPropertyAnimator.java b/src/com/android/launcher2/LauncherViewPropertyAnimator.java
index b31179d..88b4cb4 100644
--- a/src/com/android/launcher2/LauncherViewPropertyAnimator.java
+++ b/src/com/android/launcher2/LauncherViewPropertyAnimator.java
@@ -50,19 +50,17 @@
     long mStartDelay;
     long mDuration;
     TimeInterpolator mInterpolator;
-    Animator.AnimatorListener mListener;
+    ArrayList<Animator.AnimatorListener> mListeners;
     boolean mRunning = false;
 
     public LauncherViewPropertyAnimator(View target) {
         mTarget = target;
+        mListeners = new ArrayList<Animator.AnimatorListener>();
     }
 
     @Override
     public void addListener(Animator.AnimatorListener listener) {
-        if (mListener != null) {
-            throw new RuntimeException("Only one listener supported");
-        }
-        mListener = listener;
+        mListeners.add(listener);
     }
 
     @Override
@@ -89,7 +87,7 @@
 
     @Override
     public ArrayList<Animator.AnimatorListener> getListeners() {
-        return null;
+        return mListeners;
     }
 
     @Override
@@ -99,31 +97,35 @@
 
     @Override
     public void onAnimationCancel(Animator animation) {
-        if (mListener != null) {
-            mListener.onAnimationCancel(this);
+        for (int i = 0; i < mListeners.size(); i++) {
+            Animator.AnimatorListener listener = mListeners.get(i);
+            listener.onAnimationCancel(this);
         }
         mRunning = false;
     }
 
     @Override
     public void onAnimationEnd(Animator animation) {
-        if (mListener != null) {
-            mListener.onAnimationEnd(this);
+        for (int i = 0; i < mListeners.size(); i++) {
+            Animator.AnimatorListener listener = mListeners.get(i);
+            listener.onAnimationEnd(this);
         }
         mRunning = false;
     }
 
     @Override
     public void onAnimationRepeat(Animator animation) {
-        if (mListener != null) {
-            mListener.onAnimationRepeat(this);
+        for (int i = 0; i < mListeners.size(); i++) {
+            Animator.AnimatorListener listener = mListeners.get(i);
+            listener.onAnimationRepeat(this);
         }
     }
 
     @Override
     public void onAnimationStart(Animator animation) {
-        if (mListener != null) {
-            mListener.onAnimationStart(this);
+        for (int i = 0; i < mListeners.size(); i++) {
+            Animator.AnimatorListener listener = mListeners.get(i);
+            listener.onAnimationStart(this);
         }
         mRunning = true;
     }
@@ -140,16 +142,12 @@
 
     @Override
     public void removeAllListeners() {
-        mListener = null;
+        mListeners.clear();
     }
 
     @Override
     public void removeListener(Animator.AnimatorListener listener) {
-        if (mListener == listener) {
-            mListener = null;
-        } else {
-            throw new RuntimeException("Removing listener that wasn't set");
-        }
+        mListeners.remove(listener);
     }
 
     @Override