aboutsummaryrefslogtreecommitdiffstats
path: root/java
diff options
context:
space:
mode:
Diffstat (limited to 'java')
-rw-r--r--java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java187
1 files changed, 124 insertions, 63 deletions
diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java
index 0a3e4a7c7..ba7aa5d1c 100644
--- a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java
+++ b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java
@@ -177,8 +177,6 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener
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;
@@ -187,25 +185,18 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener
private int mPopupPreviewY;
private int mWindowY;
- private int mLastX;
- private int mLastY;
- private int mStartX;
- private int mStartY;
-
private boolean mProximityCorrectOn;
private Paint mPaint;
private Rect mPadding;
- private long mDownTime;
- private long mLastMoveTime;
- private int mLastKey;
- private int mLastCodeX;
- private int mLastCodeY;
private int mCurrentKey = NOT_A_KEY;
private int mDownKey = NOT_A_KEY;
- private long mLastKeyTime;
- private long mCurrentKeyTime;
+ private int mStartX;
+ private int mStartY;
+
+ private KeyDebouncer mDebouncer;
+
private int[] mKeyIndices = new int[12];
private GestureDetector mGestureDetector;
private int mPopupX;
@@ -328,6 +319,98 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener
}
};
+ static class KeyDebouncer {
+ // for move de-bouncing
+ private int mLastCodeX;
+ private int mLastCodeY;
+ private int mLastX;
+ private int mLastY;
+
+ // for time de-bouncing
+ private int mLastKey;
+ private long mLastKeyTime;
+ private long mLastMoveTime;
+ private long mCurrentKeyTime;
+
+ private int mKeyDebounceThreshold;
+ private static final int KEY_DEBOUNCE_FACTOR = 6;
+
+ KeyDebouncer(int proximityThreshold) {
+ // 1/KEY_DEBOUNCE_FACTOR of distance between adjacent keys
+ mKeyDebounceThreshold = proximityThreshold / KEY_DEBOUNCE_FACTOR;
+ }
+
+ public int getLastCodeX() {
+ return mLastCodeX;
+ }
+
+ public int getLastCodeY() {
+ return mLastCodeY;
+ }
+
+ public int getLastX() {
+ return mLastX;
+ }
+
+ public int getLastY() {
+ return mLastY;
+ }
+
+ public int getLastKey() {
+ return mLastKey;
+ }
+
+ public void startMoveDebouncing(int x, int y) {
+ mLastCodeX = x;
+ mLastCodeY = y;
+ }
+
+ public void updateMoveDebouncing(int x, int y) {
+ mLastX = x;
+ mLastY = y;
+ }
+
+ public void resetMoveDebouncing() {
+ mLastCodeX = mLastX;
+ mLastCodeY = mLastY;
+ }
+
+ public boolean isMinorMoveBounce(int x, int y, int keyIndex, int currentKey) {
+ // TODO: Check the coordinate against each key border. The current
+ // logic is pretty simple.
+ if (keyIndex == currentKey)
+ return true;
+ int dx = x - mLastCodeX;
+ int dy = y - mLastCodeY;
+ int delta = dx * dx + dy * dy;
+ return delta < mKeyDebounceThreshold;
+ }
+
+ public void startTimeDebouncing(long eventTime) {
+ mLastKey = NOT_A_KEY;
+ mLastKeyTime = 0;
+ mCurrentKeyTime = 0;
+ mLastMoveTime = eventTime;
+ }
+
+ public void updateTimeDebouncing(long eventTime) {
+ mCurrentKeyTime += eventTime - mLastMoveTime;
+ mLastMoveTime = eventTime;
+ }
+
+ public void resetTimeDebouncing(long eventTime, int currentKey) {
+ mLastKey = currentKey;
+ mLastKeyTime = mCurrentKeyTime + eventTime - mLastMoveTime;
+ mCurrentKeyTime = 0;
+ mLastMoveTime = eventTime;
+ }
+
+ public boolean isMinorTimeBounce() {
+ return mCurrentKeyTime < mLastKeyTime && mCurrentKeyTime < DEBOUNCE_TIME
+ && mLastKey != NOT_A_KEY;
+ }
+ }
+
public LatinKeyboardBaseView(Context context, AttributeSet attrs) {
this(context, attrs, R.attr.keyboardViewStyle);
}
@@ -683,8 +766,7 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener
mProximityThreshold = (int) (dimensionSum * 1.4f / length);
mProximityThreshold *= mProximityThreshold; // Square it
- // 1/KEY_DEBOUNCE_FACTOR of distance between adjacent keys
- mKeyDebounceThreshold = mProximityThreshold / KEY_DEBOUNCE_FACTOR;
+ mDebouncer = new KeyDebouncer(mProximityThreshold);
}
@Override
@@ -804,14 +886,16 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener
if (DEBUG) {
if (mShowTouchPoints) {
+ int lastX = mDebouncer.getLastX();
+ int lastY = mDebouncer.getLastY();
paint.setAlpha(128);
paint.setColor(0xFFFF0000);
canvas.drawCircle(mStartX, mStartY, 3, paint);
- canvas.drawLine(mStartX, mStartY, mLastX, mLastY, paint);
+ canvas.drawLine(mStartX, mStartY, lastX, lastY, paint);
paint.setColor(0xFF0000FF);
- canvas.drawCircle(mLastX, mLastY, 3, paint);
+ canvas.drawCircle(lastX, lastY, 3, paint);
paint.setColor(0xFF00FF00);
- canvas.drawCircle((mStartX + mLastX) / 2, (mStartY + mLastY) / 2, 2, paint);
+ canvas.drawCircle((mStartX + lastX) / 2, (mStartY + lastY) / 2, 2, paint);
}
}
@@ -1206,13 +1290,6 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener
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();
@@ -1246,17 +1323,12 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener
switch (action) {
case MotionEvent.ACTION_DOWN:
mAbortKey = false;
- mStartX = touchX;
- mStartY = touchY;
- mLastCodeX = touchX;
- mLastCodeY = touchY;
- mLastKeyTime = 0;
- mCurrentKeyTime = 0;
- mLastKey = NOT_A_KEY;
mCurrentKey = keyIndex;
mDownKey = keyIndex;
- mDownTime = me.getEventTime();
- mLastMoveTime = mDownTime;
+ mStartX = touchX;
+ mStartY = touchY;
+ mDebouncer.startMoveDebouncing(touchX, touchY);
+ mDebouncer.startTimeDebouncing(eventTime);
checkMultiTap(eventTime, keyIndex);
mKeyboardActionListener.onPress(keyIndex != NOT_A_KEY ?
mKeys[keyIndex].codes[0] : 0);
@@ -1281,22 +1353,16 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener
if (keyIndex != NOT_A_KEY) {
if (mCurrentKey == NOT_A_KEY) {
mCurrentKey = keyIndex;
- mCurrentKeyTime = eventTime - mDownTime;
- } else {
- if (keyIndex == mCurrentKey
- || isMinorMoveForKeyDebounce(touchX, touchY)) {
- mCurrentKeyTime += eventTime - mLastMoveTime;
- continueLongPress = true;
- } else if (mRepeatKeyIndex == NOT_A_KEY) {
- resetMultiTap();
- mLastKey = mCurrentKey;
- mLastCodeX = mLastX;
- mLastCodeY = mLastY;
- mLastKeyTime =
- mCurrentKeyTime + eventTime - mLastMoveTime;
- mCurrentKey = keyIndex;
- mCurrentKeyTime = 0;
- }
+ mDebouncer.updateTimeDebouncing(eventTime);
+ } else if (mDebouncer.isMinorMoveBounce(touchX, touchY,
+ keyIndex, mCurrentKey)) {
+ mDebouncer.updateTimeDebouncing(eventTime);
+ continueLongPress = true;
+ } else if (mRepeatKeyIndex == NOT_A_KEY) {
+ resetMultiTap();
+ mDebouncer.resetTimeDebouncing(eventTime, mCurrentKey);
+ mDebouncer.resetMoveDebouncing();
+ mCurrentKey = keyIndex;
}
}
if (!continueLongPress) {
@@ -1308,25 +1374,21 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener
}
}
showPreview(mCurrentKey);
- mLastMoveTime = eventTime;
break;
case MotionEvent.ACTION_UP:
mHandler.cancelKeyTimersAndPopupPreview();
if (keyIndex == mCurrentKey) {
- mCurrentKeyTime += eventTime - mLastMoveTime;
+ mDebouncer.updateTimeDebouncing(eventTime);
} else {
resetMultiTap();
- mLastKey = mCurrentKey;
- mLastKeyTime = mCurrentKeyTime + eventTime - mLastMoveTime;
+ mDebouncer.resetTimeDebouncing(eventTime, mCurrentKey);
mCurrentKey = keyIndex;
- mCurrentKeyTime = 0;
}
- if (mCurrentKeyTime < mLastKeyTime && mCurrentKeyTime < DEBOUNCE_TIME
- && mLastKey != NOT_A_KEY) {
- mCurrentKey = mLastKey;
- touchX = mLastCodeX;
- touchY = mLastCodeY;
+ if (mDebouncer.isMinorTimeBounce()) {
+ mCurrentKey = mDebouncer.getLastKey();
+ touchX = mDebouncer.getLastCodeX();
+ touchY = mDebouncer.getLastCodeY();
}
showPreview(NOT_A_KEY);
Arrays.fill(mKeyIndices, NOT_A_KEY);
@@ -1345,8 +1407,7 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener
invalidateKey(mCurrentKey);
break;
}
- mLastX = touchX;
- mLastY = touchY;
+ mDebouncer.updateMoveDebouncing(touchX, touchY);
return true;
}