diff --git a/java/src/com/android/inputmethod/latin/EditingUtils.java b/java/src/com/android/inputmethod/latin/EditingUtils.java index e56aa695d1c7942802421a2824b2d67fdace4046..634dbbdfccbe3103d1587d62035b8c3987fac67a 100644 --- a/java/src/com/android/inputmethod/latin/EditingUtils.java +++ b/java/src/com/android/inputmethod/latin/EditingUtils.java @@ -33,6 +33,7 @@ public class EditingUtils { * Number of characters we want to look back in order to identify the previous word */ private static final int LOOKBACK_CHARACTER_NUM = 15; + private static final int INVALID_CURSOR_POSITION = -1; private EditingUtils() { // Unintentional empty constructor for singleton. @@ -63,10 +64,11 @@ public class EditingUtils { } private static int getCursorPosition(InputConnection connection) { + if (null == connection) return INVALID_CURSOR_POSITION; ExtractedText extracted = connection.getExtractedText( new ExtractedTextRequest(), 0); if (extracted == null) { - return -1; + return INVALID_CURSOR_POSITION; } return extracted.startOffset + extracted.selectionStart; } @@ -79,6 +81,7 @@ public class EditingUtils { * represents the cursor, then "hello " will be returned. */ public static String getWordAtCursor(InputConnection connection, String separators) { + // getWordRangeAtCursor returns null if the connection is null Range r = getWordRangeAtCursor(connection, separators); return (r == null) ? null : r.mWord; } @@ -88,6 +91,7 @@ public class EditingUtils { * getWordAtCursor. */ public static void deleteWordAtCursor(InputConnection connection, String separators) { + // getWordRangeAtCursor returns null if the connection is null Range range = getWordRangeAtCursor(connection, separators); if (range == null) return; @@ -165,6 +169,7 @@ public class EditingUtils { public static CharSequence getPreviousWord(InputConnection connection, String sentenceSeperators) { //TODO: Should fix this. This could be slow! + if (null == connection) return null; CharSequence prev = connection.getTextBeforeCursor(LOOKBACK_CHARACTER_NUM, 0); return getPreviousWord(prev, sentenceSeperators); } @@ -194,6 +199,7 @@ public class EditingUtils { } public static CharSequence getThisWord(InputConnection connection, String sentenceSeperators) { + if (null == connection) return null; final CharSequence prev = connection.getTextBeforeCursor(LOOKBACK_CHARACTER_NUM, 0); return getThisWord(prev, sentenceSeperators); } @@ -256,12 +262,14 @@ public class EditingUtils { int selStart, int selEnd, String wordSeparators) { if (selStart == selEnd) { // There is just a cursor, so get the word at the cursor + // getWordRangeAtCursor returns null if the connection is null EditingUtils.Range range = getWordRangeAtCursor(ic, wordSeparators); if (range != null && !TextUtils.isEmpty(range.mWord)) { return new SelectedWord(selStart - range.mCharsBefore, selEnd + range.mCharsAfter, range.mWord); } } else { + if (null == ic) return null; // Is the previous character empty or a word separator? If not, return null. CharSequence charsBefore = ic.getTextBeforeCursor(1, 0); if (!isWordBoundary(charsBefore, wordSeparators)) { diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index b7a795221eae60b7a5e06f5fd066fea6ca5bdd42..95cae6ed58f450b8c68ab245973fc1c6c9abeceb 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -1514,9 +1514,15 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar final WordComposer wordComposer = mWordComposer; // TODO: May need a better way of retrieving previous word - CharSequence prevWord = EditingUtils.getPreviousWord(getCurrentInputConnection(), - mSettingsValues.mWordSeparators); - SuggestedWords.Builder builder = mSuggest.getSuggestedWordBuilder( + final InputConnection ic = getCurrentInputConnection(); + final CharSequence prevWord; + if (null == ic) { + prevWord = null; + } else { + prevWord = EditingUtils.getPreviousWord(ic, mSettingsValues.mWordSeparators); + } + // getSuggestedWordBuilder handles gracefully a null value of prevWord + final SuggestedWords.Builder builder = mSuggest.getSuggestedWordBuilder( mKeyboardSwitcher.getKeyboardView(), wordComposer, prevWord); boolean autoCorrectionAvailable = !mInputTypeNoAutoCorrect && mSuggest.hasAutoCorrection(); @@ -1788,10 +1794,13 @@ public class LatinIME extends InputMethodServiceCompatWrapper implements Keyboar // We don't want to register as bigrams words separated by a separator. // For example "I will, and you too" : we don't want the pair ("will" "and") to be // a bigram. - CharSequence prevWord = EditingUtils.getPreviousWord(getCurrentInputConnection(), - mSettingsValues.mWordSeparators); - if (!TextUtils.isEmpty(prevWord)) { - mUserBigramDictionary.addBigrams(prevWord.toString(), suggestion.toString()); + final InputConnection ic = getCurrentInputConnection(); + if (null != ic) { + final CharSequence prevWord = + EditingUtils.getPreviousWord(ic, mSettingsValues.mWordSeparators); + if (!TextUtils.isEmpty(prevWord)) { + mUserBigramDictionary.addBigrams(prevWord.toString(), suggestion.toString()); + } } } }