am 8e327009: Merge "Refactor PointerTracker and MainKeyboardView"

* commit '8e3270091409ac7c1f9d960f5023d4ddf5f46114':
  Refactor PointerTracker and MainKeyboardView
main
Tadashi G. Takaoka 2014-11-25 02:13:23 +00:00 committed by Android Git Automerger
commit 58f5e62ba8
5 changed files with 112 additions and 122 deletions

View File

@ -269,13 +269,9 @@ public final class MainKeyboardAccessibilityDelegate
eventTime, eventTime, MotionEvent.ACTION_DOWN, x, y, 0 /* metaState */); eventTime, eventTime, MotionEvent.ACTION_DOWN, x, y, 0 /* metaState */);
// Inject a fake down event to {@link PointerTracker} to handle a long press correctly. // Inject a fake down event to {@link PointerTracker} to handle a long press correctly.
tracker.processMotionEvent(downEvent, mKeyDetector); tracker.processMotionEvent(downEvent, mKeyDetector);
// The above fake down event triggers an unnecessary long press timer that should be
// canceled.
tracker.cancelLongPressTimer();
downEvent.recycle(); downEvent.recycle();
// Invoke {@link MainKeyboardView#onLongPress(PointerTracker)} as if a long press timeout // Invoke {@link PointerTracker#onLongPressed()} as if a long press timeout has passed.
// has passed. tracker.onLongPressed();
mKeyboardView.onLongPress(tracker);
// If {@link Key#hasNoPanelAutoMoreKeys()} is true (such as "0 +" key on the phone layout) // If {@link Key#hasNoPanelAutoMoreKeys()} is true (such as "0 +" key on the phone layout)
// or a key invokes IME switcher dialog, we should just ignore the next // or a key invokes IME switcher dialog, we should just ignore the next
// {@link #onRegisterHoverKey(Key,MotionEvent)}. It can be determined by whether // {@link #onRegisterHoverKey(Key,MotionEvent)}. It can be determined by whether

View File

