aboutsummaryrefslogtreecommitdiffstats
path: root/java/src
diff options
context:
space:
mode:
Diffstat (limited to 'java/src')
-rw-r--r--java/src/com/android/inputmethod/event/Event.java30
-rw-r--r--java/src/com/android/inputmethod/event/EventInterpreter.java2
-rw-r--r--java/src/com/android/inputmethod/event/HardwareKeyboardEventDecoder.java11
-rw-r--r--java/src/com/android/inputmethod/keyboard/MainKeyboardView.java5
-rw-r--r--java/src/com/android/inputmethod/keyboard/PointerTracker.java10
-rw-r--r--java/src/com/android/inputmethod/keyboard/internal/GestureStroke.java14
-rw-r--r--java/src/com/android/inputmethod/latin/LatinIME.java5
7 files changed, 51 insertions, 26 deletions
diff --git a/java/src/com/android/inputmethod/event/Event.java b/java/src/com/android/inputmethod/event/Event.java
index 215e4dee5..3fe5d5b68 100644
--- a/java/src/com/android/inputmethod/event/Event.java
+++ b/java/src/com/android/inputmethod/event/Event.java
@@ -54,39 +54,33 @@ public class Event {
final private static int NOT_A_CODE_POINT = 0;
- private int mType; // The type of event - one of the constants above
+ final private int mType; // The type of event - one of the constants above
// The code point associated with the event, if relevant. This is a unicode code point, and
// has nothing to do with other representations of the key. It is only relevant if this event
// is the right type: COMMITTABLE or DEAD or TOGGLE, but for a mode key like hankaku/zenkaku or
// ctrl, there is no code point associated so this should be NOT_A_CODE_POINT to avoid
// unintentional use of its value when it's not relevant.
- private int mCodePoint;
+ final public int mCodePoint;
- static Event obtainEvent() {
- // TODO: create an event pool instead
- return new Event();
+ // This method is private - to create a new event, use one of the create* utility methods.
+ private Event(final int type, final int codePoint) {
+ mType = type;
+ mCodePoint = codePoint;
}
- public void setDeadEvent(final int codePoint) {
- mType = EVENT_DEAD;
- mCodePoint = codePoint;
+ public static Event createDeadEvent(final int codePoint) {
+ return new Event(EVENT_DEAD, codePoint);
}
- public void setCommittableEvent(final int codePoint) {
- mType = EVENT_COMMITTABLE;
- mCodePoint = codePoint;
+ public static Event createCommittableEvent(final int codePoint) {
+ return new Event(EVENT_COMMITTABLE, codePoint);
}
- public void setNotHandledEvent() {
- mType = EVENT_NOT_HANDLED;
- mCodePoint = NOT_A_CODE_POINT; // Just in case
+ public static Event createNotHandledEvent() {
+ return new Event(EVENT_NOT_HANDLED, NOT_A_CODE_POINT);
}
public boolean isCommittable() {
return EVENT_COMMITTABLE == mType;
}
-
- public int getCodePoint() {
- return mCodePoint;
- }
}
diff --git a/java/src/com/android/inputmethod/event/EventInterpreter.java b/java/src/com/android/inputmethod/event/EventInterpreter.java
index 1bd0cca00..f9185788e 100644
--- a/java/src/com/android/inputmethod/event/EventInterpreter.java
+++ b/java/src/com/android/inputmethod/event/EventInterpreter.java
@@ -107,7 +107,7 @@ public class EventInterpreter {
private boolean onEvent(final Event event) {
if (event.isCommittable()) {
- mLatinIme.onCodeInput(event.getCodePoint(),
+ mLatinIme.onCodeInput(event.mCodePoint,
Constants.EXTERNAL_KEYBOARD_COORDINATE, Constants.EXTERNAL_KEYBOARD_COORDINATE);
return true;
}
diff --git a/java/src/com/android/inputmethod/event/HardwareKeyboardEventDecoder.java b/java/src/com/android/inputmethod/event/HardwareKeyboardEventDecoder.java
index 2dbc9f00b..554319e51 100644
--- a/java/src/com/android/inputmethod/event/HardwareKeyboardEventDecoder.java
+++ b/java/src/com/android/inputmethod/event/HardwareKeyboardEventDecoder.java
@@ -38,7 +38,6 @@ public class HardwareKeyboardEventDecoder implements HardwareEventDecoder {
@Override
public Event decodeHardwareKey(final KeyEvent keyEvent) {
- final Event event = Event.obtainEvent();
// KeyEvent#getUnicodeChar() does not exactly returns a unicode char, but rather a value
// that includes both the unicode char in the lower 21 bits and flags in the upper bits,
// hence the name "codePointAndFlags". {@see KeyEvent#getUnicodeChar()} for more info.
@@ -48,22 +47,20 @@ public class HardwareKeyboardEventDecoder implements HardwareEventDecoder {
// the key for 'A' or Space, but also Backspace or Ctrl or Caps Lock.
final int keyCode = keyEvent.getKeyCode();
if (KeyEvent.KEYCODE_DEL == keyCode) {
- event.setCommittableEvent(Constants.CODE_DELETE);
- return event;
+ return Event.createCommittableEvent(Constants.CODE_DELETE);
}
if (keyEvent.isPrintingKey() || KeyEvent.KEYCODE_SPACE == keyCode
|| KeyEvent.KEYCODE_ENTER == keyCode) {
if (0 != (codePointAndFlags & KeyCharacterMap.COMBINING_ACCENT)) {
// A dead key.
- event.setDeadEvent(codePointAndFlags & KeyCharacterMap.COMBINING_ACCENT_MASK);
+ return Event.createDeadEvent(codePointAndFlags & KeyCharacterMap.COMBINING_ACCENT_MASK);
} else {
// A committable character. This should be committed right away, taking into
// account the current state.
- event.setCommittableEvent(codePointAndFlags);
+ return Event.createCommittableEvent(codePointAndFlags);
}
} else {
- event.setNotHandledEvent();
+ return Event.createNotHandledEvent();
}
- return event;
}
}
diff --git a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
index 130fad851..625575d53 100644
--- a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
@@ -366,6 +366,11 @@ public final class MainKeyboardView extends KeyboardView implements PointerTrack
}
@Override
+ public void cancelUpdateBatchInputTimer(final PointerTracker tracker) {
+ removeMessages(MSG_UPDATE_BATCH_INPUT, tracker);
+ }
+
+ @Override
public void cancelAllUpdateBatchInputTimers() {
removeMessages(MSG_UPDATE_BATCH_INPUT);
}
diff --git a/java/src/com/android/inputmethod/keyboard/PointerTracker.java b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
index 59a3c99aa..62e674ad5 100644
--- a/java/src/com/android/inputmethod/keyboard/PointerTracker.java
+++ b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
@@ -98,6 +98,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element {
public boolean isInDoubleTapTimeout();
public void cancelKeyTimers();
public void startUpdateBatchInputTimer(PointerTracker tracker);
+ public void cancelUpdateBatchInputTimer(PointerTracker tracker);
public void cancelAllUpdateBatchInputTimers();
public static class Adapter implements TimerProxy {
@@ -124,6 +125,8 @@ public final class PointerTracker implements PointerTrackerQueue.Element {
@Override
public void startUpdateBatchInputTimer(PointerTracker tracker) {}
@Override
+ public void cancelUpdateBatchInputTimer(PointerTracker tracker) {}
+ @Override
public void cancelAllUpdateBatchInputTimers() {}
}
}
@@ -791,6 +794,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element {
private void cancelBatchInput() {
sPointerTrackerQueue.cancelAllPointerTracker();
+ mIsDetectingGesture = false;
if (!sInGesture) {
return;
}
@@ -918,6 +922,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element {
if (mIsDetectingGesture) {
final boolean onValidArea = mGestureStrokeWithPreviewPoints.addPointOnKeyboard(
x, y, gestureTime, isMajorEvent);
+ // If the move event goes out from valid batch input area, cancel batch input.
if (!onValidArea) {
cancelBatchInput();
return;
@@ -938,6 +943,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element {
if (DEBUG_MOVE_EVENT) {
printTouchEvent("onMoveEvent:", x, y, eventTime);
}
+ mTimerProxy.cancelUpdateBatchInputTimer(this);
if (mIsTrackingCanceled) {
return;
}
@@ -1122,6 +1128,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element {
printTouchEvent("onUpEvent :", x, y, eventTime);
}
+ mTimerProxy.cancelUpdateBatchInputTimer(this);
if (!sInGesture) {
if (mCurrentKey != null && mCurrentKey.isModifier()) {
// Before processing an up event of modifier key, all pointers already being
@@ -1196,6 +1203,9 @@ public final class PointerTracker implements PointerTrackerQueue.Element {
@Override
public void cancelTracking() {
+ if (isShowingMoreKeysPanel()) {
+ return;
+ }
mIsTrackingCanceled = true;
}
diff --git a/java/src/com/android/inputmethod/keyboard/internal/GestureStroke.java b/java/src/com/android/inputmethod/keyboard/internal/GestureStroke.java
index a43e94a75..adf223602 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/GestureStroke.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/GestureStroke.java
@@ -233,6 +233,10 @@ public class GestureStroke {
if (lastIndex >= 0) {
final int x = mXCoordinates.get(lastIndex);
final int y = mYCoordinates.get(lastIndex);
+ if (DEBUG) {
+ Log.d(TAG, String.format("[%d] duplicateLastPointWith: %d,%d|%d", mPointerId,
+ x, y, time));
+ }
// TODO: Have appendMajorPoint()
appendPoint(x, y, time);
updateIncrementalRecognitionSize(x, y, time);
@@ -251,6 +255,16 @@ public class GestureStroke {
}
private void appendPoint(final int x, final int y, final int time) {
+ final int lastIndex = mEventTimes.getLength() - 1;
+ // The point that is created by {@link duplicateLastPointWith(int)} may have later event
+ // time than the next {@link MotionEvent}. To maintain the monotonicity of the event time,
+ // drop the successive point here.
+ if (lastIndex >= 0 && mEventTimes.get(lastIndex) > time) {
+ Log.w(TAG, String.format("[%d] drop stale event: %d,%d|%d last: %d,%d|%d", mPointerId,
+ x, y, time, mXCoordinates.get(lastIndex), mYCoordinates.get(lastIndex),
+ mEventTimes.get(lastIndex)));
+ return;
+ }
mEventTimes.add(time);
mXCoordinates.add(x);
mYCoordinates.add(y);
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index a6326bf39..38f137784 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -1717,6 +1717,11 @@ public final class LatinIME extends InputMethodService implements KeyboardAction
// If there is a selection, remove it.
final int lengthToDelete = mLastSelectionEnd - mLastSelectionStart;
mConnection.setSelection(mLastSelectionEnd, mLastSelectionEnd);
+ // Reset mLastSelectionEnd to mLastSelectionStart. This is what is supposed to
+ // happen, and if it's wrong, the next call to onUpdateSelection will correct it,
+ // but we want to set it right away to avoid it being used with the wrong values
+ // later (typically, in a subsequent press on backspace).
+ mLastSelectionEnd = mLastSelectionStart;
mConnection.deleteSurroundingText(lengthToDelete, 0);
} else {
// There is no selection, just delete one character.