When starting input, include the literal word in suggestions
This change also includes a fix that has suggestions re-computed when the typed word is included but no prior suggestions were found in spans. Bug: 2349475 Change-Id: Ic06e6ac492507126ffc1e96a5f396c971b567272
This commit is contained in:
parent
eb771b9dc4
commit
fca2c4b439
2 changed files with 22 additions and 14 deletions
|
@ -166,6 +166,8 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
|
|||
private static final int ARG1_DISMISS_GESTURE_FLOATING_PREVIEW_TEXT = 1;
|
||||
private static final int ARG1_SHOW_GESTURE_FLOATING_PREVIEW_TEXT = 2;
|
||||
private static final int ARG2_UNUSED = 0;
|
||||
private static final int ARG1_FALSE = 0;
|
||||
private static final int ARG1_TRUE = 1;
|
||||
|
||||
private int mDelayUpdateSuggestions;
|
||||
private int mDelayUpdateShiftState;
|
||||
|
@ -213,7 +215,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
|
|||
case MSG_RESUME_SUGGESTIONS:
|
||||
latinIme.mInputLogic.restartSuggestionsOnWordTouchedByCursor(
|
||||
latinIme.mSettings.getCurrent(),
|
||||
false /* includeResumedWordInSuggestions */);
|
||||
msg.arg1 == ARG1_TRUE /* shouldIncludeResumedWordInSuggestions */);
|
||||
break;
|
||||
case MSG_REOPEN_DICTIONARIES:
|
||||
latinIme.resetSuggest();
|
||||
|
@ -250,7 +252,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
|
|||
sendMessage(obtainMessage(MSG_REOPEN_DICTIONARIES));
|
||||
}
|
||||
|
||||
public void postResumeSuggestions() {
|
||||
public void postResumeSuggestions(final boolean shouldIncludeResumedWordInSuggestions) {
|
||||
final LatinIME latinIme = getOwnerInstance();
|
||||
if (latinIme == null) {
|
||||
return;
|
||||
|
@ -260,7 +262,10 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
|
|||
return;
|
||||
}
|
||||
removeMessages(MSG_RESUME_SUGGESTIONS);
|
||||
sendMessageDelayed(obtainMessage(MSG_RESUME_SUGGESTIONS), mDelayUpdateSuggestions);
|
||||
sendMessageDelayed(obtainMessage(MSG_RESUME_SUGGESTIONS,
|
||||
shouldIncludeResumedWordInSuggestions ? ARG1_TRUE : ARG1_FALSE,
|
||||
0 /* ignored */),
|
||||
mDelayUpdateSuggestions);
|
||||
}
|
||||
|
||||
public void postResetCaches(final boolean tryResumeSuggestions, final int remainingTries) {
|
||||
|
@ -808,7 +813,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
|
|||
// When rotating, initialSelStart and initialSelEnd sometimes are lying. Make a best
|
||||
// effort to work around this bug.
|
||||
mInputLogic.mConnection.tryFixLyingCursorPosition();
|
||||
mHandler.postResumeSuggestions();
|
||||
mHandler.postResumeSuggestions(true /* shouldIncludeResumedWordInSuggestions */);
|
||||
canReachInputConnection = true;
|
||||
}
|
||||
|
||||
|
|
|
@ -356,7 +356,7 @@ public final class InputLogic {
|
|||
// The cursor has been moved : we now accept to perform recapitalization
|
||||
mRecapitalizeStatus.enable();
|
||||
// We moved the cursor. If we are touching a word, we need to resume suggestion.
|
||||
mLatinIME.mHandler.postResumeSuggestions();
|
||||
mLatinIME.mHandler.postResumeSuggestions(false /* shouldIncludeResumedWordInSuggestions */);
|
||||
// Stop the last recapitalization, if started.
|
||||
mRecapitalizeStatus.stop();
|
||||
return true;
|
||||
|
@ -998,7 +998,7 @@ public final class InputLogic {
|
|||
&& !mConnection.isCursorFollowedByWordCharacter(
|
||||
inputTransaction.mSettingsValues.mSpacingAndPunctuations)) {
|
||||
restartSuggestionsOnWordTouchedByCursor(inputTransaction.mSettingsValues,
|
||||
true /* includeResumedWordInSuggestions */);
|
||||
true /* shouldIncludeResumedWordInSuggestions */);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1238,12 +1238,12 @@ public final class InputLogic {
|
|||
* do nothing.
|
||||
*
|
||||
* @param settingsValues the current values of the settings.
|
||||
* @param includeResumedWordInSuggestions whether to include the word on which we resume
|
||||
* @param shouldIncludeResumedWordInSuggestions whether to include the word on which we resume
|
||||
* suggestions in the suggestion list.
|
||||
*/
|
||||
// TODO: make this private.
|
||||
public void restartSuggestionsOnWordTouchedByCursor(final SettingsValues settingsValues,
|
||||
final boolean includeResumedWordInSuggestions) {
|
||||
final boolean shouldIncludeResumedWordInSuggestions) {
|
||||
// HACK: We may want to special-case some apps that exhibit bad behavior in case of
|
||||
// recorrection. This is a temporary, stopgap measure that will be removed later.
|
||||
// TODO: remove this.
|
||||
|
@ -1289,7 +1289,7 @@ public final class InputLogic {
|
|||
if (numberOfCharsInWordBeforeCursor > expectedCursorPosition) return;
|
||||
final ArrayList<SuggestedWordInfo> suggestions = new ArrayList<>();
|
||||
final String typedWord = range.mWord.toString();
|
||||
if (includeResumedWordInSuggestions) {
|
||||
if (shouldIncludeResumedWordInSuggestions) {
|
||||
suggestions.add(new SuggestedWordInfo(typedWord,
|
||||
SuggestedWords.MAX_SUGGESTIONS + 1,
|
||||
SuggestedWordInfo.KIND_TYPED, Dictionary.DICTIONARY_USER_TYPED,
|
||||
|
@ -1327,9 +1327,10 @@ public final class InputLogic {
|
|||
typedWord.codePointCount(0, numberOfCharsInWordBeforeCursor));
|
||||
mConnection.setComposingRegion(expectedCursorPosition - numberOfCharsInWordBeforeCursor,
|
||||
expectedCursorPosition + range.getNumberOfCharsInWordAfterCursor());
|
||||
if (suggestions.isEmpty()) {
|
||||
// We come here if there weren't any suggestion spans on this word. We will try to
|
||||
// compute suggestions for it instead.
|
||||
if (suggestions.size() <= (shouldIncludeResumedWordInSuggestions ? 1 : 0)) {
|
||||
// If there weren't any suggestion spans on this word, suggestions#size() will be 1
|
||||
// if shouldIncludeResumedWordInSuggestions is true, 0 otherwise. In this case, we
|
||||
// have no useful suggestions, so we will try to compute some for it instead.
|
||||
mInputLogicHandler.getSuggestedWords(Suggest.SESSION_TYPING,
|
||||
SuggestedWords.NOT_A_SEQUENCE_NUMBER, new OnGetSuggestedWordsCallback() {
|
||||
@Override
|
||||
|
@ -1337,7 +1338,7 @@ public final class InputLogic {
|
|||
final SuggestedWords suggestedWordsIncludingTypedWord) {
|
||||
final SuggestedWords suggestedWords;
|
||||
if (suggestedWordsIncludingTypedWord.size() > 1
|
||||
&& !includeResumedWordInSuggestions) {
|
||||
&& !shouldIncludeResumedWordInSuggestions) {
|
||||
// We were able to compute new suggestions for this word.
|
||||
// Remove the typed word, since we don't want to display it in this
|
||||
// case. The #getSuggestedWordsExcludingTypedWord() method sets
|
||||
|
@ -1944,7 +1945,9 @@ public final class InputLogic {
|
|||
}
|
||||
mConnection.tryFixLyingCursorPosition();
|
||||
if (tryResumeSuggestions) {
|
||||
handler.postResumeSuggestions();
|
||||
// This is triggered when starting input anew, so we want to include the resumed
|
||||
// word in suggestions.
|
||||
handler.postResumeSuggestions(true /* shouldIncludeResumedWordInSuggestions */);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue