aboutsummaryrefslogtreecommitdiffstats
path: root/java
diff options
context:
space:
mode:
Diffstat (limited to 'java')
-rw-r--r--java/res/values/attrs.xml42
-rw-r--r--java/res/values/dimens.xml2
-rw-r--r--java/res/values/styles.xml18
-rw-r--r--java/src/com/android/inputmethod/keyboard/KeyboardView.java60
-rw-r--r--java/src/com/android/inputmethod/keyboard/MainKeyboardView.java4
-rw-r--r--java/src/com/android/inputmethod/keyboard/PointerTracker.java253
-rw-r--r--java/src/com/android/inputmethod/keyboard/internal/GestureStroke.java6
-rw-r--r--java/src/com/android/inputmethod/latin/LatinIME.java6
-rw-r--r--java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java38
9 files changed, 214 insertions, 215 deletions
diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml
index cced45d9f..76e76cc82 100644
--- a/java/res/values/attrs.xml
+++ b/java/res/values/attrs.xml
@@ -41,26 +41,24 @@
checkable+checked+pressed. -->
<attr name="keyBackground" format="reference" />
- <!-- Size of the text for one letter keys. If not defined, keyLetterRatio takes effect. -->
- <attr name="keyLetterSize" format="dimension" />
- <!-- Size of the text for keys with multiple letters. If not defined, keyLabelRatio takes
- effect. -->
- <attr name="keyLabelSize" format="dimension" />
- <!-- Size of the text for one letter keys, in the proportion of key height. -->
- <attr name="keyLetterRatio" format="float" />
+ <!-- Size of the text for one letter keys. If specified as fraction, the text size is
+ measured in the proportion of key height. -->
+ <attr name="keyLetterSize" format="dimension|fraction" />
+ <!-- Size of the text for keys with multiple letters. If specified as fraction, the text
+ size is measured in the proportion of key height. -->
+ <attr name="keyLabelSize" format="dimension|fraction" />
<!-- Large size of the text for one letter keys, in the proportion of key height. -->
- <attr name="keyLargeLetterRatio" format="float" />
- <!-- Size of the text for keys with multiple letters, in the proportion of key height. -->
- <attr name="keyLabelRatio" format="float" />
+ <attr name="keyLargeLetterRatio" format="fraction" />
<!-- Large size of the text for keys with multiple letters, in the proportion of key height. -->
- <attr name="keyLargeLabelRatio" format="float" />
+ <attr name="keyLargeLabelRatio" format="fraction" />
<!-- Size of the text for hint letter (= one character hint label), in the proportion of
key height. -->
- <attr name="keyHintLetterRatio" format="float" />
+ <attr name="keyHintLetterRatio" format="fraction" />
<!-- Size of the text for hint label, in the proportion of key height. -->
- <attr name="keyHintLabelRatio" format="float" />
+ <attr name="keyHintLabelRatio" format="fraction" />
<!-- Size of the text for shifted letter hint, in the proportion of key height. -->
- <attr name="keyShiftedLetterHintRatio" format="float" />
+ <attr name="keyShiftedLetterHintRatio" format="dimension|fraction" />
+
<!-- Horizontal padding of left/right aligned key label to the edge of the key. -->
<attr name="keyLabelHorizontalPadding" format="dimension" />
<!-- Right padding of hint letter to the edge of the key.-->
@@ -96,8 +94,8 @@
<attr name="keyPreviewOffset" format="dimension" />
<!-- Height of the key press feedback popup. -->
<attr name="keyPreviewHeight" format="dimension" />
- <!-- Size of the text for key press feedback popup, int the proportion of key height -->
- <attr name="keyPreviewTextRatio" format="float" />
+ <!-- Size of the text for key press feedback popup, in the proportion of key height. -->
+ <attr name="keyPreviewTextRatio" format="fraction" />
<!-- Delay after key releasing and key press feedback dismissing in millisecond -->
<attr name="keyPreviewLingerTimeout" format="integer" />
@@ -187,13 +185,13 @@
<attr name="colorTypedWord" format="color" />
<attr name="colorAutoCorrect" format="color" />
<attr name="colorSuggested" format="color" />
- <attr name="alphaValidTypedWord" format="integer" />
- <attr name="alphaTypedWord" format="integer" />
- <attr name="alphaAutoCorrect" format="integer" />
- <attr name="alphaSuggested" format="integer" />
- <attr name="alphaObsoleted" format="integer" />
+ <attr name="alphaValidTypedWord" format="fraction" />
+ <attr name="alphaTypedWord" format="fraction" />
+ <attr name="alphaAutoCorrect" format="fraction" />
+ <attr name="alphaSuggested" format="fraction" />
+ <attr name="alphaObsoleted" format="fraction" />
<attr name="suggestionsCountInStrip" format="integer" />
- <attr name="centerSuggestionPercentile" format="integer" />
+ <attr name="centerSuggestionPercentile" format="fraction" />
<attr name="maxMoreSuggestionsRow" format="integer" />
<attr name="minMoreSuggestionsWidth" format="float" />
</declare-styleable>
diff --git a/java/res/values/dimens.xml b/java/res/values/dimens.xml
index 020d2a99a..4fd942b14 100644
--- a/java/res/values/dimens.xml
+++ b/java/res/values/dimens.xml
@@ -92,7 +92,7 @@
<dimen name="suggestion_text_size">18dp</dimen>
<dimen name="more_suggestions_hint_text_size">27dp</dimen>
<integer name="suggestions_count_in_strip">3</integer>
- <integer name="center_suggestion_percentile">36</integer>
+ <fraction name="center_suggestion_percentile">36%</fraction>
<!-- Gesture preview parameters -->
<dimen name="gesture_preview_trail_width">2.5dp</dimen>
diff --git a/java/res/values/styles.xml b/java/res/values/styles.xml
index e5e7fed80..0220c836e 100644
--- a/java/res/values/styles.xml
+++ b/java/res/values/styles.xml
@@ -35,9 +35,9 @@
<style name="KeyboardView">
<item name="android:background">@drawable/keyboard_background</item>
<item name="keyBackground">@drawable/btn_keyboard_key</item>
- <item name="keyLetterRatio">@fraction/key_letter_ratio</item>
+ <item name="keyLetterSize">@fraction/key_letter_ratio</item>
<item name="keyLargeLetterRatio">@fraction/key_large_letter_ratio</item>
- <item name="keyLabelRatio">@fraction/key_label_ratio</item>
+ <item name="keyLabelSize">@fraction/key_label_ratio</item>
<item name="keyLargeLabelRatio">@fraction/key_large_label_ratio</item>
<item name="keyHintLetterRatio">@fraction/key_hint_letter_ratio</item>
<item name="keyHintLabelRatio">@fraction/key_hint_label_ratio</item>
@@ -138,9 +138,9 @@
<item name="colorTypedWord">@android:color/white</item>
<item name="colorAutoCorrect">#FFFCAE00</item>
<item name="colorSuggested">#FFFCAE00</item>
- <item name="alphaObsoleted">50</item>
+ <item name="alphaObsoleted">50%</item>
<item name="suggestionsCountInStrip">@integer/suggestions_count_in_strip</item>
- <item name="centerSuggestionPercentile">@integer/center_suggestion_percentile</item>
+ <item name="centerSuggestionPercentile">@fraction/center_suggestion_percentile</item>
<item name="maxMoreSuggestionsRow">@integer/max_more_suggestions_row</item>
<item name="minMoreSuggestionsWidth">@fraction/min_more_suggestions_width</item>
</style>
@@ -373,12 +373,12 @@
<item name="colorTypedWord">@android:color/holo_blue_light</item>
<item name="colorAutoCorrect">@android:color/holo_blue_light</item>
<item name="colorSuggested">@android:color/holo_blue_light</item>
- <item name="alphaValidTypedWord">85</item>
- <item name="alphaTypedWord">85</item>
- <item name="alphaSuggested">70</item>
- <item name="alphaObsoleted">70</item>
+ <item name="alphaValidTypedWord">85%</item>
+ <item name="alphaTypedWord">85%</item>
+ <item name="alphaSuggested">70%</item>
+ <item name="alphaObsoleted">70%</item>
<item name="suggestionsCountInStrip">@integer/suggestions_count_in_strip</item>
- <item name="centerSuggestionPercentile">@integer/center_suggestion_percentile</item>
+ <item name="centerSuggestionPercentile">@fraction/center_suggestion_percentile</item>
<item name="maxMoreSuggestionsRow">@integer/max_more_suggestions_row</item>
<item name="minMoreSuggestionsWidth">@fraction/min_more_suggestions_width</item>
</style>
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardView.java b/java/src/com/android/inputmethod/keyboard/KeyboardView.java
index 0a70605d7..127ac7160 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardView.java
@@ -84,6 +84,8 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
// Miscellaneous constants
private static final int[] LONG_PRESSABLE_STATE_SET = { android.R.attr.state_long_pressable };
+ private static final float UNDEFINED_RATIO = -1.0f;
+ private static final int UNDEFINED_DIMENSION = -1;
// XML attributes
protected final float mVerticalCorrection;
@@ -202,7 +204,6 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
private final float mKeyHintLetterRatio;
private final float mKeyShiftedLetterHintRatio;
private final float mKeyHintLabelRatio;
- private static final float UNDEFINED_RATIO = -1.0f;
public final Rect mPadding = new Rect();
public int mKeyLetterSize;
@@ -214,26 +215,22 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
public int mKeyHintLabelSize;
public int mAnimAlpha;
- public KeyDrawParams(TypedArray a) {
+ public KeyDrawParams(final TypedArray a) {
mKeyBackground = a.getDrawable(R.styleable.KeyboardView_keyBackground);
- if (a.hasValue(R.styleable.KeyboardView_keyLetterSize)) {
- mKeyLetterRatio = UNDEFINED_RATIO;
- mKeyLetterSize = a.getDimensionPixelSize(R.styleable.KeyboardView_keyLetterSize, 0);
- } else {
- mKeyLetterRatio = getRatio(a, R.styleable.KeyboardView_keyLetterRatio);
+ if (!isValidFraction(mKeyLetterRatio = getFraction(a,
+ R.styleable.KeyboardView_keyLetterSize))) {
+ mKeyLetterSize = getDimensionPixelSize(a, R.styleable.KeyboardView_keyLetterSize);
}
- if (a.hasValue(R.styleable.KeyboardView_keyLabelSize)) {
- mKeyLabelRatio = UNDEFINED_RATIO;
- mKeyLabelSize = a.getDimensionPixelSize(R.styleable.KeyboardView_keyLabelSize, 0);
- } else {
- mKeyLabelRatio = getRatio(a, R.styleable.KeyboardView_keyLabelRatio);
+ if (!isValidFraction(mKeyLabelRatio = getFraction(a,
+ R.styleable.KeyboardView_keyLabelSize))) {
+ mKeyLabelSize = getDimensionPixelSize(a, R.styleable.KeyboardView_keyLabelSize);
}
- mKeyLargeLabelRatio = getRatio(a, R.styleable.KeyboardView_keyLargeLabelRatio);
- mKeyLargeLetterRatio = getRatio(a, R.styleable.KeyboardView_keyLargeLetterRatio);
- mKeyHintLetterRatio = getRatio(a, R.styleable.KeyboardView_keyHintLetterRatio);
- mKeyShiftedLetterHintRatio = getRatio(a,
+ mKeyLargeLabelRatio = getFraction(a, R.styleable.KeyboardView_keyLargeLabelRatio);
+ mKeyLargeLetterRatio = getFraction(a, R.styleable.KeyboardView_keyLargeLetterRatio);
+ mKeyHintLetterRatio = getFraction(a, R.styleable.KeyboardView_keyHintLetterRatio);
+ mKeyShiftedLetterHintRatio = getFraction(a,
R.styleable.KeyboardView_keyShiftedLetterHintRatio);
- mKeyHintLabelRatio = getRatio(a, R.styleable.KeyboardView_keyHintLabelRatio);
+ mKeyHintLabelRatio = getFraction(a, R.styleable.KeyboardView_keyHintLabelRatio);
mKeyLabelHorizontalPadding = a.getDimension(
R.styleable.KeyboardView_keyLabelHorizontalPadding, 0);
mKeyHintLetterPadding = a.getDimension(
@@ -260,10 +257,10 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
}
public void updateKeyHeight(int keyHeight) {
- if (mKeyLetterRatio >= 0.0f) {
+ if (isValidFraction(mKeyLetterRatio)) {
mKeyLetterSize = (int)(keyHeight * mKeyLetterRatio);
}
- if (mKeyLabelRatio >= 0.0f) {
+ if (isValidFraction(mKeyLabelRatio)) {
mKeyLabelSize = (int)(keyHeight * mKeyLabelRatio);
}
mKeyLargeLabelSize = (int)(keyHeight * mKeyLargeLabelRatio);
@@ -338,7 +335,7 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
R.styleable.KeyboardView_keyPreviewOffset, 0);
mPreviewHeight = a.getDimensionPixelSize(
R.styleable.KeyboardView_keyPreviewHeight, 80);
- mPreviewTextRatio = getRatio(a, R.styleable.KeyboardView_keyPreviewTextRatio);
+ mPreviewTextRatio = getFraction(a, R.styleable.KeyboardView_keyPreviewTextRatio);
mPreviewTextColor = a.getColor(R.styleable.KeyboardView_keyPreviewTextColor, 0);
mLingerTimeout = a.getInt(R.styleable.KeyboardView_keyPreviewLingerTimeout, 0);
@@ -387,9 +384,24 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
mPaint.setAntiAlias(true);
}
- // Read fraction value in TypedArray as float.
- /* package */ static float getRatio(TypedArray a, int index) {
- return a.getFraction(index, 1000, 1000, 1) / 1000.0f;
+ static boolean isValidFraction(final float fraction) {
+ return fraction >= 0.0f;
+ }
+
+ static float getFraction(final TypedArray a, final int index) {
+ final TypedValue value = a.peekValue(index);
+ if (value == null || value.type != TypedValue.TYPE_FRACTION) {
+ return UNDEFINED_RATIO;
+ }
+ return a.getFraction(index, 1, 1, UNDEFINED_RATIO);
+ }
+
+ public static int getDimensionPixelSize(final TypedArray a, final int index) {
+ final TypedValue value = a.peekValue(index);
+ if (value == null || value.type != TypedValue.TYPE_DIMENSION) {
+ return UNDEFINED_DIMENSION;
+ }
+ return a.getDimensionPixelSize(index, UNDEFINED_DIMENSION);
}
/**
@@ -980,7 +992,7 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
}
@Override
- public void showGestureTrail(PointerTracker tracker) {
+ public void showGesturePreviewTrail(PointerTracker tracker) {
locatePreviewPlacerView();
mPreviewPlacerView.invalidatePointer(tracker);
}
diff --git a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
index 0cc0b6320..df84271e8 100644
--- a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
@@ -344,8 +344,8 @@ public class MainKeyboardView extends KeyboardView implements PointerTracker.Key
R.styleable.MainKeyboardView_autoCorrectionSpacebarLedEnabled, false);
mAutoCorrectionSpacebarLedIcon = a.getDrawable(
R.styleable.MainKeyboardView_autoCorrectionSpacebarLedIcon);
- mSpacebarTextRatio = a.getFraction(R.styleable.MainKeyboardView_spacebarTextRatio,
- 1000, 1000, 1) / 1000.0f;
+ mSpacebarTextRatio = a.getFraction(
+ R.styleable.MainKeyboardView_spacebarTextRatio, 1, 1, 1.0f);
mSpacebarTextColor = a.getColor(R.styleable.MainKeyboardView_spacebarTextColor, 0);
mSpacebarTextShadowColor = a.getColor(
R.styleable.MainKeyboardView_spacebarTextShadowColor, 0);
diff --git a/java/src/com/android/inputmethod/keyboard/PointerTracker.java b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
index b5b3ef65f..be101cfb0 100644
--- a/java/src/com/android/inputmethod/keyboard/PointerTracker.java
+++ b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
@@ -80,7 +80,7 @@ public class PointerTracker implements PointerTrackerQueue.Element {
public void invalidateKey(Key key);
public void showKeyPreview(PointerTracker tracker);
public void dismissKeyPreview(PointerTracker tracker);
- public void showGestureTrail(PointerTracker tracker);
+ public void showGesturePreviewTrail(PointerTracker tracker);
}
public interface TimerProxy {
@@ -152,8 +152,6 @@ public class PointerTracker implements PointerTrackerQueue.Element {
private static boolean sNeedsPhantomSuddenMoveEventHack;
private static final ArrayList<PointerTracker> sTrackers = CollectionUtils.newArrayList();
- private static final InputPointers sAggregratedPointers = new InputPointers(
- GestureStroke.DEFAULT_CAPACITY);
private static PointerTrackerQueue sPointerTrackerQueue;
public final int mPointerId;
@@ -166,13 +164,13 @@ public class PointerTracker implements PointerTrackerQueue.Element {
private Keyboard mKeyboard;
private int mKeyQuarterWidthSquared;
- private boolean mIsAlphabetKeyboard;
- private boolean mIsPossibleGesture = false;
- private boolean mInGesture = false;
-
- // TODO: Remove these variables
- private int mLastRecognitionPointSize = 0;
- private long mLastRecognitionTime = 0;
+ private boolean mIsDetectingGesture = false; // per PointerTracker.
+ private static boolean sInGesture = false;
+ private static long sGestureFirstDownTime;
+ private static final InputPointers sAggregratedPointers = new InputPointers(
+ GestureStroke.DEFAULT_CAPACITY);
+ private static int sLastRecognitionPointSize = 0;
+ private static long sLastRecognitionTime = 0;
// The position and time at which first down event occurred.
private long mDownTime;
@@ -290,40 +288,6 @@ public class PointerTracker implements PointerTrackerQueue.Element {
}
}
- // TODO: To handle multi-touch gestures we may want to move this method to
- // {@link PointerTrackerQueue}.
- private static InputPointers getIncrementalBatchPoints() {
- final int trackersSize = sTrackers.size();
- for (int i = 0; i < trackersSize; ++i) {
- final PointerTracker tracker = sTrackers.get(i);
- tracker.mGestureStrokeWithPreviewTrail.appendIncrementalBatchPoints(
- sAggregratedPointers);
- }
- return sAggregratedPointers;
- }
-
- // TODO: To handle multi-touch gestures we may want to move this method to
- // {@link PointerTrackerQueue}.
- private static InputPointers getAllBatchPoints() {
- final int trackersSize = sTrackers.size();
- for (int i = 0; i < trackersSize; ++i) {
- final PointerTracker tracker = sTrackers.get(i);
- tracker.mGestureStrokeWithPreviewTrail.appendAllBatchPoints(sAggregratedPointers);
- }
- return sAggregratedPointers;
- }
-
- // TODO: To handle multi-touch gestures we may want to move this method to
- // {@link PointerTrackerQueue}.
- public static void clearBatchInputPointsOfAllPointerTrackers() {
- final int trackersSize = sTrackers.size();
- for (int i = 0; i < trackersSize; ++i) {
- final PointerTracker tracker = sTrackers.get(i);
- tracker.mGestureStrokeWithPreviewTrail.reset();
- }
- sAggregratedPointers.reset();
- }
-
private PointerTracker(final int id, final KeyEventHandler handler) {
if (handler == null) {
throw new NullPointerException();
@@ -338,7 +302,7 @@ public class PointerTracker implements PointerTrackerQueue.Element {
// Returns true if keyboard has been changed by this callback.
private boolean callListenerOnPressAndCheckKeyboardLayoutChange(final Key key) {
- if (mInGesture) {
+ if (sInGesture) {
return false;
}
final boolean ignoreModifierKey = mIgnoreModifierKey && key.isModifier();
@@ -394,7 +358,7 @@ public class PointerTracker implements PointerTrackerQueue.Element {
// primaryCode is different from {@link Key#mCode}.
private void callListenerOnRelease(final Key key, final int primaryCode,
final boolean withSliding) {
- if (mInGesture) {
+ if (sInGesture) {
return;
}
final boolean ignoreModifierKey = mIgnoreModifierKey && key.isModifier();
@@ -428,7 +392,6 @@ public class PointerTracker implements PointerTrackerQueue.Element {
private void setKeyDetectorInner(final KeyDetector keyDetector) {
mKeyDetector = keyDetector;
mKeyboard = keyDetector.getKeyboard();
- mIsAlphabetKeyboard = mKeyboard.mId.isAlphabetKeyboard();
mGestureStrokeWithPreviewTrail.setGestureSampleLength(mKeyboard.mMostCommonKeyWidth);
final Key newKey = mKeyDetector.detectHitKey(mKeyX, mKeyY);
if (newKey != mCurrentKey) {
@@ -502,7 +465,7 @@ public class PointerTracker implements PointerTrackerQueue.Element {
return;
}
- if (!key.noKeyPreview() && !mInGesture) {
+ if (!key.noKeyPreview() && !sInGesture) {
mDrawingProxy.showKeyPreview(this);
}
updatePressKeyGraphics(key);
@@ -577,50 +540,65 @@ public class PointerTracker implements PointerTrackerQueue.Element {
return newKey;
}
+ private static int getActivePointerTrackerCount() {
+ return (sPointerTrackerQueue == null) ? 1 : sPointerTrackerQueue.size();
+ }
+
private void startBatchInput() {
if (DEBUG_LISTENER) {
Log.d(TAG, "onStartBatchInput");
}
- mInGesture = true;
+ sInGesture = true;
mListener.onStartBatchInput();
- }
-
- private void updateBatchInput(final InputPointers batchPoints) {
- if (DEBUG_LISTENER) {
- Log.d(TAG, "onUpdateBatchInput: batchPoints=" + batchPoints.getPointerSize());
+ mDrawingProxy.showGesturePreviewTrail(this);
+ }
+
+ private void updateBatchInput(final long eventTime) {
+ synchronized (sAggregratedPointers) {
+ mGestureStrokeWithPreviewTrail.appendIncrementalBatchPoints(sAggregratedPointers);
+ final int size = sAggregratedPointers.getPointerSize();
+ if (size > sLastRecognitionPointSize
+ && eventTime > sLastRecognitionTime + MIN_GESTURE_RECOGNITION_TIME) {
+ sLastRecognitionPointSize = size;
+ sLastRecognitionTime = eventTime;
+ if (DEBUG_LISTENER) {
+ Log.d(TAG, "onUpdateBatchInput: batchPoints=" + size);
+ }
+ mListener.onUpdateBatchInput(sAggregratedPointers);
+ }
}
- mListener.onUpdateBatchInput(batchPoints);
+ mDrawingProxy.showGesturePreviewTrail(this);
}
- private void endBatchInput(final InputPointers batchPoints) {
- if (DEBUG_LISTENER) {
- Log.d(TAG, "onEndBatchInput: batchPoints=" + batchPoints.getPointerSize());
+ private void endBatchInput() {
+ synchronized (sAggregratedPointers) {
+ mGestureStrokeWithPreviewTrail.appendAllBatchPoints(sAggregratedPointers);
+ if (getActivePointerTrackerCount() == 1) {
+ if (DEBUG_LISTENER) {
+ Log.d(TAG, "onEndBatchInput: batchPoints="
+ + sAggregratedPointers.getPointerSize());
+ }
+ sInGesture = false;
+ mListener.onEndBatchInput(sAggregratedPointers);
+ clearBatchInputPointsOfAllPointerTrackers();
+ }
}
- mListener.onEndBatchInput(batchPoints);
- clearBatchInputRecognitionStateOfThisPointerTracker();
- clearBatchInputPointsOfAllPointerTrackers();
+ mDrawingProxy.showGesturePreviewTrail(this);
}
- private void abortBatchInput() {
- clearBatchInputRecognitionStateOfThisPointerTracker();
+ private static void abortBatchInput() {
clearBatchInputPointsOfAllPointerTrackers();
}
- private void clearBatchInputRecognitionStateOfThisPointerTracker() {
- mIsPossibleGesture = false;
- mInGesture = false;
- mLastRecognitionPointSize = 0;
- mLastRecognitionTime = 0;
- }
-
- private boolean updateBatchInputRecognitionState(final long eventTime, final int size) {
- if (size > mLastRecognitionPointSize
- && eventTime > mLastRecognitionTime + MIN_GESTURE_RECOGNITION_TIME) {
- mLastRecognitionPointSize = size;
- mLastRecognitionTime = eventTime;
- return true;
+ private static void clearBatchInputPointsOfAllPointerTrackers() {
+ final int trackersSize = sTrackers.size();
+ for (int i = 0; i < trackersSize; ++i) {
+ final PointerTracker tracker = sTrackers.get(i);
+ tracker.mGestureStrokeWithPreviewTrail.reset();
}
- return false;
+ sAggregratedPointers.reset();
+ sLastRecognitionPointSize = 0;
+ sLastRecognitionTime = 0;
}
public void processMotionEvent(final int action, final int x, final int y, final long eventTime,
@@ -671,8 +649,8 @@ public class PointerTracker implements PointerTrackerQueue.Element {
}
}
- final PointerTrackerQueue queue = sPointerTrackerQueue;
final Key key = getKeyOn(x, y);
+ final PointerTrackerQueue queue = sPointerTrackerQueue;
if (queue != null) {
if (key != null && key.isModifier()) {
// Before processing a down event of modifier key, all pointers already being
@@ -682,16 +660,26 @@ public class PointerTracker implements PointerTrackerQueue.Element {
queue.add(this);
}
onDownEventInternal(x, y, eventTime);
- if (queue != null && queue.size() == 1) {
- mIsPossibleGesture = false;
+ if (!sShouldHandleGesture) {
+ return;
+ }
+ final int activePointerTrackerCount = getActivePointerTrackerCount();
+ if (activePointerTrackerCount == 1) {
+ mIsDetectingGesture = false;
// A gesture should start only from the letter key.
- if (sShouldHandleGesture && mIsAlphabetKeyboard && !mIsShowingMoreKeysPanel
- && key != null && Keyboard.isLetterCode(key.mCode)) {
- mIsPossibleGesture = true;
- // TODO: pointer times should be relative to first down even in entire batch input
- // instead of resetting to 0 for each new down event.
- mGestureStrokeWithPreviewTrail.addPoint(x, y, 0, false);
+ final boolean isAlphabetKeyboard = (mKeyboard != null)
+ && mKeyboard.mId.isAlphabetKeyboard();
+ if (isAlphabetKeyboard && !mIsShowingMoreKeysPanel && key != null
+ && Keyboard.isLetterCode(key.mCode)) {
+ mIsDetectingGesture = true;
+ sGestureFirstDownTime = eventTime;
+ mGestureStrokeWithPreviewTrail.addPoint(x, y, 0, false /* isHistorical */);
}
+ } else if (sInGesture && activePointerTrackerCount > 1) {
+ mIsDetectingGesture = true;
+ final int elapsedTimeFromFirstDown = (int)(eventTime - sGestureFirstDownTime);
+ mGestureStrokeWithPreviewTrail.addPoint(x, y, elapsedTimeFromFirstDown,
+ false /* isHistorical */);
}
}
@@ -727,22 +715,18 @@ public class PointerTracker implements PointerTrackerQueue.Element {
mIsInSlidingKeyInput = true;
}
- private void onGestureMoveEvent(final PointerTracker tracker, final int x, final int y,
- final long eventTime, final boolean isHistorical, final Key key) {
- final int gestureTime = (int)(eventTime - tracker.getDownTime());
- if (sShouldHandleGesture && mIsPossibleGesture) {
+ private void onGestureMoveEvent(final int x, final int y, final long eventTime,
+ final boolean isHistorical, final Key key) {
+ final int gestureTime = (int)(eventTime - sGestureFirstDownTime);
+ if (mIsDetectingGesture) {
final GestureStroke stroke = mGestureStrokeWithPreviewTrail;
stroke.addPoint(x, y, gestureTime, isHistorical);
- if (!mInGesture && stroke.isStartOfAGesture()) {
+ if (!sInGesture && stroke.isStartOfAGesture()) {
startBatchInput();
}
- }
- if (key != null && mInGesture) {
- final InputPointers batchPoints = getIncrementalBatchPoints();
- mDrawingProxy.showGestureTrail(this);
- if (updateBatchInputRecognitionState(eventTime, batchPoints.getPointerSize())) {
- updateBatchInput(batchPoints);
+ if (sInGesture && key != null) {
+ updateBatchInput(eventTime);
}
}
}
@@ -755,7 +739,7 @@ public class PointerTracker implements PointerTrackerQueue.Element {
return;
}
- if (me != null) {
+ if (sShouldHandleGesture && me != null) {
// Add historical points to gesture path.
final int pointerIndex = me.findPointerIndex(mPointerId);
final int historicalSize = me.getHistorySize();
@@ -763,24 +747,31 @@ public class PointerTracker implements PointerTrackerQueue.Element {
final int historicalX = (int)me.getHistoricalX(pointerIndex, h);
final int historicalY = (int)me.getHistoricalY(pointerIndex, h);
final long historicalTime = me.getHistoricalEventTime(h);
- onGestureMoveEvent(this, historicalX, historicalY, historicalTime,
+ onGestureMoveEvent(historicalX, historicalY, historicalTime,
true /* isHistorical */, null);
}
}
+ onMoveEventInternal(x, y, eventTime);
+ }
+
+ private void onMoveEventInternal(final int x, final int y, final long eventTime) {
final int lastX = mLastX;
final int lastY = mLastY;
final Key oldKey = mCurrentKey;
Key key = onMoveKey(x, y);
- // Register move event on gesture tracker.
- onGestureMoveEvent(this, x, y, eventTime, false /* isHistorical */, key);
- if (mInGesture) {
- mIgnoreModifierKey = true;
- mTimerProxy.cancelLongPressTimer();
- mIsInSlidingKeyInput = true;
- mCurrentKey = null;
- setReleasedKeyGraphics(oldKey);
+ if (sShouldHandleGesture) {
+ // Register move event on gesture tracker.
+ onGestureMoveEvent(x, y, eventTime, false /* isHistorical */, key);
+ if (sInGesture) {
+ mIgnoreModifierKey = true;
+ mTimerProxy.cancelLongPressTimer();
+ mIsInSlidingKeyInput = true;
+ mCurrentKey = null;
+ setReleasedKeyGraphics(oldKey);
+ return;
+ }
}
if (key != null) {
@@ -825,7 +816,7 @@ public class PointerTracker implements PointerTrackerQueue.Element {
// TODO: Should find a way to balance gesture detection and this hack.
if (sNeedsPhantomSuddenMoveEventHack
&& lastMoveSquared >= mKeyQuarterWidthSquared
- && !mIsPossibleGesture) {
+ && !mIsDetectingGesture) {
if (DEBUG_MODE) {
Log.w(TAG, String.format("onMoveEvent:"
+ " phantom sudden move event is translated to "
@@ -843,12 +834,11 @@ public class PointerTracker implements PointerTrackerQueue.Element {
// touch panels when there are close multiple touches.
// Caveat: When in chording input mode with a modifier key, we don't use
// this hack.
- final PointerTrackerQueue queue = sPointerTrackerQueue;
- if (queue != null && queue.size() > 1
- && !queue.hasModifierKeyOlderThan(this)) {
+ if (getActivePointerTrackerCount() > 1 && sPointerTrackerQueue != null
+ && !sPointerTrackerQueue.hasModifierKeyOlderThan(this)) {
onUpEventInternal();
}
- if (!mIsPossibleGesture) {
+ if (!mIsDetectingGesture) {
mKeyAlreadyProcessed = true;
}
setReleasedKeyGraphics(oldKey);
@@ -866,7 +856,7 @@ public class PointerTracker implements PointerTrackerQueue.Element {
if (mIsAllowedSlidingKeyInput) {
onMoveToNewKey(key, x, y);
} else {
- if (!mIsPossibleGesture) {
+ if (!mIsDetectingGesture) {
mKeyAlreadyProcessed = true;
}
}
@@ -881,7 +871,7 @@ public class PointerTracker implements PointerTrackerQueue.Element {
final PointerTrackerQueue queue = sPointerTrackerQueue;
if (queue != null) {
- if (!mInGesture) {
+ if (!sInGesture) {
if (mCurrentKey != null && mCurrentKey.isModifier()) {
// Before processing an up event of modifier key, all pointers already being
// tracked should be released.
@@ -890,9 +880,11 @@ public class PointerTracker implements PointerTrackerQueue.Element {
queue.releaseAllPointersOlderThan(this, eventTime);
}
}
- queue.remove(this);
}
onUpEventInternal();
+ if (queue != null) {
+ queue.remove(this);
+ }
}
// Let this pointer tracker know that one of newer-than-this pointer trackers got an up event.
@@ -910,34 +902,31 @@ public class PointerTracker implements PointerTrackerQueue.Element {
private void onUpEventInternal() {
mTimerProxy.cancelKeyTimers();
mIsInSlidingKeyInput = false;
- mIsPossibleGesture = false;
+ mIsDetectingGesture = false;
+ final Key currentKey = mCurrentKey;
+ mCurrentKey = null;
// Release the last pressed key.
- setReleasedKeyGraphics(mCurrentKey);
+ setReleasedKeyGraphics(currentKey);
if (mIsShowingMoreKeysPanel) {
mDrawingProxy.dismissMoreKeysPanel();
mIsShowingMoreKeysPanel = false;
}
- if (mInGesture) {
- // Register up event on gesture tracker.
- // TODO: Figure out how to deal with multiple fingers that are in gesture, sliding,
- // and/or tapping mode?
- endBatchInput(getAllBatchPoints());
- if (mCurrentKey != null) {
- callListenerOnRelease(mCurrentKey, mCurrentKey.mCode, true);
- mCurrentKey = null;
+ if (sInGesture) {
+ if (currentKey != null) {
+ callListenerOnRelease(currentKey, currentKey.mCode, true);
}
- mDrawingProxy.showGestureTrail(this);
+ endBatchInput();
return;
}
- // This event will be recognized as a regular code input. Clear unused batch points so they
- // are not mistakenly included in the next batch event.
+ // This event will be recognized as a regular code input. Clear unused possible batch points
+ // so they are not mistakenly displayed as preview.
clearBatchInputPointsOfAllPointerTrackers();
if (mKeyAlreadyProcessed) {
return;
}
- if (mCurrentKey != null && !mCurrentKey.isRepeatable()) {
- detectAndSendKey(mCurrentKey, mKeyX, mKeyY);
+ if (currentKey != null && !currentKey.isRepeatable()) {
+ detectAndSendKey(currentKey, mKeyX, mKeyY);
}
}
@@ -981,7 +970,7 @@ public class PointerTracker implements PointerTrackerQueue.Element {
}
private void startRepeatKey(final Key key) {
- if (key != null && key.isRepeatable() && !mInGesture) {
+ if (key != null && key.isRepeatable() && !sInGesture) {
onRegisterKey(key);
mTimerProxy.startKeyRepeatTimer(this);
}
@@ -1010,7 +999,7 @@ public class PointerTracker implements PointerTrackerQueue.Element {
}
private void startLongPressTimer(final Key key) {
- if (key != null && key.isLongPressEnabled() && !mInGesture) {
+ if (key != null && key.isLongPressEnabled() && !sInGesture) {
mTimerProxy.startLongPressTimer(this);
}
}
diff --git a/java/src/com/android/inputmethod/keyboard/internal/GestureStroke.java b/java/src/com/android/inputmethod/keyboard/internal/GestureStroke.java
index 292842d22..825134468 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/GestureStroke.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/GestureStroke.java
@@ -130,8 +130,12 @@ public class GestureStroke {
}
private void appendBatchPoints(final InputPointers out, final int size) {
+ final int length = size - mLastIncrementalBatchSize;
+ if (length <= 0) {
+ return;
+ }
out.append(mPointerId, mEventTimes, mXCoordinates, mYCoordinates,
- mLastIncrementalBatchSize, size - mLastIncrementalBatchSize);
+ mLastIncrementalBatchSize, length);
mLastIncrementalBatchSize = size;
}
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index df200cd0e..83a306818 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -1351,7 +1351,9 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
@Override
public void onTextInput(CharSequence rawText) {
mConnection.beginBatchEdit();
- commitTyped(LastComposedWord.NOT_A_SEPARATOR);
+ if (mWordComposer.isComposingWord()) {
+ commitCurrentAutoCorrection(LastComposedWord.NOT_A_SEPARATOR);
+ }
mHandler.postUpdateSuggestionStrip();
final CharSequence text = specificTldProcessingOnTextInput(rawText);
if (SPACE_STATE_PHANTOM == mSpaceState) {
@@ -1370,7 +1372,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
public void onStartBatchInput() {
mConnection.beginBatchEdit();
if (mWordComposer.isComposingWord()) {
- commitTyped(LastComposedWord.NOT_A_SEPARATOR);
+ commitCurrentAutoCorrection(LastComposedWord.NOT_A_SEPARATOR);
mExpectingUpdateSelection = true;
// TODO: Can we remove this?
mSpaceState = SPACE_STATE_PHANTOM;
diff --git a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java
index afc4293c0..03263d274 100644
--- a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java
+++ b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java
@@ -132,7 +132,7 @@ public class SuggestionStripView extends RelativeLayout implements OnClickListen
private static class SuggestionStripViewParams {
private static final int DEFAULT_SUGGESTIONS_COUNT_IN_STRIP = 3;
- private static final int DEFAULT_CENTER_SUGGESTION_PERCENTILE = 40;
+ private static final float DEFAULT_CENTER_SUGGESTION_PERCENTILE = 0.40f;
private static final int DEFAULT_MAX_MORE_SUGGESTIONS_ROW = 2;
private static final int PUNCTUATIONS_IN_STRIP = 5;
@@ -196,16 +196,16 @@ public class SuggestionStripView extends RelativeLayout implements OnClickListen
R.styleable.SuggestionStripView, defStyle, R.style.SuggestionStripViewStyle);
mSuggestionStripOption = a.getInt(
R.styleable.SuggestionStripView_suggestionStripOption, 0);
- final float alphaValidTypedWord = getPercent(a,
- R.styleable.SuggestionStripView_alphaValidTypedWord, 100);
- final float alphaTypedWord = getPercent(a,
- R.styleable.SuggestionStripView_alphaTypedWord, 100);
- final float alphaAutoCorrect = getPercent(a,
- R.styleable.SuggestionStripView_alphaAutoCorrect, 100);
- final float alphaSuggested = getPercent(a,
- R.styleable.SuggestionStripView_alphaSuggested, 100);
- mAlphaObsoleted = getPercent(a,
- R.styleable.SuggestionStripView_alphaSuggested, 100);
+ final float alphaValidTypedWord = getFraction(a,
+ R.styleable.SuggestionStripView_alphaValidTypedWord, 1.0f);
+ final float alphaTypedWord = getFraction(a,
+ R.styleable.SuggestionStripView_alphaTypedWord, 1.0f);
+ final float alphaAutoCorrect = getFraction(a,
+ R.styleable.SuggestionStripView_alphaAutoCorrect, 1.0f);
+ final float alphaSuggested = getFraction(a,
+ R.styleable.SuggestionStripView_alphaSuggested, 1.0f);
+ mAlphaObsoleted = getFraction(a,
+ R.styleable.SuggestionStripView_alphaSuggested, 1.0f);
mColorValidTypedWord = applyAlpha(a.getColor(
R.styleable.SuggestionStripView_colorValidTypedWord, 0), alphaValidTypedWord);
mColorTypedWord = applyAlpha(a.getColor(
@@ -217,14 +217,14 @@ public class SuggestionStripView extends RelativeLayout implements OnClickListen
mSuggestionsCountInStrip = a.getInt(
R.styleable.SuggestionStripView_suggestionsCountInStrip,
DEFAULT_SUGGESTIONS_COUNT_IN_STRIP);
- mCenterSuggestionWeight = getPercent(a,
+ mCenterSuggestionWeight = getFraction(a,
R.styleable.SuggestionStripView_centerSuggestionPercentile,
DEFAULT_CENTER_SUGGESTION_PERCENTILE);
mMaxMoreSuggestionsRow = a.getInt(
R.styleable.SuggestionStripView_maxMoreSuggestionsRow,
DEFAULT_MAX_MORE_SUGGESTIONS_ROW);
- mMinMoreSuggestionsWidth = getRatio(a,
- R.styleable.SuggestionStripView_minMoreSuggestionsWidth);
+ mMinMoreSuggestionsWidth = getFraction(a,
+ R.styleable.SuggestionStripView_minMoreSuggestionsWidth, 1.0f);
a.recycle();
mMoreSuggestionsHint = getMoreSuggestionsHint(res,
@@ -278,14 +278,8 @@ public class SuggestionStripView extends RelativeLayout implements OnClickListen
return new BitmapDrawable(res, buffer);
}
- // Read integer value in TypedArray as percent.
- private static float getPercent(TypedArray a, int index, int defValue) {
- return a.getInt(index, defValue) / 100.0f;
- }
-
- // Read fraction value in TypedArray as float.
- private static float getRatio(TypedArray a, int index) {
- return a.getFraction(index, 1000, 1000, 1) / 1000.0f;
+ static float getFraction(final TypedArray a, final int index, final float defValue) {
+ return a.getFraction(index, 1, 1, defValue);
}
private CharSequence getStyledSuggestionWord(SuggestedWords suggestedWords, int pos) {