diff --git a/core/java/android/view/inputmethod/InputConnection.java b/core/java/android/view/inputmethod/InputConnection.java index a76d46d1c00f1..f3111bdc7471c 100644 --- a/core/java/android/view/inputmethod/InputConnection.java +++ b/core/java/android/view/inputmethod/InputConnection.java @@ -858,7 +858,7 @@ public interface InputConnection { boolean reportFullscreenMode(boolean enabled); /** - * Have the editor perform spell checking around the current selection. + * Have the editor perform spell checking for the full content. * *

The editor can ignore this method call if it does not support spell checking. * diff --git a/core/java/android/widget/SpellChecker.java b/core/java/android/widget/SpellChecker.java index 97d98fd8ec592..794b642135d0a 100644 --- a/core/java/android/widget/SpellChecker.java +++ b/core/java/android/widget/SpellChecker.java @@ -220,29 +220,26 @@ public class SpellChecker implements SpellCheckerSessionListener { } void onPerformSpellCheck() { - final int selectionStart = mTextView.getSelectionStart(); - final int selectionEnd = mTextView.getSelectionEnd(); - final int selectionRangeStart; - final int selectionRangeEnd; - if (selectionStart < selectionEnd) { - selectionRangeStart = selectionStart; - selectionRangeEnd = selectionEnd; - } else { - selectionRangeStart = selectionEnd; - selectionRangeEnd = selectionStart; - } - // Expand the range so that it (hopefully) includes the current sentence. - final int start = Math.max(0, selectionRangeStart - MIN_SENTENCE_LENGTH); - final int end = Math.min(mTextView.length(), selectionRangeEnd + MIN_SENTENCE_LENGTH); + // Triggers full content spell check. + final int start = 0; + final int end = mTextView.length(); if (DBG) { Log.d(TAG, "performSpellCheckAroundSelection: " + start + ", " + end); } - spellCheck(start, end); + spellCheck(start, end, /* forceCheckWhenEditingWord= */ true); } public void spellCheck(int start, int end) { + spellCheck(start, end, /* forceCheckWhenEditingWord= */ false); + } + + /** + * Requests to do spell check for text in the range (start, end). + */ + public void spellCheck(int start, int end, boolean forceCheckWhenEditingWord) { if (DBG) { - Log.d(TAG, "Start spell-checking: " + start + ", " + end); + Log.d(TAG, "Start spell-checking: " + start + ", " + end + ", " + + forceCheckWhenEditingWord); } final Locale locale = mTextView.getSpellCheckerLocale(); final boolean isSessionActive = isSessionActive(); @@ -267,7 +264,7 @@ public class SpellChecker implements SpellCheckerSessionListener { for (int i = 0; i < length; i++) { final SpellParser spellParser = mSpellParsers[i]; if (spellParser.isFinished()) { - spellParser.parse(start, end); + spellParser.parse(start, end, forceCheckWhenEditingWord); return; } } @@ -282,10 +279,14 @@ public class SpellChecker implements SpellCheckerSessionListener { SpellParser spellParser = new SpellParser(); mSpellParsers[length] = spellParser; - spellParser.parse(start, end); + spellParser.parse(start, end, forceCheckWhenEditingWord); } private void spellCheck() { + spellCheck(/* forceCheckWhenEditingWord= */ false); + } + + private void spellCheck(boolean forceCheckWhenEditingWord) { if (mSpellCheckerSession == null) return; Editable editable = (Editable) mTextView.getText(); @@ -295,6 +296,12 @@ public class SpellChecker implements SpellCheckerSessionListener { TextInfo[] textInfos = new TextInfo[mLength]; int textInfosCount = 0; + if (DBG) { + Log.d(TAG, "forceCheckWhenEditingWord=" + forceCheckWhenEditingWord + + ", mLength=" + mLength + ", cookie = " + mCookie + + ", sel start = " + selectionStart + ", sel end = " + selectionEnd); + } + for (int i = 0; i < mLength; i++) { final SpellCheckSpan spellCheckSpan = mSpellCheckSpans[i]; if (mIds[i] < 0 || spellCheckSpan.isSpellCheckInProgress()) continue; @@ -319,7 +326,7 @@ public class SpellChecker implements SpellCheckerSessionListener { } else { isEditing = selectionEnd < start || selectionStart > end; } - if (start >= 0 && end > start && isEditing) { + if (start >= 0 && end > start && (forceCheckWhenEditingWord || isEditing)) { spellCheckSpan.setSpellCheckInProgress(true); final TextInfo textInfo = new TextInfo(editable, start, end, mCookie, mIds[i]); textInfos[textInfosCount++] = textInfo; @@ -546,7 +553,11 @@ public class SpellChecker implements SpellCheckerSessionListener { private class SpellParser { private Object mRange = new Object(); - public void parse(int start, int end) { + // Forces to do spell checker even user is editing the word. + private boolean mForceCheckWhenEditingWord; + + public void parse(int start, int end, boolean forceCheckWhenEditingWord) { + mForceCheckWhenEditingWord = forceCheckWhenEditingWord; final int max = mTextView.length(); final int parseEnd; if (end > max) { @@ -567,6 +578,7 @@ public class SpellChecker implements SpellCheckerSessionListener { public void stop() { removeRangeSpan((Editable) mTextView.getText()); + mForceCheckWhenEditingWord = false; } private void setRangeSpan(Editable editable, int start, int end) { @@ -617,7 +629,7 @@ public class SpellChecker implements SpellCheckerSessionListener { if (DBG) { Log.i(TAG, "No more spell check."); } - removeRangeSpan(editable); + stop(); return; } @@ -649,7 +661,7 @@ public class SpellChecker implements SpellCheckerSessionListener { if (DBG) { Log.i(TAG, "Incorrect range span."); } - removeRangeSpan(editable); + stop(); return; } do { @@ -778,7 +790,7 @@ public class SpellChecker implements SpellCheckerSessionListener { removeRangeSpan(editable); } - spellCheck(); + spellCheck(mForceCheckWhenEditingWord); } private void removeSpansAt(Editable editable, int offset, T[] spans) {