Merge "Optimizations and safeguards."

main
Jean Chalard 2013-05-08 10:11:48 +00:00 committed by Android (Google) Code Review
commit 71d52474fd
2 changed files with 13 additions and 4 deletions

View File

@ -250,6 +250,7 @@ public final class LatinIME extends InputMethodService implements KeyboardAction
} }
public void postResumeSuggestions() { public void postResumeSuggestions() {
removeMessages(MSG_RESUME_SUGGESTIONS);
sendMessageDelayed(obtainMessage(MSG_RESUME_SUGGESTIONS), mDelayUpdateSuggestions); sendMessageDelayed(obtainMessage(MSG_RESUME_SUGGESTIONS), mDelayUpdateSuggestions);
} }
@ -759,7 +760,8 @@ public final class LatinIME extends InputMethodService implements KeyboardAction
} }
mSuggestedWords = SuggestedWords.EMPTY; mSuggestedWords = SuggestedWords.EMPTY;
mConnection.resetCachesUponCursorMove(editorInfo.initialSelStart); mConnection.resetCachesUponCursorMove(editorInfo.initialSelStart,
false /* shouldFinishComposition */);
if (isDifferentTextField) { if (isDifferentTextField) {
mainKeyboardView.closing(); mainKeyboardView.closing();
@ -1148,13 +1150,14 @@ public final class LatinIME extends InputMethodService implements KeyboardAction
// This will reset the whole input state to the starting state. It will clear // This will reset the whole input state to the starting state. It will clear
// the composing word, reset the last composed word, tell the inputconnection about it. // the composing word, reset the last composed word, tell the inputconnection about it.
private void resetEntireInputState(final int newCursorPosition) { private void resetEntireInputState(final int newCursorPosition) {
final boolean shouldFinishComposition = mWordComposer.isComposingWord();
resetComposingState(true /* alsoResetLastComposedWord */); resetComposingState(true /* alsoResetLastComposedWord */);
if (mSettings.getCurrent().mBigramPredictionEnabled) { if (mSettings.getCurrent().mBigramPredictionEnabled) {
clearSuggestionStrip(); clearSuggestionStrip();
} else { } else {
setSuggestedWords(mSettings.getCurrent().mSuggestPuncList, false); setSuggestedWords(mSettings.getCurrent().mSuggestPuncList, false);
} }
mConnection.resetCachesUponCursorMove(newCursorPosition); mConnection.resetCachesUponCursorMove(newCursorPosition, shouldFinishComposition);
} }
private void resetComposingState(final boolean alsoResetLastComposedWord) { private void resetComposingState(final boolean alsoResetLastComposedWord) {
@ -2436,10 +2439,15 @@ public final class LatinIME extends InputMethodService implements KeyboardAction
private void restartSuggestionsOnWordTouchedByCursor() { private void restartSuggestionsOnWordTouchedByCursor() {
// If the cursor is not touching a word, or if there is a selection, return right away. // If the cursor is not touching a word, or if there is a selection, return right away.
if (mLastSelectionStart != mLastSelectionEnd) return; if (mLastSelectionStart != mLastSelectionEnd) return;
// If we don't know the cursor location, return.
if (mLastSelectionStart < 0) return;
if (!mConnection.isCursorTouchingWord(mSettings.getCurrent())) return; if (!mConnection.isCursorTouchingWord(mSettings.getCurrent())) return;
final Range range = mConnection.getWordRangeAtCursor(mSettings.getWordSeparators(), final Range range = mConnection.getWordRangeAtCursor(mSettings.getWordSeparators(),
0 /* additionalPrecedingWordsCount */); 0 /* additionalPrecedingWordsCount */);
if (null == range) return; // Happens if we don't have an input connection at all if (null == range) return; // Happens if we don't have an input connection at all
// If for some strange reason (editor bug or so) we measure the text before the cursor as
// longer than what the entire text is supposed to be, the safe thing to do is bail out.
if (range.mCharsBefore > mLastSelectionStart) return;
final ArrayList<SuggestedWordInfo> suggestions = CollectionUtils.newArrayList(); final ArrayList<SuggestedWordInfo> suggestions = CollectionUtils.newArrayList();
final String typedWord = range.mWord.toString(); final String typedWord = range.mWord.toString();
if (range.mWord instanceof SpannableString) { if (range.mWord instanceof SpannableString) {

View File

@ -135,13 +135,14 @@ public final class RichInputConnection {
if (DEBUG_PREVIOUS_TEXT) checkConsistencyForDebug(); if (DEBUG_PREVIOUS_TEXT) checkConsistencyForDebug();
} }
public void resetCachesUponCursorMove(final int newCursorPosition) { public void resetCachesUponCursorMove(final int newCursorPosition,
final boolean shouldFinishComposition) {
mCurrentCursorPosition = newCursorPosition; mCurrentCursorPosition = newCursorPosition;
mComposingText.setLength(0); mComposingText.setLength(0);
mCommittedTextBeforeComposingText.setLength(0); mCommittedTextBeforeComposingText.setLength(0);
final CharSequence textBeforeCursor = getTextBeforeCursor(DEFAULT_TEXT_CACHE_SIZE, 0); final CharSequence textBeforeCursor = getTextBeforeCursor(DEFAULT_TEXT_CACHE_SIZE, 0);
if (null != textBeforeCursor) mCommittedTextBeforeComposingText.append(textBeforeCursor); if (null != textBeforeCursor) mCommittedTextBeforeComposingText.append(textBeforeCursor);
if (null != mIC) { if (null != mIC && shouldFinishComposition) {
mIC.finishComposingText(); mIC.finishComposingText();
if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) { if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) {
ResearchLogger.richInputConnection_finishComposingText(); ResearchLogger.richInputConnection_finishComposingText();