Auto-switch back from symbols keyboard on space.

Also fix bug 1904029: Rotating keyboard while texting causes words to be deleted.
diff --git a/src/com/android/inputmethod/latin/KeyboardSwitcher.java b/src/com/android/inputmethod/latin/KeyboardSwitcher.java
index 92b7cd4..a5aebfb 100644
--- a/src/com/android/inputmethod/latin/KeyboardSwitcher.java
+++ b/src/com/android/inputmethod/latin/KeyboardSwitcher.java
@@ -37,6 +37,10 @@
     public static final int KEYBOARDMODE_EMAIL = R.id.mode_email;
     public static final int KEYBOARDMODE_IM = R.id.mode_im;
 
+    private static final int SYMBOLS_MODE_STATE_NONE = 0;
+    private static final int SYMBOLS_MODE_STATE_BEGIN = 1;
+    private static final int SYMBOLS_MODE_STATE_SYMBOL = 2;
+
     LatinKeyboardView mInputView;
     LatinIME mContext;
     
@@ -50,6 +54,7 @@
     private int mImeOptions;
     private int mTextMode = MODE_TEXT_QWERTY;
     private boolean mIsSymbols;
+    private int mSymbolsModeState = SYMBOLS_MODE_STATE_NONE;
 
     private int mLastDisplayWidth;
 
@@ -228,5 +233,28 @@
 
     void toggleSymbols() {
         setKeyboardMode(mMode, mImeOptions, !mIsSymbols);
+        if (mIsSymbols) {
+            mSymbolsModeState = SYMBOLS_MODE_STATE_BEGIN;
+        } else {
+            mSymbolsModeState = SYMBOLS_MODE_STATE_NONE;
+        }
+    }
+
+    /**
+     * Updates state machine to figure out when to automatically switch back to alpha mode.
+     * Returns true if the keyboard needs to switch back 
+     */
+    boolean onKey(int key) {
+        // Switch back to alpha mode if user types one or more non-space characters followed by
+        // a space.
+        switch (mSymbolsModeState) {
+            case SYMBOLS_MODE_STATE_BEGIN:
+                if (key != ' ' && key > 0) mSymbolsModeState = SYMBOLS_MODE_STATE_SYMBOL;
+                break;
+            case SYMBOLS_MODE_STATE_SYMBOL:
+                if (key == ' ') return true;
+                break;
+        }
+        return false;
     }
 }
diff --git a/src/com/android/inputmethod/latin/LatinIME.java b/src/com/android/inputmethod/latin/LatinIME.java
index 4b4cafe..eec78a1 100644
--- a/src/com/android/inputmethod/latin/LatinIME.java
+++ b/src/com/android/inputmethod/latin/LatinIME.java
@@ -115,6 +115,8 @@
     private boolean mQuickFixes;
     private boolean mShowSuggestions;
     private int     mCorrectionMode;
+    private int     mOrientation;
+
     // Indicates whether the suggestion strip is to be on in landscape
     private boolean mJustAccepted;
     private CharSequence mJustRevertedSeparator;
@@ -159,10 +161,12 @@
         super.onCreate();
         //setStatusIcon(R.drawable.ime_qwerty);
         mKeyboardSwitcher = new KeyboardSwitcher(this);
-        initSuggest(getResources().getConfiguration().locale.toString());
-        
+        final Configuration conf = getResources().getConfiguration();
+        initSuggest(conf.locale.toString());
+        mOrientation = conf.orientation;
+
         mVibrateDuration = getResources().getInteger(R.integer.vibrate_duration_ms);
-        
+
         // register to receive ringer mode changes for silent mode
         IntentFilter filter = new IntentFilter(AudioManager.RINGER_MODE_CHANGED_ACTION);
         registerReceiver(mReceiver, filter);
@@ -191,9 +195,14 @@
         if (!TextUtils.equals(conf.locale.toString(), mLocale)) {
             initSuggest(conf.locale.toString());
         }
+        // If orientation changed while predicting, commit the change
+        if (conf.orientation != mOrientation) {
+            commitTyped(getCurrentInputConnection());
+            mOrientation = conf.orientation;
+        }
         super.onConfigurationChanged(conf);
     }
-    
+
     @Override
     public View onCreateInputView() {
         mInputView = (LatinKeyboardView) getLayoutInflater().inflate(
@@ -575,6 +584,9 @@
                 // Cancel the just reverted state
                 mJustRevertedSeparator = null;
         }
+        if (mKeyboardSwitcher.onKey(primaryCode)) {
+            changeKeyboardMode();
+        }
     }
     
     public void onText(CharSequence text) {