From 14de691f22f5eec357ab671699965546dcf5dfec Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Mon, 9 May 2011 12:13:10 +0900 Subject: [PATCH] Include horizontal and vertical gap in the count of Key.isOnKey This change considers that the point is on the key while sorting in proximity key detection. This change is the cherry-pick of I3ee91367. Bug: 4353949 Change-Id: I04fa0acf4d32c18bea9640b39a5c770466a37803 --- .../com/android/inputmethod/keyboard/Key.java | 25 ++++++++++--------- .../inputmethod/keyboard/KeyDetector.java | 4 +-- .../keyboard/ProximityKeyDetector.java | 8 +++--- 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/java/src/com/android/inputmethod/keyboard/Key.java b/java/src/com/android/inputmethod/keyboard/Key.java index 7396f0518..24e8926c5 100644 --- a/java/src/com/android/inputmethod/keyboard/Key.java +++ b/java/src/com/android/inputmethod/keyboard/Key.java @@ -196,8 +196,8 @@ public class Key { } // 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 @@ public class Key { 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 @@ public class Key { * @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 1a4f90195..a7ede5f26 100644 --- a/java/src/com/android/inputmethod/keyboard/KeyDetector.java +++ b/java/src/com/android/inputmethod/keyboard/KeyDetector.java @@ -81,11 +81,11 @@ public abstract class KeyDetector { * * @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 c3fd1984b..87f3e1497 100644 --- a/java/src/com/android/inputmethod/keyboard/ProximityKeyDetector.java +++ b/java/src/com/android/inputmethod/keyboard/ProximityKeyDetector.java @@ -45,13 +45,15 @@ public class ProximityKeyDetector extends KeyDetector { * * @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 @@ public class ProximityKeyDetector extends KeyDetector { 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; }