From 7a17c1fcb52f0249108cfcbd789928320706718a Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Tue, 9 Oct 2012 14:31:13 +0900 Subject: [PATCH] Tuning gesture detection parameters Bug: 7032858 Change-Id: Ie4f952aa33b99ce16027500a596d723ee9bafae9 --- java/res/values/config.xml | 2 +- .../inputmethod/keyboard/PointerTracker.java | 49 +++++++------------ .../keyboard/internal/GestureStroke.java | 17 +++++-- 3 files changed, 31 insertions(+), 37 deletions(-) diff --git a/java/res/values/config.xml b/java/res/values/config.xml index b3dbb0ee5..32b54447c 100644 --- a/java/res/values/config.xml +++ b/java/res/values/config.xml @@ -81,7 +81,7 @@ 20 600% - 35% + 50% 16.6666% diff --git a/java/src/com/android/inputmethod/keyboard/PointerTracker.java b/java/src/com/android/inputmethod/keyboard/PointerTracker.java index 82c77d6cd..361053337 100644 --- a/java/src/com/android/inputmethod/keyboard/PointerTracker.java +++ b/java/src/com/android/inputmethod/keyboard/PointerTracker.java @@ -192,47 +192,32 @@ public final class PointerTracker implements PointerTrackerQueue.Element { gestureStrokeParams.mStaticTimeThresholdAfterFastTyping; } - private void recordTyping(final long eventTime) { - mLastTypingTime = eventTime; - } - - private void recordLetterTyping(final long eventTime) { - mLastLetterTypingTime = eventTime; - // Reset gesture typing time - mLastBatchInputTime = 0; - } - - private void recordGestureTyping(final long eventTime) { - mLastBatchInputTime = eventTime; - // Reset typing time. - mLastTypingTime = 0; - } - - private boolean isInTyping() { - return mLastTypingTime != 0; - } - - private boolean isInBatchInput() { - return mLastBatchInputTime != 0; + private boolean wasLastInputTyping() { + return mLastTypingTime >= mLastBatchInputTime; } public void onCodeInput(final int code, final long eventTime) { - if (Keyboard.isLetterCode(code) && code != Keyboard.CODE_SPACE) { - if (isInTyping() - && eventTime - mLastTypingTime < mStaticTimeThresholdAfterFastTyping) { - recordLetterTyping(eventTime); + // Record the letter typing time when + // 1. Letter keys are typed successively without any batch input in between. + // 2. A letter key is typed within the threshold time since the last any key typing. + // 3. A non-letter key is typed within the threshold time since the last letter key + // typing. + if (Character.isLetter(code)) { + if (wasLastInputTyping() + || eventTime - mLastTypingTime < mStaticTimeThresholdAfterFastTyping) { + mLastLetterTypingTime = eventTime; } } else { if (eventTime - mLastLetterTypingTime < mStaticTimeThresholdAfterFastTyping) { // This non-letter typing should be treated as a part of fast typing. - recordLetterTyping(eventTime); + mLastLetterTypingTime = eventTime; } } - recordTyping(eventTime); + mLastTypingTime = eventTime; } public void onEndBatchInput(final long eventTime) { - recordGestureTyping(eventTime); + mLastBatchInputTime = eventTime; } public long getLastLetterTypingTime() { @@ -240,7 +225,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element { } public boolean needsToSuppressKeyPreviewPopup(final long eventTime) { - return !isInTyping() && isInBatchInput() + return !wasLastInputTyping() && eventTime - mLastBatchInputTime < mSuppressKeyPreviewAfterBatchInputDuration; } } @@ -851,11 +836,13 @@ public final class PointerTracker implements PointerTrackerQueue.Element { // Register move event on gesture tracker. onGestureMoveEvent(x, y, eventTime, true /* isMajorEvent */, key); if (sInGesture) { - mTimerProxy.cancelLongPressTimer(); mCurrentKey = null; setReleasedKeyGraphics(oldKey); return; } + if (mGestureStrokeWithPreviewPoints.hasDetectedFastMove()) { + mTimerProxy.cancelLongPressTimer(); + } } if (key != null) { diff --git a/java/src/com/android/inputmethod/keyboard/internal/GestureStroke.java b/java/src/com/android/inputmethod/keyboard/internal/GestureStroke.java index 9b1a20159..c406f0c4f 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/GestureStroke.java +++ b/java/src/com/android/inputmethod/keyboard/internal/GestureStroke.java @@ -190,8 +190,8 @@ public class GestureStroke { return mParams.mDynamicTimeThresholdFrom - decayedThreshold; } - public boolean isStartOfAGesture() { - if (mDetectFastMoveTime == 0) { + public final boolean isStartOfAGesture() { + if (!hasDetectedFastMove()) { return false; } final int size = mEventTimes.getLength(); @@ -200,6 +200,9 @@ public class GestureStroke { } final int lastIndex = size - 1; final int deltaTime = mEventTimes.get(lastIndex) - mDetectFastMoveTime; + if (deltaTime < 0) { + return false; + } final int deltaDistance = getDistance( mXCoordinates.get(lastIndex), mYCoordinates.get(lastIndex), mDetectFastMoveX, mDetectFastMoveY); @@ -240,6 +243,10 @@ public class GestureStroke { mLastMajorEventY = y; } + public final boolean hasDetectedFastMove() { + return mDetectFastMoveTime > 0; + } + private int detectFastMove(final int x, final int y, final int time) { final int size = mEventTimes.getLength(); final int lastIndex = size - 1; @@ -255,7 +262,7 @@ public class GestureStroke { Log.d(TAG, String.format("[%d] detectFastMove: speed=%5.2f", mPointerId, speed)); } // Equivalent to (pixels / msecs < mStartSpeedThreshold / MSEC_PER_SEC) - if (mDetectFastMoveTime == 0 && pixelsPerSec > mDetectFastMoveSpeedThreshold * msecs) { + if (!hasDetectedFastMove() && pixelsPerSec > mDetectFastMoveSpeedThreshold * msecs) { if (DEBUG) { final float speed = (float)pixelsPerSec / msecs / mKeyWidth; Log.d(TAG, String.format( @@ -306,11 +313,11 @@ public class GestureStroke { return currentTime > lastRecognitionTime + mParams.mRecognitionMinimumTime; } - public void appendAllBatchPoints(final InputPointers out) { + public final void appendAllBatchPoints(final InputPointers out) { appendBatchPoints(out, mEventTimes.getLength()); } - public void appendIncrementalBatchPoints(final InputPointers out) { + public final void appendIncrementalBatchPoints(final InputPointers out) { appendBatchPoints(out, mIncrementalRecognitionSize); }