aboutsummaryrefslogtreecommitdiffstats
path: root/java
diff options
context:
space:
mode:
Diffstat (limited to 'java')
-rw-r--r--java/src/com/android/inputmethod/keyboard/KeyDetector.java63
-rw-r--r--java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java20
-rw-r--r--java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java5
-rw-r--r--java/src/com/android/inputmethod/keyboard/PointerTracker.java3
-rw-r--r--java/src/com/android/inputmethod/keyboard/internal/KeyboardState.java11
-rw-r--r--java/src/com/android/inputmethod/keyboard/internal/PointerTrackerQueue.java24
-rw-r--r--java/src/com/android/inputmethod/latin/LatinIME.java7
7 files changed, 99 insertions, 34 deletions
diff --git a/java/src/com/android/inputmethod/keyboard/KeyDetector.java b/java/src/com/android/inputmethod/keyboard/KeyDetector.java
index bff491ffd..0ce98d2f1 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyDetector.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyDetector.java
@@ -180,32 +180,34 @@ public class KeyDetector {
if (maxCodesSize <= numCodes) {
return;
}
- if (primaryCode != NOT_A_CODE) {
- final List<Integer> additionalChars =
- mKeyboard.getAdditionalProximityChars().get(primaryCode);
- if (additionalChars == null || additionalChars.size() == 0) {
- return;
- }
- int currentCodesSize = numCodes;
- allCodes[numCodes++] = ADDITIONAL_PROXIMITY_CHAR_DELIMITER_CODE;
- if (maxCodesSize <= numCodes) {
- return;
- }
- // TODO: This is O(N^2). Assuming additionalChars.size() is up to 4 or 5.
- for (int i = 0; i < additionalChars.size(); ++i) {
- final int additionalChar = additionalChars.get(i);
- boolean contains = false;
- for (int j = 0; j < currentCodesSize; ++j) {
- if (additionalChar == allCodes[j]) {
- contains = true;
- break;
- }
+
+ final int code = (primaryCode == NOT_A_CODE) ? allCodes[0] : primaryCode;
+ if (code == NOT_A_CODE) {
+ return;
+ }
+ final List<Integer> additionalChars = mKeyboard.getAdditionalProximityChars().get(code);
+ if (additionalChars == null || additionalChars.size() == 0) {
+ return;
+ }
+ int currentCodesSize = numCodes;
+ allCodes[numCodes++] = ADDITIONAL_PROXIMITY_CHAR_DELIMITER_CODE;
+ if (maxCodesSize <= numCodes) {
+ return;
+ }
+ // TODO: This is O(N^2). Assuming additionalChars.size() is up to 4 or 5.
+ for (int i = 0; i < additionalChars.size(); ++i) {
+ final int additionalChar = additionalChars.get(i);
+ boolean contains = false;
+ for (int j = 0; j < currentCodesSize; ++j) {
+ if (additionalChar == allCodes[j]) {
+ contains = true;
+ break;
}
- if (!contains) {
- allCodes[numCodes++] = additionalChar;
- if (maxCodesSize <= numCodes) {
- return;
- }
+ }
+ if (!contains) {
+ allCodes[numCodes++] = additionalChar;
+ if (maxCodesSize <= numCodes) {
+ return;
}
}
}
@@ -257,10 +259,17 @@ public class KeyDetector {
public static String printableCodes(int[] codes) {
final StringBuilder sb = new StringBuilder();
+ boolean addDelimiter = false;
for (final int code : codes) {
if (code == NOT_A_CODE) break;
- if (sb.length() > 0) sb.append(", ");
- sb.append(code);
+ if (code == ADDITIONAL_PROXIMITY_CHAR_DELIMITER_CODE) {
+ sb.append(" | ");
+ addDelimiter = false;
+ } else {
+ if (addDelimiter) sb.append(", ");
+ sb.append(code);
+ addDelimiter = true;
+ }
}
return "[" + sb + "]";
}
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
index 5ba560d72..d5e5a4e53 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java
@@ -268,6 +268,16 @@ public class KeyboardSwitcher implements KeyboardState.SwitchActions,
// Implements {@link KeyboardState.SwitchActions}.
@Override
+ public void cancelDoubleTapTimer() {
+ final LatinKeyboardView keyboardView = getKeyboardView();
+ if (keyboardView != null) {
+ final TimerProxy timer = keyboardView.getTimerProxy();
+ timer.cancelDoubleTapTimer();
+ }
+ }
+
+ // Implements {@link KeyboardState.SwitchActions}.
+ @Override
public boolean isInDoubleTapTimeout() {
final LatinKeyboardView keyboardView = getKeyboardView();
return (keyboardView != null)
@@ -286,6 +296,16 @@ public class KeyboardSwitcher implements KeyboardState.SwitchActions,
// Implements {@link KeyboardState.SwitchActions}.
@Override
+ public void cancelLongPressTimer() {
+ final LatinKeyboardView keyboardView = getKeyboardView();
+ if (keyboardView != null) {
+ final TimerProxy timer = keyboardView.getTimerProxy();
+ timer.cancelLongPressTimer();
+ }
+ }
+
+ // Implements {@link KeyboardState.SwitchActions}.
+ @Override
public void hapticAndAudioFeedback(int code) {
mInputMethodService.hapticAndAudioFeedback(code);
}
diff --git a/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java b/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java
index 88a41579d..9a0fe1efa 100644
--- a/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/LatinKeyboardView.java
@@ -233,6 +233,11 @@ public class LatinKeyboardView extends KeyboardView implements PointerTracker.Ke
}
@Override
+ public void cancelDoubleTapTimer() {
+ removeMessages(MSG_DOUBLE_TAP);
+ }
+
+ @Override
public boolean isInDoubleTapTimeout() {
return hasMessages(MSG_DOUBLE_TAP);
}
diff --git a/java/src/com/android/inputmethod/keyboard/PointerTracker.java b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
index 110f7f6ae..c45308419 100644
--- a/java/src/com/android/inputmethod/keyboard/PointerTracker.java
+++ b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
@@ -77,6 +77,7 @@ public class PointerTracker {
public void startLongPressTimer(int code);
public void cancelLongPressTimer();
public void startDoubleTapTimer();
+ public void cancelDoubleTapTimer();
public boolean isInDoubleTapTimeout();
public void cancelKeyTimers();
@@ -96,6 +97,8 @@ public class PointerTracker {
@Override
public void startDoubleTapTimer() {}
@Override
+ public void cancelDoubleTapTimer() {}
+ @Override
public boolean isInDoubleTapTimeout() { return false; }
@Override
public void cancelKeyTimers() {}
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardState.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardState.java
index cb8b4f05c..6a8a03677 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardState.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardState.java
@@ -54,7 +54,9 @@ public class KeyboardState {
public void startDoubleTapTimer();
public boolean isInDoubleTapTimeout();
+ public void cancelDoubleTapTimer();
public void startLongPressTimer(int code);
+ public void cancelLongPressTimer();
public void hapticAndAudioFeedback(int code);
}
@@ -300,6 +302,8 @@ public class KeyboardState {
} else if (code == Keyboard.CODE_SWITCH_ALPHA_SYMBOL) {
onPressSymbol();
} else {
+ mSwitchActions.cancelDoubleTapTimer();
+ mSwitchActions.cancelLongPressTimer();
mShiftKeyState.onOtherKeyPressed();
mSymbolKeyState.onOtherKeyPressed();
}
@@ -348,7 +352,7 @@ public class KeyboardState {
// state. And mark as if shift key is released.
mShiftKeyState.onRelease();
} else {
- // Shift key is long pressed while shift unloked state.
+ // Shift key is long pressed while shift unlocked state.
setShiftLocked(true);
}
mSwitchActions.hapticAndAudioFeedback(code);
@@ -364,6 +368,11 @@ public class KeyboardState {
private void updateAlphabetShiftState(boolean autoCaps) {
if (!mIsAlphabetMode) return;
+ if (!mShiftKeyState.isReleasing()) {
+ // Ignore update shift state event while the shift key is being pressed (including
+ // chording).
+ return;
+ }
if (!mAlphabetShiftState.isShiftLocked() && !mShiftKeyState.isIgnoring()) {
if (mShiftKeyState.isReleasing() && autoCaps) {
// Only when shift key is releasing, automatic temporary upper case will be set.
diff --git a/java/src/com/android/inputmethod/keyboard/internal/PointerTrackerQueue.java b/java/src/com/android/inputmethod/keyboard/internal/PointerTrackerQueue.java
index d9181f786..5db65c660 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/PointerTrackerQueue.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/PointerTrackerQueue.java
@@ -16,12 +16,18 @@
package com.android.inputmethod.keyboard.internal;
+import android.util.Log;
+
+import com.android.inputmethod.keyboard.Keyboard;
import com.android.inputmethod.keyboard.PointerTracker;
import java.util.Iterator;
import java.util.LinkedList;
public class PointerTrackerQueue {
+ private static final String TAG = PointerTrackerQueue.class.getSimpleName();
+ private static final boolean DEBUG = false;
+
private final LinkedList<PointerTracker> mQueue = new LinkedList<PointerTracker>();
public synchronized void add(PointerTracker tracker) {
@@ -32,7 +38,11 @@ public class PointerTrackerQueue {
mQueue.remove(tracker);
}
- public synchronized void releaseAllPointersOlderThan(PointerTracker tracker, long eventTime) {
+ public synchronized void releaseAllPointersOlderThan(PointerTracker tracker,
+ long eventTime) {
+ if (DEBUG) {
+ Log.d(TAG, "releaseAllPoniterOlderThan: [" + tracker.mPointerId + "] " + this);
+ }
if (!mQueue.contains(tracker)) {
return;
}
@@ -54,6 +64,13 @@ public class PointerTrackerQueue {
}
public synchronized void releaseAllPointersExcept(PointerTracker tracker, long eventTime) {
+ if (DEBUG) {
+ if (tracker == null) {
+ Log.d(TAG, "releaseAllPoniters: " + this);
+ } else {
+ Log.d(TAG, "releaseAllPoniterExcept: [" + tracker.mPointerId + "] " + this);
+ }
+ }
final Iterator<PointerTracker> it = mQueue.iterator();
while (it.hasNext()) {
final PointerTracker t = it.next();
@@ -79,8 +96,9 @@ public class PointerTrackerQueue {
for (final PointerTracker tracker : mQueue) {
if (sb.length() > 0)
sb.append(" ");
- sb.append(tracker.mPointerId);
+ sb.append("[" + tracker.mPointerId + " "
+ + Keyboard.printableCode(tracker.getKey().mCode) + "]");
}
- return "[" + sb + "]";
+ return sb.toString();
}
}
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 1cb79e707..730992b13 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -325,7 +325,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
return hasMessages(MSG_UPDATE_SUGGESTIONS);
}
- public void postUpdateShiftKeyState() {
+ public void postUpdateShiftState() {
removeMessages(MSG_UPDATE_SHIFT_STATE);
sendMessageDelayed(obtainMessage(MSG_UPDATE_SHIFT_STATE), mDelayUpdateShiftState);
}
@@ -898,9 +898,10 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
resetComposingState(true /* alsoResetLastComposedWord */);
updateSuggestions();
}
+
+ mHandler.postUpdateShiftState();
}
mExpectingUpdateSelection = false;
- mHandler.postUpdateShiftKeyState();
// TODO: Decide to call restartSuggestionsOnWordBeforeCursorIfAtEndOfWord() or not
// here. It would probably be too expensive to call directly here but we may want to post a
// message to delay it. The point would be to unify behavior between backspace to the
@@ -1391,7 +1392,7 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar
mVoiceProxy.handleBackspace();
// In many cases, we may have to put the keyboard in auto-shift state again.
- mHandler.postUpdateShiftKeyState();
+ mHandler.postUpdateShiftState();
if (mEnteredText != null && sameAsTextBeforeCursor(ic, mEnteredText)) {
// Cancel multi-character input: remove the text we just entered.