[CB17] Remove a member.

Bug: 13406701
Change-Id: I2e271f637f6b529a4191a7adc5cdfa5af437761b
main
Jean Chalard 2014-03-25 21:59:53 +09:00
parent 543fea98a4
commit 3285b68c97
2 changed files with 27 additions and 39 deletions

View File

@ -23,7 +23,6 @@ import com.android.inputmethod.latin.utils.CoordinateUtils;
import com.android.inputmethod.latin.utils.StringUtils; import com.android.inputmethod.latin.utils.StringUtils;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
/** /**
@ -51,11 +50,6 @@ public final class WordComposer {
// The list of events that served to compose this string. // The list of events that served to compose this string.
private final ArrayList<Event> mEvents; private final ArrayList<Event> mEvents;
private final InputPointers mInputPointers = new InputPointers(MAX_WORD_LENGTH); private final InputPointers mInputPointers = new InputPointers(MAX_WORD_LENGTH);
// This is the typed word, as a StringBuilder. This has the same contents as mPrimaryKeyCodes
// but under a StringBuilder representation for ease of use, depending on what is more useful
// at any given time. However this is not limited in size, while mPrimaryKeyCodes is limited
// to MAX_WORD_LENGTH code points.
private final StringBuilder mTypedWord;
// The previous word (before the composing word). Used as context for suggestions. May be null // The previous word (before the composing word). Used as context for suggestions. May be null
// after resetting and before starting a new composing word, or when there is no context like // after resetting and before starting a new composing word, or when there is no context like
// at the start of text for example. It can also be set to null externally when the user // at the start of text for example. It can also be set to null externally when the user
@ -73,6 +67,7 @@ public final class WordComposer {
private String mRejectedBatchModeSuggestion; private String mRejectedBatchModeSuggestion;
// Cache these values for performance // Cache these values for performance
private CharSequence mTypedWordCache;
private int mCapsCount; private int mCapsCount;
private int mDigitsCount; private int mDigitsCount;
private int mCapitalizedMode; private int mCapitalizedMode;
@ -93,7 +88,6 @@ public final class WordComposer {
mCombinerChain = new CombinerChain(); mCombinerChain = new CombinerChain();
mPrimaryKeyCodes = new int[MAX_WORD_LENGTH]; mPrimaryKeyCodes = new int[MAX_WORD_LENGTH];
mEvents = CollectionUtils.newArrayList(); mEvents = CollectionUtils.newArrayList();
mTypedWord = new StringBuilder(MAX_WORD_LENGTH);
mAutoCorrection = null; mAutoCorrection = null;
mTrailingSingleQuotesCount = 0; mTrailingSingleQuotesCount = 0;
mIsResumed = false; mIsResumed = false;
@ -101,7 +95,7 @@ public final class WordComposer {
mCursorPositionWithinWord = 0; mCursorPositionWithinWord = 0;
mRejectedBatchModeSuggestion = null; mRejectedBatchModeSuggestion = null;
mPreviousWordForSuggestion = null; mPreviousWordForSuggestion = null;
refreshSize(); refreshTypedWordCache();
} }
/** /**
@ -109,7 +103,6 @@ public final class WordComposer {
*/ */
public void reset() { public void reset() {
mCombinerChain.reset(); mCombinerChain.reset();
mTypedWord.setLength(0);
mEvents.clear(); mEvents.clear();
mAutoCorrection = null; mAutoCorrection = null;
mCapsCount = 0; mCapsCount = 0;
@ -121,11 +114,12 @@ public final class WordComposer {
mCursorPositionWithinWord = 0; mCursorPositionWithinWord = 0;
mRejectedBatchModeSuggestion = null; mRejectedBatchModeSuggestion = null;
mPreviousWordForSuggestion = null; mPreviousWordForSuggestion = null;
refreshSize(); refreshTypedWordCache();
} }
private final void refreshSize() { private final void refreshTypedWordCache() {
mCodePointSize = mTypedWord.codePointCount(0, mTypedWord.length()); mTypedWordCache = mCombinerChain.getComposingWordWithCombiningFeedback();
mCodePointSize = Character.codePointCount(mTypedWordCache, 0, mTypedWordCache.length());
} }
/** /**
@ -180,12 +174,8 @@ public final class WordComposer {
final int keyY = event.mY; final int keyY = event.mY;
final int newIndex = size(); final int newIndex = size();
mCombinerChain.processEvent(mEvents, event); mCombinerChain.processEvent(mEvents, event);
// TODO: remove mTypedWord and compute it dynamically when necessary. We also need to
// make the views of the composing word a SpannableString.
mTypedWord.replace(0, mTypedWord.length(),
mCombinerChain.getComposingWordWithCombiningFeedback().toString());
mEvents.add(event); mEvents.add(event);
refreshSize(); refreshTypedWordCache();
mCursorPositionWithinWord = mCodePointSize; mCursorPositionWithinWord = mCodePointSize;
if (newIndex < MAX_WORD_LENGTH) { if (newIndex < MAX_WORD_LENGTH) {
mPrimaryKeyCodes[newIndex] = primaryCode >= Constants.CODE_SPACE mPrimaryKeyCodes[newIndex] = primaryCode >= Constants.CODE_SPACE
@ -242,7 +232,7 @@ public final class WordComposer {
// If we have more than MAX_WORD_LENGTH characters, we don't have everything inside // If we have more than MAX_WORD_LENGTH characters, we don't have everything inside
// mPrimaryKeyCodes. This should be rare enough that we can afford to just compute // mPrimaryKeyCodes. This should be rare enough that we can afford to just compute
// the array on the fly when this happens. // the array on the fly when this happens.
codePoints = StringUtils.toCodePointArray(mTypedWord.toString()); codePoints = StringUtils.toCodePointArray(mTypedWordCache);
} else { } else {
codePoints = mPrimaryKeyCodes; codePoints = mPrimaryKeyCodes;
} }
@ -311,10 +301,8 @@ public final class WordComposer {
*/ */
public void deleteLast(final Event event) { public void deleteLast(final Event event) {
mCombinerChain.processEvent(mEvents, event); mCombinerChain.processEvent(mEvents, event);
mTypedWord.replace(0, mTypedWord.length(),
mCombinerChain.getComposingWordWithCombiningFeedback().toString());
mEvents.add(event); mEvents.add(event);
refreshSize(); refreshTypedWordCache();
// We may have deleted the last one. // We may have deleted the last one.
if (0 == size()) { if (0 == size()) {
mIsFirstCharCapitalized = false; mIsFirstCharCapitalized = false;
@ -322,10 +310,12 @@ public final class WordComposer {
if (mTrailingSingleQuotesCount > 0) { if (mTrailingSingleQuotesCount > 0) {
--mTrailingSingleQuotesCount; --mTrailingSingleQuotesCount;
} else { } else {
int i = mTypedWord.length(); int i = mTypedWordCache.length();
while (i > 0) { while (i > 0) {
i = mTypedWord.offsetByCodePoints(i, -1); i = Character.offsetByCodePoints(mTypedWordCache, i, -1);
if (Constants.CODE_SINGLE_QUOTE != mTypedWord.codePointAt(i)) break; if (Constants.CODE_SINGLE_QUOTE != Character.codePointAt(mTypedWordCache, i)) {
break;
}
++mTrailingSingleQuotesCount; ++mTrailingSingleQuotesCount;
} }
} }
@ -338,7 +328,7 @@ public final class WordComposer {
* @return the word that was typed so far. Never returns null. * @return the word that was typed so far. Never returns null.
*/ */
public String getTypedWord() { public String getTypedWord() {
return mTypedWord.toString(); return mTypedWordCache.toString();
} }
public String getPreviousWordForSuggestion() { public String getPreviousWordForSuggestion() {
@ -447,7 +437,7 @@ public final class WordComposer {
final int[] primaryKeyCodes = mPrimaryKeyCodes; final int[] primaryKeyCodes = mPrimaryKeyCodes;
mPrimaryKeyCodes = new int[MAX_WORD_LENGTH]; mPrimaryKeyCodes = new int[MAX_WORD_LENGTH];
final LastComposedWord lastComposedWord = new LastComposedWord(primaryKeyCodes, mEvents, final LastComposedWord lastComposedWord = new LastComposedWord(primaryKeyCodes, mEvents,
mInputPointers, mTypedWord.toString(), committedWord, separatorString, mInputPointers, mTypedWordCache.toString(), committedWord, separatorString,
prevWord, mCapitalizedMode); prevWord, mCapitalizedMode);
mInputPointers.reset(); mInputPointers.reset();
if (type != LastComposedWord.COMMIT_TYPE_DECIDED_WORD if (type != LastComposedWord.COMMIT_TYPE_DECIDED_WORD
@ -458,14 +448,13 @@ public final class WordComposer {
mDigitsCount = 0; mDigitsCount = 0;
mIsBatchMode = false; mIsBatchMode = false;
mPreviousWordForSuggestion = committedWord.toString(); mPreviousWordForSuggestion = committedWord.toString();
mTypedWord.setLength(0);
mCombinerChain.reset(); mCombinerChain.reset();
mEvents.clear(); mEvents.clear();
mCodePointSize = 0; mCodePointSize = 0;
mTrailingSingleQuotesCount = 0; mTrailingSingleQuotesCount = 0;
mIsFirstCharCapitalized = false; mIsFirstCharCapitalized = false;
mCapitalizedMode = CAPS_MODE_OFF; mCapitalizedMode = CAPS_MODE_OFF;
refreshSize(); refreshTypedWordCache();
mAutoCorrection = null; mAutoCorrection = null;
mCursorPositionWithinWord = 0; mCursorPositionWithinWord = 0;
mIsResumed = false; mIsResumed = false;
@ -486,10 +475,8 @@ public final class WordComposer {
mEvents.clear(); mEvents.clear();
Collections.copy(mEvents, lastComposedWord.mEvents); Collections.copy(mEvents, lastComposedWord.mEvents);
mInputPointers.set(lastComposedWord.mInputPointers); mInputPointers.set(lastComposedWord.mInputPointers);
mTypedWord.setLength(0);
mCombinerChain.reset(); mCombinerChain.reset();
mTypedWord.append(lastComposedWord.mTypedWord); refreshTypedWordCache();
refreshSize();
mCapitalizedMode = lastComposedWord.mCapitalizedMode; mCapitalizedMode = lastComposedWord.mCapitalizedMode;
mAutoCorrection = null; // This will be filled by the next call to updateSuggestion. mAutoCorrection = null; // This will be filled by the next call to updateSuggestion.
mCursorPositionWithinWord = mCodePointSize; mCursorPositionWithinWord = mCodePointSize;

View File

@ -172,28 +172,29 @@ public final class StringUtils {
private static final int[] EMPTY_CODEPOINTS = {}; private static final int[] EMPTY_CODEPOINTS = {};
public static int[] toCodePointArray(final String string) { public static int[] toCodePointArray(final CharSequence charSequence) {
return toCodePointArray(string, 0, string.length()); return toCodePointArray(charSequence, 0, charSequence.length());
} }
/** /**
* Converts a range of a string to an array of code points. * Converts a range of a string to an array of code points.
* @param string the source string. * @param charSequence the source string.
* @param startIndex the start index inside the string in java chars, inclusive. * @param startIndex the start index inside the string in java chars, inclusive.
* @param endIndex the end index inside the string in java chars, exclusive. * @param endIndex the end index inside the string in java chars, exclusive.
* @return a new array of code points. At most endIndex - startIndex, but possibly less. * @return a new array of code points. At most endIndex - startIndex, but possibly less.
*/ */
public static int[] toCodePointArray(final String string, public static int[] toCodePointArray(final CharSequence charSequence,
final int startIndex, final int endIndex) { final int startIndex, final int endIndex) {
final int length = string.length(); final int length = charSequence.length();
if (length <= 0) { if (length <= 0) {
return EMPTY_CODEPOINTS; return EMPTY_CODEPOINTS;
} }
final int[] codePoints = new int[string.codePointCount(startIndex, endIndex)]; final int[] codePoints =
new int[Character.codePointCount(charSequence, startIndex, endIndex)];
int destIndex = 0; int destIndex = 0;
for (int index = startIndex; index < endIndex; for (int index = startIndex; index < endIndex;
index = string.offsetByCodePoints(index, 1)) { index = Character.offsetByCodePoints(charSequence, index, 1)) {
codePoints[destIndex] = string.codePointAt(index); codePoints[destIndex] = Character.codePointAt(charSequence, index);
destIndex++; destIndex++;
} }
return codePoints; return codePoints;