Add support for MoveTo.
diff --git a/res/raw/rollo3.c b/res/raw/rollo3.c
index bb02373..253709a 100644
--- a/res/raw/rollo3.c
+++ b/res/raw/rollo3.c
@@ -22,6 +22,10 @@
 float g_OldPosPage;
 float g_OldPosVelocity;
 float g_OldZoom;
+float g_MoveToTotalTime;
+float g_MoveToTime;
+float g_MoveToOldPos;
+
 
 // Drawing constants, should be parameters ======
 #define VIEW_ANGLE 1.28700222f
@@ -79,6 +83,9 @@
     g_LastPositionX = 0;
     g_Zoom = 0;
     g_SpecialHWWar = 1;
+    g_MoveToTime = 0;
+    g_MoveToOldPos = 0;
+    g_MoveToTotalTime = 0.5f;
 }
 
 void resetHWWar() {
@@ -97,9 +104,16 @@
     }
     g_LastTouchDown = state->newTouchDown;
     g_LastPositionX = state->newPositionX;
+    g_MoveToTime = 0;
     //debugF("Move P", g_PosPage);
 }
 
+void moveTo() {
+    g_MoveToTime = g_MoveToTotalTime;
+    g_PosVelocity = 0;
+    g_MoveToOldPos = g_PosPage;
+}
+
 void fling() {
     g_LastTouchDown = 0;
     g_PosVelocity = -state->flingVelocity * 4;
@@ -145,6 +159,25 @@
                         tablePosFrac) * g_DT;
     float friction = 4.f * g_DT;
 
+    if (g_MoveToTime) {
+        float a = 2.f * (state->targetPos - g_MoveToOldPos) /
+                  (g_MoveToTotalTime * g_MoveToTotalTime);
+        if (g_MoveToTime > (g_MoveToTotalTime * 0.5f)) {
+            // slowing
+            g_PosPage = state->targetPos - 0.5f * a * (g_MoveToTime * g_MoveToTime);
+        } else {
+            // accelerating.
+            float t = g_MoveToTotalTime - g_MoveToTime;
+            g_PosPage = g_MoveToOldPos + 0.5f * a * (t * t);
+        }
+        g_MoveToTime -= g_DT;
+        if (g_MoveToTime <= 0) {
+            g_MoveToTime = 0;
+            g_PosPage = state->targetPos;
+        }
+        return;
+    }
+
     if (g_PosPage < -0.5f) {
         accel = g_AttractionTable[0] * g_DT;
         outOfRange = 1;
diff --git a/src/com/android/launcher2/AllAppsView.java b/src/com/android/launcher2/AllAppsView.java
index 9499935..7ee3026 100644
--- a/src/com/android/launcher2/AllAppsView.java
+++ b/src/com/android/launcher2/AllAppsView.java
@@ -482,9 +482,11 @@
         private Resources mRes;
         private Script mScript;
         private Script.Invokable mInvokeMove;
+        private Script.Invokable mInvokeMoveTo;
         private Script.Invokable mInvokeFling;
         private Script.Invokable mInvokeResetWAR;
 
+
         private ProgramStore mPSIcons;
         private ProgramStore mPSText;
         private ProgramFragment mPFColor;
@@ -570,6 +572,7 @@
             public int selectedIconTexture;
             public float zoomTarget;
             public int homeButtonId;
+            public float targetPos;
 
             State() {
                 mType = Type.createFromClass(mRS, State.class, 1, "StateClass");
@@ -743,6 +746,7 @@
             sb.setType(mState.mType, "state", Defines.ALLOC_STATE);
             mInvokeMove = sb.addInvokable("move");
             mInvokeFling = sb.addInvokable("fling");
+            mInvokeMoveTo = sb.addInvokable("moveTo");
             mInvokeResetWAR = sb.addInvokable("resetHWWar");
             mScript = sb.create();
             mScript.setClearColor(0.0f, 0.0f, 0.0f, 0.0f);
@@ -937,6 +941,12 @@
             mInvokeMove.execute();
         }
 
+        void moveTo(float row) {
+            mState.targetPos = row;
+            mState.save();
+            mInvokeMoveTo.execute();
+        }
+
         /**
          * You need to call save() on mState on your own after calling this.
          *