aboutsummaryrefslogtreecommitdiffstats
path: root/java/src/com/android
diff options
context:
space:
mode:
Diffstat (limited to 'java/src/com/android')
-rw-r--r--java/src/com/android/inputmethod/keyboard/KeyDetector.java18
-rw-r--r--java/src/com/android/inputmethod/keyboard/LatinKeyboardBaseView.java11
-rw-r--r--java/src/com/android/inputmethod/keyboard/MiniKeyboardKeyDetector.java2
-rw-r--r--java/src/com/android/inputmethod/keyboard/PointerTracker.java19
-rw-r--r--java/src/com/android/inputmethod/keyboard/internal/PointerTrackerKeyState.java6
5 files changed, 39 insertions, 17 deletions
diff --git a/java/src/com/android/inputmethod/keyboard/KeyDetector.java b/java/src/com/android/inputmethod/keyboard/KeyDetector.java
index 7add43a6d..85418a61d 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyDetector.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyDetector.java
@@ -28,6 +28,8 @@ public class KeyDetector {
public static final int NOT_A_CODE = -1;
public static final int NOT_A_KEY = -1;
+ private final int mKeyHysteresisDistanceSquared;
+
private Keyboard mKeyboard;
private int mCorrectionX;
private int mCorrectionY;
@@ -39,12 +41,28 @@ public class KeyDetector {
private final int[] mDistances = new int[MAX_NEARBY_KEYS];
private final int[] mIndices = new int[MAX_NEARBY_KEYS];
+ /**
+ * This class handles key detection.
+ *
+ * @param keyHysteresisDistance if the pointer movement distance is smaller than this, the
+ * movement will not been handled as meaningful movement. The unit is pixel.
+ */
+ public KeyDetector(float keyHysteresisDistance) {
+ mKeyHysteresisDistanceSquared = (int)(keyHysteresisDistance * keyHysteresisDistance);
+ }
+
public void setKeyboard(Keyboard keyboard, float correctionX, float correctionY) {
if (keyboard == null)
throw new NullPointerException();
mCorrectionX = (int)correctionX;
mCorrectionY = (int)correctionY;
mKeyboard = keyboard;
+ final int threshold = keyboard.getMostCommonKeyWidth();
+ mProximityThresholdSquare = threshold * threshold;
+ }
+
+ public int getKeyHysteresisDistanceSquared() {
+ return mKeyHysteresisDistanceSquared;
}
protected int getTouchX(int x) {
diff --git a/java/src/com/android/inputmethod/keyboard/LatinKeyboardBaseView.java b/java/src/com/android/inputmethod/keyboard/LatinKeyboardBaseView.java
index 0a7ba05c8..5ef40ecb3 100644
--- a/java/src/com/android/inputmethod/keyboard/LatinKeyboardBaseView.java
+++ b/java/src/com/android/inputmethod/keyboard/LatinKeyboardBaseView.java
@@ -59,7 +59,6 @@ public class LatinKeyboardBaseView extends KeyboardView {
private final int mKeyRepeatInterval;
// XML attribute
- private final float mKeyHysteresisDistance;
private final float mVerticalCorrection;
private final int mPopupLayout;
@@ -81,7 +80,7 @@ public class LatinKeyboardBaseView extends KeyboardView {
private int mOldPointerCount = 1;
private int mOldKeyIndex;
- protected KeyDetector mKeyDetector = new KeyDetector();
+ protected KeyDetector mKeyDetector;
// Swipe gesture detector
protected GestureDetector mGestureDetector;
@@ -182,8 +181,6 @@ public class LatinKeyboardBaseView extends KeyboardView {
final TypedArray a = context.obtainStyledAttributes(
attrs, R.styleable.KeyboardView, defStyle, R.style.KeyboardView);
- mKeyHysteresisDistance = a.getDimensionPixelOffset(
- R.styleable.KeyboardView_keyHysteresisDistance, 0);
mVerticalCorrection = a.getDimensionPixelOffset(
R.styleable.KeyboardView_verticalCorrection, 0);
@@ -193,6 +190,8 @@ public class LatinKeyboardBaseView extends KeyboardView {
final Resources res = getResources();
+ final float keyHysteresisDistance = res.getDimension(R.dimen.key_hysteresis_distance);
+ mKeyDetector = new KeyDetector(keyHysteresisDistance);
mSwipeThreshold = (int) (500 * res.getDisplayMetrics().density);
// TODO: Refer to frameworks/base/core/res/res/values/config.xml
mDisambiguateSwipe = res.getBoolean(R.bool.config_swipeDisambiguation);
@@ -309,7 +308,7 @@ public class LatinKeyboardBaseView extends KeyboardView {
mKeyDetector.setKeyboard(keyboard, -getPaddingLeft(),
-getPaddingTop() + mVerticalCorrection);
for (PointerTracker tracker : mPointerTrackers) {
- tracker.setKeyboard(keyboard, mKeyHysteresisDistance);
+ tracker.setKeyboard(keyboard, mKeyDetector);
}
mKeyDetector.setProximityThreshold(keyboard.getMostCommonKeyWidth());
mPopupPanelCache.clear();
@@ -484,7 +483,7 @@ public class LatinKeyboardBaseView extends KeyboardView {
final PointerTracker tracker =
new PointerTracker(i, this, mHandler, mKeyDetector, this);
if (keyboard != null)
- tracker.setKeyboard(keyboard, mKeyHysteresisDistance);
+ tracker.setKeyboard(keyboard, mKeyDetector);
if (listener != null)
tracker.setOnKeyboardActionListener(listener);
pointers.add(tracker);
diff --git a/java/src/com/android/inputmethod/keyboard/MiniKeyboardKeyDetector.java b/java/src/com/android/inputmethod/keyboard/MiniKeyboardKeyDetector.java
index cc5c3bbfe..69005db57 100644
--- a/java/src/com/android/inputmethod/keyboard/MiniKeyboardKeyDetector.java
+++ b/java/src/com/android/inputmethod/keyboard/MiniKeyboardKeyDetector.java
@@ -23,7 +23,7 @@ public class MiniKeyboardKeyDetector extends KeyDetector {
private final int mSlideAllowanceSquareTop;
public MiniKeyboardKeyDetector(float slideAllowance) {
- super();
+ super(/* keyHysteresisDistance */0);
mSlideAllowanceSquare = (int)(slideAllowance * slideAllowance);
// Top slide allowance is slightly longer (sqrt(2) times) than other edges.
mSlideAllowanceSquareTop = mSlideAllowanceSquare * 2;
diff --git a/java/src/com/android/inputmethod/keyboard/PointerTracker.java b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
index 68284cd1b..ed93978ac 100644
--- a/java/src/com/android/inputmethod/keyboard/PointerTracker.java
+++ b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
@@ -56,7 +56,7 @@ public class PointerTracker {
private final LatinKeyboardBaseView mKeyboardView;
private final UIProxy mProxy;
private final UIHandler mHandler;
- private final KeyDetector mKeyDetector;
+ private KeyDetector mKeyDetector;
private KeyboardActionListener mListener = EMPTY_LISTENER;
private final KeyboardSwitcher mKeyboardSwitcher;
private final boolean mHasDistinctMultitouch;
@@ -67,7 +67,6 @@ public class PointerTracker {
private Keyboard mKeyboard;
private List<Key> mKeys;
- private int mKeyHysteresisDistanceSquared = -1;
private int mKeyQuarterWidthSquared;
private final PointerTrackerKeyState mKeyState;
@@ -198,12 +197,13 @@ public class PointerTracker {
mListener.onCancelInput();
}
- public void setKeyboard(Keyboard keyboard, float keyHysteresisDistance) {
- if (keyboard == null || keyHysteresisDistance < 0)
- throw new IllegalArgumentException();
+ public void setKeyboard(Keyboard keyboard, KeyDetector keyDetector) {
+ if (keyboard == null || keyDetector == null)
+ throw new NullPointerException();
mKeyboard = keyboard;
mKeys = keyboard.getKeys();
- mKeyHysteresisDistanceSquared = (int)(keyHysteresisDistance * keyHysteresisDistance);
+ mKeyDetector = keyDetector;
+ mKeyState.setKeyDetector(keyDetector);
final int keyQuarterWidth = keyboard.getKeyWidth() / 4;
mKeyQuarterWidthSquared = keyQuarterWidth * keyQuarterWidth;
// Mark that keyboard layout has been changed.
@@ -602,13 +602,14 @@ public class PointerTracker {
}
private boolean isMajorEnoughMoveToBeOnNewKey(int x, int y, int newKey) {
- if (mKeys == null || mKeyHysteresisDistanceSquared < 0)
- throw new IllegalStateException("keyboard and/or hysteresis not set");
+ if (mKeys == null || mKeyDetector == null)
+ throw new NullPointerException("keyboard and/or key detector not set");
int curKey = mKeyState.getKeyIndex();
if (newKey == curKey) {
return false;
} else if (isValidKeyIndex(curKey)) {
- return mKeys.get(curKey).squaredDistanceToEdge(x, y) >= mKeyHysteresisDistanceSquared;
+ return mKeys.get(curKey).squaredDistanceToEdge(x, y)
+ >= mKeyDetector.getKeyHysteresisDistanceSquared();
} else {
return true;
}
diff --git a/java/src/com/android/inputmethod/keyboard/internal/PointerTrackerKeyState.java b/java/src/com/android/inputmethod/keyboard/internal/PointerTrackerKeyState.java
index ddadb1338..6e2b60c30 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/PointerTrackerKeyState.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/PointerTrackerKeyState.java
@@ -23,7 +23,7 @@ import com.android.inputmethod.keyboard.PointerTracker;
* This class keeps track of a key index and a position where {@link PointerTracker} is.
*/
public class PointerTrackerKeyState {
- private final KeyDetector mKeyDetector;
+ private KeyDetector mKeyDetector;
// The position and time at which first down event occurred.
private long mDownTime;
@@ -43,6 +43,10 @@ public class PointerTrackerKeyState {
mKeyDetector = keyDetecor;
}
+ public void setKeyDetector(KeyDetector keyDetector) {
+ mKeyDetector = keyDetector;
+ }
+
public int getKeyIndex() {
return mKeyIndex;
}