Merge "Implement ResizableIntArray.setLength and .get"
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardView.java b/java/src/com/android/inputmethod/keyboard/KeyboardView.java
index fb98af3..b05cc70 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardView.java
@@ -94,7 +94,7 @@
     // The maximum key label width in the proportion to the key width.
     private static final float MAX_LABEL_RATIO = 0.90f;
 
-    private final static int ALPHA_OPAQUE = 255;
+    public final static int ALPHA_OPAQUE = 255;
 
     // Main keyboard
     private Keyboard mKeyboard;
diff --git a/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java b/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java
index 1eae2c1..36d3664 100644
--- a/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java
@@ -80,7 +80,6 @@
     // Stuff to draw language name on spacebar.
     private final int mLanguageOnSpacebarFinalAlpha;
     private ObjectAnimator mLanguageOnSpacebarFadeoutAnimator;
-    private static final int ALPHA_OPAQUE = 255;
     private boolean mNeedsToDisplayLanguage;
     private boolean mHasMultipleEnabledIMEsOrSubtypes;
     private int mLanguageOnSpacebarAnimAlpha = ALPHA_OPAQUE;
diff --git a/java/src/com/android/inputmethod/keyboard/PointerTracker.java b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
index ea4d93a..b002ae9 100644
--- a/java/src/com/android/inputmethod/keyboard/PointerTracker.java
+++ b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
@@ -121,6 +121,8 @@
     private static boolean sConfigGestureInputEnabledByBuildConfig;
 
     private static final ArrayList<PointerTracker> sTrackers = new ArrayList<PointerTracker>();
+    private static final InputPointers sAggregratedPointers = new InputPointers(
+            GestureStroke.DEFAULT_CAPACITY);
     private static PointerTrackerQueue sPointerTrackerQueue;
     // HACK: Change gesture detection criteria depending on this variable.
     // TODO: Find more comprehensive ways to detect a gesture start.
@@ -257,23 +259,19 @@
     // TODO: To handle multi-touch gestures we may want to move this method to
     // {@link PointerTrackerQueue}.
     private static InputPointers getIncrementalBatchPoints() {
-        // TODO: Avoid creating a new instance here?
-        final InputPointers pointers = new InputPointers(GestureStroke.DEFAULT_CAPACITY);
         for (final PointerTracker tracker : sTrackers) {
-            tracker.mGestureStroke.appendIncrementalBatchPoints(pointers);
+            tracker.mGestureStroke.appendIncrementalBatchPoints(sAggregratedPointers);
         }
-        return pointers;
+        return sAggregratedPointers;
     }
 
     // TODO: To handle multi-touch gestures we may want to move this method to
     // {@link PointerTrackerQueue}.
     private static InputPointers getAllBatchPoints() {
-        // TODO: Avoid creating a new instance here?
-        final InputPointers pointers = new InputPointers(GestureStroke.DEFAULT_CAPACITY);
         for (final PointerTracker tracker : sTrackers) {
-            tracker.mGestureStroke.appendAllBatchPoints(pointers);
+            tracker.mGestureStroke.appendAllBatchPoints(sAggregratedPointers);
         }
-        return pointers;
+        return sAggregratedPointers;
     }
 
     // TODO: To handle multi-touch gestures we may want to move this method to
@@ -282,6 +280,7 @@
         for (final PointerTracker tracker : sTrackers) {
             tracker.mGestureStroke.reset();
         }
+        sAggregratedPointers.reset();
     }
 
     private PointerTracker(int id, KeyEventHandler handler) {
@@ -645,6 +644,8 @@
             if (sIsGestureEnabled && mIsAlphabetKeyboard && key != null
                     && Keyboard.isLetterCode(key.mCode)) {
                 mIsPossibleGesture = true;
+                // TODO: pointer times should be relative to first down even in entire batch input
+                // instead of resetting to 0 for each new down event.
                 mGestureStroke.addPoint(x, y, 0, false);
             }
         }
@@ -869,7 +870,9 @@
             }
             return;
         }
-
+        // This event will be recognized as a regular code input. Clear unused batch points so they
+        // are not mistakenly included in the next batch event.
+        clearBatchInputPointsOfAllPointerTrackers();
         if (mKeyAlreadyProcessed)
             return;
         if (mCurrentKey != null && !mCurrentKey.isRepeatable()) {
diff --git a/java/src/com/android/inputmethod/keyboard/internal/GestureStroke.java b/java/src/com/android/inputmethod/keyboard/internal/GestureStroke.java
index 6f392f1..16c8410 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/GestureStroke.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/GestureStroke.java
@@ -27,6 +27,7 @@
     private float mLength;
     private float mAngle;
     private int mIncrementalRecognitionSize;
+    private int mLastIncrementalBatchSize;
     private long mLastPointTime;
     private int mLastPointX;
     private int mLastPointY;
@@ -73,6 +74,7 @@
         mLength = 0;
         mAngle = 0;
         mIncrementalRecognitionSize = 0;
+        mLastIncrementalBatchSize = 0;
         mLastPointTime = 0;
         mInputPointers.reset();
     }
@@ -126,11 +128,15 @@
     }
 
     public void appendAllBatchPoints(final InputPointers out) {
-        out.append(mInputPointers, 0, mInputPointers.getPointerSize());
+        final int size = mInputPointers.getPointerSize();
+        out.append(mInputPointers, mLastIncrementalBatchSize, size - mLastIncrementalBatchSize);
+        mLastIncrementalBatchSize = size;
     }
 
     public void appendIncrementalBatchPoints(final InputPointers out) {
-        out.append(mInputPointers, 0, mIncrementalRecognitionSize);
+        out.append(mInputPointers, mLastIncrementalBatchSize,
+                mIncrementalRecognitionSize - mLastIncrementalBatchSize);
+        mLastIncrementalBatchSize = mIncrementalRecognitionSize;
     }
 
     private static float getDistance(final int p1x, final int p1y,