diff --git a/java/src/com/android/inputmethod/keyboard/PointerTracker.java b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
index d9a520917aaa26331ed14f179be88180e9a4626d..20a299e4982083e46e0e3be752789acfe5f56951 100644
--- a/java/src/com/android/inputmethod/keyboard/PointerTracker.java
+++ b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
@@ -777,6 +777,15 @@ public final class PointerTracker implements PointerTrackerQueue.Element {
         mDrawingProxy.showGesturePreviewTrail(this, isOldestTrackerInQueue(this));
     }
 
+    private void cancelBatchInput() {
+        sPointerTrackerQueue.cancelAllPointerTracker();
+        sInGesture = false;
+        if (DEBUG_LISTENER) {
+            Log.d(TAG, String.format("[%d] onCancelBatchInput", mPointerId));
+        }
+        mListener.onCancelBatchInput();
+    }
+
     public void processMotionEvent(final int action, final int x, final int y, final long eventTime,
             final KeyEventHandler handler) {
         switch (action) {
@@ -892,12 +901,7 @@ public final class PointerTracker implements PointerTrackerQueue.Element {
             final boolean onValidArea = mGestureStrokeWithPreviewPoints.addPointOnKeyboard(
                     x, y, gestureTime, isMajorEvent);
             if (!onValidArea) {
-                sPointerTrackerQueue.cancelAllPointerTracker();
-                if (DEBUG_LISTENER) {
-                    Log.d(TAG, String.format("[%d] onCancelBatchInput: batchPoints=%d",
-                            mPointerId, sAggregratedPointers.getPointerSize()));
-                }
-                mListener.onCancelBatchInput();
+                cancelBatchInput();
                 return;
             }
             mayStartBatchInput(key);
@@ -1162,8 +1166,11 @@ public final class PointerTracker implements PointerTrackerQueue.Element {
             printTouchEvent("onCancelEvt:", x, y, eventTime);
         }
 
-        sPointerTrackerQueue.releaseAllPointersExcept(this, eventTime);
-        sPointerTrackerQueue.remove(this);
+        if (sInGesture) {
+            cancelBatchInput();
+        }
+        sPointerTrackerQueue.cancelAllPointerTracker();
+        sPointerTrackerQueue.releaseAllPointers(eventTime);
         onCancelEventInternal();
     }
 
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 3935f99ab63f0774f38c0b086d0bc67f03d2950b..305f38d8ccccea2f3801b9e8ba8ff51b2693c97b 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -1553,13 +1553,14 @@ public final class LatinIME extends InputMethodService implements KeyboardAction
 
     private void showGesturePreviewAndSuggestionStrip(final SuggestedWords suggestedWords,
             final boolean dismissGestureFloatingPreviewText) {
-        final String batchInputText = suggestedWords.isEmpty()
-                ? null : suggestedWords.getWord(0);
-        final KeyboardView mainKeyboardView = mKeyboardSwitcher.getMainKeyboardView();
-        mainKeyboardView.showGestureFloatingPreviewText(batchInputText);
         showSuggestionStrip(suggestedWords, null);
+        final KeyboardView mainKeyboardView = mKeyboardSwitcher.getMainKeyboardView();
         if (dismissGestureFloatingPreviewText) {
             mainKeyboardView.dismissGestureFloatingPreviewText();
+        } else {
+            final String batchInputText = suggestedWords.isEmpty()
+                    ? null : suggestedWords.getWord(0);
+            mainKeyboardView.showGestureFloatingPreviewText(batchInputText);
         }
     }