Extend onTextInput to be able to inject suggestions

Change-Id: I1061da0edfdb05c64c5711717d4ef9fa9681e568
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardActionListener.java b/java/src/com/android/inputmethod/keyboard/KeyboardActionListener.java
index c41d245..dc27769 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardActionListener.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardActionListener.java
@@ -64,6 +64,20 @@
      */
     public void onTextInput(CharSequence text);
 
+    // TODO: Should move this method to some more appropriate interface.
+    /**
+     * Called when user started batch input.
+     */
+    public void onStartBatchInput();
+
+    // TODO: Should move this method to some more appropriate interface.
+    /**
+     * Sends a sequence of characters to the listener as batch input.
+     *
+     * @param text the sequence of characters to be displayed as composing text.
+     */
+    public void onEndBatchInput(CharSequence text);
+
     /**
      * Called when user released a finger outside any key.
      */
@@ -85,6 +99,10 @@
         @Override
         public void onTextInput(CharSequence text) {}
         @Override
+        public void onStartBatchInput() {}
+        @Override
+        public void onEndBatchInput(CharSequence text) {}
+        @Override
         public void onCancelInput() {}
         @Override
         public boolean onCustomRequest(int requestCode) {
diff --git a/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboardView.java b/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboardView.java
index be7644f..9c80691 100644
--- a/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/MoreKeysKeyboardView.java
@@ -58,6 +58,16 @@
         }
 
         @Override
+        public void onStartBatchInput() {
+            mListener.onStartBatchInput();
+        }
+
+        @Override
+        public void onEndBatchInput(CharSequence text) {
+            mListener.onEndBatchInput(text);
+        }
+
+        @Override
         public void onCancelInput() {
             mListener.onCancelInput();
         }
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index b59e76b..0baa3ba 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -1272,6 +1272,9 @@
             if (mCurrentSettings.isWordSeparator(primaryCode)) {
                 didAutoCorrect = handleSeparator(primaryCode, x, y, spaceState);
             } else {
+                if (SPACE_STATE_PHANTOM == spaceState) {
+                    commitTyped(LastComposedWord.NOT_A_SEPARATOR);
+                }
                 final Keyboard keyboard = mKeyboardSwitcher.getKeyboard();
                 if (keyboard != null && keyboard.hasProximityCharsCorrection(primaryCode)) {
                     handleCharacter(primaryCode, x, y, spaceState);
@@ -1313,6 +1316,31 @@
         resetComposingState(true /* alsoResetLastComposedWord */);
     }
 
+    @Override
+    public void onStartBatchInput() {
+        mConnection.beginBatchEdit();
+        if (mWordComposer.isComposingWord()) {
+            commitTyped(LastComposedWord.NOT_A_SEPARATOR);
+            mExpectingUpdateSelection = true;
+            // TODO: Can we remove this?
+            mSpaceState = SPACE_STATE_PHANTOM;
+        }
+        mConnection.endBatchEdit();
+    }
+
+    @Override
+    public void onEndBatchInput(CharSequence text) {
+        mConnection.beginBatchEdit();
+        if (SPACE_STATE_PHANTOM == mSpaceState) {
+            sendKeyCodePoint(Keyboard.CODE_SPACE);
+        }
+        mConnection.setComposingText(text, 1);
+        mExpectingUpdateSelection = true;
+        mConnection.endBatchEdit();
+        mKeyboardSwitcher.updateShiftState();
+        mSpaceState = SPACE_STATE_PHANTOM;
+    }
+
     private CharSequence specificTldProcessingOnTextInput(final CharSequence text) {
         if (text.length() <= 1 || text.charAt(0) != Keyboard.CODE_PERIOD
                 || !Character.isLetter(text.charAt(1))) {
@@ -1359,7 +1387,12 @@
         if (mWordComposer.isComposingWord()) {
             final int length = mWordComposer.size();
             if (length > 0) {
-                mWordComposer.deleteLast();
+                // Immediately after a batch input.
+                if (SPACE_STATE_PHANTOM == spaceState) {
+                    mWordComposer.reset();
+                } else {
+                    mWordComposer.deleteLast();
+                }
                 mConnection.setComposingText(getTextWithUnderline(mWordComposer.getTypedWord()), 1);
                 // If we have deleted the last remaining character of a word, then we are not
                 // isComposingWord() any more.