Merge "Use priority queue for native string buffer"
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 6ea642c..6f7bdd8 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -1386,13 +1386,20 @@
 
     private void handleBackspace(final int spaceState) {
         if (mVoiceProxy.logAndRevertVoiceInput()) return;
-
         final InputConnection ic = getCurrentInputConnection();
         if (ic == null) return;
         ic.beginBatchEdit();
+        handleBackspaceWhileInBatchEdit(spaceState, ic);
+        ic.endBatchEdit();
+    }
 
+    // "ic" may not be null.
+    private void handleBackspaceWhileInBatchEdit(final int spaceState, final InputConnection ic) {
         mVoiceProxy.handleBackspace();
 
+        // In many cases, we may have to put the keyboard in auto-shift state again.
+        mHandler.postUpdateShiftKeyState();
+
         if (mEnteredText != null && sameAsTextBeforeCursor(ic, mEnteredText)) {
             // Cancel multi-character input: remove the text we just entered.
             // This is triggered on backspace after a key that inputs multiple characters,
@@ -1401,11 +1408,9 @@
             // If we have mEnteredText, then we know that mHasUncommittedTypedChars == false.
             // In addition we know that spaceState is false, and that we should not be
             // reverting any autocorrect at this point. So we can safely return.
-            ic.endBatchEdit();
             return;
         }
 
-        final boolean deleteChar = !mHasUncommittedTypedChars;
         if (mHasUncommittedTypedChars) {
             final int length = mWordComposer.size();
             if (length > 0) {
@@ -1418,10 +1423,8 @@
                 ic.setComposingText(textWithUnderline, 1);
                 if (mWordComposer.size() == 0) {
                     mHasUncommittedTypedChars = false;
-                }
-                if (1 == length) {
-                    // 1 == length means we are about to erase the last character of the word,
-                    // so we can show bigrams.
+                    // Remaining size equals zero means we just erased the last character of the
+                    // word, so we can show bigrams.
                     mHandler.postUpdateBigramPredictions();
                 } else {
                     // length > 1, so we still have letters to deduce a suggestion from.
@@ -1430,42 +1433,32 @@
             } else {
                 ic.deleteSurroundingText(1, 0);
             }
-            // If we deleted the last remaining char of a word, we may have to put the keyboard
-            // in auto-shift state again.
-            mHandler.postUpdateShiftKeyState();
             // If we had uncommitted chars then we know it's not time to revert any auto-correct
             // and that spaceState is NONE.
-            ic.endBatchEdit();
-            return;
-        }
-        mHandler.postUpdateShiftKeyState();
-
-        if (null != mWordSavedForAutoCorrectCancellation) {
-            Utils.Stats.onAutoCorrectionCancellation();
-            cancelAutoCorrect(ic);
-            mWordSavedForAutoCorrectCancellation = null;
-            ic.endBatchEdit();
             return;
         } else {
-            mWordSavedForAutoCorrectCancellation = null;
-        }
-
-        if (SPACE_STATE_DOUBLE == spaceState) {
-            if (revertDoubleSpace(ic)) {
-                ic.endBatchEdit();
-                // No need to reset mSpaceState, it has already be done (that's why we
-                // receive it as a parameter)
+            if (null != mWordSavedForAutoCorrectCancellation) {
+                Utils.Stats.onAutoCorrectionCancellation();
+                cancelAutoCorrect(ic);
+                mWordSavedForAutoCorrectCancellation = null;
                 return;
+            } else {
+                mWordSavedForAutoCorrectCancellation = null;
             }
-        } else if (SPACE_STATE_SWAP_PUNCTUATION == spaceState) {
-            if (revertSwapPunctuation(ic)) {
-                ic.endBatchEdit();
-                // Likewise
-                return;
-            }
-        }
 
-        if (deleteChar) {
+            if (SPACE_STATE_DOUBLE == spaceState) {
+                if (revertDoubleSpace(ic)) {
+                    // No need to reset mSpaceState, it has already be done (that's why we
+                    // receive it as a parameter)
+                    return;
+                }
+            } else if (SPACE_STATE_SWAP_PUNCTUATION == spaceState) {
+                if (revertSwapPunctuation(ic)) {
+                    // Likewise
+                    return;
+                }
+            }
+
             if (mSuggestionsView != null && mSuggestionsView.dismissAddToDictionaryHint()) {
                 // Go back to the suggestion mode if the user canceled the
                 // "Touch again to save".
@@ -1483,7 +1476,6 @@
                 restartSuggestionsOnWordBeforeCursorIfAtEndOfWord(ic);
             }
         }
-        ic.endBatchEdit();
     }
 
     private void handleTab() {