From 400046d62e22899e28efd2a62321c637c7831f81 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Thu, 2 Sep 2010 21:54:26 +0900 Subject: [PATCH] Encapsulate vertical and horizontal correction values into KeyDetector. Bug: 2959169 Change-Id: Id2b0b974fffdf6f09ee1828e957b973d2ce1c315 --- .../inputmethod/latin/KeyDetector.java | 14 ++++- .../latin/LatinKeyboardBaseView.java | 44 ++++++-------- .../inputmethod/latin/PointerTracker.java | 60 +++++++++---------- .../latin/ProximityKeyDetector.java | 8 ++- 4 files changed, 65 insertions(+), 61 deletions(-) diff --git a/java/src/com/android/inputmethod/latin/KeyDetector.java b/java/src/com/android/inputmethod/latin/KeyDetector.java index 11d5f861d..5583e3275 100644 --- a/java/src/com/android/inputmethod/latin/KeyDetector.java +++ b/java/src/com/android/inputmethod/latin/KeyDetector.java @@ -25,12 +25,16 @@ abstract class KeyDetector { protected Keyboard mKeyboard; protected Key[] mKeys; + protected int mCorrectionX; + protected int mCorrectionY; protected boolean mProximityCorrectOn; protected int mProximityThresholdSquare; - public Key[] setKeyboard(Keyboard keyboard) { + public Key[] setKeyboard(Keyboard keyboard, float correctionX, float correctionY) { if (keyboard == null) throw new NullPointerException(); + mCorrectionX = (int)correctionX; + mCorrectionY = (int)correctionY; mKeyboard = keyboard; List keys = mKeyboard.getKeys(); Key[] array = keys.toArray(new Key[keys.size()]); @@ -38,6 +42,14 @@ abstract class KeyDetector { return array; } + protected int getTouchX(int x) { + return x + mCorrectionX; + } + + protected int getTouchY(int y) { + return y + mCorrectionY; + } + public void setProximityCorrectionEnabled(boolean enabled) { mProximityCorrectOn = enabled; } diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java index 14b8143a9..48cccea92 100644 --- a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java +++ b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java @@ -165,7 +165,7 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener, private float mShadowRadius; private Drawable mKeyBackground; private float mBackgroundDimAmount; - private int mVerticalCorrection; + private float mVerticalCorrection; private int mPreviewOffset; private int mPreviewHeight; private int mPopupLayout; @@ -541,7 +541,8 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener, mHandler.cancelPopupPreview(); mKeyboard = keyboard; LatinImeLogger.onSetKeyboard(keyboard); - mKeys = mKeyDetector.setKeyboard(keyboard); + mKeys = mKeyDetector.setKeyboard(keyboard, -getPaddingLeft(), + -getPaddingTop() + mVerticalCorrection); for (PointerTracker tracker : mPointerTrackers) { tracker.setKeyboard(mKeys, mDebounceHysteresis); } @@ -613,9 +614,6 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener, return mSymbolColorScheme; } - public void setVerticalCorrection(int verticalOffset) { - } - public void setPopupParent(View v) { mPopupParent = v; } @@ -1070,14 +1068,6 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener, return mMiniKeyboardOnScreen; } - private int getTouchX(float x) { - return (int)x - getPaddingLeft(); - } - - private int getTouchY(float y) { - return (int)y + mVerticalCorrection - getPaddingTop(); - } - private PointerTracker getPointerTracker(final int id) { final ArrayList pointers = mPointerTrackers; final Key[] keys = mKeys; @@ -1132,29 +1122,29 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener, if (action == MotionEvent.ACTION_MOVE) { for (int index = 0; index < pointerCount; index++) { - int touchX = getTouchX(me.getX(index)); - int touchY = getTouchY(me.getY(index)); + int x = (int)me.getX(index); + int y = (int)me.getY(index); int id = me.getPointerId(index); PointerTracker tracker = getPointerTracker(id); - tracker.onMoveEvent(touchX, touchY, eventTime); + tracker.onMoveEvent(x, y, eventTime); } } else { int index = me.getActionIndex(); - int touchX = getTouchX(me.getX(index)); - int touchY = getTouchY(me.getY(index)); + int x = (int)me.getX(index); + int y = (int)me.getY(index); int id = me.getPointerId(index); PointerTracker tracker = getPointerTracker(id); switch (action) { case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_POINTER_DOWN: - onDownEvent(tracker, touchX, touchY, eventTime); + onDownEvent(tracker, x, y, eventTime); break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_POINTER_UP: - onUpEvent(tracker, touchX, touchY, eventTime); + onUpEvent(tracker, x, y, eventTime); break; case MotionEvent.ACTION_CANCEL: - onCancelEvent(tracker, touchX, touchY, eventTime); + onCancelEvent(tracker, x, y, eventTime); break; } } @@ -1162,12 +1152,12 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener, return true; } - private void onDownEvent(PointerTracker tracker, int touchX, int touchY, long eventTime) { - tracker.onDownEvent(touchX, touchY, eventTime); + private void onDownEvent(PointerTracker tracker, int x, int y, long eventTime) { + tracker.onDownEvent(x, y, eventTime); mPointerQueue.add(tracker); } - private void onUpEvent(PointerTracker tracker, int touchX, int touchY, long eventTime) { + private void onUpEvent(PointerTracker tracker, int x, int y, long eventTime) { int index = mPointerQueue.lastIndexOf(tracker); if (index >= 0) { mPointerQueue.releasePointersOlderThan(tracker, eventTime); @@ -1175,12 +1165,12 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener, Log.w(TAG, "onUpEvent: corresponding down event not found for pointer " + tracker.mPointerId); } - tracker.onUpEvent(touchX, touchY, eventTime); + tracker.onUpEvent(x, y, eventTime); mPointerQueue.remove(tracker); } - private void onCancelEvent(PointerTracker tracker, int touchX, int touchY, long eventTime) { - tracker.onCancelEvent(touchX, touchY, eventTime); + private void onCancelEvent(PointerTracker tracker, int x, int y, long eventTime) { + tracker.onCancelEvent(x, y, eventTime); mPointerQueue.remove(tracker); } diff --git a/java/src/com/android/inputmethod/latin/PointerTracker.java b/java/src/com/android/inputmethod/latin/PointerTracker.java index f5f2c11ff..2a7a31793 100644 --- a/java/src/com/android/inputmethod/latin/PointerTracker.java +++ b/java/src/com/android/inputmethod/latin/PointerTracker.java @@ -139,12 +139,12 @@ public class PointerTracker { } } - public void onDownEvent(int touchX, int touchY, long eventTime) { - int keyIndex = mKeyDetector.getKeyIndexAndNearbyCodes(touchX, touchY, null); + public void onDownEvent(int x, int y, long eventTime) { + int keyIndex = mKeyDetector.getKeyIndexAndNearbyCodes(x, y, null); mCurrentKey = keyIndex; - mStartX = touchX; - mStartY = touchY; - startMoveDebouncing(touchX, touchY); + mStartX = x; + mStartY = y; + startMoveDebouncing(x, y); startTimeDebouncing(eventTime); checkMultiTap(eventTime, keyIndex); if (mListener != null) { @@ -159,19 +159,19 @@ public class PointerTracker { mHandler.startLongPressTimer(LONGPRESS_TIMEOUT, keyIndex, this); } showKeyPreviewAndUpdateKey(keyIndex); - updateMoveDebouncing(touchX, touchY); + updateMoveDebouncing(x, y); if (DEBUG) - debugLog("onDownEvent:", touchX, touchY); + debugLog("onDownEvent:", x, y); } - public void onMoveEvent(int touchX, int touchY, long eventTime) { - int keyIndex = mKeyDetector.getKeyIndexAndNearbyCodes(touchX, touchY, null); + public void onMoveEvent(int x, int y, long eventTime) { + int keyIndex = mKeyDetector.getKeyIndexAndNearbyCodes(x, y, null); if (isValidKeyIndex(keyIndex)) { if (mCurrentKey == NOT_A_KEY) { updateTimeDebouncing(eventTime); mCurrentKey = keyIndex; mHandler.startLongPressTimer(LONGPRESS_TIMEOUT, keyIndex, this); - } else if (isMinorMoveBounce(touchX, touchY, keyIndex, mCurrentKey)) { + } else if (isMinorMoveBounce(x, y, keyIndex, mCurrentKey)) { updateTimeDebouncing(eventTime); } else { resetMultiTap(); @@ -190,19 +190,19 @@ public class PointerTracker { * should not be showed as popup preview. */ showKeyPreviewAndUpdateKey(isMinorTimeBounce() ? mLastKey : mCurrentKey); - updateMoveDebouncing(touchX, touchY); + updateMoveDebouncing(x, y); if (DEBUG_MOVE) - debugLog("onMoveEvent:", touchX, touchY); + debugLog("onMoveEvent:", x, y); } - public void onUpEvent(int touchX, int touchY, long eventTime) { + public void onUpEvent(int x, int y, long eventTime) { if (DEBUG) - debugLog("onUpEvent :", touchX, touchY); - int keyIndex = mKeyDetector.getKeyIndexAndNearbyCodes(touchX, touchY, null); + debugLog("onUpEvent :", x, y); + int keyIndex = mKeyDetector.getKeyIndexAndNearbyCodes(x, y, null); boolean wasInKeyRepeat = mHandler.isInKeyRepeat(); mHandler.cancelKeyTimers(); mHandler.cancelPopupPreview(); - if (isMinorMoveBounce(touchX, touchY, keyIndex, mCurrentKey)) { + if (isMinorMoveBounce(x, y, keyIndex, mCurrentKey)) { updateTimeDebouncing(eventTime); } else { resetMultiTap(); @@ -211,21 +211,21 @@ public class PointerTracker { } if (isMinorTimeBounce()) { mCurrentKey = mLastKey; - touchX = mLastCodeX; - touchY = mLastCodeY; + x = mLastCodeX; + y = mLastCodeY; } showKeyPreviewAndUpdateKey(NOT_A_KEY); // If we're not on a repeating key (which sends on a DOWN event) if (!wasInKeyRepeat && !mProxy.isMiniKeyboardOnScreen()) { - detectAndSendKey(mCurrentKey, touchX, touchY, eventTime); + detectAndSendKey(mCurrentKey, (int)x, (int)y, eventTime); } if (isValidKeyIndex(keyIndex)) mProxy.invalidateKey(mKeys[keyIndex]); } - public void onCancelEvent(int touchX, int touchY, long eventTime) { + public void onCancelEvent(int x, int y, long eventTime) { if (DEBUG) - debugLog("onCancelEvt:", touchX, touchY); + debugLog("onCancelEvt:", x, y); mHandler.cancelKeyTimers(); mHandler.cancelPopupPreview(); mProxy.dismissPopupKeyboard(); @@ -244,6 +244,14 @@ public class PointerTracker { } } + public int getLastX() { + return mLastX; + } + + public int getLastY() { + return mLastY; + } + // These package scope methods are only for debugging purpose. /* package */ int getStartX() { return mStartX; @@ -253,14 +261,6 @@ public class PointerTracker { return mStartY; } - /* package */ int getLastX() { - return mLastX; - } - - /* package */ int getLastY() { - return mLastY; - } - private void startMoveDebouncing(int x, int y) { mLastCodeX = x; mLastCodeY = y; @@ -426,7 +426,7 @@ public class PointerTracker { code = String.format((primaryCode < 0) ? "%4d" : "0x%02x", primaryCode); } Log.d(TAG, - String.format("%s [%d] %d,%d %s %s", title, mPointerId, x, y, code, + String.format("%s [%d] %3d,%3d %s %s", title, mPointerId, x, y, code, isModifier() ? "modifier" : "")); } } \ No newline at end of file diff --git a/java/src/com/android/inputmethod/latin/ProximityKeyDetector.java b/java/src/com/android/inputmethod/latin/ProximityKeyDetector.java index 6ee005510..eaaed91aa 100644 --- a/java/src/com/android/inputmethod/latin/ProximityKeyDetector.java +++ b/java/src/com/android/inputmethod/latin/ProximityKeyDetector.java @@ -35,6 +35,8 @@ class ProximityKeyDetector extends KeyDetector { @Override public int getKeyIndexAndNearbyCodes(int x, int y, int[] allKeys) { + int touchX = getTouchX(x); + int touchY = getTouchY(y); final Key[] keys = mKeys; if (keys == null) throw new IllegalStateException("keyboard isn't set"); @@ -44,18 +46,18 @@ class ProximityKeyDetector extends KeyDetector { int closestKeyDist = mProximityThresholdSquare + 1; int[] distances = mDistances; Arrays.fill(distances, Integer.MAX_VALUE); - int [] nearestKeyIndices = mKeyboard.getNearestKeys(x, y); + int [] nearestKeyIndices = mKeyboard.getNearestKeys(touchX, touchY); final int keyCount = nearestKeyIndices.length; for (int i = 0; i < keyCount; i++) { final Key key = keys[nearestKeyIndices[i]]; int dist = 0; - boolean isInside = key.isInside(x,y); + boolean isInside = key.isInside(touchX, touchY); if (isInside) { primaryIndex = nearestKeyIndices[i]; } if (((mProximityCorrectOn - && (dist = key.squaredDistanceFrom(x, y)) < mProximityThresholdSquare) + && (dist = key.squaredDistanceFrom(touchX, touchY)) < mProximityThresholdSquare) || isInside) && key.codes[0] > 32) { // Find insertion point