Merge "[CB14.5] Stop copying WordComposers."

main
Jean Chalard 2014-03-28 06:51:17 +00:00 committed by Android (Google) Code Review
commit 35645ac39a
4 changed files with 48 additions and 34 deletions

View File

@ -244,7 +244,7 @@ public final class BinaryDictionary extends Dictionary {
// TODO: toLowerCase in the native code // TODO: toLowerCase in the native code
final int[] prevWordCodePointArray = (null == prevWord) final int[] prevWordCodePointArray = (null == prevWord)
? null : StringUtils.toCodePointArray(prevWord); ? null : StringUtils.toCodePointArray(prevWord);
final int composerSize = composer.size(); final int composerSize = composer.sizeWithoutTrailingSingleQuotes();
final boolean isGesture = composer.isBatchMode(); final boolean isGesture = composer.isBatchMode();
if (composerSize <= 1 || !isGesture) { if (composerSize <= 1 || !isGesture) {

View File

@ -101,19 +101,6 @@ public final class Suggest {
: typedWord; : typedWord;
LatinImeLogger.onAddSuggestedWord(typedWord, Dictionary.TYPE_USER_TYPED); LatinImeLogger.onAddSuggestedWord(typedWord, Dictionary.TYPE_USER_TYPED);
final WordComposer wordComposerForLookup;
if (trailingSingleQuotesCount > 0) {
wordComposerForLookup = new WordComposer(wordComposer);
for (int i = trailingSingleQuotesCount - 1; i >= 0; --i) {
// TODO: do not create a fake event for this. Ideally the word composer should know
// how to give out the word without trailing quotes and we can remove this entirely
wordComposerForLookup.deleteLast(Event.createSoftwareKeypressEvent(
Event.NOT_A_CODE_POINT, Constants.CODE_DELETE,
Constants.NOT_A_COORDINATE, Constants.NOT_A_COORDINATE));
}
} else {
wordComposerForLookup = wordComposer;
}
final ArrayList<SuggestedWordInfo> rawSuggestions; final ArrayList<SuggestedWordInfo> rawSuggestions;
if (ProductionFlag.INCLUDE_RAW_SUGGESTIONS) { if (ProductionFlag.INCLUDE_RAW_SUGGESTIONS) {
rawSuggestions = CollectionUtils.newArrayList(); rawSuggestions = CollectionUtils.newArrayList();
@ -121,7 +108,7 @@ public final class Suggest {
rawSuggestions = null; rawSuggestions = null;
} }
final SuggestionResults suggestionResults = mDictionaryFacilitator.getSuggestionResults( final SuggestionResults suggestionResults = mDictionaryFacilitator.getSuggestionResults(
wordComposerForLookup, prevWordForBigram, proximityInfo, blockOffensiveWords, wordComposer, prevWordForBigram, proximityInfo, blockOffensiveWords,
additionalFeaturesOptions, SESSION_TYPING, rawSuggestions); additionalFeaturesOptions, SESSION_TYPING, rawSuggestions);
final boolean isFirstCharCapitalized = wordComposer.isFirstCharCapitalized(); final boolean isFirstCharCapitalized = wordComposer.isFirstCharCapitalized();

View File

@ -104,25 +104,6 @@ public final class WordComposer {
refreshSize(); refreshSize();
} }
public WordComposer(final WordComposer source) {
mCombinerChain = source.mCombinerChain;
mPrimaryKeyCodes = Arrays.copyOf(source.mPrimaryKeyCodes, source.mPrimaryKeyCodes.length);
mEvents = new ArrayList<Event>(source.mEvents);
mTypedWord = new StringBuilder(source.mTypedWord);
mInputPointers.copy(source.mInputPointers);
mCapsCount = source.mCapsCount;
mDigitsCount = source.mDigitsCount;
mIsFirstCharCapitalized = source.mIsFirstCharCapitalized;
mCapitalizedMode = source.mCapitalizedMode;
mTrailingSingleQuotesCount = source.mTrailingSingleQuotesCount;
mIsResumed = source.mIsResumed;
mIsBatchMode = source.mIsBatchMode;
mCursorPositionWithinWord = source.mCursorPositionWithinWord;
mRejectedBatchModeSuggestion = source.mRejectedBatchModeSuggestion;
mPreviousWordForSuggestion = source.mPreviousWordForSuggestion;
refreshSize();
}
/** /**
* Clear out the keys registered so far. * Clear out the keys registered so far.
*/ */
@ -155,6 +136,13 @@ public final class WordComposer {
return mCodePointSize; return mCodePointSize;
} }
// When the composition contains trailing quotes, we don't pass them to the suggestion engine.
// This is because "'tgis'" should be corrected to "'this'", but we can't afford to consider
// single quotes as separators because of their very common use as apostrophes.
public int sizeWithoutTrailingSingleQuotes() {
return size() - mTrailingSingleQuotesCount;
}
public final boolean isComposingWord() { public final boolean isComposingWord() {
return size() > 0; return size() > 0;
} }

View File

@ -474,4 +474,43 @@ public class InputLogicTests extends InputTestsBase {
WORD_TO_TYPE.length() * TIMES_TO_TYPE - TIMES_TO_BACKSPACE, WORD_TO_TYPE.length() * TIMES_TO_TYPE - TIMES_TO_BACKSPACE,
mEditText.getText().length()); mEditText.getText().length());
} }
public void testManySingleQuotes() {
final String WORD_TO_AUTOCORRECT = "i";
final String WORD_AUTOCORRECTED = "I";
final String QUOTES = "''''''''''''''''''''";
final String WORD_TO_TYPE = WORD_TO_AUTOCORRECT + QUOTES + " ";
final String EXPECTED_RESULT = WORD_AUTOCORRECTED + QUOTES + " ";
type(WORD_TO_TYPE);
assertEquals("auto-correct with many trailing single quotes", EXPECTED_RESULT,
mEditText.getText().toString());
}
public void testManySingleQuotesOneByOne() {
final String WORD_TO_AUTOCORRECT = "i";
final String WORD_AUTOCORRECTED = "I";
final String QUOTES = "''''''''''''''''''''";
final String WORD_TO_TYPE = WORD_TO_AUTOCORRECT + QUOTES + " ";
final String EXPECTED_RESULT = WORD_AUTOCORRECTED + QUOTES + " ";
for (int i = 0; i < WORD_TO_TYPE.length(); ++i) {
type(WORD_TO_TYPE.substring(i, i+1));
sleep(DELAY_TO_WAIT_FOR_PREDICTIONS);
runMessages();
}
assertEquals("type many trailing single quotes one by one", EXPECTED_RESULT,
mEditText.getText().toString());
}
public void testTypingSingleQuotesOneByOne() {
final String WORD_TO_TYPE = "it's ";
final String EXPECTED_RESULT = WORD_TO_TYPE;
for (int i = 0; i < WORD_TO_TYPE.length(); ++i) {
type(WORD_TO_TYPE.substring(i, i+1));
sleep(DELAY_TO_WAIT_FOR_PREDICTIONS);
runMessages();
}
assertEquals("type words letter by letter", EXPECTED_RESULT,
mEditText.getText().toString());
}
} }