Merge "Temporarily suppress key popup preview after gesture input" into jb-mr1-dev

main
Tadashi G. Takaoka 2012-09-28 03:38:19 -07:00 committed by Android (Google) Code Review
commit c8f252940f
1 changed files with 21 additions and 7 deletions

View File

@ -47,6 +47,9 @@ public final class PointerTracker implements PointerTrackerQueue.Element {
private static boolean sGestureHandlingEnabledByInputField = false; private static boolean sGestureHandlingEnabledByInputField = false;
private static boolean sGestureHandlingEnabledByUser = false; private static boolean sGestureHandlingEnabledByUser = false;
// TODO: Move this to resource.
private static final int SUPPRESS_KEY_PREVIEW_AFTER_LAST_BATCH_INPUT_DURATION = 1000; // msec
public interface KeyEventHandler { public interface KeyEventHandler {
/** /**
* Get KeyDetector object that is used for this PointerTracker. * Get KeyDetector object that is used for this PointerTracker.
@ -165,6 +168,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element {
private boolean mIsDetectingGesture = false; // per PointerTracker. private boolean mIsDetectingGesture = false; // per PointerTracker.
private static boolean sInGesture = false; private static boolean sInGesture = false;
private static long sGestureFirstDownTime; private static long sGestureFirstDownTime;
private static long sLastBatchInputTime;
private static long sLastLetterTypingUpTime; private static long sLastLetterTypingUpTime;
private static final InputPointers sAggregratedPointers = new InputPointers( private static final InputPointers sAggregratedPointers = new InputPointers(
GestureStroke.DEFAULT_CAPACITY); GestureStroke.DEFAULT_CAPACITY);
@ -345,6 +349,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element {
} }
// Even if the key is disabled, it should respond if it is in the altCodeWhileTyping state. // Even if the key is disabled, it should respond if it is in the altCodeWhileTyping state.
if (key.isEnabled() || altersCode) { if (key.isEnabled() || altersCode) {
sLastBatchInputTime = 0; // reset time
if (code == Keyboard.CODE_OUTPUT_TEXT) { if (code == Keyboard.CODE_OUTPUT_TEXT) {
mListener.onTextInput(key.getOutputText()); mListener.onTextInput(key.getOutputText());
} else if (code != Keyboard.CODE_UNSPECIFIED) { } else if (code != Keyboard.CODE_UNSPECIFIED) {
@ -452,7 +457,15 @@ public final class PointerTracker implements PointerTrackerQueue.Element {
} }
} }
private void setPressedKeyGraphics(final Key key) { private static boolean needsToSuppressKeyPreviewPopup(final long eventTime) {
if (!sShouldHandleGesture) return false;
if (sLastBatchInputTime == 0) return false;
final long elapsedTimeAfterTheLastBatchInput = eventTime - sLastBatchInputTime;
return elapsedTimeAfterTheLastBatchInput
< SUPPRESS_KEY_PREVIEW_AFTER_LAST_BATCH_INPUT_DURATION;
}
private void setPressedKeyGraphics(final Key key, final long eventTime) {
if (key == null) { if (key == null) {
return; return;
} }
@ -464,7 +477,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element {
return; return;
} }
if (!key.noKeyPreview() && !sInGesture) { if (!key.noKeyPreview() && !sInGesture && !needsToSuppressKeyPreviewPopup(eventTime)) {
mDrawingProxy.showKeyPreview(this); mDrawingProxy.showKeyPreview(this);
} }
updatePressKeyGraphics(key); updatePressKeyGraphics(key);
@ -579,7 +592,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element {
mDrawingProxy.showGesturePreviewTrail(this, isOldestTracker); mDrawingProxy.showGesturePreviewTrail(this, isOldestTracker);
} }
private void mayEndBatchInput() { private void mayEndBatchInput(final long eventTime) {
synchronized (sAggregratedPointers) { synchronized (sAggregratedPointers) {
mGestureStrokeWithPreviewPoints.appendAllBatchPoints(sAggregratedPointers); mGestureStrokeWithPreviewPoints.appendAllBatchPoints(sAggregratedPointers);
mGestureStrokeWithPreviewPoints.reset(); mGestureStrokeWithPreviewPoints.reset();
@ -589,6 +602,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element {
+ sAggregratedPointers.getPointerSize()); + sAggregratedPointers.getPointerSize());
} }
sInGesture = false; sInGesture = false;
sLastBatchInputTime = eventTime;
mListener.onEndBatchInput(sAggregratedPointers); mListener.onEndBatchInput(sAggregratedPointers);
clearBatchInputPointsOfAllPointerTrackers(); clearBatchInputPointsOfAllPointerTrackers();
} }
@ -714,7 +728,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element {
startRepeatKey(key); startRepeatKey(key);
startLongPressTimer(key); startLongPressTimer(key);
setPressedKeyGraphics(key); setPressedKeyGraphics(key, eventTime);
} }
} }
@ -792,7 +806,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element {
} }
onMoveToNewKey(key, x, y); onMoveToNewKey(key, x, y);
startLongPressTimer(key); startLongPressTimer(key);
setPressedKeyGraphics(key); setPressedKeyGraphics(key, eventTime);
} else if (isMajorEnoughMoveToBeOnNewKey(x, y, key)) { } else if (isMajorEnoughMoveToBeOnNewKey(x, y, key)) {
// The pointer has been slid in to the new key from the previous key, we must call // The pointer has been slid in to the new key from the previous key, we must call
// onRelease() first to notify that the previous key has been released, then call // onRelease() first to notify that the previous key has been released, then call
@ -811,7 +825,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element {
} }
onMoveToNewKey(key, x, y); onMoveToNewKey(key, x, y);
startLongPressTimer(key); startLongPressTimer(key);
setPressedKeyGraphics(key); setPressedKeyGraphics(key, eventTime);
} else { } else {
// HACK: On some devices, quick successive touches may be translated to sudden // HACK: On some devices, quick successive touches may be translated to sudden
// move by touch panel firmware. This hack detects the case and translates the // move by touch panel firmware. This hack detects the case and translates the
@ -922,7 +936,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element {
if (currentKey != null) { if (currentKey != null) {
callListenerOnRelease(currentKey, currentKey.mCode, true); callListenerOnRelease(currentKey, currentKey.mCode, true);
} }
mayEndBatchInput(); mayEndBatchInput(eventTime);
return; return;
} }
// This event will be recognized as a regular code input. Clear unused possible batch points // This event will be recognized as a regular code input. Clear unused possible batch points