Merge "Don't auto-correct when there are digits." into jb-mr1-dev
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardView.java b/java/src/com/android/inputmethod/keyboard/KeyboardView.java
index f1f942c..9c6543b 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardView.java
@@ -106,7 +106,7 @@
     protected final KeyPreviewDrawParams mKeyPreviewDrawParams;
     private boolean mShowKeyPreviewPopup = true;
     private int mDelayAfterPreview;
-    private PreviewPlacerView mPreviewPlacer;
+    private final PreviewPlacerView mPreviewPlacerView;
 
     /** True if {@link KeyboardView} should handle gesture events. */
     protected boolean mShouldHandleGesture;
@@ -376,6 +376,8 @@
         mDelayAfterPreview = mKeyPreviewDrawParams.mLingerTimeout;
 
         mPaint.setAntiAlias(true);
+
+        mPreviewPlacerView = new PreviewPlacerView(context);
     }
 
     // Read fraction value in TypedArray as float.
@@ -876,39 +878,35 @@
     }
 
     private void addKeyPreview(TextView keyPreview) {
-        if (mPreviewPlacer == null) {
-            createPreviewPlacer();
-        }
-        mPreviewPlacer.addView(
-                keyPreview, ViewLayoutUtils.newLayoutParam(mPreviewPlacer, 0, 0));
+        locatePreviewPlacerView();
+        mPreviewPlacerView.addView(
+                keyPreview, ViewLayoutUtils.newLayoutParam(mPreviewPlacerView, 0, 0));
     }
 
-    private void createPreviewPlacer() {
-        mPreviewPlacer = new PreviewPlacerView(getContext());
+    private void locatePreviewPlacerView() {
+        if (mPreviewPlacerView.getParent() != null) {
+            return;
+        }
         final int[] viewOrigin = new int[2];
         getLocationInWindow(viewOrigin);
-        mPreviewPlacer.setOrigin(viewOrigin[0], viewOrigin[1]);
+        mPreviewPlacerView.setOrigin(viewOrigin[0], viewOrigin[1]);
         final ViewGroup windowContentView =
                 (ViewGroup)getRootView().findViewById(android.R.id.content);
-        windowContentView.addView(mPreviewPlacer);
+        windowContentView.addView(mPreviewPlacerView);
     }
 
     public void showGesturePreviewText(String gesturePreviewText) {
         // TDOD: Add user settings option to control drawing gesture trail.
-        if (mPreviewPlacer == null) {
-            createPreviewPlacer();
-        }
-        mPreviewPlacer.setGesturePreviewText(gesturePreviewText);
-        mPreviewPlacer.invalidate();
+        locatePreviewPlacerView();
+        mPreviewPlacerView.setGesturePreviewText(gesturePreviewText);
+        mPreviewPlacerView.invalidate();
     }
 
     @Override
     public void showGestureTrail(PointerTracker tracker) {
         // TDOD: Add user settings option to control drawing gesture trail.
-        if (mPreviewPlacer == null) {
-            createPreviewPlacer();
-        }
-        mPreviewPlacer.invalidatePointer(tracker);
+        locatePreviewPlacerView();
+        mPreviewPlacerView.invalidatePointer(tracker);
     }
 
     @SuppressWarnings("deprecation") // setBackgroundDrawable is replaced by setBackground in API16
@@ -1051,9 +1049,7 @@
     protected void onDetachedFromWindow() {
         super.onDetachedFromWindow();
         closing();
-        if (mPreviewPlacer != null) {
-            mPreviewPlacer.removeAllViews();
-        }
+        mPreviewPlacerView.removeAllViews();
         if (mBuffer != null) {
             mBuffer.recycle();
             mBuffer = null;
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 6b5de48..1aac734 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -701,6 +701,13 @@
 
         mLastSelectionStart = editorInfo.initialSelStart;
         mLastSelectionEnd = editorInfo.initialSelEnd;
+        // If we come here something in the text state is very likely to have changed.
+        // We should update the shift state regardless of whether we are restarting or not, because
+        // this is not perceived as a layout change that may be disruptive like we may have with
+        // switcher.loadKeyboard; in apps like Talk, we come here when the text is sent and the
+        // field gets emptied and we need to re-evaluate the shift state, but not the whole layout
+        // which would be disruptive.
+        mKeyboardSwitcher.updateShiftState();
 
         mHandler.cancelUpdateSuggestionStrip();
         mHandler.cancelDoubleSpacesTimer();