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