diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml index 7e8c77e1365d4dbcbbb031083e398b378fdcb409..acc5df2e5de58be22381695227c98b692b837610 100644 --- a/java/res/values/attrs.xml +++ b/java/res/values/attrs.xml @@ -125,6 +125,8 @@ <attr name="longPressShiftKeyTimeout" format="integer" /> <!-- Ignore special key timeout while typing in millisecond. --> <attr name="ignoreAltCodeKeyTimeout" format="integer" /> + <!-- Disable gesture input while fast typing timer in millisecond. --> + <attr name="disableGestureWhileFastTypingTimeout" format="integer" /> <!-- More keys keyboard will shown at touched point. --> <attr name="showMoreKeysKeyboardAtTouchedPoint" format="boolean" /> </declare-styleable> diff --git a/java/res/values/config.xml b/java/res/values/config.xml index 8e2d43e4e04c96205eb357bce3ceae0775d5933d..1f6adffbbe40d62691f8110c65cf88b9c844eff2 100644 --- a/java/res/values/config.xml +++ b/java/res/values/config.xml @@ -66,6 +66,7 @@ <!-- Long pressing shift will invoke caps-lock if > 0, never invoke caps-lock if == 0 --> <integer name="config_long_press_shift_key_timeout">1200</integer> <integer name="config_ignore_alt_code_key_timeout">350</integer> + <integer name="config_disable_gesture_while_fast_typing_timeout">350</integer> <!-- Showing more keys keyboard, just above the touched point if true, aligned to the key if false --> <bool name="config_show_more_keys_keyboard_at_touched_point">false</bool> diff --git a/java/res/values/styles.xml b/java/res/values/styles.xml index ed92440ef0929dd7c441d3591e8a89e65f4bc9fa..d520392215265d877f9a27631774d7f432d40dc7 100644 --- a/java/res/values/styles.xml +++ b/java/res/values/styles.xml @@ -89,6 +89,7 @@ <item name="longPressKeyTimeout">@integer/config_long_press_key_timeout</item> <item name="longPressShiftKeyTimeout">@integer/config_long_press_shift_key_timeout</item> <item name="ignoreAltCodeKeyTimeout">@integer/config_ignore_alt_code_key_timeout</item> + <item name="disableGestureWhileFastTypingTimeout">@integer/config_disable_gesture_while_fast_typing_timeout</item> <item name="showMoreKeysKeyboardAtTouchedPoint">@bool/config_show_more_keys_keyboard_at_touched_point</item> <item name="languageOnSpacebarFinalAlpha">@integer/config_language_on_spacebar_final_alpha</item> <item name="languageOnSpacebarFadeoutAnimator">@anim/language_on_spacebar_fadeout</item> diff --git a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java index 4ed0f58e14423e64db1ceca264b99f7ef44dc526..f5c1b7a0c299cc281749f84e94b4a296a6e9d04f 100644 --- a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java +++ b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java @@ -142,12 +142,14 @@ public class MainKeyboardView extends KeyboardView implements PointerTracker.Key private static final int MSG_REPEAT_KEY = 1; private static final int MSG_LONGPRESS_KEY = 2; private static final int MSG_DOUBLE_TAP = 3; + private static final int MSG_DISABLE_GESTURE_EXPIRED = 4; private final int mKeyRepeatStartTimeout; private final int mKeyRepeatInterval; private final int mLongPressKeyTimeout; private final int mLongPressShiftKeyTimeout; private final int mIgnoreAltCodeKeyTimeout; + private final int mDisableGestureWhileFastTypingTimeout; public KeyTimerHandler(final MainKeyboardView outerInstance, final TypedArray mainKeyboardViewAttr) { @@ -163,6 +165,8 @@ public class MainKeyboardView extends KeyboardView implements PointerTracker.Key R.styleable.MainKeyboardView_longPressShiftKeyTimeout, 0); mIgnoreAltCodeKeyTimeout = mainKeyboardViewAttr.getInt( R.styleable.MainKeyboardView_ignoreAltCodeKeyTimeout, 0); + mDisableGestureWhileFastTypingTimeout = mainKeyboardViewAttr.getInt( + R.styleable.MainKeyboardView_disableGestureWhileFastTypingTimeout, 0); } @Override @@ -187,6 +191,9 @@ public class MainKeyboardView extends KeyboardView implements PointerTracker.Key KeyboardSwitcher.getInstance().onLongPressTimeout(msg.arg1); } break; + case MSG_DISABLE_GESTURE_EXPIRED: + PointerTracker.clearGestureOffWhileFastTyping(); + break; } } @@ -311,6 +318,14 @@ public class MainKeyboardView extends KeyboardView implements PointerTracker.Key return hasMessages(MSG_TYPING_STATE_EXPIRED); } + @Override + public void startGestureOffWhileFastTypingTimer() { + removeMessages(MSG_DISABLE_GESTURE_EXPIRED); + PointerTracker.setGestureOffWhileFastTyping(); + sendMessageDelayed(obtainMessage(MSG_DISABLE_GESTURE_EXPIRED), + mDisableGestureWhileFastTypingTimeout); + } + @Override public void startDoubleTapTimer() { sendMessageDelayed(obtainMessage(MSG_DOUBLE_TAP), diff --git a/java/src/com/android/inputmethod/keyboard/PointerTracker.java b/java/src/com/android/inputmethod/keyboard/PointerTracker.java index d4902ec289590fafa5f2a646fdf32d1c96c013d7..89b6e7bc5c881c0481d1c02692eca2d3ad7951f3 100644 --- a/java/src/com/android/inputmethod/keyboard/PointerTracker.java +++ b/java/src/com/android/inputmethod/keyboard/PointerTracker.java @@ -46,6 +46,7 @@ public class PointerTracker implements PointerTrackerQueue.Element { private static boolean sMainDictionaryAvailable = false; private static boolean sGestureHandlingEnabledByInputField = false; private static boolean sGestureHandlingEnabledByUser = false; + private static boolean sGestureOffWhileFastTyping = false; public interface KeyEventHandler { /** @@ -84,6 +85,7 @@ public class PointerTracker implements PointerTrackerQueue.Element { public interface TimerProxy { public void startTypingStateTimer(Key typedKey); public boolean isTypingState(); + public void startGestureOffWhileFastTypingTimer(); public void startKeyRepeatTimer(PointerTracker tracker); public void startLongPressTimer(PointerTracker tracker); public void startLongPressTimer(int code); @@ -99,6 +101,8 @@ public class PointerTracker implements PointerTrackerQueue.Element { @Override public boolean isTypingState() { return false; } @Override + public void startGestureOffWhileFastTypingTimer() {} + @Override public void startKeyRepeatTimer(PointerTracker tracker) {} @Override public void startLongPressTimer(PointerTracker tracker) {} @@ -225,6 +229,7 @@ public class PointerTracker implements PointerTrackerQueue.Element { private static void updateGestureHandlingMode() { sShouldHandleGesture = sMainDictionaryAvailable + && !sGestureOffWhileFastTyping && sGestureHandlingEnabledByInputField && sGestureHandlingEnabledByUser && !AccessibilityUtils.getInstance().isTouchExplorationEnabled(); @@ -241,6 +246,16 @@ public class PointerTracker implements PointerTrackerQueue.Element { updateGestureHandlingMode(); } + public static void setGestureOffWhileFastTyping() { + sGestureOffWhileFastTyping = true; + updateGestureHandlingMode(); + } + + public static void clearGestureOffWhileFastTyping() { + sGestureOffWhileFastTyping = false; + updateGestureHandlingMode(); + } + public static PointerTracker getPointerTracker(final int id, final KeyEventHandler handler) { final ArrayList<PointerTracker> trackers = sTrackers; @@ -346,8 +361,10 @@ public class PointerTracker implements PointerTrackerQueue.Element { if (key.isEnabled() || altersCode) { if (code == Keyboard.CODE_OUTPUT_TEXT) { mListener.onTextInput(key.getOutputText()); + mTimerProxy.startGestureOffWhileFastTypingTimer(); } else if (code != Keyboard.CODE_UNSPECIFIED) { mListener.onCodeInput(code, x, y); + mTimerProxy.startGestureOffWhileFastTypingTimer(); } } } diff --git a/java/src/com/android/inputmethod/keyboard/internal/GestureStroke.java b/java/src/com/android/inputmethod/keyboard/internal/GestureStroke.java index 73413f698a93bd287732a23987af054a8e067888..193c3a4bad119598438e0b0d0daf965dae072c04 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/GestureStroke.java +++ b/java/src/com/android/inputmethod/keyboard/internal/GestureStroke.java @@ -45,7 +45,7 @@ public class GestureStroke { private int mDetectFastMoveY; // TODO: Move some of these to resource. - private static final float START_GESTURE_LENGTH_THRESHOLD_RATIO_TO_KEY_WIDTH = 0.75f; + private static final float START_GESTURE_LENGTH_THRESHOLD_RATIO_TO_KEY_WIDTH = 0.60f; private static final int START_GESTURE_DURATION_THRESHOLD = 70; // msec private static final int MIN_GESTURE_RECOGNITION_TIME = 100; // msec private static final float MIN_GESTURE_SAMPLING_RATIO_TO_KEY_WIDTH = 1.0f / 6.0f;