Optimizations and safeguards.
- Don't call finishComposingText when useless. - Add safeguards against calling setComposingRegion when the data returned by the editor is inconsistent. - Cancel pending recorrection messages when new messages arrive. Bug: 8842941 Bug: 8845001 Change-Id: I939701033cf5c2bbd85871ecf83e329021ddeb91main
parent
faa94a2d0a
commit
9f9cc03277
|
@ -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) {
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Reference in New Issue