Passing SpacingAndPunctuations to RichInputConnection.getNthPreviousWords

Change-Id: I174c50f509ed6998b755e1a712e7f6c0f82f4425
main
Tadashi G. Takaoka 2014-01-09 17:27:33 +09:00
parent d7660c6f56
commit 494e2d6c17
4 changed files with 58 additions and 32 deletions

View File

@ -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);

View File

@ -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;
} }

View File

@ -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

View File

@ -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));
} }
/** /**