aboutsummaryrefslogtreecommitdiffstats
path: root/java/src/com/android/inputmethod
diff options
context:
space:
mode:
authorTadashi G. Takaoka <takaoka@google.com>2010-09-15 02:54:43 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2010-09-15 02:54:43 -0700
commitbf1f16f35f96e9aca5c62a9793ec2ba7ba1bffbe (patch)
tree9693cac4ba1f88aa216d7346da942248013adac7 /java/src/com/android/inputmethod
parentbd1cc1da005fe477bf28afce43d5572e381b4757 (diff)
parent2aa8078df86029dab394d8dd616f4f6decb39035 (diff)
downloadlatinime-bf1f16f35f96e9aca5c62a9793ec2ba7ba1bffbe.tar.gz
latinime-bf1f16f35f96e9aca5c62a9793ec2ba7ba1bffbe.tar.xz
latinime-bf1f16f35f96e9aca5c62a9793ec2ba7ba1bffbe.zip
Merge "All keys should be processed before processing modifier key" into gingerbread
Diffstat (limited to 'java/src/com/android/inputmethod')
-rw-r--r--java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java36
-rw-r--r--java/src/com/android/inputmethod/latin/PointerTracker.java12
2 files changed, 40 insertions, 8 deletions
diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java
index a78e2b869..3ae2e1c53 100644
--- a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java
+++ b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java
@@ -345,7 +345,7 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
return -1;
}
- public void releasePointersOlderThan(PointerTracker tracker, long eventTime) {
+ public void releaseAllPointersOlderThan(PointerTracker tracker, long eventTime) {
LinkedList<PointerTracker> queue = mQueue;
int oldestPos = 0;
for (PointerTracker t = queue.get(oldestPos); t != tracker; t = queue.get(oldestPos)) {
@@ -353,11 +353,24 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
oldestPos++;
} else {
t.onUpEvent(t.getLastX(), t.getLastY(), eventTime);
+ t.setAlreadyProcessed();
queue.remove(oldestPos);
}
}
}
+ public void releaseAllPointersExcept(PointerTracker tracker, long eventTime) {
+ for (PointerTracker t : mQueue) {
+ if (t == tracker)
+ continue;
+ t.onUpEvent(t.getLastX(), t.getLastY(), eventTime);
+ t.setAlreadyProcessed();
+ }
+ mQueue.clear();
+ if (tracker != null)
+ mQueue.add(tracker);
+ }
+
public void remove(PointerTracker tracker) {
mQueue.remove(tracker);
}
@@ -1246,17 +1259,28 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
}
private void onDownEvent(PointerTracker tracker, int x, int y, long eventTime) {
+ if (tracker.isOnModifierKey(x, y)) {
+ // Before processing a down event of modifier key, all pointers already being tracked
+ // should be released.
+ mPointerQueue.releaseAllPointersExcept(null, eventTime);
+ }
tracker.onDownEvent(x, y, eventTime);
mPointerQueue.add(tracker);
}
private void onUpEvent(PointerTracker tracker, int x, int y, long eventTime) {
- int index = mPointerQueue.lastIndexOf(tracker);
- if (index >= 0) {
- mPointerQueue.releasePointersOlderThan(tracker, eventTime);
+ if (tracker.isModifier()) {
+ // Before processing an up event of modifier key, all pointers already being tracked
+ // should be released.
+ mPointerQueue.releaseAllPointersExcept(tracker, eventTime);
} else {
- Log.w(TAG, "onUpEvent: corresponding down event not found for pointer "
- + tracker.mPointerId);
+ int index = mPointerQueue.lastIndexOf(tracker);
+ if (index >= 0) {
+ mPointerQueue.releaseAllPointersOlderThan(tracker, eventTime);
+ } else {
+ Log.w(TAG, "onUpEvent: corresponding down event not found for pointer "
+ + tracker.mPointerId);
+ }
}
tracker.onUpEvent(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 958e57618..a612c8eec 100644
--- a/java/src/com/android/inputmethod/latin/PointerTracker.java
+++ b/java/src/com/android/inputmethod/latin/PointerTracker.java
@@ -123,8 +123,8 @@ public class PointerTracker {
return isValidKeyIndex(keyIndex) ? mKeys[keyIndex] : null;
}
- public boolean isModifier() {
- Key key = getKey(mCurrentKey);
+ private boolean isModifierInternal(int keyIndex) {
+ Key key = getKey(keyIndex);
if (key == null)
return false;
int primaryCode = key.codes[0];
@@ -132,6 +132,14 @@ public class PointerTracker {
|| primaryCode == Keyboard.KEYCODE_MODE_CHANGE;
}
+ public boolean isModifier() {
+ return isModifierInternal(mCurrentKey);
+ }
+
+ public boolean isOnModifierKey(int x, int y) {
+ return isModifierInternal(mKeyDetector.getKeyIndexAndNearbyCodes(x, y, null));
+ }
+
public void updateKey(int keyIndex) {
if (mKeyAlreadyProcessed)
return;