aboutsummaryrefslogtreecommitdiffstats
path: root/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java')
-rw-r--r--java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java85
1 files changed, 50 insertions, 35 deletions
diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java
index 79b7ceb68..9169630eb 100644
--- a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java
+++ b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java
@@ -21,11 +21,11 @@ import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
+import android.graphics.Paint.Align;
import android.graphics.PorterDuff;
import android.graphics.Rect;
-import android.graphics.Typeface;
-import android.graphics.Paint.Align;
import android.graphics.Region.Op;
+import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.inputmethodservice.Keyboard;
import android.inputmethodservice.Keyboard.Key;
@@ -200,7 +200,6 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener
private GestureDetector mGestureDetector;
private int mPopupX;
private int mPopupY;
- private int mRepeatKeyIndex = NOT_A_KEY;
private int mPopupLayout;
private boolean mAbortKey;
private Key mInvalidatedKey;
@@ -251,6 +250,8 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener
private static final int MSG_REPEAT_KEY = 3;
private static final int MSG_LOGPRESS_KEY = 4;
+ private boolean mInKeyRepeat;
+
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
@@ -261,9 +262,8 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener
mPreviewText.setVisibility(INVISIBLE);
break;
case MSG_REPEAT_KEY:
- if (repeatKey()) {
- startKeyRepeatTimer(REPEAT_INTERVAL);
- }
+ repeatKey(msg.arg1);
+ startKeyRepeatTimer(REPEAT_INTERVAL, msg.arg1);
break;
case MSG_LOGPRESS_KEY:
openPopupIfRequired(msg.arg1);
@@ -288,8 +288,18 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener
removeMessages(MSG_DISMISS_PREVIEW);
}
- public void startKeyRepeatTimer(long delay) {
- sendMessageDelayed(obtainMessage(MSG_REPEAT_KEY), delay);
+ public void startKeyRepeatTimer(long delay, int keyIndex) {
+ mInKeyRepeat = true;
+ sendMessageDelayed(obtainMessage(MSG_REPEAT_KEY, keyIndex, 0), delay);
+ }
+
+ public void cancelKeyRepeatTimer() {
+ mInKeyRepeat = false;
+ removeMessages(MSG_REPEAT_KEY);
+ }
+
+ public boolean isInKeyRepeat() {
+ return mInKeyRepeat;
}
public void startLongPressTimer(int keyIndex, long delay) {
@@ -302,21 +312,14 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener
}
public void cancelKeyTimers() {
- removeMessages(MSG_REPEAT_KEY);
- removeMessages(MSG_LOGPRESS_KEY);
- }
-
- public void cancelKeyTimersAndPopupPreview() {
- removeMessages(MSG_REPEAT_KEY);
- removeMessages(MSG_LOGPRESS_KEY);
- removeMessages(MSG_POPUP_PREVIEW);
+ cancelKeyRepeatTimer();
+ cancelLongPressTimer();
}
public void cancelAllMessages() {
- removeMessages(MSG_REPEAT_KEY);
- removeMessages(MSG_LOGPRESS_KEY);
- removeMessages(MSG_POPUP_PREVIEW);
- removeMessages(MSG_DISMISS_PREVIEW);
+ cancelKeyTimers();
+ cancelPopupPreview();
+ cancelDismissPreview();
}
};
@@ -621,7 +624,8 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener
showPreview(NOT_A_KEY);
}
// Remove any pending messages, except dismissing preview
- mHandler.cancelKeyTimersAndPopupPreview();
+ mHandler.cancelKeyTimers();
+ mHandler.cancelPopupPreview();
mKeyboard = keyboard;
List<Key> keys = mKeyboard.getKeys();
mKeys = keys.toArray(new Key[keys.size()]);
@@ -1308,6 +1312,16 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener
return true;
}
+ if (mHandler.isInKeyRepeat()) {
+ // Will keep being in the key repeating mode while the key is being pressed. It'll be
+ // canceled otherwise.
+ if (pointerCount == 1 && action == MotionEvent.ACTION_MOVE) {
+ return true;
+ } else {
+ mHandler.cancelKeyRepeatTimer();
+ }
+ }
+
if (pointerCount != mOldPointerCount) {
if (pointerCount == 1) {
// Send a down event for the latest pointer
@@ -1357,13 +1371,12 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener
checkMultiTap(eventTime, keyIndex);
mKeyboardActionListener.onPress(keyIndex != NOT_A_KEY ?
mKeys[keyIndex].codes[0] : 0);
- if (mCurrentKey >= 0 && mKeys[mCurrentKey].repeatable) {
- mRepeatKeyIndex = mCurrentKey;
- mHandler.startKeyRepeatTimer(REPEAT_START_DELAY);
- repeatKey();
+ if (keyIndex >= 0 && mKeys[keyIndex].repeatable) {
+ repeatKey(keyIndex);
+ mHandler.startKeyRepeatTimer(REPEAT_START_DELAY, keyIndex);
// Delivering the key could have caused an abort
if (mAbortKey) {
- mRepeatKeyIndex = NOT_A_KEY;
+ mHandler.cancelKeyRepeatTimer();
break;
}
}
@@ -1382,7 +1395,7 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener
} else if (mDebouncer.isMinorMoveBounce(touchX, touchY, keyIndex,
mCurrentKey)) {
mDebouncer.updateTimeDebouncing(eventTime);
- } else if (mRepeatKeyIndex == NOT_A_KEY) {
+ } else {
resetMultiTap();
mDebouncer.resetTimeDebouncing(eventTime, mCurrentKey);
mDebouncer.resetMoveDebouncing();
@@ -1402,7 +1415,8 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener
break;
case MotionEvent.ACTION_UP:
- mHandler.cancelKeyTimersAndPopupPreview();
+ mHandler.cancelKeyTimers();
+ mHandler.cancelPopupPreview();
if (mDebouncer.isMinorMoveBounce(touchX, touchY, keyIndex, mCurrentKey)) {
mDebouncer.updateTimeDebouncing(eventTime);
} else {
@@ -1417,15 +1431,15 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener
}
showPreview(NOT_A_KEY);
// If we're not on a repeating key (which sends on a DOWN event)
- if (mRepeatKeyIndex == NOT_A_KEY && !mMiniKeyboardOnScreen && !mAbortKey) {
+ if (!mMiniKeyboardOnScreen && !mAbortKey) {
detectAndSendKey(mCurrentKey, touchX, touchY, eventTime);
}
invalidateKey(keyIndex);
- mRepeatKeyIndex = NOT_A_KEY;
break;
case MotionEvent.ACTION_CANCEL:
- mHandler.cancelKeyTimersAndPopupPreview();
+ mHandler.cancelKeyTimers();
+ mHandler.cancelPopupPreview();
dismissPopupKeyboard();
mAbortKey = true;
showPreview(NOT_A_KEY);
@@ -1436,10 +1450,11 @@ public class LatinKeyboardBaseView extends View implements View.OnClickListener
return true;
}
- private boolean repeatKey() {
- Key key = mKeys[mRepeatKeyIndex];
- detectAndSendKey(mCurrentKey, key.x, key.y, mLastTapTime);
- return true;
+ private void repeatKey(int keyIndex) {
+ Key key = mKeys[keyIndex];
+ // While key is repeating, because there is no need to handle multi-tap key, we can pass
+ // -1 as eventTime argument.
+ detectAndSendKey(keyIndex, key.x, key.y, -1);
}
protected void swipeRight() {