Merge changes I7888797c,I57b2232f

* changes:
  Refactor + small bugfix
  Refactoring
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 6ea642c..0299df4 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,7 +1408,6 @@
             // 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;
         }
 
@@ -1430,21 +1436,15 @@
             } 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;
@@ -1452,14 +1452,12 @@
 
         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)
                 return;
             }
         } else if (SPACE_STATE_SWAP_PUNCTUATION == spaceState) {
             if (revertSwapPunctuation(ic)) {
-                ic.endBatchEdit();
                 // Likewise
                 return;
             }
@@ -1483,7 +1481,6 @@
                 restartSuggestionsOnWordBeforeCursorIfAtEndOfWord(ic);
             }
         }
-        ic.endBatchEdit();
     }
 
     private void handleTab() {