am ade16493: Merge "Include horizontal and vertical gap in the count of Key.isOnKey" into honeycomb-mr2

* commit 'ade16493316c906dcef1f5c1a5b65e18a41b4db6':
  Include horizontal and vertical gap in the count of Key.isOnKey
diff --git a/java/src/com/android/inputmethod/keyboard/Key.java b/java/src/com/android/inputmethod/keyboard/Key.java
index 7396f05..24e8926 100644
--- a/java/src/com/android/inputmethod/keyboard/Key.java
+++ b/java/src/com/android/inputmethod/keyboard/Key.java
@@ -196,8 +196,8 @@
         }
 
         // Horizontal gap is divided equally to both sides of the key.
-        this.mX = x + mGap / 2;
-        this.mY = y;
+        mX = x + mGap / 2;
+        mY = y;
 
         final TypedArray keyAttr = res.obtainAttributes(Xml.asAttributeSet(parser),
                 R.styleable.Keyboard_Key);
@@ -350,12 +350,13 @@
         final boolean rightEdge = (flags & Keyboard.EDGE_RIGHT) != 0;
         final boolean topEdge = (flags & Keyboard.EDGE_TOP) != 0;
         final boolean bottomEdge = (flags & Keyboard.EDGE_BOTTOM) != 0;
-        final int left = this.mX;
-        final int right = left + this.mWidth;
-        final int top = this.mY;
-        final int bottom = top + this.mHeight;
-        return (x >= left || leftEdge) && (x < right || rightEdge)
-                && (y >= top || topEdge) && (y < bottom || bottomEdge);
+        final int left = mX - mGap / 2;
+        final int right = left + mWidth + mGap;
+        final int top = mY;
+        final int bottom = top + mHeight + mKeyboard.getVerticalGap();
+        // In order to mitigate rounding errors, we use (left <= x <= right) here.
+        return (x >= left || leftEdge) && (x <= right || rightEdge)
+                && (y >= top || topEdge) && (y <= bottom || bottomEdge);
     }
 
     /**
@@ -365,10 +366,10 @@
      * @return the square of the distance of the point from the nearest edge of the key
      */
     public int squaredDistanceToEdge(int x, int y) {
-        final int left = this.mX;
-        final int right = left + this.mWidth;
-        final int top = this.mY;
-        final int bottom = top + this.mHeight;
+        final int left = mX;
+        final int right = left + mWidth;
+        final int top = mY;
+        final int bottom = top + mHeight;
         final int edgeX = x < left ? left : (x > right ? right : x);
         final int edgeY = y < top ? top : (y > bottom ? bottom : y);
         final int dx = x - edgeX;
diff --git a/java/src/com/android/inputmethod/keyboard/KeyDetector.java b/java/src/com/android/inputmethod/keyboard/KeyDetector.java
index 1a4f901..a7ede5f 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyDetector.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyDetector.java
@@ -81,11 +81,11 @@
      *
      * @return Allocates and returns an array that can hold all key indices returned by
      *         {@link #getKeyIndexAndNearbyCodes} method. All elements in the returned array are
-     *         initialized by {@link #NOT_A_KEY} value.
+     *         initialized by {@link #NOT_A_CODE} value.
      */
     public int[] newCodeArray() {
         int[] codes = new int[getMaxNearbyKeys()];
-        Arrays.fill(codes, NOT_A_KEY);
+        Arrays.fill(codes, NOT_A_CODE);
         return codes;
     }
 
diff --git a/java/src/com/android/inputmethod/keyboard/ProximityKeyDetector.java b/java/src/com/android/inputmethod/keyboard/ProximityKeyDetector.java
index c3fd198..87f3e14 100644
--- a/java/src/com/android/inputmethod/keyboard/ProximityKeyDetector.java
+++ b/java/src/com/android/inputmethod/keyboard/ProximityKeyDetector.java
@@ -45,13 +45,15 @@
      *
      * @param keyIndex index of the key.
      * @param distance distance between the key's edge and user touched point.
+     * @param isOnKey true if the point is on the key.
      * @return order of the key in the nearby buffer, 0 if it is the nearest key.
      */
-    private int sortNearbyKeys(int keyIndex, int distance) {
+    private int sortNearbyKeys(int keyIndex, int distance, boolean isOnKey) {
         final int[] distances = mDistances;
         final int[] indices = mIndices;
         for (int insertPos = 0; insertPos < distances.length; insertPos++) {
-            if (distance < distances[insertPos]) {
+            final int comparingDistance = distances[insertPos];
+            if (distance < comparingDistance || (distance == comparingDistance && isOnKey)) {
                 final int nextPos = insertPos + 1;
                 if (nextPos < distances.length) {
                     System.arraycopy(distances, insertPos, distances, nextPos,
@@ -103,7 +105,7 @@
             final boolean isInside = key.isInside(touchX, touchY);
             final int distance = key.squaredDistanceToEdge(touchX, touchY);
             if (isInside || (mProximityCorrectOn && distance < mProximityThresholdSquare)) {
-                final int insertedPosition = sortNearbyKeys(index, distance);
+                final int insertedPosition = sortNearbyKeys(index, distance, isInside);
                 if (insertedPosition == 0 && isInside)
                     primaryIndex = index;
             }