Implement new physics model for scroll.
diff --git a/src/com/android/launcher2/AllAppsView.java b/src/com/android/launcher2/AllAppsView.java
index 95f36d6..03734c0 100644
--- a/src/com/android/launcher2/AllAppsView.java
+++ b/src/com/android/launcher2/AllAppsView.java
@@ -85,11 +85,11 @@
     private int mPageCount;
     private boolean mStartedScrolling;
     private VelocityTracker mVelocity;
-    private int mLastScrollX;
     private int mLastMotionX;
     private int mMotionDownRawX;
     private int mMotionDownRawY;
     private int mScrollHandleTop;
+    private long mTouchTime;
 
     static class Defines {
         private static float farSize(float sizeAt0) {
@@ -191,16 +191,17 @@
             mMotionDownRawY = (int)ev.getRawY();
             mLastMotionX = x;
             mRollo.mState.read();
-            mRollo.mState.startScrollX = mRollo.mState.scrollX = mLastScrollX
-                    = mRollo.mState.currentScrollX;
-            if (mRollo.mState.flingVelocityX != 0) {
+
+            mRollo.mState.newPositionX = ev.getRawX() / Defines.SCREEN_WIDTH_PX;
+            mRollo.mState.newTouchDown = 1;
+
+            if (mRollo.mState.readVel != 0) {
                 mRollo.clearSelectedIcon();
             } else {
-                mRollo.selectIcon(x, (int)ev.getY(), mRollo.mState.startScrollX,
-                        (-mRollo.mState.startScrollX / Defines.SCREEN_WIDTH_PX));
+                mRollo.selectIcon(x, (int)ev.getY(), mRollo.mState.readPosX);
             }
-            mRollo.mState.flingVelocityX = 0;
             mRollo.mState.save();
+            mRollo.mInvokeMove.execute();
             mVelocity = VelocityTracker.obtain();
             mVelocity.addMovement(ev);
             mStartedScrolling = false;
@@ -212,25 +213,31 @@
                 // don't update mLastMotionX so slop is right and when we do start scrolling
                 // below, we get the right delta.
             } else {
+
+                mRollo.mState.newPositionX = ev.getRawX() / Defines.SCREEN_WIDTH_PX;
+                mRollo.mState.newTouchDown = 1;
+                mRollo.mInvokeMove.execute();
+
                 mStartedScrolling = true;
                 mRollo.clearSelectedIcon();
                 deltaX = x - mLastMotionX;
                 mVelocity.addMovement(ev);
-                mRollo.mState.currentScrollX = mLastScrollX;
-                mLastScrollX += deltaX;
-                mRollo.mState.scrollX = mLastScrollX;
                 mRollo.mState.save();
                 mLastMotionX = x;
             }
             break;
         case MotionEvent.ACTION_UP:
         case MotionEvent.ACTION_CANCEL:
+
+            mRollo.mState.newPositionX = ev.getRawX() / Defines.SCREEN_WIDTH_PX;
+            mRollo.mState.newTouchDown = 0;
+
             mVelocity.computeCurrentVelocity(1000 /* px/sec */,
                     mConfig.getScaledMaximumFlingVelocity());
-            mRollo.mState.flingTimeMs = (int)SystemClock.uptimeMillis(); // TODO: use long
-            mRollo.mState.flingVelocityX = (int)mVelocity.getXVelocity();
+            mRollo.mState.flingVelocityX = mVelocity.getXVelocity() / Defines.SCREEN_WIDTH_PX;
             mRollo.clearSelectedIcon();
             mRollo.mState.save();
+            mRollo.mInvokeFling.execute();
             mLastMotionX = -10000;
             mVelocity.recycle();
             mVelocity = null;
@@ -354,6 +361,10 @@
 
         private Resources mRes;
         private Script mScript;
+
+        private Script.Invokable mInvokeMove;
+        private Script.Invokable mInvokeFling;
+
         private Sampler mSampler;
         private Sampler mSamplerText;
         private ProgramStore mPSBackground;
@@ -417,14 +428,13 @@
         }
 
         class State extends BaseAlloc {
+            public float newPositionX;
+            public int newTouchDown;
+            public float readPosX;
+            public float readVel;
+            public float flingVelocityX;
             public int iconCount;
             public int scrollX;
-            public int flingTimeMs;
-            public float flingVelocityX;
-            public int currentScrollX;
-            public int flingDuration;
-            public int flingEndPos;
-            public int startScrollX;
             public int selectedIconIndex = -1;
             public int selectedIconTexture;
             public int visible;
@@ -564,6 +574,8 @@
             sb.addDefines(Defines.class);
             sb.setType(mParams.mType, "params", Defines.ALLOC_PARAMS);
             sb.setType(mState.mType, "state", Defines.ALLOC_STATE);
+            mInvokeMove = sb.addInvokable("move");
+            mInvokeFling = sb.addInvokable("fling");
             mScript = sb.create();
             mScript.setClearColor(0.0f, 0.0f, 0.0f, 0.0f);
 
@@ -653,7 +665,9 @@
             mAllocTouchXBorders.data(mTouchXBorders);
         }
 
-        int chooseTappedIcon(int x, int y, int scrollX, int currentPage) {
+        int chooseTappedIcon(int x, int y, float page) {
+            int currentPage = (int)page;
+
             int col = -1;
             int row = -1;
 
@@ -681,8 +695,8 @@
         /**
          * You need to call save() on mState on your own after calling this.
          */
-        void selectIcon(int x, int y, int scrollX, int currentPage) {
-            int index = chooseTappedIcon(x, y, scrollX, currentPage);
+        void selectIcon(int x, int y, float pos) {
+            int index = chooseTappedIcon(x, y, pos);
             selectIcon(index);
         }