aboutsummaryrefslogtreecommitdiffstats
path: root/java/src/com/android/inputmethod/latin
diff options
context:
space:
mode:
Diffstat (limited to 'java/src/com/android/inputmethod/latin')
-rw-r--r--java/src/com/android/inputmethod/latin/LatinIME.java11
-rw-r--r--java/src/com/android/inputmethod/latin/SubtypeSwitcher.java13
-rw-r--r--java/src/com/android/inputmethod/latin/WordComposer.java97
-rw-r--r--java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java8
-rw-r--r--java/src/com/android/inputmethod/latin/inputlogic/InputLogicHandler.java30
-rw-r--r--java/src/com/android/inputmethod/latin/utils/StringUtils.java17
6 files changed, 85 insertions, 91 deletions
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 53e6232b6..b4807b01a 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -156,7 +156,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
private static final int MSG_SHOW_GESTURE_PREVIEW_AND_SUGGESTION_STRIP = 3;
private static final int MSG_RESUME_SUGGESTIONS = 4;
private static final int MSG_REOPEN_DICTIONARIES = 5;
- private static final int MSG_ON_END_BATCH_INPUT = 6;
+ private static final int MSG_UPDATE_TAIL_BATCH_INPUT_COMPLETED = 6;
private static final int MSG_RESET_CACHES = 7;
// Update this when adding new messages
private static final int MSG_LAST = MSG_RESET_CACHES;
@@ -220,8 +220,9 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
// get any suggestions. Wait one frame.
postUpdateSuggestionStrip();
break;
- case MSG_ON_END_BATCH_INPUT:
- latinIme.mInputLogic.endBatchInputInternal(latinIme.mSettings.getCurrent(),
+ case MSG_UPDATE_TAIL_BATCH_INPUT_COMPLETED:
+ latinIme.mInputLogic.onUpdateTailBatchInputCompleted(
+ latinIme.mSettings.getCurrent(),
(SuggestedWords) msg.obj, latinIme.mKeyboardSwitcher);
break;
case MSG_RESET_CACHES:
@@ -304,8 +305,8 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
ARG1_NOT_GESTURE_INPUT, ARG2_UNUSED, suggestedWords).sendToTarget();
}
- public void onEndBatchInput(final SuggestedWords suggestedWords) {
- obtainMessage(MSG_ON_END_BATCH_INPUT, suggestedWords).sendToTarget();
+ public void showTailBatchInputResult(final SuggestedWords suggestedWords) {
+ obtainMessage(MSG_UPDATE_TAIL_BATCH_INPUT_COMPLETED, suggestedWords).sendToTarget();
}
// Working variables for the following methods.
diff --git a/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java b/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java
index d4301229c..021133945 100644
--- a/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java
+++ b/java/src/com/android/inputmethod/latin/SubtypeSwitcher.java
@@ -34,7 +34,7 @@ import android.view.inputmethod.InputMethodSubtype;
import com.android.inputmethod.annotations.UsedForTesting;
import com.android.inputmethod.compat.InputMethodSubtypeCompatUtils;
import com.android.inputmethod.keyboard.KeyboardSwitcher;
-import com.android.inputmethod.keyboard.internal.NeedsToDisplayLanguage;
+import com.android.inputmethod.keyboard.internal.LanguageOnSpacebarHelper;
import com.android.inputmethod.latin.utils.LocaleUtils;
import com.android.inputmethod.latin.utils.SubtypeLocaleUtils;
@@ -54,7 +54,8 @@ public final class SubtypeSwitcher {
private /* final */ Resources mResources;
private /* final */ ConnectivityManager mConnectivityManager;
- private final NeedsToDisplayLanguage mNeedsToDisplayLanguage = new NeedsToDisplayLanguage();
+ private final LanguageOnSpacebarHelper mLanguageOnSpacebarHelper =
+ new LanguageOnSpacebarHelper();
private InputMethodInfo mShortcutInputMethodInfo;
private InputMethodSubtype mShortcutSubtype;
private InputMethodSubtype mNoLanguageSubtype;
@@ -127,7 +128,7 @@ public final class SubtypeSwitcher {
public void updateParametersOnStartInputView() {
final List<InputMethodSubtype> enabledSubtypesOfThisIme =
mRichImm.getMyEnabledInputMethodSubtypeList(true);
- mNeedsToDisplayLanguage.updateEnabledSubtypeCount(enabledSubtypesOfThisIme.size());
+ mLanguageOnSpacebarHelper.updateEnabledSubtypes(enabledSubtypesOfThisIme);
updateShortcutIME();
}
@@ -176,7 +177,7 @@ public final class SubtypeSwitcher {
final boolean sameLanguage = systemLocale.getLanguage().equals(newLocale.getLanguage());
final boolean implicitlyEnabled =
mRichImm.checkIfSubtypeBelongsToThisImeAndImplicitlyEnabled(newSubtype);
- mNeedsToDisplayLanguage.updateIsSystemLanguageSameAsInputLanguage(
+ mLanguageOnSpacebarHelper.updateIsSystemLanguageSameAsInputLanguage(
sameLocale || (sameLanguage && implicitlyEnabled));
updateShortcutIME();
@@ -249,8 +250,8 @@ public final class SubtypeSwitcher {
// Subtype Switching functions //
//////////////////////////////////
- public boolean needsToDisplayLanguage(final InputMethodSubtype subtype) {
- return mNeedsToDisplayLanguage.needsToDisplayLanguage(subtype);
+ public int getLanguageOnSpacebarFormatType(final InputMethodSubtype subtype) {
+ return mLanguageOnSpacebarHelper.getLanguageOnSpacebarFormatType(subtype);
}
public boolean isSystemLocaleSameAsLocaleOfAllEnabledSubtypesOfEnabledImes() {
diff --git a/java/src/com/android/inputmethod/latin/WordComposer.java b/java/src/com/android/inputmethod/latin/WordComposer.java
index 8a321e257..f31fb134c 100644
--- a/java/src/com/android/inputmethod/latin/WordComposer.java
+++ b/java/src/com/android/inputmethod/latin/WordComposer.java
@@ -23,7 +23,6 @@ import com.android.inputmethod.latin.utils.CoordinateUtils;
import com.android.inputmethod.latin.utils.StringUtils;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Collections;
/**
@@ -51,11 +50,6 @@ public final class WordComposer {
// The list of events that served to compose this string.
private final ArrayList<Event> mEvents;
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
// 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
@@ -73,6 +67,7 @@ public final class WordComposer {
private String mRejectedBatchModeSuggestion;
// Cache these values for performance
+ private CharSequence mTypedWordCache;
private int mCapsCount;
private int mDigitsCount;
private int mCapitalizedMode;
@@ -93,7 +88,6 @@ public final class WordComposer {
mCombinerChain = new CombinerChain();
mPrimaryKeyCodes = new int[MAX_WORD_LENGTH];
mEvents = CollectionUtils.newArrayList();
- mTypedWord = new StringBuilder(MAX_WORD_LENGTH);
mAutoCorrection = null;
mTrailingSingleQuotesCount = 0;
mIsResumed = false;
@@ -101,7 +95,7 @@ public final class WordComposer {
mCursorPositionWithinWord = 0;
mRejectedBatchModeSuggestion = null;
mPreviousWordForSuggestion = null;
- refreshSize();
+ refreshTypedWordCache();
}
/**
@@ -109,7 +103,6 @@ public final class WordComposer {
*/
public void reset() {
mCombinerChain.reset();
- mTypedWord.setLength(0);
mEvents.clear();
mAutoCorrection = null;
mCapsCount = 0;
@@ -121,11 +114,12 @@ public final class WordComposer {
mCursorPositionWithinWord = 0;
mRejectedBatchModeSuggestion = null;
mPreviousWordForSuggestion = null;
- refreshSize();
+ refreshTypedWordCache();
}
- private final void refreshSize() {
- mCodePointSize = mTypedWord.codePointCount(0, mTypedWord.length());
+ private final void refreshTypedWordCache() {
+ mTypedWordCache = mCombinerChain.getComposingWordWithCombiningFeedback();
+ mCodePointSize = Character.codePointCount(mTypedWordCache, 0, mTypedWordCache.length());
}
/**
@@ -179,13 +173,7 @@ public final class WordComposer {
final int keyX = event.mX;
final int keyY = event.mY;
final int newIndex = size();
- 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);
- refreshSize();
+ processEvent(event);
mCursorPositionWithinWord = mCodePointSize;
if (newIndex < MAX_WORD_LENGTH) {
mPrimaryKeyCodes[newIndex] = primaryCode >= Constants.CODE_SPACE
@@ -210,6 +198,37 @@ public final class WordComposer {
mAutoCorrection = null;
}
+ private void processEvent(final Event event) {
+ mCombinerChain.processEvent(mEvents, event);
+ mEvents.add(event);
+ refreshTypedWordCache();
+ }
+
+ /**
+ * Delete the last composing unit as a result of hitting backspace.
+ */
+ public void deleteLast(final Event event) {
+ processEvent(event);
+ // We may have deleted the last one.
+ if (0 == size()) {
+ mIsFirstCharCapitalized = false;
+ }
+ if (mTrailingSingleQuotesCount > 0) {
+ --mTrailingSingleQuotesCount;
+ } else {
+ int i = mTypedWordCache.length();
+ while (i > 0) {
+ i = Character.offsetByCodePoints(mTypedWordCache, i, -1);
+ if (Constants.CODE_SINGLE_QUOTE != Character.codePointAt(mTypedWordCache, i)) {
+ break;
+ }
+ ++mTrailingSingleQuotesCount;
+ }
+ }
+ mCursorPositionWithinWord = mCodePointSize;
+ mAutoCorrection = null;
+ }
+
public void setCursorPositionWithinWord(final int posWithinWord) {
mCursorPositionWithinWord = posWithinWord;
// TODO: compute where that puts us inside the events
@@ -242,7 +261,7 @@ public final class WordComposer {
// 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
// the array on the fly when this happens.
- codePoints = StringUtils.toCodePointArray(mTypedWord.toString());
+ codePoints = StringUtils.toCodePointArray(mTypedWordCache);
} else {
codePoints = mPrimaryKeyCodes;
}
@@ -307,38 +326,11 @@ public final class WordComposer {
}
/**
- * Delete the last composing unit as a result of hitting backspace.
- */
- public void deleteLast(final Event event) {
- mCombinerChain.processEvent(mEvents, event);
- mTypedWord.replace(0, mTypedWord.length(),
- mCombinerChain.getComposingWordWithCombiningFeedback().toString());
- mEvents.add(event);
- refreshSize();
- // We may have deleted the last one.
- if (0 == size()) {
- mIsFirstCharCapitalized = false;
- }
- if (mTrailingSingleQuotesCount > 0) {
- --mTrailingSingleQuotesCount;
- } else {
- int i = mTypedWord.length();
- while (i > 0) {
- i = mTypedWord.offsetByCodePoints(i, -1);
- if (Constants.CODE_SINGLE_QUOTE != mTypedWord.codePointAt(i)) break;
- ++mTrailingSingleQuotesCount;
- }
- }
- mCursorPositionWithinWord = mCodePointSize;
- mAutoCorrection = null;
- }
-
- /**
* Returns the word as it was typed, without any correction applied.
* @return the word that was typed so far. Never returns null.
*/
public String getTypedWord() {
- return mTypedWord.toString();
+ return mTypedWordCache.toString();
}
public String getPreviousWordForSuggestion() {
@@ -447,7 +439,7 @@ public final class WordComposer {
final int[] primaryKeyCodes = mPrimaryKeyCodes;
mPrimaryKeyCodes = new int[MAX_WORD_LENGTH];
final LastComposedWord lastComposedWord = new LastComposedWord(primaryKeyCodes, mEvents,
- mInputPointers, mTypedWord.toString(), committedWord, separatorString,
+ mInputPointers, mTypedWordCache.toString(), committedWord, separatorString,
prevWord, mCapitalizedMode);
mInputPointers.reset();
if (type != LastComposedWord.COMMIT_TYPE_DECIDED_WORD
@@ -458,14 +450,13 @@ public final class WordComposer {
mDigitsCount = 0;
mIsBatchMode = false;
mPreviousWordForSuggestion = committedWord.toString();
- mTypedWord.setLength(0);
mCombinerChain.reset();
mEvents.clear();
mCodePointSize = 0;
mTrailingSingleQuotesCount = 0;
mIsFirstCharCapitalized = false;
mCapitalizedMode = CAPS_MODE_OFF;
- refreshSize();
+ refreshTypedWordCache();
mAutoCorrection = null;
mCursorPositionWithinWord = 0;
mIsResumed = false;
@@ -486,10 +477,8 @@ public final class WordComposer {
mEvents.clear();
Collections.copy(mEvents, lastComposedWord.mEvents);
mInputPointers.set(lastComposedWord.mInputPointers);
- mTypedWord.setLength(0);
mCombinerChain.reset();
- mTypedWord.append(lastComposedWord.mTypedWord);
- refreshSize();
+ refreshTypedWordCache();
mCapitalizedMode = lastComposedWord.mCapitalizedMode;
mAutoCorrection = null; // This will be filled by the next call to updateSuggestion.
mCursorPositionWithinWord = mCodePointSize;
diff --git a/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java b/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java
index ec6bd289a..2fd8ace93 100644
--- a/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java
+++ b/java/src/com/android/inputmethod/latin/inputlogic/InputLogic.java
@@ -219,13 +219,11 @@ public final class InputLogic {
Event.NOT_A_KEY_CODE /* keyCode*/,
Constants.SUGGESTION_STRIP_COORDINATE /* x */,
Constants.SUGGESTION_STRIP_COORDINATE /* y */);
- final InputTransaction completeTransaction = onCodeInput(settingsValues, event,
- keyboardShiftState, handler);
if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) {
ResearchLogger.latinIME_punctuationSuggestion(index, suggestion,
false /* isBatchMode */, suggestedWords.mIsPrediction);
}
- return completeTransaction;
+ return onCodeInput(settingsValues, event, keyboardShiftState, handler);
}
final Event event = Event.createSuggestionPickedEvent(suggestionInfo);
@@ -601,7 +599,7 @@ public final class InputLogic {
}
public void onEndBatchInput(final InputPointers batchPointers) {
- mInputLogicHandler.onEndBatchInput(batchPointers, mAutoCommitSequenceNumber);
+ mInputLogicHandler.updateTailBatchInput(batchPointers, mAutoCommitSequenceNumber);
++mAutoCommitSequenceNumber;
}
@@ -1794,7 +1792,7 @@ public final class InputLogic {
* @param settingsValues the current values of the settings.
* @param suggestedWords suggestedWords to use.
*/
- public void endBatchInputInternal(final SettingsValues settingsValues,
+ public void onUpdateTailBatchInputCompleted(final SettingsValues settingsValues,
final SuggestedWords suggestedWords,
// TODO: remove this argument
final KeyboardSwitcher keyboardSwitcher) {
diff --git a/java/src/com/android/inputmethod/latin/inputlogic/InputLogicHandler.java b/java/src/com/android/inputmethod/latin/inputlogic/InputLogicHandler.java
index 42f0d7c00..e3b8ab465 100644
--- a/java/src/com/android/inputmethod/latin/inputlogic/InputLogicHandler.java
+++ b/java/src/com/android/inputmethod/latin/inputlogic/InputLogicHandler.java
@@ -54,7 +54,8 @@ class InputLogicHandler implements Handler.Callback {
@Override
public void onCancelBatchInput() {}
@Override
- public void onEndBatchInput(final InputPointers batchPointers, final int sequenceNumber) {}
+ public void updateTailBatchInput(final InputPointers batchPointers,
+ final int sequenceNumber) {}
@Override
public void getSuggestedWords(final int sessionId, final int sequenceNumber,
final OnGetSuggestedWordsCallback callback) {}
@@ -106,7 +107,7 @@ class InputLogicHandler implements Handler.Callback {
* Fetch suggestions corresponding to an update of a batch input.
* @param batchPointers the updated pointers, including the part that was passed last time.
* @param sequenceNumber the sequence number associated with this batch input.
- * @param forEnd true if this is the end of a batch input, false if it's an update.
+ * @param isTailBatchInput true if this is the end of a batch input, false if it's an update.
*/
// This method can be called from any thread and will see to it that the correct threads
// are used for parts that require it. This method will send a message to the Non-UI handler
@@ -115,7 +116,7 @@ class InputLogicHandler implements Handler.Callback {
// send a message to the UI handler in LatinIME so that showing suggestions can be done on
// the UI thread.
private void updateBatchInput(final InputPointers batchPointers,
- final int sequenceNumber, final boolean forEnd) {
+ final int sequenceNumber, final boolean isTailBatchInput) {
synchronized (mLock) {
if (!mInBatchInput) {
// Batch input has ended or canceled while the message was being delivered.
@@ -136,12 +137,12 @@ class InputLogicHandler implements Handler.Callback {
suggestedWords = mInputLogic.mSuggestedWords;
}
mLatinIME.mHandler.showGesturePreviewAndSuggestionStrip(suggestedWords,
- forEnd /* dismissGestureFloatingPreviewText */);
- if (forEnd) {
+ isTailBatchInput /* dismissGestureFloatingPreviewText */);
+ if (isTailBatchInput) {
mInBatchInput = false;
// The following call schedules onEndBatchInputInternal
// to be called on the UI thread.
- mLatinIME.mHandler.onEndBatchInput(suggestedWords);
+ mLatinIME.mHandler.showTailBatchInputResult(suggestedWords);
}
}
});
@@ -159,13 +160,13 @@ class InputLogicHandler implements Handler.Callback {
// Called on the UI thread by InputLogic.
public void onUpdateBatchInput(final InputPointers batchPointers,
final int sequenceNumber) {
- updateBatchInput(batchPointers, sequenceNumber, false /* forEnd */);
+ updateBatchInput(batchPointers, sequenceNumber, false /* isTailBatchInput */);
}
/**
* Cancel a batch input.
*
- * Note that as opposed to onEndBatchInput, we do the UI side of this immediately on the
+ * Note that as opposed to updateTailBatchInput, we do the UI side of this immediately on the
* same thread, rather than get this to call a method in LatinIME. This is because
* canceling a batch input does not necessitate the long operation of pulling suggestions.
*/
@@ -177,17 +178,20 @@ class InputLogicHandler implements Handler.Callback {
}
/**
- * Finish a batch input.
+ * Trigger an update for a tail batch input.
*
- * This fetches suggestions, updates the suggestion strip and commits the first suggestion.
- * It also dismisses the floating text preview.
+ * A tail batch input is the last update for a gesture, the one that is triggered after the
+ * user lifts their finger. This method schedules fetching suggestions on the non-UI thread,
+ * then when the suggestions are computed it comes back on the UI thread to update the
+ * suggestion strip, commit the first suggestion, and dismiss the floating text preview.
*
* @param batchPointers the updated batch pointers.
* @param sequenceNumber the sequence number associated with this batch input.
*/
// Called on the UI thread by InputLogic.
- public void onEndBatchInput(final InputPointers batchPointers, final int sequenceNumber) {
- updateBatchInput(batchPointers, sequenceNumber, true /* forEnd */);
+ public void updateTailBatchInput(final InputPointers batchPointers,
+ final int sequenceNumber) {
+ updateBatchInput(batchPointers, sequenceNumber, true /* isTailBatchInput */);
}
public void getSuggestedWords(final int sessionId, final int sequenceNumber,
diff --git a/java/src/com/android/inputmethod/latin/utils/StringUtils.java b/java/src/com/android/inputmethod/latin/utils/StringUtils.java
index b9d526b5f..accbc8b7b 100644
--- a/java/src/com/android/inputmethod/latin/utils/StringUtils.java
+++ b/java/src/com/android/inputmethod/latin/utils/StringUtils.java
@@ -172,28 +172,29 @@ public final class StringUtils {
private static final int[] EMPTY_CODEPOINTS = {};
- public static int[] toCodePointArray(final String string) {
- return toCodePointArray(string, 0, string.length());
+ public static int[] toCodePointArray(final CharSequence charSequence) {
+ return toCodePointArray(charSequence, 0, charSequence.length());
}
/**
* 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 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.
*/
- public static int[] toCodePointArray(final String string,
+ public static int[] toCodePointArray(final CharSequence charSequence,
final int startIndex, final int endIndex) {
- final int length = string.length();
+ final int length = charSequence.length();
if (length <= 0) {
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;
for (int index = startIndex; index < endIndex;
- index = string.offsetByCodePoints(index, 1)) {
- codePoints[destIndex] = string.codePointAt(index);
+ index = Character.offsetByCodePoints(charSequence, index, 1)) {
+ codePoints[destIndex] = Character.codePointAt(charSequence, index);
destIndex++;
}
return codePoints;