From 9f09c6fbc81ed40a41c0a23bd5913214ec7f6a9b Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Mon, 24 Sep 2012 11:39:37 +0900 Subject: [PATCH] Disable gesture input while fast typing Bug: 7032858 Change-Id: I0f9f92c712dbe45f4ba0b3cf331fbe11426c1db4 --- java/res/values/attrs.xml | 2 ++ java/res/values/config.xml | 1 + java/res/values/styles.xml | 1 + .../inputmethod/keyboard/MainKeyboardView.java | 15 +++++++++++++++ .../inputmethod/keyboard/PointerTracker.java | 17 +++++++++++++++++ .../keyboard/internal/GestureStroke.java | 2 +- 6 files changed, 37 insertions(+), 1 deletion(-) diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml index 7e8c77e13..acc5df2e5 100644 --- a/java/res/values/attrs.xml +++ b/java/res/values/attrs.xml @@ -125,6 +125,8 @@ + + diff --git a/java/res/values/config.xml b/java/res/values/config.xml index 8e2d43e4e..1f6adffbb 100644 --- a/java/res/values/config.xml +++ b/java/res/values/config.xml @@ -66,6 +66,7 @@ 1200 350 + 350 false diff --git a/java/res/values/styles.xml b/java/res/values/styles.xml index ed92440ef..d52039221 100644 --- a/java/res/values/styles.xml +++ b/java/res/values/styles.xml @@ -89,6 +89,7 @@ @integer/config_long_press_key_timeout @integer/config_long_press_shift_key_timeout @integer/config_ignore_alt_code_key_timeout + @integer/config_disable_gesture_while_fast_typing_timeout @bool/config_show_more_keys_keyboard_at_touched_point @integer/config_language_on_spacebar_final_alpha @anim/language_on_spacebar_fadeout diff --git a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java index 4ed0f58e1..f5c1b7a0c 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 d4902ec28..89b6e7bc5 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 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 73413f698..193c3a4ba 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;