Use autoscroller to handle drag scrolling

Change-Id: Ie094cbfa91f898133f84ad9ffc349d8cfa07e668
diff --git a/src/com/android/launcher3/RampUpScroller.java b/src/com/android/launcher3/RampUpScroller.java
new file mode 100644
index 0000000..89eb579
--- /dev/null
+++ b/src/com/android/launcher3/RampUpScroller.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.launcher3;
+
+import android.view.animation.AccelerateInterpolator;
+import android.view.animation.AnimationUtils;
+import android.view.animation.Interpolator;
+
+/**
+ * Scroller that gradually reaches a target velocity.
+ */
+class RampUpScroller {
+    private final Interpolator mInterpolator;
+    private final long mRampUpTime;
+
+    private long mStartTime;
+    private long mDeltaTime;
+    private float mTargetVelocityX;
+    private float mTargetVelocityY;
+    private int mDeltaX;
+    private int mDeltaY;
+
+    /**
+     * Creates a new ramp-up scroller that reaches full velocity after a
+     * specified duration.
+     *
+     * @param rampUpTime Duration before the scroller reaches target velocity.
+     */
+    public RampUpScroller(long rampUpTime) {
+        mInterpolator = new AccelerateInterpolator();
+        mRampUpTime = rampUpTime;
+    }
+
+    /**
+     * Starts the scroller at the current animation time.
+     */
+    public void start() {
+        mStartTime = AnimationUtils.currentAnimationTimeMillis();
+        mDeltaTime = mStartTime;
+    }
+
+    /**
+     * Computes the current scroll deltas. This usually only be called after
+     * starting the scroller with {@link #start()}.
+     *
+     * @see #getDeltaX()
+     * @see #getDeltaY()
+     */
+    public void computeScrollDelta() {
+        final long currentTime = AnimationUtils.currentAnimationTimeMillis();
+        final long elapsedSinceStart = currentTime - mStartTime;
+        final float scale;
+        if (elapsedSinceStart < mRampUpTime) {
+            scale = mInterpolator.getInterpolation((float) elapsedSinceStart / mRampUpTime);
+        } else {
+            scale = 1f;
+        }
+
+        final long elapsedSinceDelta = currentTime - mDeltaTime;
+        mDeltaTime = currentTime;
+
+        mDeltaX = (int) (elapsedSinceDelta * scale * mTargetVelocityX);
+        mDeltaY = (int) (elapsedSinceDelta * scale * mTargetVelocityY);
+    }
+
+    /**
+     * Sets the target velocity for this scroller.
+     *
+     * @param x The target X velocity in pixels per millisecond.
+     * @param y The target Y velocity in pixels per millisecond.
+     */
+    public void setTargetVelocity(float x, float y) {
+        mTargetVelocityX = x;
+        mTargetVelocityY = y;
+    }
+
+    /**
+     * @return The target X velocity for this scroller.
+     */
+    public float getTargetVelocityX() {
+        return mTargetVelocityX;
+    }
+
+    /**
+     * @return The target Y velocity for this scroller.
+     */
+    public float getTargetVelocityY() {
+        return mTargetVelocityY;
+    }
+
+    /**
+     * The distance traveled in the X-coordinate computed by the last call to
+     * {@link #computeScrollDelta()}.
+     */
+    public int getDeltaX() {
+        return mDeltaX;
+    }
+
+    /**
+     * The distance traveled in the Y-coordinate computed by the last call to
+     * {@link #computeScrollDelta()}.
+     */
+    public int getDeltaY() {
+        return mDeltaY;
+    }
+}