@ -461,12 +461,17 @@ public final class MainKeyboardView extends KeyboardView implements DrawingProxy
windowContentView.addView(mDrawingPreviewPlacerView); windowContentView.addView(mDrawingPreviewPlacerView);
} }
// Implements {@link DrawingProxy#onKeyPressed(Key,boolean)}.
@Override @Override
public void showKeyPreview(@Nonnull final Key key) { public void onKeyPressed(@Nonnull final Key key, final boolean withPreview) {
// If the key is invalid or has no key preview, we must not show key preview. key.onPressed();
if (key.noKeyPreview()) { invalidateKey(key);
return; if (withPreview && !key.noKeyPreview()) {
showKeyPreview(key);
} }
}
private void showKeyPreview(@Nonnull final Key key) {
final Keyboard keyboard = getKeyboard(); final Keyboard keyboard = getKeyboard();
if (keyboard == null) { if (keyboard == null) {
return; return;
@ -483,15 +488,26 @@ public final class MainKeyboardView extends KeyboardView implements DrawingProxy
getWidth(), mOriginCoords, mDrawingPreviewPlacerView, isHardwareAccelerated()); getWidth(), mOriginCoords, mDrawingPreviewPlacerView, isHardwareAccelerated());
} }
// Implements {@link DrawingProxy#dismissKeyPreviewWithoutDelay(Key)}. private void dismissKeyPreviewWithoutDelay(@Nonnull final Key key) {
@Override
public void dismissKeyPreviewWithoutDelay(@Nonnull final Key key) {
mKeyPreviewChoreographer.dismissKeyPreview(key, false /* withAnimation */); mKeyPreviewChoreographer.dismissKeyPreview(key, false /* withAnimation */);
invalidateKey(key); invalidateKey(key);
} }
// Implements {@link DrawingProxy#onKeyReleased(Key,boolean)}.
@Override @Override
public void dismissKeyPreview(@Nonnull final Key key) { public void onKeyReleased(@Nonnull final Key key, final boolean withAnimation) {
key.onReleased();
invalidateKey(key);
if (!key.noKeyPreview()) {
if (withAnimation) {
dismissKeyPreview(key);
} else {
dismissKeyPreviewWithoutDelay(key);
}
}
}
private void dismissKeyPreview(@Nonnull final Key key) {
if (isHardwareAccelerated()) { if (isHardwareAccelerated()) {
mKeyPreviewChoreographer.dismissKeyPreview(key, true /* withAnimation */); mKeyPreviewChoreographer.dismissKeyPreview(key, true /* withAnimation */);
return; return;
@ -574,7 +590,11 @@ public final class MainKeyboardView extends KeyboardView implements DrawingProxy
mDrawingPreviewPlacerView.removeAllViews(); mDrawingPreviewPlacerView.removeAllViews();
} }
private MoreKeysPanel onCreateMoreKeysPanel(final Key key, final Context context) { // Implements {@link DrawingProxy@showMoreKeysKeyboard(Key,PointerTracker)}.
@Override
@Nullable
public MoreKeysPanel showMoreKeysKeyboard(@Nonnull final Key key,
@Nonnull final PointerTracker tracker) {
final MoreKeySpec[] moreKeys = key.getMoreKeys(); final MoreKeySpec[] moreKeys = key.getMoreKeys();
if (moreKeys == null) { if (moreKeys == null) {
return null; return null;
@ -590,7 +610,7 @@ public final class MainKeyboardView extends KeyboardView implements DrawingProxy
&& !key.noKeyPreview() && moreKeys.length == 1 && !key.noKeyPreview() && moreKeys.length == 1
&& mKeyPreviewDrawParams.getVisibleWidth() > 0; && mKeyPreviewDrawParams.getVisibleWidth() > 0;
final MoreKeysKeyboard.Builder builder = new MoreKeysKeyboard.Builder( final MoreKeysKeyboard.Builder builder = new MoreKeysKeyboard.Builder(
context, key, getKeyboard(), isSingleMoreKeyWithPreview, getContext(), key, getKeyboard(), isSingleMoreKeyWithPreview,
mKeyPreviewDrawParams.getVisibleWidth(), mKeyPreviewDrawParams.getVisibleWidth(),
mKeyPreviewDrawParams.getVisibleHeight(), newLabelPaint(key)); mKeyPreviewDrawParams.getVisibleHeight(), newLabelPaint(key));
moreKeysKeyboard = builder.build(); moreKeysKeyboard = builder.build();
@ -603,50 +623,6 @@ public final class MainKeyboardView extends KeyboardView implements DrawingProxy
(MoreKeysKeyboardView)container.findViewById(R.id.more_keys_keyboard_view); (MoreKeysKeyboardView)container.findViewById(R.id.more_keys_keyboard_view);
moreKeysKeyboardView.setKeyboard(moreKeysKeyboard); moreKeysKeyboardView.setKeyboard(moreKeysKeyboard);
container.measure(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); container.measure(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
return moreKeysKeyboardView;
}
// Implements {@link DrawingProxy@onLongPress(PointerTracker)}.
/**
* Called when a key is long pressed.
* @param tracker the pointer tracker which pressed the parent key
*/
@Override
public void onLongPress(@Nonnull final PointerTracker tracker) {
if (isShowingMoreKeysPanel()) {
return;
}
final Key key = tracker.getKey();
if (key == null) {
return;
}
final KeyboardActionListener listener = mKeyboardActionListener;
if (key.hasNoPanelAutoMoreKey()) {
final int moreKeyCode = key.getMoreKeys()[0].mCode;
tracker.onLongPressed();
listener.onPressKey(moreKeyCode, 0 /* repeatCount */, true /* isSinglePointer */);
listener.onCodeInput(moreKeyCode, Constants.NOT_A_COORDINATE,
Constants.NOT_A_COORDINATE, false /* isKeyRepeat */);
listener.onReleaseKey(moreKeyCode, false /* withSliding */);
return;
}
final int code = key.getCode();
if (code == Constants.CODE_SPACE || code == Constants.CODE_LANGUAGE_SWITCH) {
// Long pressing the space key invokes IME switcher dialog.
if (listener.onCustomRequest(Constants.CUSTOM_CODE_SHOW_INPUT_METHOD_PICKER)) {
tracker.onLongPressed();
listener.onReleaseKey(code, false /* withSliding */);
return;
}
}
openMoreKeysPanel(key, tracker);
}
private void openMoreKeysPanel(final Key key, final PointerTracker tracker) {
final MoreKeysPanel moreKeysPanel = onCreateMoreKeysPanel(key, getContext());
if (moreKeysPanel == null) {
return;
}
final int[] lastCoords = CoordinateUtils.newInstance(); final int[] lastCoords = CoordinateUtils.newInstance();
tracker.getLastCoordinates(lastCoords); tracker.getLastCoordinates(lastCoords);
@ -664,10 +640,8 @@ public final class MainKeyboardView extends KeyboardView implements DrawingProxy
// {@code mPreviewVisibleOffset} has been set appropriately in // {@code mPreviewVisibleOffset} has been set appropriately in
// {@link KeyboardView#showKeyPreview(PointerTracker)}. // {@link KeyboardView#showKeyPreview(PointerTracker)}.
final int pointY = key.getY() + mKeyPreviewDrawParams.getVisibleOffset(); final int pointY = key.getY() + mKeyPreviewDrawParams.getVisibleOffset();
moreKeysPanel.showMoreKeysPanel(this, this, pointX, pointY, mKeyboardActionListener); moreKeysKeyboardView.showMoreKeysPanel(this, this, pointX, pointY, mKeyboardActionListener);
tracker.onShowMoreKeysPanel(moreKeysPanel); return moreKeysKeyboardView;
// TODO: Implement zoom in animation of more keys panel.
mKeyPreviewChoreographer.dismissKeyPreview(key, false /* withAnimation */);
} }
public boolean isInDraggingFinger() { public boolean isInDraggingFinger() {

View File

@ -222,7 +222,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element,
final int trackersSize = sTrackers.size(); final int trackersSize = sTrackers.size();
for (int i = 0; i < trackersSize; ++i) { for (int i = 0; i < trackersSize; ++i) {
final PointerTracker tracker = sTrackers.get(i); final PointerTracker tracker = sTrackers.get(i);
tracker.setReleasedKeyGraphics(tracker.getKey()); tracker.setReleasedKeyGraphics(tracker.getKey(), true /* withAnimation */);
} }
} }
@ -382,19 +382,18 @@ public final class PointerTracker implements PointerTrackerQueue.Element,
return mKeyDetector.detectHitKey(x, y); return mKeyDetector.detectHitKey(x, y);
} }
private void setReleasedKeyGraphics(@Nullable final Key key) { private void setReleasedKeyGraphics(@Nullable final Key key, final boolean withAnimation) {
if (key == null) { if (key == null) {
return; return;
} }
sDrawingProxy.dismissKeyPreview(key);
// Even if the key is disabled, update the key release graphics just in case. // Even if the key is disabled, update the key release graphics just in case.
updateReleaseKeyGraphics(key); sDrawingProxy.onKeyReleased(key, withAnimation);
if (key.isShift()) { if (key.isShift()) {
for (final Key shiftKey : mKeyboard.mShiftKeys) { for (final Key shiftKey : mKeyboard.mShiftKeys) {
if (shiftKey != key) { if (shiftKey != key) {
updateReleaseKeyGraphics(shiftKey); sDrawingProxy.onKeyReleased(shiftKey, false /* withAnimation */);
} }
} }
} }
@ -403,11 +402,11 @@ public final class PointerTracker implements PointerTrackerQueue.Element,
final int altCode = key.getAltCode(); final int altCode = key.getAltCode();
final Key altKey = mKeyboard.getKey(altCode); final Key altKey = mKeyboard.getKey(altCode);
if (altKey != null) { if (altKey != null) {
updateReleaseKeyGraphics(altKey); sDrawingProxy.onKeyReleased(altKey, false /* withAnimation */);
} }
for (final Key k : mKeyboard.mAltCodeKeysWhileTyping) { for (final Key k : mKeyboard.mAltCodeKeysWhileTyping) {
if (k != key && k.getAltCode() == altCode) { if (k != key && k.getAltCode() == altCode) {
updateReleaseKeyGraphics(k); sDrawingProxy.onKeyReleased(k, false /* withAnimation */);
} }
} }
} }
@ -418,7 +417,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element,
return sTypingTimeRecorder.needsToSuppressKeyPreviewPopup(eventTime); return sTypingTimeRecorder.needsToSuppressKeyPreviewPopup(eventTime);
} }
private void setPressedKeyGraphics(final Key key, final long eventTime) { private void setPressedKeyGraphics(@Nullable final Key key, final long eventTime) {
if (key == null) { if (key == null) {
return; return;
} }
@ -430,15 +429,13 @@ public final class PointerTracker implements PointerTrackerQueue.Element,
return; return;
} }
if (!key.noKeyPreview() && !sInGesture && !needsToSuppressKeyPreviewPopup(eventTime)) { final boolean noKeyPreview = sInGesture || needsToSuppressKeyPreviewPopup(eventTime);
sDrawingProxy.showKeyPreview(key); sDrawingProxy.onKeyPressed(key, !noKeyPreview);
}
updatePressKeyGraphics(key);
if (key.isShift()) { if (key.isShift()) {
for (final Key shiftKey : mKeyboard.mShiftKeys) { for (final Key shiftKey : mKeyboard.mShiftKeys) {
if (shiftKey != key) { if (shiftKey != key) {
updatePressKeyGraphics(shiftKey); sDrawingProxy.onKeyPressed(shiftKey, false /* withPreview */);
} }
} }
} }
@ -447,26 +444,16 @@ public final class PointerTracker implements PointerTrackerQueue.Element,
final int altCode = key.getAltCode(); final int altCode = key.getAltCode();
final Key altKey = mKeyboard.getKey(altCode); final Key altKey = mKeyboard.getKey(altCode);
if (altKey != null) { if (altKey != null) {
updatePressKeyGraphics(altKey); sDrawingProxy.onKeyPressed(altKey, false /* withPreview */);
} }
for (final Key k : mKeyboard.mAltCodeKeysWhileTyping) { for (final Key k : mKeyboard.mAltCodeKeysWhileTyping) {
if (k != key && k.getAltCode() == altCode) { if (k != key && k.getAltCode() == altCode) {
updatePressKeyGraphics(k); sDrawingProxy.onKeyPressed(k, false /* withPreview */);
} }
} }
} }
} }
private static void updateReleaseKeyGraphics(final Key key) {
key.onReleased();
sDrawingProxy.invalidateKey(key);
}
private static void updatePressKeyGraphics(final Key key) {
key.onPressed();
sDrawingProxy.invalidateKey(key);
}
public GestureStrokeDrawingPoints getGestureStrokeDrawingPoints() { public GestureStrokeDrawingPoints getGestureStrokeDrawingPoints() {
return mGestureStrokeDrawingPoints; return mGestureStrokeDrawingPoints;
} }
@ -837,7 +824,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element,
} }
private void processDraggingFingerOutFromOldKey(final Key oldKey) { private void processDraggingFingerOutFromOldKey(final Key oldKey) {
setReleasedKeyGraphics(oldKey); setReleasedKeyGraphics(oldKey, true /* withAnimation */);
callListenerOnRelease(oldKey, oldKey.getCode(), true /* withSliding */); callListenerOnRelease(oldKey, oldKey.getCode(), true /* withSliding */);
startKeySelectionByDraggingFinger(oldKey); startKeySelectionByDraggingFinger(oldKey);
sTimerProxy.cancelKeyTimersOf(this); sTimerProxy.cancelKeyTimersOf(this);
@ -880,12 +867,12 @@ public final class PointerTracker implements PointerTrackerQueue.Element,
} }
onUpEvent(x, y, eventTime); onUpEvent(x, y, eventTime);
cancelTrackingForAction(); cancelTrackingForAction();
setReleasedKeyGraphics(oldKey); setReleasedKeyGraphics(oldKey, true /* withAnimation */);
} else { } else {
if (!mIsDetectingGesture) { if (!mIsDetectingGesture) {
cancelTrackingForAction(); cancelTrackingForAction();
} }
setReleasedKeyGraphics(oldKey); setReleasedKeyGraphics(oldKey, true /* withAnimation */);
} }
} }
@ -913,7 +900,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element,
onGestureMoveEvent(x, y, eventTime, true /* isMajorEvent */, newKey); onGestureMoveEvent(x, y, eventTime, true /* isMajorEvent */, newKey);
if (sInGesture) { if (sInGesture) {
mCurrentKey = null; mCurrentKey = null;
setReleasedKeyGraphics(oldKey); setReleasedKeyGraphics(oldKey, true /* withAnimation */);
return; return;
} }
} }
@ -978,7 +965,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element,
final int currentRepeatingKeyCode = mCurrentRepeatingKeyCode; final int currentRepeatingKeyCode = mCurrentRepeatingKeyCode;
mCurrentRepeatingKeyCode = Constants.NOT_A_CODE; mCurrentRepeatingKeyCode = Constants.NOT_A_CODE;
// Release the last pressed key. // Release the last pressed key.
setReleasedKeyGraphics(currentKey); setReleasedKeyGraphics(currentKey, true /* withAnimation */);
if (isShowingMoreKeysPanel()) { if (isShowingMoreKeysPanel()) {
if (!mIsTrackingForActionDisabled) { if (!mIsTrackingForActionDisabled) {
@ -1015,14 +1002,6 @@ public final class PointerTracker implements PointerTrackerQueue.Element,
} }
} }
public void onShowMoreKeysPanel(final MoreKeysPanel panel) {
setReleasedKeyGraphics(mCurrentKey);
final int translatedX = panel.translateX(mLastX);
final int translatedY = panel.translateY(mLastY);
panel.onDownEvent(translatedX, translatedY, mPointerId, SystemClock.uptimeMillis());
mMoreKeysPanel = panel;
}
@Override @Override
public void cancelTrackingForAction() { public void cancelTrackingForAction() {
if (isShowingMoreKeysPanel()) { if (isShowingMoreKeysPanel()) {
@ -1035,14 +1014,49 @@ public final class PointerTracker implements PointerTrackerQueue.Element,
return !mIsTrackingForActionDisabled; return !mIsTrackingForActionDisabled;
} }
public void cancelLongPressTimer() { public void onLongPressed() {
sTimerProxy.cancelLongPressTimersOf(this); sTimerProxy.cancelLongPressTimersOf(this);
if (isShowingMoreKeysPanel()) {
return;
}
final Key key = getKey();
if (key == null) {
return;
}
if (key.hasNoPanelAutoMoreKey()) {
cancelKeyTracking();
final int moreKeyCode = key.getMoreKeys()[0].mCode;
sListener.onPressKey(moreKeyCode, 0 /* repeatCont */, true /* isSinglePointer */);
sListener.onCodeInput(moreKeyCode, Constants.NOT_A_COORDINATE,
Constants.NOT_A_COORDINATE, false /* isKeyRepeat */);
sListener.onReleaseKey(moreKeyCode, false /* withSliding */);
return;
}
final int code = key.getCode();
if (code == Constants.CODE_SPACE || code == Constants.CODE_LANGUAGE_SWITCH) {
// Long pressing the space key invokes IME switcher dialog.
if (sListener.onCustomRequest(Constants.CUSTOM_CODE_SHOW_INPUT_METHOD_PICKER)) {
cancelKeyTracking();
sListener.onReleaseKey(code, false /* withSliding */);
return;
}
} }
public void onLongPressed() { setReleasedKeyGraphics(key, false /* withAnimation */);
final MoreKeysPanel moreKeysPanel = sDrawingProxy.showMoreKeysKeyboard(key, this);
if (moreKeysPanel == null) {
return;
}
final int translatedX = moreKeysPanel.translateX(mLastX);
final int translatedY = moreKeysPanel.translateY(mLastY);
moreKeysPanel.onDownEvent(translatedX, translatedY, mPointerId, SystemClock.uptimeMillis());
mMoreKeysPanel = moreKeysPanel;
}
private void cancelKeyTracking() {
resetKeySelectionByDraggingFinger(); resetKeySelectionByDraggingFinger();
cancelTrackingForAction(); cancelTrackingForAction();
setReleasedKeyGraphics(mCurrentKey); setReleasedKeyGraphics(mCurrentKey, true /* withAnimation */);
sPointerTrackerQueue.remove(this); sPointerTrackerQueue.remove(this);
} }
@ -1059,7 +1073,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element,
private void onCancelEventInternal() { private void onCancelEventInternal() {
sTimerProxy.cancelKeyTimersOf(this); sTimerProxy.cancelKeyTimersOf(this);
setReleasedKeyGraphics(mCurrentKey); setReleasedKeyGraphics(mCurrentKey, true /* withAnimation */);
resetKeySelectionByDraggingFinger(); resetKeySelectionByDraggingFinger();
dismissMoreKeysPanel(); dismissMoreKeysPanel();
} }

View File

@ -17,29 +17,36 @@
package com.android.inputmethod.keyboard.internal; package com.android.inputmethod.keyboard.internal;
import com.android.inputmethod.keyboard.Key; import com.android.inputmethod.keyboard.Key;
import com.android.inputmethod.keyboard.MoreKeysPanel;
import com.android.inputmethod.keyboard.PointerTracker; import com.android.inputmethod.keyboard.PointerTracker;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
public interface DrawingProxy { public interface DrawingProxy {
// TODO: Remove this method. /**
public void invalidateKey(@Nullable Key key); * Called when a key is being pressed.
* @param key the {@link Key} that is being pressed.
// TODO: Rename this method to onKeyPressed. * @param withPreview true if key popup preview should be displayed.
public void showKeyPreview(@Nonnull Key key); */
public void onKeyPressed(@Nonnull Key key, boolean withPreview);
// TODO: Rename this method to onKeyReleased.
public void dismissKeyPreview(@Nonnull Key key);
/** /**
* Dismiss a key preview visual without delay. * Called when a key is being released.
* @param key the key whose preview visual should be dismissed. * @param key the {@link Key} that is being released.
* @param withAnimation when true, key popup preview should be dismissed with animation.
*/ */
public void dismissKeyPreviewWithoutDelay(@Nonnull Key key); public void onKeyReleased(@Nonnull Key key, boolean withAnimation);
// TODO: Rename this method to onKeyLongPressed. /**
public void onLongPress(@Nonnull PointerTracker tracker); * Start showing more keys keyboard of a key that is being long pressed.
* @param key the {@link Key} that is being long pressed and showing more keys keyboard.
* @param tracker the {@link PointerTracker} that detects this long pressing.
* @return {@link MoreKeysPanel} that is being shown. null if there is no need to show more keys
* keyboard.
*/
@Nullable
public MoreKeysPanel showMoreKeysKeyboard(@Nonnull Key key, @Nonnull PointerTracker tracker);
/** /**
* Start a while-typing-animation. * Start a while-typing-animation.

View File

@ -66,7 +66,7 @@ public final class TimerHandler extends LeakGuardHandlerWrapper<DrawingProxy>
case MSG_LONGPRESS_SHIFT_KEY: case MSG_LONGPRESS_SHIFT_KEY:
cancelLongPressTimers(); cancelLongPressTimers();
final PointerTracker tracker2 = (PointerTracker) msg.obj; final PointerTracker tracker2 = (PointerTracker) msg.obj;
drawingProxy.onLongPress(tracker2); tracker2.onLongPressed();
break; break;
case MSG_UPDATE_BATCH_INPUT: case MSG_UPDATE_BATCH_INPUT:
final PointerTracker tracker3 = (PointerTracker) msg.obj; final PointerTracker tracker3 = (PointerTracker) msg.obj;
@ -74,8 +74,7 @@ public final class TimerHandler extends LeakGuardHandlerWrapper<DrawingProxy>
startUpdateBatchInputTimer(tracker3); startUpdateBatchInputTimer(tracker3);
break; break;
case MSG_DISMISS_KEY_PREVIEW: case MSG_DISMISS_KEY_PREVIEW:
final Key key = (Key) msg.obj; drawingProxy.onKeyReleased((Key) msg.obj, false /* withAnimation */);
drawingProxy.dismissKeyPreviewWithoutDelay(key);
break; break;
case MSG_DISMISS_GESTURE_FLOATING_PREVIEW_TEXT: case MSG_DISMISS_GESTURE_FLOATING_PREVIEW_TEXT:
drawingProxy.dismissGestureFloatingPreviewTextWithoutDelay(); drawingProxy.dismissGestureFloatingPreviewTextWithoutDelay();