[CB14.5] Stop copying WordComposers.

This is an overdue refactoring that I have been wanted to
do forever, and that we can at last do now that suggestions
come only from instances of BinaryDictionary instances.

With this, all unit tests and regression tests are
passing again.

Bug: 13667648
Bug: 13665487
Bug: 8636060
Change-Id: Ie23a19f9b7e692edf2ee0b107ddaff2d7db564b6
main
Jean Chalard 2014-03-28 13:25:04 +09:00
parent 2f781026cc
commit 8e829c37df
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());
}
} }