diff --git a/java/src/com/android/inputmethod/keyboard/internal/GesturePreviewTrail.java b/java/src/com/android/inputmethod/keyboard/internal/GesturePreviewTrail.java
index 900349c..a11f8ef 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/GesturePreviewTrail.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/GesturePreviewTrail.java
@@ -118,94 +118,6 @@
                 / params.mTrailLingerDuration, 0.0f);
     }
 
-    static final class RoundedLine {
-        // Input
-        // Previous point (P1) coordinates and trail radius.
-        public float p1x, p1y;
-        public float r1;
-        // Current point (P2) coordinates and trail radius.
-        public float p2x, p2y;
-        public float r2;
-
-        // Closing point of arc at P1.
-        private float p1ax, p1ay;
-        // Opening point of arc at P1.
-        private float p1bx, p1by;
-        // Opening point of arc at P2.
-        private float p2ax, p2ay;
-        // Closing point of arc at P2.
-        private float p2bx, p2by;
-        // Start angle of the trail arcs.
-        private float angle;
-        // Sweep angle of the trail arc at P1.
-        private float a1;
-        private final RectF arc1 = new RectF();
-        // Sweep angle of the trail arc at P2.
-        private float a2;
-        private final RectF arc2 = new RectF();
-        private final Path path = new Path();
-
-        private static final float RADIAN_TO_DEGREE = (float)(180.0d / Math.PI);
-        private static final float RIGHT_ANGLE = (float)(Math.PI / 2.0d);
-
-        public Path makePath() {
-            final float dx = p2x - p1x;
-            final float dy = p2y - p1y;
-            // Distance of the points.
-            final double l = Math.hypot(dx, dy);
-            if (Double.compare(0.0d, l) == 0) {
-                return null;
-            }
-            // Angle of the line p1-p2
-            final float a = (float)Math.atan2(dy, dx);
-            // Difference of trail cap radius.
-            final float dr = r2 - r1;
-            // Variation of angle at trail cap.
-            final float ar = (float)Math.asin(dr / l);
-            // The start angle of trail cap arc at P1.
-            final float aa = a - (RIGHT_ANGLE + ar);
-            // The end angle of trail cap arc at P2.
-            final float ab = a + (RIGHT_ANGLE + ar);
-            final float cosa = (float)Math.cos(aa);
-            final float sina = (float)Math.sin(aa);
-            final float cosb = (float)Math.cos(ab);
-            final float sinb = (float)Math.sin(ab);
-            p1ax = p1x + r1 * cosa;
-            p1ay = p1y + r1 * sina;
-            p1bx = p1x + r1 * cosb;
-            p1by = p1y + r1 * sinb;
-            p2ax = p2x + r2 * cosa;
-            p2ay = p2y + r2 * sina;
-            p2bx = p2x + r2 * cosb;
-            p2by = p2y + r2 * sinb;
-            angle = aa * RADIAN_TO_DEGREE;
-            final float ar2degree = ar * 2.0f * RADIAN_TO_DEGREE;
-            a1 = -180.0f + ar2degree;
-            a2 = 180.0f + ar2degree;
-            arc1.set(p1x, p1y, p1x, p1y);
-            arc1.inset(-r1, -r1);
-            arc2.set(p2x, p2y, p2x, p2y);
-            arc2.inset(-r2, -r2);
-
-            path.rewind();
-            // Trail cap at P1.
-            path.moveTo(p1x, p1y);
-            path.arcTo(arc1, angle, a1);
-            // Trail cap at P2.
-            path.moveTo(p2x, p2y);
-            path.arcTo(arc2, angle, a2);
-            // Two trapezoids connecting P1 and P2.
-            path.moveTo(p1ax, p1ay);
-            path.lineTo(p1x, p1y);
-            path.lineTo(p1bx, p1by);
-            path.lineTo(p2bx, p2by);
-            path.lineTo(p2x, p2y);
-            path.lineTo(p2ax, p2ay);
-            path.close();
-            return path;
-        }
-    }
-
     private final RoundedLine mRoundedLine = new RoundedLine();
 
     /**
diff --git a/java/src/com/android/inputmethod/keyboard/internal/RoundedLine.java b/java/src/com/android/inputmethod/keyboard/internal/RoundedLine.java
new file mode 100644
index 0000000..2a5d444
--- /dev/null
+++ b/java/src/com/android/inputmethod/keyboard/internal/RoundedLine.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2012 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.inputmethod.keyboard.internal;
+
+import android.graphics.Path;
+import android.graphics.RectF;
+
+public final class RoundedLine {
+    // Start point (P1) coordinates and trail radius.
+    public float p1x, p1y;
+    public float r1;
+    // End point (P2) coordinates and trail radius.
+    public float p2x, p2y;
+    public float r2;
+
+    // Closing point of arc at P1.
+    private float p1ax, p1ay;
+    // Opening point of arc at P1.
+    private float p1bx, p1by;
+    // Opening point of arc at P2.
+    private float p2ax, p2ay;
+    // Closing point of arc at P2.
+    private float p2bx, p2by;
+    // Start angle of the trail arcs.
+    private float angle;
+    // Sweep angle of the trail arc at P1.
+    private float a1;
+    private final RectF arc1 = new RectF();
+    // Sweep angle of the trail arc at P2.
+    private float a2;
+    private final RectF arc2 = new RectF();
+    private final Path path = new Path();
+
+    private static final float RADIAN_TO_DEGREE = (float)(180.0d / Math.PI);
+    private static final float RIGHT_ANGLE = (float)(Math.PI / 2.0d);
+
+    public Path makePath() {
+        final float dx = p2x - p1x;
+        final float dy = p2y - p1y;
+        // Distance of the points.
+        final double l = Math.hypot(dx, dy);
+        if (Double.compare(0.0d, l) == 0) {
+            return null;
+        }
+        // Angle of the line p1-p2
+        final float a = (float)Math.atan2(dy, dx);
+        // Difference of trail cap radius.
+        final float dr = r2 - r1;
+        // Variation of angle at trail cap.
+        final float ar = (float)Math.asin(dr / l);
+        // The start angle of trail cap arc at P1.
+        final float aa = a - (RIGHT_ANGLE + ar);
+        // The end angle of trail cap arc at P2.
+        final float ab = a + (RIGHT_ANGLE + ar);
+        final float cosa = (float)Math.cos(aa);
+        final float sina = (float)Math.sin(aa);
+        final float cosb = (float)Math.cos(ab);
+        final float sinb = (float)Math.sin(ab);
+        p1ax = p1x + r1 * cosa;
+        p1ay = p1y + r1 * sina;
+        p1bx = p1x + r1 * cosb;
+        p1by = p1y + r1 * sinb;
+        p2ax = p2x + r2 * cosa;
+        p2ay = p2y + r2 * sina;
+        p2bx = p2x + r2 * cosb;
+        p2by = p2y + r2 * sinb;
+        angle = aa * RADIAN_TO_DEGREE;
+        final float ar2degree = ar * 2.0f * RADIAN_TO_DEGREE;
+        a1 = -180.0f + ar2degree;
+        a2 = 180.0f + ar2degree;
+        arc1.set(p1x, p1y, p1x, p1y);
+        arc1.inset(-r1, -r1);
+        arc2.set(p2x, p2y, p2x, p2y);
+        arc2.inset(-r2, -r2);
+
+        path.rewind();
+        // Trail cap at P1.
+        path.moveTo(p1x, p1y);
+        path.arcTo(arc1, angle, a1);
+        // Trail cap at P2.
+        path.moveTo(p2x, p2y);
+        path.arcTo(arc2, angle, a2);
+        // Two trapezoids connecting P1 and P2.
+        path.moveTo(p1ax, p1ay);
+        path.lineTo(p1x, p1y);
+        path.lineTo(p1bx, p1by);
+        path.lineTo(p2bx, p2by);
+        path.lineTo(p2x, p2y);
+        path.lineTo(p2ax, p2ay);
+        path.close();
+        return path;
+    }
+}
\ No newline at end of file
