Merge "Reset the client database on version upgrade."
diff --git a/java/src/com/android/inputmethod/latin/WordComposer.java b/java/src/com/android/inputmethod/latin/WordComposer.java
index f31fb13..3f9d57e 100644
--- a/java/src/com/android/inputmethod/latin/WordComposer.java
+++ b/java/src/com/android/inputmethod/latin/WordComposer.java
@@ -174,7 +174,6 @@
         final int keyY = event.mY;
         final int newIndex = size();
         processEvent(event);
-        mCursorPositionWithinWord = mCodePointSize;
         if (newIndex < MAX_WORD_LENGTH) {
             mPrimaryKeyCodes[newIndex] = primaryCode >= Constants.CODE_SPACE
                     ? Character.toLowerCase(primaryCode) : primaryCode;
@@ -195,13 +194,22 @@
         } else {
             mTrailingSingleQuotesCount = 0;
         }
-        mAutoCorrection = null;
     }
 
     private void processEvent(final Event event) {
+        final int primaryCode = event.mCodePoint;
+        final int keyX = event.mX;
+        final int keyY = event.mY;
+        final int newIndex = size();
         mCombinerChain.processEvent(mEvents, event);
         mEvents.add(event);
         refreshTypedWordCache();
+        mCursorPositionWithinWord = mCodePointSize;
+        // We may have deleted the last one.
+        if (0 == mCodePointSize) {
+            mIsFirstCharCapitalized = false;
+        }
+        mAutoCorrection = null;
     }
 
     /**
@@ -209,10 +217,6 @@
      */
     public void deleteLast(final Event event) {
         processEvent(event);
-        // We may have deleted the last one.
-        if (0 == size()) {
-            mIsFirstCharCapitalized = false;
-        }
         if (mTrailingSingleQuotesCount > 0) {
             --mTrailingSingleQuotesCount;
         } else {
@@ -225,8 +229,6 @@
                 ++mTrailingSingleQuotesCount;
             }
         }
