Merge "Actually call LauncherTransitionable.onLauncherTransitionStep()." into ub-launcher3-burnaby-polish
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index f64631b..8679ec7 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -3792,6 +3792,7 @@
      *
      * Implementation of the method from LauncherModel.Callbacks.
      */
+    @Override
     public void bindItems(final ArrayList<ItemInfo> shortcuts, final int start, final int end,
                           final boolean forceAnimateIcons) {
         Runnable r = new Runnable() {
diff --git a/src/com/android/launcher3/LauncherAnimUtils.java b/src/com/android/launcher3/LauncherAnimUtils.java
index 6a248a3..fa20f03 100644
--- a/src/com/android/launcher3/LauncherAnimUtils.java
+++ b/src/com/android/launcher3/LauncherAnimUtils.java
@@ -24,7 +24,6 @@
 import android.annotation.TargetApi;
 import android.os.Build;
 import android.view.View;
-import android.view.ViewAnimationUtils;
 import android.view.ViewTreeObserver;
 
 import com.android.launcher3.util.UiThreadCircularReveal;
@@ -59,24 +58,25 @@
     // it should be cancelled
     public static void startAnimationAfterNextDraw(final Animator animator, final View view) {
         view.getViewTreeObserver().addOnDrawListener(new ViewTreeObserver.OnDrawListener() {
-                private boolean mStarted = false;
-                public void onDraw() {
-                    if (mStarted) return;
-                    mStarted = true;
-                    // Use this as a signal that the animation was cancelled
-                    if (animator.getDuration() == 0) {
-                        return;
-                    }
-                    animator.start();
+            private boolean mStarted = false;
 
-                    final ViewTreeObserver.OnDrawListener listener = this;
-                    view.post(new Runnable() {
-                            public void run() {
-                                view.getViewTreeObserver().removeOnDrawListener(listener);
-                            }
-                        });
+            public void onDraw() {
+                if (mStarted) return;
+                mStarted = true;
+                // Use this as a signal that the animation was cancelled
+                if (animator.getDuration() == 0) {
+                    return;
                 }
-            });
+                animator.start();
+
+                final ViewTreeObserver.OnDrawListener listener = this;
+                view.post(new Runnable() {
+                    public void run() {
+                        view.getViewTreeObserver().removeOnDrawListener(listener);
+                    }
+                });
+            }
+        });
     }
 
     public static void onDestroyActivity() {
diff --git a/src/com/android/launcher3/LauncherStateTransitionAnimation.java b/src/com/android/launcher3/LauncherStateTransitionAnimation.java
index 47b0a91..3391d06 100644
--- a/src/com/android/launcher3/LauncherStateTransitionAnimation.java
+++ b/src/com/android/launcher3/LauncherStateTransitionAnimation.java
@@ -22,6 +22,7 @@
 import android.animation.ObjectAnimator;
 import android.animation.PropertyValuesHolder;
 import android.animation.TimeInterpolator;
+import android.animation.ValueAnimator;
 import android.annotation.SuppressLint;
 import android.content.res.Resources;
 import android.util.Log;
@@ -229,6 +230,8 @@
         startWorkspaceSearchBarAnimation(animation, fromWorkspaceState, toWorkspaceState,
                 animated ? revealDuration : 0, overlaySearchBarView);
 
+        Animator updateTransitionStepAnim = dispatchOnLauncherTransitionStepAnim(fromView, toView);
+
         if (animated && initialized) {
             // Setup the reveal view animation
             int width = revealView.getMeasuredWidth();
@@ -342,11 +345,12 @@
                 animation.play(workspaceAnim);
             }
 
+            animation.play(updateTransitionStepAnim);
+
             // Dispatch the prepare transition signal
             dispatchOnLauncherTransitionPrepare(fromView, animated, false);
             dispatchOnLauncherTransitionPrepare(toView, animated, false);
 
-
             final AnimatorSet stateAnimation = animation;
             final Runnable startAnimRunnable = new Runnable() {
                 public void run() {
@@ -402,6 +406,24 @@
     }
 
     /**
+     * Returns an Animator that calls {@link #dispatchOnLauncherTransitionStep(View, float)} on
+     * {@param fromView} and {@param toView} as the animation interpolates.
+     *
+     * This is a bit hacky: we create a dummy ValueAnimator just for the AnimatorUpdateListener.
+     */
+    private Animator dispatchOnLauncherTransitionStepAnim(final View fromView, final View toView) {
+        ValueAnimator updateAnimator = ValueAnimator.ofFloat(0, 1);
+        updateAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+            @Override
+            public void onAnimationUpdate(ValueAnimator animation) {
+                dispatchOnLauncherTransitionStep(fromView, animation.getAnimatedFraction());
+                dispatchOnLauncherTransitionStep(toView, animation.getAnimatedFraction());
+            }
+        });
+        return updateAnimator;
+    }
+
+    /**
      * Starts and animation to the workspace from the apps view.
      */
     private void startAnimationToWorkspaceFromAllApps(final Workspace.State fromWorkspaceState,
@@ -509,12 +531,16 @@
         startWorkspaceSearchBarAnimation(animation, fromWorkspaceState, toWorkspaceState,
                 animated ? revealDuration : 0, overlaySearchBarView);
 
+        Animator updateTransitionStepAnim = dispatchOnLauncherTransitionStepAnim(fromView, toView);
+
         if (animated && initialized) {
             // Play the workspace animation
             if (workspaceAnim != null) {
                 animation.play(workspaceAnim);
             }
 
+            animation.play(updateTransitionStepAnim);
+
             // hideAppsCustomizeHelper is called in some cases when it is already hidden
             // don't perform all these no-op animations. In particularly, this was causing
             // the all-apps button to pop in and out.