Special case periods in the spell checker

Special case <valid word>.<valid word> to send as a suggestion
the same string where the periods is replaced by a space.

Bug: 10780091
Change-Id: I43c94675977f9ab5d7ee5671486cb742b39f3974
diff --git a/java/src/com/android/inputmethod/latin/Constants.java b/java/src/com/android/inputmethod/latin/Constants.java
index 35012a4..fa51436 100644
--- a/java/src/com/android/inputmethod/latin/Constants.java
+++ b/java/src/com/android/inputmethod/latin/Constants.java
@@ -214,6 +214,9 @@
     public static final int CODE_INVERTED_QUESTION_MARK = 0xBF; // ¿
     public static final int CODE_INVERTED_EXCLAMATION_MARK = 0xA1; // ¡
 
+    public static final String REGEXP_PERIOD = "\\.";
+    public static final String STRING_SPACE = " ";
+
     /**
      * Special keys code. Must be negative.
      * These should be aligned with {@link KeyboardCodesSet#ID_TO_NAME},
diff --git a/java/src/com/android/inputmethod/latin/spellcheck/AndroidWordLevelSpellCheckerSession.java b/java/src/com/android/inputmethod/latin/spellcheck/AndroidWordLevelSpellCheckerSession.java
index 0032fcb..54eebe3 100644
--- a/java/src/com/android/inputmethod/latin/spellcheck/AndroidWordLevelSpellCheckerSession.java
+++ b/java/src/com/android/inputmethod/latin/spellcheck/AndroidWordLevelSpellCheckerSession.java
@@ -282,6 +282,22 @@
                         return AndroidSpellCheckerService.getNotInDictEmptySuggestions(
                                 false /* reportAsTypo */);
                     }
+                    if (CHECKABILITY_CONTAINS_PERIOD == checkability) {
+                        final String[] splitText = inText.split(Constants.REGEXP_PERIOD);
+                        boolean allWordsAreValid = true;
+                        for (final String word : splitText) {
+                            if (!dictInfo.mDictionary.isValidWord(word)) {
+                                allWordsAreValid = false;
+                                break;
+                            }
+                        }
+                        if (allWordsAreValid) {
+                            return new SuggestionsInfo(SuggestionsInfo.RESULT_ATTR_LOOKS_LIKE_TYPO
+                                    | SuggestionsInfo.RESULT_ATTR_HAS_RECOMMENDED_SUGGESTIONS,
+                                    new String[] {
+                                            TextUtils.join(Constants.STRING_SPACE, splitText) });
+                        }
+                    }
                     return dictInfo.mDictionary.isValidWord(inText)
                             ? AndroidSpellCheckerService.getInDictEmptySuggestions()
                             : AndroidSpellCheckerService.getNotInDictEmptySuggestions(
diff --git a/tests/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerServiceTest.java b/tests/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerServiceTest.java
index 995d7f0..2272d6b 100644
--- a/tests/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerServiceTest.java
+++ b/tests/src/com/android/inputmethod/latin/spellcheck/AndroidSpellCheckerServiceTest.java
@@ -39,7 +39,7 @@
         // it yields 5).
         assertTrue(suggestions.length >= 2);
         // We also assume the top suggestion should be "this".
-        assertEquals("", "this", suggestions[0]);
+        assertEquals("Test basic spell checking", "this", suggestions[0]);
     }
 
     public void testRussianSpellchecker() {
@@ -62,4 +62,21 @@
         // Russian dictionary.
         assertEquals("", "года", suggestions[0]);
     }
+
+    public void testSpellcheckWithPeriods() {
+        changeLanguage("en_US");
+        mEditText.setText("I'm.sure ");
+        mEditText.setSelection(mEditText.getText().length());
+        mEditText.onAttachedToWindow();
+        sleep(1000);
+        runMessages();
+        sleep(1000);
+
+        final SpanGetter span = new SpanGetter(mEditText.getText(), SuggestionSpan.class);
+        // If no span, the following will crash
+        final String[] suggestions = span.getSuggestions();
+        // The first suggestion should be "I'm sure".
+        assertEquals("Test spell checking of mistyped period for space", "I'm sure",
+                suggestions[0]);
+    }
 }