-        mCursorPositionWithinWord = mCodePointSize;
-        mAutoCorrection = null;
     }
 
     public void setCursorPositionWithinWord(final int posWithinWord) {
diff --git a/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java b/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java
index c89be35..ee31c46 100644
--- a/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java
+++ b/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java
@@ -823,13 +823,11 @@
         }
 
         if (Constants.CODE_SPACE == codePoint) {
-            if (inputTransaction.mSettingsValues.isSuggestionsRequested()) {
-                if (maybeDoubleSpacePeriod(inputTransaction)) {
-                    inputTransaction.requireShiftUpdate(InputTransaction.SHIFT_UPDATE_NOW);
-                    mSpaceState = SpaceState.DOUBLE;
-                } else if (!mSuggestedWords.isPunctuationSuggestions()) {
-                    mSpaceState = SpaceState.WEAK;
-                }
+            if (maybeDoubleSpacePeriod(inputTransaction)) {
+                inputTransaction.requireShiftUpdate(InputTransaction.SHIFT_UPDATE_NOW);
+                mSpaceState = SpaceState.DOUBLE;
+            } else if (!mSuggestedWords.isPunctuationSuggestions()) {
+                mSpaceState = SpaceState.WEAK;
             }
 
             startDoubleSpacePeriodCountdown(inputTransaction);
diff --git a/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetSubtypesCountTests.java b/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetSubtypesCountTests.java
index bbffc8d..d6d12ea 100644
--- a/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetSubtypesCountTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/KeyboardLayoutSetSubtypesCountTests.java
@@ -25,7 +25,7 @@
 
 @SmallTest
 public class KeyboardLayoutSetSubtypesCountTests extends KeyboardLayoutSetTestsBase {
-    private static final int NUMBER_OF_SUBTYPES = 66;
+    private static final int NUMBER_OF_SUBTYPES = 67;
     private static final int NUMBER_OF_ASCII_CAPABLE_SUBTYPES = 42;
     private static final int NUMBER_OF_PREDEFINED_ADDITIONAL_SUBTYPES = 2;
 
diff --git a/tests/src/com/android/inputmethod/latin/InputLogicTests.java b/tests/src/com/android/inputmethod/latin/InputLogicTests.java
index b366452..d2dd292 100644
--- a/tests/src/com/android/inputmethod/latin/InputLogicTests.java
+++ b/tests/src/com/android/inputmethod/latin/InputLogicTests.java
@@ -16,7 +16,10 @@
 
 package com.android.inputmethod.latin;
 
+import com.android.inputmethod.latin.settings.Settings;
+
 import android.test.suitebuilder.annotation.LargeTest;
+import android.text.TextUtils;
 import android.view.inputmethod.BaseInputConnection;
 
 @LargeTest
@@ -179,6 +182,8 @@
     }
 
     public void testDoubleSpace() {
+        // Set default pref just in case
+        setBooleanPreference(Settings.PREF_KEY_USE_DOUBLE_SPACE_PERIOD, true, true);
         // U+1F607 is an emoji
         final String[] STRINGS_TO_TYPE =
                 new String[] { "this   ", "a+  ", "\u1F607  ", "..  ", ")  ", "(  ", "%  " };
@@ -200,6 +205,76 @@
         assertEquals("double space make a period", EXPECTED_RESULT, mEditText.getText().toString());
     }
 
+    private void testDoubleSpacePeriodWithSettings(final boolean expectsPeriod,
+            final Object... settingsKeysValues) {
+        final Object[] oldSettings = new Object[settingsKeysValues.length / 2];
+        final String STRING_WITHOUT_PERIOD = "this  ";
+        final String STRING_WITH_PERIOD = "this. ";
+        final String EXPECTED_RESULT = expectsPeriod ? STRING_WITH_PERIOD : STRING_WITHOUT_PERIOD;
+        try {
+            for (int i = 0; i < settingsKeysValues.length; i += 2) {
+                if (settingsKeysValues[i + 1] instanceof String) {
+                    oldSettings[i / 2] = setStringPreference((String)settingsKeysValues[i],
+                            (String)settingsKeysValues[i + 1], "0");
+                } else {
+                    oldSettings[i / 2] = setBooleanPreference((String)settingsKeysValues[i],
+                            (Boolean)settingsKeysValues[i + 1], false);
+                }
+            }
+            mLatinIME.loadSettings();
+            mEditText.setText("");
+            type(STRING_WITHOUT_PERIOD);
+            assertEquals("double-space-to-period with specific settings "
+                    + TextUtils.join(" ", settingsKeysValues),
+                    EXPECTED_RESULT, mEditText.getText().toString());
+        } finally {
+            // Restore old settings
+            for (int i = 0; i < settingsKeysValues.length; i += 2) {
+                if (null == oldSettings[i / 2]) {
+                    break;
+                } if (oldSettings[i / 2] instanceof String) {
+                    setStringPreference((String)settingsKeysValues[i], (String)oldSettings[i / 2],
+                            "");
+                } else {
+                    setBooleanPreference((String)settingsKeysValues[i], (Boolean)oldSettings[i / 2],
+                            false);
+                }
+            }
+        }
+    }
+
+    public void testDoubleSpacePeriod() {
+        // Reset settings to default, else these tests will go flaky.
+        setStringPreference(Settings.PREF_SHOW_SUGGESTIONS_SETTING, "0", "0");
+        setStringPreference(Settings.PREF_AUTO_CORRECTION_THRESHOLD, "1", "1");
+        setBooleanPreference(Settings.PREF_KEY_USE_DOUBLE_SPACE_PERIOD, true, true);
+        testDoubleSpacePeriodWithSettings(true /* expectsPeriod */);
+        // "Suggestion visibility" to "always hide"
+        testDoubleSpacePeriodWithSettings(true, Settings.PREF_SHOW_SUGGESTIONS_SETTING, "2");
+        // "Suggestion visibility" to "portrait only"
+        testDoubleSpacePeriodWithSettings(true, Settings.PREF_SHOW_SUGGESTIONS_SETTING, "1");
+        // "Suggestion visibility" to "always show"
+        testDoubleSpacePeriodWithSettings(true, Settings.PREF_SHOW_SUGGESTIONS_SETTING, "0");
+
+        // "Double-space period" to "off"
+        testDoubleSpacePeriodWithSettings(false, Settings.PREF_KEY_USE_DOUBLE_SPACE_PERIOD, false);
+
+        // "Auto-correction" to "off"
+        testDoubleSpacePeriodWithSettings(true, Settings.PREF_AUTO_CORRECTION_THRESHOLD, "0");
+        // "Auto-correction" to "modest"
+        testDoubleSpacePeriodWithSettings(true, Settings.PREF_AUTO_CORRECTION_THRESHOLD, "1");
+        // "Auto-correction" to "very aggressive"
+        testDoubleSpacePeriodWithSettings(true, Settings.PREF_AUTO_CORRECTION_THRESHOLD, "3");
+
+        // "Suggestion visibility" to "always hide" and "Auto-correction" to "off"
+        testDoubleSpacePeriodWithSettings(true, Settings.PREF_SHOW_SUGGESTIONS_SETTING, "0",
+                Settings.PREF_AUTO_CORRECTION_THRESHOLD, "0");
+        // "Suggestion visibility" to "always hide" and "Auto-correction" to "off"
+        testDoubleSpacePeriodWithSettings(false, Settings.PREF_SHOW_SUGGESTIONS_SETTING, "0",
+                Settings.PREF_AUTO_CORRECTION_THRESHOLD, "0",
+                Settings.PREF_KEY_USE_DOUBLE_SPACE_PERIOD, false);
+    }
+
     public void testBackspaceAtStartAfterAutocorrect() {
         final String STRING_TO_TYPE = "tgis ";
         final int typedLength = STRING_TO_TYPE.length();
diff --git a/tests/src/com/android/inputmethod/latin/InputTestsBase.java b/tests/src/com/android/inputmethod/latin/InputTestsBase.java
index 690c559..1383ff9 100644
--- a/tests/src/com/android/inputmethod/latin/InputTestsBase.java
+++ b/tests/src/com/android/inputmethod/latin/InputTestsBase.java
@@ -65,7 +65,6 @@
     protected MyEditText mEditText;
     protected View mInputView;
     protected InputConnection mInputConnection;
-    private boolean mPreviousDebugSetting;
     private boolean mPreviousBigramPredictionSettings;
     private String mPreviousAutoCorrectSetting;
 
@@ -185,7 +184,7 @@
         mEditText.setEnabled(true);
         setupService();
         mLatinIME = getService();
-        mPreviousDebugSetting = setDebugMode(true);
+        setDebugMode(true);
         mPreviousBigramPredictionSettings = setBooleanPreference(Settings.PREF_BIGRAM_PREDICTIONS,
                 true, true /* defaultValue */);
         mPreviousAutoCorrectSetting = setStringPreference(Settings.PREF_AUTO_CORRECTION_THRESHOLD,
@@ -219,7 +218,7 @@
                 true /* defaultValue */);
         setStringPreference(Settings.PREF_AUTO_CORRECTION_THRESHOLD, mPreviousAutoCorrectSetting,
                 DEFAULT_AUTO_CORRECTION_THRESHOLD);
-        setDebugMode(mPreviousDebugSetting);
+        setDebugMode(false);
         super.tearDown();
     }