Add key debounce.  bug: 2517112

Change-Id: I461e481226395ce8964003c2ad1f4af888c6f7f9
diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java
index 7f35ea9..4205aad 100644
--- a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java
+++ b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java
@@ -182,6 +182,8 @@
 
     private int mVerticalCorrection;
     private int mProximityThreshold;
+    private int mKeyDebounceThreshold;
+    private static final int KEY_DEBOUNCE_FACTOR = 6;
 
     private boolean mPreviewCentered = false;
     private boolean mShowPreview = true;
@@ -633,6 +635,9 @@
         if (dimensionSum < 0 || length == 0) return;
         mProximityThreshold = (int) (dimensionSum * 1.4f / length);
         mProximityThreshold *= mProximityThreshold; // Square it
+
+        // 1/KEY_DEBOUNCE_FACTOR of distance between adjacent keys
+        mKeyDebounceThreshold = mProximityThreshold / KEY_DEBOUNCE_FACTOR;
     }
 
     @Override
@@ -1158,6 +1163,13 @@
         return result;
     }
 
+    private boolean isMinorMoveForKeyDebounce(int x, int y) {
+        // TODO: Check the coordinate against each key border.  The current
+        // logic is pretty simple.
+        return ((x - mLastCodeX) * (x - mLastCodeX) +
+                (y - mLastCodeY) * (y - mLastCodeY)) < mKeyDebounceThreshold;
+    }
+
     private boolean onModifiedTouchEvent(MotionEvent me, boolean possiblePoly) {
         int touchX = (int) me.getX() - getPaddingLeft();
         int touchY = (int) me.getY() + mVerticalCorrection - getPaddingTop();
@@ -1231,7 +1243,8 @@
                         mCurrentKey = keyIndex;
                         mCurrentKeyTime = eventTime - mDownTime;
                     } else {
-                        if (keyIndex == mCurrentKey) {
+                        if (keyIndex == mCurrentKey
+                            || isMinorMoveForKeyDebounce(touchX, touchY)) {
                             mCurrentKeyTime += eventTime - mLastMoveTime;
                             continueLongPress = true;
                         } else if (mRepeatKeyIndex == NOT_A_KEY) {