am 5ef094f8: Merge "Remove the CharacterStore class (A7)"
* commit '5ef094f81640b342b537b42be97535ca02bd1b8c': Remove the CharacterStore class (A7)main
commit
2c09f01a3f
|
@ -33,45 +33,17 @@ public class WordComposer {
|
||||||
public static final int NOT_A_CODE = KeyDetector.NOT_A_CODE;
|
public static final int NOT_A_CODE = KeyDetector.NOT_A_CODE;
|
||||||
public static final int NOT_A_COORDINATE = -1;
|
public static final int NOT_A_COORDINATE = -1;
|
||||||
|
|
||||||
// Storage for all the info about the current input.
|
|
||||||
private static class CharacterStore {
|
|
||||||
/**
|
|
||||||
* The list of unicode values for each keystroke (including surrounding keys)
|
|
||||||
*/
|
|
||||||
ArrayList<int[]> mCodes;
|
|
||||||
int[] mXCoordinates;
|
|
||||||
int[] mYCoordinates;
|
|
||||||
StringBuilder mTypedWord;
|
|
||||||
CharSequence mAutoCorrection;
|
|
||||||
CharacterStore() {
|
|
||||||
final int N = BinaryDictionary.MAX_WORD_LENGTH;
|
final int N = BinaryDictionary.MAX_WORD_LENGTH;
|
||||||
mCodes = new ArrayList<int[]>(N);
|
|
||||||
mTypedWord = new StringBuilder(N);
|
|
||||||
mXCoordinates = new int[N];
|
|
||||||
mYCoordinates = new int[N];
|
|
||||||
mAutoCorrection = null;
|
|
||||||
}
|
|
||||||
CharacterStore(final CharacterStore that) {
|
|
||||||
mCodes = new ArrayList<int[]>(that.mCodes);
|
|
||||||
mTypedWord = new StringBuilder(that.mTypedWord);
|
|
||||||
mXCoordinates = Arrays.copyOf(that.mXCoordinates, that.mXCoordinates.length);
|
|
||||||
mYCoordinates = Arrays.copyOf(that.mYCoordinates, that.mYCoordinates.length);
|
|
||||||
}
|
|
||||||
void reset() {
|
|
||||||
// For better performance than creating a new character store.
|
|
||||||
mCodes.clear();
|
|
||||||
mTypedWord.setLength(0);
|
|
||||||
mAutoCorrection = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// The currently typing word. May not be null.
|
private ArrayList<int[]> mCodes;
|
||||||
private CharacterStore mCurrentWord;
|
private int[] mXCoordinates;
|
||||||
|
private int[] mYCoordinates;
|
||||||
|
private StringBuilder mTypedWord;
|
||||||
|
private CharSequence mAutoCorrection;
|
||||||
|
|
||||||
|
// Cache these values for performance
|
||||||
private int mCapsCount;
|
private int mCapsCount;
|
||||||
|
|
||||||
private boolean mAutoCapitalized;
|
private boolean mAutoCapitalized;
|
||||||
// Cache this value for performance
|
|
||||||
private int mTrailingSingleQuotesCount;
|
private int mTrailingSingleQuotesCount;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -80,7 +52,11 @@ public class WordComposer {
|
||||||
private boolean mIsFirstCharCapitalized;
|
private boolean mIsFirstCharCapitalized;
|
||||||
|
|
||||||
public WordComposer() {
|
public WordComposer() {
|
||||||
mCurrentWord = new CharacterStore();
|
mCodes = new ArrayList<int[]>(N);
|
||||||
|
mTypedWord = new StringBuilder(N);
|
||||||
|
mXCoordinates = new int[N];
|
||||||
|
mYCoordinates = new int[N];
|
||||||
|
mAutoCorrection = null;
|
||||||
mTrailingSingleQuotesCount = 0;
|
mTrailingSingleQuotesCount = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -89,7 +65,10 @@ public class WordComposer {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void init(WordComposer source) {
|
public void init(WordComposer source) {
|
||||||
mCurrentWord = new CharacterStore(source.mCurrentWord);
|
mCodes = new ArrayList<int[]>(source.mCodes);
|
||||||
|
mTypedWord = new StringBuilder(source.mTypedWord);
|
||||||
|
mXCoordinates = Arrays.copyOf(source.mXCoordinates, source.mXCoordinates.length);
|
||||||
|
mYCoordinates = Arrays.copyOf(source.mYCoordinates, source.mYCoordinates.length);
|
||||||
mCapsCount = source.mCapsCount;
|
mCapsCount = source.mCapsCount;
|
||||||
mIsFirstCharCapitalized = source.mIsFirstCharCapitalized;
|
mIsFirstCharCapitalized = source.mIsFirstCharCapitalized;
|
||||||
mAutoCapitalized = source.mAutoCapitalized;
|
mAutoCapitalized = source.mAutoCapitalized;
|
||||||
|
@ -100,7 +79,9 @@ public class WordComposer {
|
||||||
* Clear out the keys registered so far.
|
* Clear out the keys registered so far.
|
||||||
*/
|
*/
|
||||||
public void reset() {
|
public void reset() {
|
||||||
mCurrentWord.reset();
|
mCodes.clear();
|
||||||
|
mTypedWord.setLength(0);
|
||||||
|
mAutoCorrection = null;
|
||||||
mCapsCount = 0;
|
mCapsCount = 0;
|
||||||
mIsFirstCharCapitalized = false;
|
mIsFirstCharCapitalized = false;
|
||||||
mTrailingSingleQuotesCount = 0;
|
mTrailingSingleQuotesCount = 0;
|
||||||
|
@ -111,7 +92,7 @@ public class WordComposer {
|
||||||
* @return the number of keystrokes
|
* @return the number of keystrokes
|
||||||
*/
|
*/
|
||||||
public final int size() {
|
public final int size() {
|
||||||
return mCurrentWord.mTypedWord.length();
|
return mTypedWord.length();
|
||||||
}
|
}
|
||||||
|
|
||||||
public final boolean isComposingWord() {
|
public final boolean isComposingWord() {
|
||||||
|
@ -124,15 +105,15 @@ public class WordComposer {
|
||||||
* @return the unicode for the pressed and surrounding keys
|
* @return the unicode for the pressed and surrounding keys
|
||||||
*/
|
*/
|
||||||
public int[] getCodesAt(int index) {
|
public int[] getCodesAt(int index) {
|
||||||
return mCurrentWord.mCodes.get(index);
|
return mCodes.get(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int[] getXCoordinates() {
|
public int[] getXCoordinates() {
|
||||||
return mCurrentWord.mXCoordinates;
|
return mXCoordinates;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int[] getYCoordinates() {
|
public int[] getYCoordinates() {
|
||||||
return mCurrentWord.mYCoordinates;
|
return mYCoordinates;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean isFirstCharCapitalized(int index, int codePoint, boolean previous) {
|
private static boolean isFirstCharCapitalized(int index, int codePoint, boolean previous) {
|
||||||
|
@ -147,12 +128,12 @@ public class WordComposer {
|
||||||
*/
|
*/
|
||||||
public void add(int primaryCode, int[] codes, int x, int y) {
|
public void add(int primaryCode, int[] codes, int x, int y) {
|
||||||
final int newIndex = size();
|
final int newIndex = size();
|
||||||
mCurrentWord.mTypedWord.append((char) primaryCode);
|
mTypedWord.append((char) primaryCode);
|
||||||
correctPrimaryJuxtapos(primaryCode, codes);
|
correctPrimaryJuxtapos(primaryCode, codes);
|
||||||
mCurrentWord.mCodes.add(codes);
|
mCodes.add(codes);
|
||||||
if (newIndex < BinaryDictionary.MAX_WORD_LENGTH) {
|
if (newIndex < BinaryDictionary.MAX_WORD_LENGTH) {
|
||||||
mCurrentWord.mXCoordinates[newIndex] = x;
|
mXCoordinates[newIndex] = x;
|
||||||
mCurrentWord.mYCoordinates[newIndex] = y;
|
mYCoordinates[newIndex] = y;
|
||||||
}
|
}
|
||||||
mIsFirstCharCapitalized = isFirstCharCapitalized(
|
mIsFirstCharCapitalized = isFirstCharCapitalized(
|
||||||
newIndex, primaryCode, mIsFirstCharCapitalized);
|
newIndex, primaryCode, mIsFirstCharCapitalized);
|
||||||
|
@ -162,7 +143,7 @@ public class WordComposer {
|
||||||
} else {
|
} else {
|
||||||
mTrailingSingleQuotesCount = 0;
|
mTrailingSingleQuotesCount = 0;
|
||||||
}
|
}
|
||||||
mCurrentWord.mAutoCorrection = null;
|
mAutoCorrection = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -231,9 +212,9 @@ public class WordComposer {
|
||||||
final int size = size();
|
final int size = size();
|
||||||
if (size > 0) {
|
if (size > 0) {
|
||||||
final int lastPos = size - 1;
|
final int lastPos = size - 1;
|
||||||
char lastChar = mCurrentWord.mTypedWord.charAt(lastPos);
|
char lastChar = mTypedWord.charAt(lastPos);
|
||||||
mCurrentWord.mCodes.remove(lastPos);
|
mCodes.remove(lastPos);
|
||||||
mCurrentWord.mTypedWord.deleteCharAt(lastPos);
|
mTypedWord.deleteCharAt(lastPos);
|
||||||
if (Character.isUpperCase(lastChar)) mCapsCount--;
|
if (Character.isUpperCase(lastChar)) mCapsCount--;
|
||||||
}
|
}
|
||||||
if (size() == 0) {
|
if (size() == 0) {
|
||||||
|
@ -242,12 +223,12 @@ public class WordComposer {
|
||||||
if (mTrailingSingleQuotesCount > 0) {
|
if (mTrailingSingleQuotesCount > 0) {
|
||||||
--mTrailingSingleQuotesCount;
|
--mTrailingSingleQuotesCount;
|
||||||
} else {
|
} else {
|
||||||
for (int i = mCurrentWord.mTypedWord.length() - 1; i >= 0; --i) {
|
for (int i = mTypedWord.length() - 1; i >= 0; --i) {
|
||||||
if (Keyboard.CODE_SINGLE_QUOTE != mCurrentWord.mTypedWord.codePointAt(i)) break;
|
if (Keyboard.CODE_SINGLE_QUOTE != mTypedWord.codePointAt(i)) break;
|
||||||
++mTrailingSingleQuotesCount;
|
++mTrailingSingleQuotesCount;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mCurrentWord.mAutoCorrection = null;
|
mAutoCorrection = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -255,7 +236,7 @@ public 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 mCurrentWord.mTypedWord.toString();
|
return mTypedWord.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -306,14 +287,14 @@ public class WordComposer {
|
||||||
* Sets the auto-correction for this word.
|
* Sets the auto-correction for this word.
|
||||||
*/
|
*/
|
||||||
public void setAutoCorrection(final CharSequence correction) {
|
public void setAutoCorrection(final CharSequence correction) {
|
||||||
mCurrentWord.mAutoCorrection = correction;
|
mAutoCorrection = correction;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return the auto-correction for this word, or null if none.
|
* @return the auto-correction for this word, or null if none.
|
||||||
*/
|
*/
|
||||||
public CharSequence getAutoCorrectionOrNull() {
|
public CharSequence getAutoCorrectionOrNull() {
|
||||||
return mCurrentWord.mAutoCorrection;
|
return mAutoCorrection;
|
||||||
}
|
}
|
||||||
|
|
||||||
// `type' should be one of the LastComposedWord.COMMIT_TYPE_* constants above.
|
// `type' should be one of the LastComposedWord.COMMIT_TYPE_* constants above.
|
||||||
|
@ -328,23 +309,22 @@ public class WordComposer {
|
||||||
// LastComposedWord#didAutoCorrectToAnotherWord with #equals(). It would be marginally
|
// LastComposedWord#didAutoCorrectToAnotherWord with #equals(). It would be marginally
|
||||||
// cleaner to do it here, but it would be slower (since we would #equals() for each commit,
|
// cleaner to do it here, but it would be slower (since we would #equals() for each commit,
|
||||||
// instead of only on cancel), and ultimately we want to figure it out even earlier anyway.
|
// instead of only on cancel), and ultimately we want to figure it out even earlier anyway.
|
||||||
final LastComposedWord lastComposedWord = new LastComposedWord(type, mCurrentWord.mCodes,
|
final LastComposedWord lastComposedWord = new LastComposedWord(type, mCodes,
|
||||||
mCurrentWord.mXCoordinates, mCurrentWord.mYCoordinates,
|
mXCoordinates, mYCoordinates, mTypedWord.toString(),
|
||||||
mCurrentWord.mTypedWord.toString(),
|
(type != LastComposedWord.COMMIT_TYPE_DECIDED_WORD) || (null == mAutoCorrection)
|
||||||
(type != LastComposedWord.COMMIT_TYPE_DECIDED_WORD)
|
? null : mAutoCorrection.toString());
|
||||||
|| (null == mCurrentWord.mAutoCorrection)
|
mCodes.clear();
|
||||||
? null : mCurrentWord.mAutoCorrection.toString());
|
mTypedWord.setLength(0);
|
||||||
// TODO: improve performance by swapping buffers instead of creating a new object.
|
mAutoCorrection = null;
|
||||||
mCurrentWord = new CharacterStore();
|
|
||||||
return lastComposedWord;
|
return lastComposedWord;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void resumeSuggestionOnLastComposedWord(final LastComposedWord lastComposedWord) {
|
public void resumeSuggestionOnLastComposedWord(final LastComposedWord lastComposedWord) {
|
||||||
mCurrentWord.mCodes = lastComposedWord.mCodes;
|
mCodes = lastComposedWord.mCodes;
|
||||||
mCurrentWord.mXCoordinates = lastComposedWord.mXCoordinates;
|
mXCoordinates = lastComposedWord.mXCoordinates;
|
||||||
mCurrentWord.mYCoordinates = lastComposedWord.mYCoordinates;
|
mYCoordinates = lastComposedWord.mYCoordinates;
|
||||||
mCurrentWord.mTypedWord.setLength(0);
|
mTypedWord.setLength(0);
|
||||||
mCurrentWord.mTypedWord.append(lastComposedWord.mTypedWord);
|
mTypedWord.append(lastComposedWord.mTypedWord);
|
||||||
mCurrentWord.mAutoCorrection = lastComposedWord.mAutoCorrection;
|
mAutoCorrection = lastComposedWord.mAutoCorrection;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue