Add container velocity for all apps to be used by the caret

Change-Id: I03479d53eb7203ab4a0515e2bf68b917dfb81f23
diff --git a/src/com/android/launcher3/allapps/AllAppsTransitionController.java b/src/com/android/launcher3/allapps/AllAppsTransitionController.java
index 40244b2..eb6c926 100644
--- a/src/com/android/launcher3/allapps/AllAppsTransitionController.java
+++ b/src/com/android/launcher3/allapps/AllAppsTransitionController.java
@@ -78,7 +78,7 @@
     private float mShiftRange;      // changes depending on the orientation
     private float mProgress;        // [0, 1], mShiftRange * mProgress = shiftCurrent
 
-    private float mVelocityForCaret;
+    private float mContainerVelocity;
 
     private static final float DEFAULT_SHIFT_RANGE = 10;
 
@@ -208,7 +208,7 @@
             return false;   // early termination.
         }
 
-        mVelocityForCaret = velocity;
+        mContainerVelocity = velocity;
 
         float shift = Math.min(Math.max(0, mShiftStart + displacement), mShiftRange);
         setProgress(shift / mShiftRange);
@@ -305,9 +305,10 @@
     }
 
     /**
-     * @param progress value between 0 and 1
+     * @param progress       value between 0 and 1, 0 shows all apps and 1 shows workspace
      */
     public void setProgress(float progress) {
+        float shiftPrevious = mProgress * mShiftRange;
         mProgress = progress;
         float shiftCurrent = progress * mShiftRange;
 
@@ -339,6 +340,15 @@
                 interpolation);
         updateCaret(progress);
         updateLightStatusBar(shiftCurrent);
+
+        if (!mDetector.isDraggingState()) {
+            mContainerVelocity = mDetector.computeVelocity(shiftCurrent - shiftPrevious,
+                    System.currentTimeMillis());
+        }
+    }
+
+    public float getContainerVelocity() {
+        return mContainerVelocity;
     }
 
     public float getProgress() {
@@ -361,7 +371,6 @@
             return;
         }
         if (mDetector.isIdleState()) {
-            mVelocityForCaret = -VerticalPullDetector.RELEASE_VELOCITY_PX_MS;
             preparePull(true);
             mAnimationDuration = duration;
             mShiftStart = mAppsView.getTranslationY();
@@ -434,7 +443,6 @@
         }
         Interpolator interpolator;
         if (mDetector.isIdleState()) {
-            mVelocityForCaret = VerticalPullDetector.RELEASE_VELOCITY_PX_MS;
             preparePull(true);
             mAnimationDuration = duration;
             mShiftStart = mAppsView.getTranslationY();
@@ -513,7 +521,7 @@
         if (0f < shift && shift < 1f && !mLauncher.useVerticalBarLayout()) {
             // How fast are we moving as a percentage of the minimum fling velocity?
             final float pctOfFlingVelocity = Math.max(-1, Math.min(
-                    mVelocityForCaret / VerticalPullDetector.RELEASE_VELOCITY_PX_MS, 1));
+                    mContainerVelocity / VerticalPullDetector.RELEASE_VELOCITY_PX_MS, 1));
 
             mCaretDrawable.setCaretProgress(pctOfFlingVelocity);
 
diff --git a/src/com/android/launcher3/allapps/VerticalPullDetector.java b/src/com/android/launcher3/allapps/VerticalPullDetector.java
index 6eab1c0..ab2b6ed 100644
--- a/src/com/android/launcher3/allapps/VerticalPullDetector.java
+++ b/src/com/android/launcher3/allapps/VerticalPullDetector.java
@@ -93,10 +93,9 @@
 
     private float mDownX;
     private float mDownY;
-    private float mDownMillis;
 
     private float mLastY;
-    private float mLastMillis;
+    private long mCurrentMillis;
 
     private float mVelocity;
     private float mLastDisplacement;
@@ -153,7 +152,6 @@
     public boolean onTouchEvent(MotionEvent ev) {
         switch (ev.getAction()) {
             case MotionEvent.ACTION_DOWN:
-                mDownMillis = ev.getDownTime();
                 mDownX = ev.getX();
                 mDownY = ev.getY();
                 mLastDisplacement = 0;
@@ -167,7 +165,7 @@
             case MotionEvent.ACTION_MOVE:
                 mDisplacementX = ev.getX() - mDownX;
                 mDisplacementY = ev.getY() - mDownY;
-                mVelocity = computeVelocity(ev, mVelocity);
+                computeVelocity(ev);
 
                 // handle state and listener calls.
                 if (mState != ScrollState.DRAGGING && shouldScrollStart()) {
@@ -190,10 +188,7 @@
         }
         // Do house keeping.
         mLastDisplacement = mDisplacementY;
-
         mLastY = ev.getY();
-        mLastMillis = ev.getEventTime();
-
         return true;
     }
 
@@ -245,21 +240,23 @@
     /**
      * Computes the damped velocity using the two motion events and the previous velocity.
      */
-    private float computeVelocity(MotionEvent to, float previousVelocity) {
-        float delta = computeDelta(to);
-
-        float deltaTimeMillis = to.getEventTime() - mLastMillis;
-        float velocity = (deltaTimeMillis > 0) ? (delta / deltaTimeMillis) : 0;
-        if (Math.abs(previousVelocity) < 0.001f) {
-            return velocity;
-        }
-
-        float alpha = computeDampeningFactor(deltaTimeMillis);
-        return interpolate(previousVelocity, velocity, alpha);
+    private float computeVelocity(MotionEvent to) {
+        return computeVelocity(to.getY() - mLastY, to.getEventTime());
     }
 
-    private float computeDelta(MotionEvent to) {
-        return to.getY() - mLastY;
+    public float computeVelocity(float delta, long currentMillis) {
+        long previousMillis = mCurrentMillis;
+        mCurrentMillis = currentMillis;
+
+        float deltaTimeMillis = mCurrentMillis - previousMillis;
+        float velocity = (deltaTimeMillis > 0) ? (delta / deltaTimeMillis) : 0;
+        if (Math.abs(mVelocity) < 0.001f) {
+            mVelocity = velocity;
+        } else {
+            float alpha = computeDampeningFactor(deltaTimeMillis);
+            mVelocity = interpolate(mVelocity, velocity, alpha);
+        }
+        return mVelocity;
     }
 
     /**