am cc5a71ca: Merge "[CB17] Remove a member."
* commit 'cc5a71caf1a96899f654a179eb229edacaee18f7': [CB17] Remove a member.main
commit
f706a77ebc
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue