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
main
Tadashi G. Takaoka 2012-10-15 17:16:39 -07:00
parent c1bcb8ee10
commit d631778e1c
1 changed files with 30 additions and 21 deletions

View File

@ -180,8 +180,9 @@ public final class PointerTracker implements PointerTrackerQueue.Element {
static final class BogusMoveEventDetector { static final class BogusMoveEventDetector {
// Move these thresholds to resource. // Move these thresholds to resource.
private static final float BOGUS_MOVE_ACCUMULATED_DISTANCE_THRESHOLD = 0.70f; // in keyWidth // These thresholds' unit is a diagonal length of a key.
private static final float BOGUS_MOVE_RADIUS_THRESHOLD = 1.50f; // in keyWidth 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 mAccumulatedDistanceThreshold;
private int mRadiusThreshold; private int mRadiusThreshold;
@ -191,10 +192,11 @@ public final class PointerTracker implements PointerTrackerQueue.Element {
private int mActualDownX; private int mActualDownX;
private int mActualDownY; 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)( mAccumulatedDistanceThreshold = (int)(
keyWidth * BOGUS_MOVE_ACCUMULATED_DISTANCE_THRESHOLD); keyDiagonal * BOGUS_MOVE_ACCUMULATED_DISTANCE_THRESHOLD);
mRadiusThreshold = (int)(keyWidth * BOGUS_MOVE_RADIUS_THRESHOLD); mRadiusThreshold = (int)(keyDiagonal * BOGUS_MOVE_RADIUS_THRESHOLD);
} }
public void onActualDownEvent(final int x, final int y) { public void onActualDownEvent(final int x, final int y) {
@ -210,8 +212,12 @@ public final class PointerTracker implements PointerTrackerQueue.Element {
mAccumulatedDistanceFromDownKey += distance; mAccumulatedDistanceFromDownKey += distance;
} }
public boolean hasTraveledLongDistance() { public boolean hasTraveledLongDistance(final int x, final int y) {
return mAccumulatedDistanceFromDownKey >= mAccumulatedDistanceThreshold; 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) { /* package */ int getDistanceFromDownEvent(final int x, final int y) {
@ -514,7 +520,9 @@ public final class PointerTracker implements PointerTrackerQueue.Element {
} }
mKeyDetector = keyDetector; mKeyDetector = keyDetector;
mKeyboard = keyDetector.getKeyboard(); 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); final Key newKey = mKeyDetector.detectHitKey(mKeyX, mKeyY);
if (newKey != mCurrentKey) { if (newKey != mCurrentKey) {
if (mDrawingProxy != null) { if (mDrawingProxy != null) {
@ -522,9 +530,8 @@ public final class PointerTracker implements PointerTrackerQueue.Element {
} }
// Keep {@link #mCurrentKey} that comes from previous keyboard. // Keep {@link #mCurrentKey} that comes from previous keyboard.
} }
final int keyWidth = mKeyboard.mMostCommonKeyWidth;
mPhantonSuddenMoveThreshold = (int)(keyWidth * PHANTOM_SUDDEN_MOVE_THRESHOLD); mPhantonSuddenMoveThreshold = (int)(keyWidth * PHANTOM_SUDDEN_MOVE_THRESHOLD);
mBogusMoveEventDetector.setKeyboardGeometry(keyWidth); mBogusMoveEventDetector.setKeyboardGeometry(keyWidth, keyHeight);
} }
@Override @Override
@ -962,11 +969,13 @@ public final class PointerTracker implements PointerTrackerQueue.Element {
&& sTimeRecorder.isInFastTyping(eventTime) && sTimeRecorder.isInFastTyping(eventTime)
&& mBogusMoveEventDetector.isCloseToActualDownEvent(x, y)) { && mBogusMoveEventDetector.isCloseToActualDownEvent(x, y)) {
if (DEBUG_MODE) { if (DEBUG_MODE) {
final float keyDiagonal = (float)Math.hypot(
mKeyboard.mMostCommonKeyWidth, mKeyboard.mMostCommonKeyHeight);
final float radiusRatio = final float radiusRatio =
(float)mBogusMoveEventDetector.getDistanceFromDownEvent(x, y) mBogusMoveEventDetector.getDistanceFromDownEvent(x, y)
/ mKeyboard.mMostCommonKeyWidth; / keyDiagonal;
Log.w(TAG, String.format("[%d] onMoveEvent:" 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", + " translated to up[%d,%d,%s]/down[%d,%d,%s] events",
mPointerId, radiusRatio, mPointerId, radiusRatio,
lastX, lastY, Keyboard.printableCode(oldKey.mCode), lastX, lastY, Keyboard.printableCode(oldKey.mCode),
@ -1146,24 +1155,24 @@ public final class PointerTracker implements PointerTrackerQueue.Element {
final int distanceFromKeyEdgeSquared = curKey.squaredDistanceToEdge(x, y); final int distanceFromKeyEdgeSquared = curKey.squaredDistanceToEdge(x, y);
if (distanceFromKeyEdgeSquared >= keyHysteresisDistanceSquared) { if (distanceFromKeyEdgeSquared >= keyHysteresisDistanceSquared) {
if (DEBUG_MODE) { if (DEBUG_MODE) {
final int keyWidth = mKeyboard.mMostCommonKeyWidth; final float distanceToEdgeRatio = (float)Math.sqrt(distanceFromKeyEdgeSquared)
final float distanceToEdgeRatio = (float)distanceFromKeyEdgeSquared / mKeyboard.mMostCommonKeyWidth;
/ (keyWidth * keyWidth);
Log.d(TAG, String.format("[%d] isMajorEnoughMoveToBeOnNewKey:" Log.d(TAG, String.format("[%d] isMajorEnoughMoveToBeOnNewKey:"
+" %.2f keyWidth from key edge", +" %.2f key width from key edge",
mPointerId, distanceToEdgeRatio)); mPointerId, distanceToEdgeRatio));
} }
return true; return true;
} }
if (sNeedsProximateBogusDownMoveUpEventHack && !mIsAllowedSlidingKeyInput if (sNeedsProximateBogusDownMoveUpEventHack && !mIsAllowedSlidingKeyInput
&& sTimeRecorder.isInFastTyping(eventTime) && sTimeRecorder.isInFastTyping(eventTime)
&& mBogusMoveEventDetector.hasTraveledLongDistance()) { && mBogusMoveEventDetector.hasTraveledLongDistance(x, y)) {
if (DEBUG_MODE) { if (DEBUG_MODE) {
final float keyDiagonal = (float)Math.hypot(
mKeyboard.mMostCommonKeyWidth, mKeyboard.mMostCommonKeyHeight);
final float lengthFromDownRatio = final float lengthFromDownRatio =
(float)mBogusMoveEventDetector.mAccumulatedDistanceFromDownKey mBogusMoveEventDetector.mAccumulatedDistanceFromDownKey / keyDiagonal;
/ mKeyboard.mMostCommonKeyWidth;
Log.d(TAG, String.format("[%d] isMajorEnoughMoveToBeOnNewKey:" Log.d(TAG, String.format("[%d] isMajorEnoughMoveToBeOnNewKey:"
+ " %.2f keyWidth from virtual down point", + " %.2f key diagonal from virtual down point",
mPointerId, lengthFromDownRatio)); mPointerId, lengthFromDownRatio));
} }
return true; return true;