Passing SpacingAndPunctuations to RichInputConnection.getNthPreviousWords
Change-Id: I174c50f509ed6998b755e1a712e7f6c0f82f4425main
parent
d7660c6f56
commit
494e2d6c17
|
@ -1396,7 +1396,8 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
|
|||
// word. If we are composing a word we should have the second word before the cursor
|
||||
// memorized, otherwise we should have the first.
|
||||
final String rereadPrevWord = mInputLogic.getNthPreviousWordForSuggestion(
|
||||
currentSettings, mInputLogic.mWordComposer.isComposingWord() ? 2 : 1);
|
||||
currentSettings.mSpacingAndPunctuations,
|
||||
mInputLogic.mWordComposer.isComposingWord() ? 2 : 1);
|
||||
if (!TextUtils.equals(previousWord, rereadPrevWord)) {
|
||||
throw new RuntimeException("Unexpected previous word: "
|
||||
+ previousWord + " <> " + rereadPrevWord);
|
||||
|
|
|
@ -28,6 +28,7 @@ import android.view.inputmethod.InputConnection;
|
|||
|
||||
import com.android.inputmethod.latin.define.ProductionFlag;
|
||||
import com.android.inputmethod.latin.settings.SettingsValues;
|
||||
import com.android.inputmethod.latin.settings.SpacingAndPunctuations;
|
||||
import com.android.inputmethod.latin.utils.CapsModeUtils;
|
||||
import com.android.inputmethod.latin.utils.DebugLogUtils;
|
||||
import com.android.inputmethod.latin.utils.SpannableStringUtils;
|
||||
|
@ -537,7 +538,8 @@ public final class RichInputConnection {
|
|||
}
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public String getNthPreviousWord(final SettingsValues currentSettingsValues, final int n) {
|
||||
public String getNthPreviousWord(final SpacingAndPunctuations spacingAndPunctuations,
|
||||
final int n) {
|
||||
mIC = mParent.getCurrentInputConnection();
|
||||
if (null == mIC) return null;
|
||||
final CharSequence prev = getTextBeforeCursor(LOOKBACK_CHARACTER_NUM, 0);
|
||||
|
@ -556,7 +558,7 @@ public final class RichInputConnection {
|
|||
}
|
||||
}
|
||||
}
|
||||
return getNthPreviousWord(prev, currentSettingsValues, n);
|
||||
return getNthPreviousWord(prev, spacingAndPunctuations, n);
|
||||
}
|
||||
|
||||
private static boolean isSeparator(int code, String sep) {
|
||||
|
@ -580,7 +582,7 @@ public final class RichInputConnection {
|
|||
// (n = 2) "abc |" -> null
|
||||
// (n = 2) "abc. def|" -> null
|
||||
public static String getNthPreviousWord(final CharSequence prev,
|
||||
final SettingsValues currentSettingsValues, final int n) {
|
||||
final SpacingAndPunctuations spacingAndPunctuations, final int n) {
|
||||
if (prev == null) return null;
|
||||
final String[] w = spaceRegex.split(prev);
|
||||
|
||||
|
@ -592,8 +594,8 @@ public final class RichInputConnection {
|
|||
|
||||
// If ends in a separator, return null
|
||||
final char lastChar = nthPrevWord.charAt(length - 1);
|
||||
if (currentSettingsValues.isWordSeparator(lastChar)
|
||||
|| currentSettingsValues.isWordConnector(lastChar)) return null;
|
||||
if (spacingAndPunctuations.isWordSeparator(lastChar)
|
||||
|| spacingAndPunctuations.isWordConnector(lastChar)) return null;
|
||||
|
||||
return nthPrevWord;
|
||||
}
|
||||
|
|
|
@ -46,6 +46,7 @@ import com.android.inputmethod.latin.WordComposer;
|
|||
import com.android.inputmethod.latin.define.ProductionFlag;
|
||||
import com.android.inputmethod.latin.settings.Settings;
|
||||
import com.android.inputmethod.latin.settings.SettingsValues;
|
||||
import com.android.inputmethod.latin.settings.SpacingAndPunctuations;
|
||||
import com.android.inputmethod.latin.suggestions.SuggestionStripView;
|
||||
import com.android.inputmethod.latin.utils.AsyncResultHolder;
|
||||
import com.android.inputmethod.latin.utils.CollectionUtils;
|
||||
|
@ -369,7 +370,8 @@ public final class InputLogic {
|
|||
mWordComposer.setCapitalizedModeAndPreviousWordAtStartComposingTime(
|
||||
getActualCapsMode(settingsValues, keyboardSwitcher.getKeyboardShiftMode()),
|
||||
// Prev word is 1st word before cursor
|
||||
getNthPreviousWordForSuggestion(settingsValues, 1 /* nthPreviousWord */));
|
||||
getNthPreviousWordForSuggestion(
|
||||
settingsValues.mSpacingAndPunctuations, 1 /* nthPreviousWord */));
|
||||
}
|
||||
|
||||
/* The sequence number member is only used in onUpdateBatchInput. It is increased each time
|
||||
|
@ -555,7 +557,8 @@ public final class InputLogic {
|
|||
// yet, so the word we want is the 1st word before the cursor.
|
||||
mWordComposer.setCapitalizedModeAndPreviousWordAtStartComposingTime(
|
||||
getActualCapsMode(settingsValues, keyboardSwitcher.getKeyboardShiftMode()),
|
||||
getNthPreviousWordForSuggestion(settingsValues, 1 /* nthPreviousWord */));
|
||||
getNthPreviousWordForSuggestion(
|
||||
settingsValues.mSpacingAndPunctuations, 1 /* nthPreviousWord */));
|
||||
}
|
||||
mConnection.setComposingText(getTextWithUnderline(
|
||||
mWordComposer.getTypedWord()), 1);
|
||||
|
@ -1107,7 +1110,7 @@ public final class InputLogic {
|
|||
}
|
||||
}
|
||||
mWordComposer.setComposingWord(typedWord,
|
||||
getNthPreviousWordForSuggestion(settingsValues,
|
||||
getNthPreviousWordForSuggestion(settingsValues.mSpacingAndPunctuations,
|
||||
// We want the previous word for suggestion. If we have chars in the word
|
||||
// before the cursor, then we want the word before that, hence 2; otherwise,
|
||||
// we want the word immediately before the cursor, hence 1.
|
||||
|
@ -1301,17 +1304,17 @@ public final class InputLogic {
|
|||
|
||||
/**
|
||||
* Get the nth previous word before the cursor as context for the suggestion process.
|
||||
* @param currentSettings the current settings values.
|
||||
* @param spacingAndPunctuations the current spacing and punctuations settings.
|
||||
* @param nthPreviousWord reverse index of the word to get (1-indexed)
|
||||
* @return the nth previous word before the cursor.
|
||||
*/
|
||||
// TODO: Make this private
|
||||
public String getNthPreviousWordForSuggestion(final SettingsValues currentSettings,
|
||||
final int nthPreviousWord) {
|
||||
if (currentSettings.mSpacingAndPunctuations.mCurrentLanguageHasSpaces) {
|
||||
public String getNthPreviousWordForSuggestion(
|
||||
final SpacingAndPunctuations spacingAndPunctuations, final int nthPreviousWord) {
|
||||
if (spacingAndPunctuations.mCurrentLanguageHasSpaces) {
|
||||
// If we are typing in a language with spaces we can just look up the previous
|
||||
// word from textview.
|
||||
return mConnection.getNthPreviousWord(currentSettings, nthPreviousWord);
|
||||
return mConnection.getNthPreviousWord(spacingAndPunctuations, nthPreviousWord);
|
||||
} else {
|
||||
return LastComposedWord.NOT_A_COMPOSED_WORD == mLastComposedWord ? null
|
||||
: mLastComposedWord.mCommittedWord;
|
||||
|
@ -1659,7 +1662,8 @@ public final class InputLogic {
|
|||
mConnection.commitText(SuggestionSpanUtils.getTextWithSuggestionSpan(mLatinIME, chosenWord,
|
||||
suggestedWords), 1);
|
||||
// TODO: we pass 2 here, but would it be better to move this above and pass 1 instead?
|
||||
final String prevWord = mConnection.getNthPreviousWord(settingsValues, 2);
|
||||
final String prevWord = mConnection.getNthPreviousWord(
|
||||
settingsValues.mSpacingAndPunctuations, 2);
|
||||
// Add the word to the user history dictionary
|
||||
performAdditionToUserHistoryDictionary(settingsValues, chosenWord, prevWord);
|
||||
// TODO: figure out here if this is an auto-correct or if the best word is actually
|
||||
|
|
|
@ -16,16 +16,13 @@
|
|||
|
||||
package com.android.inputmethod.latin;
|
||||
|
||||
import com.android.inputmethod.latin.settings.SettingsValues;
|
||||
import com.android.inputmethod.latin.utils.TextRange;
|
||||
|
||||
import android.content.res.Resources;
|
||||
import android.inputmethodservice.InputMethodService;
|
||||
import android.os.Parcel;
|
||||
import android.test.AndroidTestCase;
|
||||
import android.test.MoreAsserts;
|
||||
import android.test.suitebuilder.annotation.SmallTest;
|
||||
import android.text.SpannableString;
|
||||
import android.text.Spanned;
|
||||
import android.text.TextUtils;
|
||||
import android.text.style.SuggestionSpan;
|
||||
import android.view.inputmethod.ExtractedText;
|
||||
|
@ -33,6 +30,10 @@ import android.view.inputmethod.ExtractedTextRequest;
|
|||
import android.view.inputmethod.InputConnection;
|
||||
import android.view.inputmethod.InputConnectionWrapper;
|
||||
|
||||
import com.android.inputmethod.latin.settings.SpacingAndPunctuations;
|
||||
import com.android.inputmethod.latin.utils.RunInLocale;
|
||||
import com.android.inputmethod.latin.utils.TextRange;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
@SmallTest
|
||||
|
@ -40,12 +41,19 @@ public class RichInputConnectionAndTextRangeTests extends AndroidTestCase {
|
|||
|
||||
// The following is meant to be a reasonable default for
|
||||
// the "word_separators" resource.
|
||||
private static final SettingsValues sSettings =
|
||||
SettingsValues.makeDummySettingsValuesForTest(Locale.ENGLISH);
|
||||
private SpacingAndPunctuations mSpacingAndPunctuations;
|
||||
|
||||
@Override
|
||||
protected void setUp() throws Exception {
|
||||
super.setUp();
|
||||
final RunInLocale<SpacingAndPunctuations> job = new RunInLocale<SpacingAndPunctuations>() {
|
||||
@Override
|
||||
protected SpacingAndPunctuations job(final Resources res) {
|
||||
return new SpacingAndPunctuations(res);
|
||||
}
|
||||
};
|
||||
final Resources res = getContext().getResources();
|
||||
mSpacingAndPunctuations = job.runInLocale(res, Locale.ENGLISH);
|
||||
}
|
||||
|
||||
private class MockConnection extends InputConnectionWrapper {
|
||||
|
@ -139,9 +147,12 @@ public class RichInputConnectionAndTextRangeTests extends AndroidTestCase {
|
|||
*/
|
||||
public void testGetPreviousWord() {
|
||||
// If one of the following cases breaks, the bigram suggestions won't work.
|
||||
assertEquals(RichInputConnection.getNthPreviousWord("abc def", sSettings, 2), "abc");
|
||||
assertNull(RichInputConnection.getNthPreviousWord("abc", sSettings, 2));
|
||||
assertNull(RichInputConnection.getNthPreviousWord("abc. def", sSettings, 2));
|
||||
assertEquals(RichInputConnection.getNthPreviousWord(
|
||||
"abc def", mSpacingAndPunctuations, 2), "abc");
|
||||
assertNull(RichInputConnection.getNthPreviousWord(
|
||||
"abc", mSpacingAndPunctuations, 2));
|
||||
assertNull(RichInputConnection.getNthPreviousWord(
|
||||
"abc. def", mSpacingAndPunctuations, 2));
|
||||
|
||||
// The following tests reflect the current behavior of the function
|
||||
// RichInputConnection#getNthPreviousWord.
|
||||
|
@ -150,15 +161,23 @@ public class RichInputConnectionAndTextRangeTests extends AndroidTestCase {
|
|||
// this function if needed - especially since it does not seem very
|
||||
// logical. These tests are just there to catch any unintentional
|
||||
// changes in the behavior of the RichInputConnection#getPreviousWord method.
|
||||
assertEquals(RichInputConnection.getNthPreviousWord("abc def ", sSettings, 2), "abc");
|
||||
assertEquals(RichInputConnection.getNthPreviousWord("abc def.", sSettings, 2), "abc");
|
||||
assertEquals(RichInputConnection.getNthPreviousWord("abc def .", sSettings, 2), "def");
|
||||
assertNull(RichInputConnection.getNthPreviousWord("abc ", sSettings, 2));
|
||||
assertEquals(RichInputConnection.getNthPreviousWord(
|
||||
"abc def ", mSpacingAndPunctuations, 2), "abc");
|
||||
assertEquals(RichInputConnection.getNthPreviousWord(
|
||||
"abc def.", mSpacingAndPunctuations, 2), "abc");
|
||||
assertEquals(RichInputConnection.getNthPreviousWord(
|
||||
"abc def .", mSpacingAndPunctuations, 2), "def");
|
||||
assertNull(RichInputConnection.getNthPreviousWord(
|
||||
"abc ", mSpacingAndPunctuations, 2));
|
||||
|
||||
assertEquals(RichInputConnection.getNthPreviousWord("abc def", sSettings, 1), "def");
|
||||
assertEquals(RichInputConnection.getNthPreviousWord("abc def ", sSettings, 1), "def");
|
||||
assertNull(RichInputConnection.getNthPreviousWord("abc def.", sSettings, 1));
|
||||
assertNull(RichInputConnection.getNthPreviousWord("abc def .", sSettings, 1));
|
||||
assertEquals(RichInputConnection.getNthPreviousWord(
|
||||
"abc def", mSpacingAndPunctuations, 1), "def");
|
||||
assertEquals(RichInputConnection.getNthPreviousWord(
|
||||
"abc def ", mSpacingAndPunctuations, 1), "def");
|
||||
assertNull(RichInputConnection.getNthPreviousWord(
|
||||
"abc def.", mSpacingAndPunctuations, 1));
|
||||
assertNull(RichInputConnection.getNthPreviousWord(
|
||||
"abc def .", mSpacingAndPunctuations, 1));
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue