From d631778e1c1ffcdf28129894239e7ee7d6f399fc Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Mon, 15 Oct 2012 17:16:39 -0700 Subject: [PATCH] Restrict bogus move event detector to a horizontal movement The bogus move detection threshold is in proportional to a diagonal length of a key. It was in proportional to a key width. Bug: 7346614 Change-Id: I796add8aea16dd05e9844d6c4fba8072eece39c6 --- .../inputmethod/keyboard/PointerTracker.java | 51 +++++++++++-------- 1 file changed, 30 insertions(+), 21 deletions(-) diff --git a/java/src/com/android/inputmethod/keyboard/PointerTracker.java b/java/src/com/android/inputmethod/keyboard/PointerTracker.java index ccf6932ca..d0f7cb276 100644 --- a/java/src/com/android/inputmethod/keyboard/PointerTracker.java +++ b/java/src/com/android/inputmethod/keyboard/PointerTracker.java @@ -180,8 +180,9 @@ public final class PointerTracker implements PointerTrackerQueue.Element { static final class BogusMoveEventDetector { // Move these thresholds to resource. - private static final float BOGUS_MOVE_ACCUMULATED_DISTANCE_THRESHOLD = 0.70f; // in keyWidth - private static final float BOGUS_MOVE_RADIUS_THRESHOLD = 1.50f; // in keyWidth + // These thresholds' unit is a diagonal length of a key. + private static final float BOGUS_MOVE_ACCUMULATED_DISTANCE_THRESHOLD = 0.53f; + private static final float BOGUS_MOVE_RADIUS_THRESHOLD = 1.14f; private int mAccumulatedDistanceThreshold; private int mRadiusThreshold; @@ -191,10 +192,11 @@ public final class PointerTracker implements PointerTrackerQueue.Element { private int mActualDownX; private int mActualDownY; - public void setKeyboardGeometry(final int keyWidth) { + public void setKeyboardGeometry(final int keyWidth, final int keyHeight) { + final float keyDiagonal = (float)Math.hypot(keyWidth, keyHeight); mAccumulatedDistanceThreshold = (int)( - keyWidth * BOGUS_MOVE_ACCUMULATED_DISTANCE_THRESHOLD); - mRadiusThreshold = (int)(keyWidth * BOGUS_MOVE_RADIUS_THRESHOLD); + keyDiagonal * BOGUS_MOVE_ACCUMULATED_DISTANCE_THRESHOLD); + mRadiusThreshold = (int)(keyDiagonal * BOGUS_MOVE_RADIUS_THRESHOLD); } public void onActualDownEvent(final int x, final int y) { @@ -210,8 +212,12 @@ public final class PointerTracker implements PointerTrackerQueue.Element { mAccumulatedDistanceFromDownKey += distance; } - public boolean hasTraveledLongDistance() { - return mAccumulatedDistanceFromDownKey >= mAccumulatedDistanceThreshold; + public boolean hasTraveledLongDistance(final int x, final int y) { + final int dx = Math.abs(x - mActualDownX); + final int dy = Math.abs(y - mActualDownY); + // A bogus move event should be a horizontal movement. A vertical movement might be + // a sloppy typing and should be ignored. + return dx >= dy && mAccumulatedDistanceFromDownKey >= mAccumulatedDistanceThreshold; } /* package */ int getDistanceFromDownEvent(final int x, final int y) { @@ -514,7 +520,9 @@ public final class PointerTracker implements PointerTrackerQueue.Element { } mKeyDetector = keyDetector; mKeyboard = keyDetector.getKeyboard(); - mGestureStrokeWithPreviewPoints.setKeyboardGeometry(mKeyboard.mMostCommonKeyWidth); + final int keyWidth = mKeyboard.mMostCommonKeyWidth; + final int keyHeight = mKeyboard.mMostCommonKeyHeight; + mGestureStrokeWithPreviewPoints.setKeyboardGeometry(keyWidth); final Key newKey = mKeyDetector.detectHitKey(mKeyX, mKeyY); if (newKey != mCurrentKey) { if (mDrawingProxy != null) { @@ -522,9 +530,8 @@ public final class PointerTracker implements PointerTrackerQueue.Element { } // Keep {@link #mCurrentKey} that comes from previous keyboard. } - final int keyWidth = mKeyboard.mMostCommonKeyWidth; mPhantonSuddenMoveThreshold = (int)(keyWidth * PHANTOM_SUDDEN_MOVE_THRESHOLD); - mBogusMoveEventDetector.setKeyboardGeometry(keyWidth); + mBogusMoveEventDetector.setKeyboardGeometry(keyWidth, keyHeight); } @Override @@ -962,11 +969,13 @@ public final class PointerTracker implements PointerTrackerQueue.Element { && sTimeRecorder.isInFastTyping(eventTime) && mBogusMoveEventDetector.isCloseToActualDownEvent(x, y)) { if (DEBUG_MODE) { + final float keyDiagonal = (float)Math.hypot( + mKeyboard.mMostCommonKeyWidth, mKeyboard.mMostCommonKeyHeight); final float radiusRatio = - (float)mBogusMoveEventDetector.getDistanceFromDownEvent(x, y) - / mKeyboard.mMostCommonKeyWidth; + mBogusMoveEventDetector.getDistanceFromDownEvent(x, y) + / keyDiagonal; Log.w(TAG, String.format("[%d] onMoveEvent:" - + " bogus down-move-up event (raidus=%.2f keyWidth) is " + + " bogus down-move-up event (raidus=%.2f key diagonal) is " + " translated to up[%d,%d,%s]/down[%d,%d,%s] events", mPointerId, radiusRatio, lastX, lastY, Keyboard.printableCode(oldKey.mCode), @@ -1146,24 +1155,24 @@ public final class PointerTracker implements PointerTrackerQueue.Element { final int distanceFromKeyEdgeSquared = curKey.squaredDistanceToEdge(x, y); if (distanceFromKeyEdgeSquared >= keyHysteresisDistanceSquared) { if (DEBUG_MODE) { - final int keyWidth = mKeyboard.mMostCommonKeyWidth; - final float distanceToEdgeRatio = (float)distanceFromKeyEdgeSquared - / (keyWidth * keyWidth); + final float distanceToEdgeRatio = (float)Math.sqrt(distanceFromKeyEdgeSquared) + / mKeyboard.mMostCommonKeyWidth; Log.d(TAG, String.format("[%d] isMajorEnoughMoveToBeOnNewKey:" - +" %.2f keyWidth from key edge", + +" %.2f key width from key edge", mPointerId, distanceToEdgeRatio)); } return true; } if (sNeedsProximateBogusDownMoveUpEventHack && !mIsAllowedSlidingKeyInput && sTimeRecorder.isInFastTyping(eventTime) - && mBogusMoveEventDetector.hasTraveledLongDistance()) { + && mBogusMoveEventDetector.hasTraveledLongDistance(x, y)) { if (DEBUG_MODE) { + final float keyDiagonal = (float)Math.hypot( + mKeyboard.mMostCommonKeyWidth, mKeyboard.mMostCommonKeyHeight); final float lengthFromDownRatio = - (float)mBogusMoveEventDetector.mAccumulatedDistanceFromDownKey - / mKeyboard.mMostCommonKeyWidth; + mBogusMoveEventDetector.mAccumulatedDistanceFromDownKey / keyDiagonal; Log.d(TAG, String.format("[%d] isMajorEnoughMoveToBeOnNewKey:" - + " %.2f keyWidth from virtual down point", + + " %.2f key diagonal from virtual down point", mPointerId, lengthFromDownRatio)); } return true;