diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml index 02e8eeb3b..4975d6540 100644 --- a/java/res/values/attrs.xml +++ b/java/res/values/attrs.xml @@ -119,6 +119,7 @@ + @@ -128,6 +129,8 @@ + + diff --git a/java/res/values/config.xml b/java/res/values/config.xml index e5575e7ae..54a6687a3 100644 --- a/java/res/values/config.xml +++ b/java/res/values/config.xml @@ -49,6 +49,7 @@ Configuration for KeyboardView --> 70 + 200 diff --git a/java/res/values/styles.xml b/java/res/values/styles.xml index 955a27631..ae67c4369 100644 --- a/java/res/values/styles.xml +++ b/java/res/values/styles.xml @@ -77,6 +77,7 @@ @dimen/gesture_floating_preview_text_shadow_border @android:color/white @dimen/gesture_floating_preview_text_connector_width + @integer/config_gesture_floating_preview_text_linger_timeout @android:color/holo_blue_light @dimen/gesture_preview_trail_width diff --git a/java/src/com/android/inputmethod/compat/SuggestionSpanUtils.java b/java/src/com/android/inputmethod/compat/SuggestionSpanUtils.java index a0f48d24c..1183b5fb9 100644 --- a/java/src/com/android/inputmethod/compat/SuggestionSpanUtils.java +++ b/java/src/com/android/inputmethod/compat/SuggestionSpanUtils.java @@ -120,7 +120,6 @@ public class SuggestionSpanUtils { spannable = new SpannableString(pickedWord); } final ArrayList suggestionsList = new ArrayList(); - boolean sameAsTyped = false; for (int i = 0; i < suggestedWords.size(); ++i) { if (suggestionsList.size() >= OBJ_SUGGESTIONS_MAX_SIZE) { break; @@ -128,8 +127,6 @@ public class SuggestionSpanUtils { final CharSequence word = suggestedWords.getWord(i); if (!TextUtils.equals(pickedWord, word)) { suggestionsList.add(word.toString()); - } else if (i == 0) { - sameAsTyped = true; } } diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java index dc84763c1..10f651ad1 100644 --- a/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java +++ b/java/src/com/android/inputmethod/keyboard/KeyboardSwitcher.java @@ -267,7 +267,7 @@ public class KeyboardSwitcher implements KeyboardState.SwitchActions { // Implements {@link KeyboardState.SwitchActions}. @Override public void startDoubleTapTimer() { - final MainKeyboardView keyboardView = getKeyboardView(); + final MainKeyboardView keyboardView = getMainKeyboardView(); if (keyboardView != null) { final TimerProxy timer = keyboardView.getTimerProxy(); timer.startDoubleTapTimer(); @@ -277,7 +277,7 @@ public class KeyboardSwitcher implements KeyboardState.SwitchActions { // Implements {@link KeyboardState.SwitchActions}. @Override public void cancelDoubleTapTimer() { - final MainKeyboardView keyboardView = getKeyboardView(); + final MainKeyboardView keyboardView = getMainKeyboardView(); if (keyboardView != null) { final TimerProxy timer = keyboardView.getTimerProxy(); timer.cancelDoubleTapTimer(); @@ -287,7 +287,7 @@ public class KeyboardSwitcher implements KeyboardState.SwitchActions { // Implements {@link KeyboardState.SwitchActions}. @Override public boolean isInDoubleTapTimeout() { - final MainKeyboardView keyboardView = getKeyboardView(); + final MainKeyboardView keyboardView = getMainKeyboardView(); return (keyboardView != null) ? keyboardView.getTimerProxy().isInDoubleTapTimeout() : false; } @@ -295,7 +295,7 @@ public class KeyboardSwitcher implements KeyboardState.SwitchActions { // Implements {@link KeyboardState.SwitchActions}. @Override public void startLongPressTimer(int code) { - final MainKeyboardView keyboardView = getKeyboardView(); + final MainKeyboardView keyboardView = getMainKeyboardView(); if (keyboardView != null) { final TimerProxy timer = keyboardView.getTimerProxy(); timer.startLongPressTimer(code); @@ -305,7 +305,7 @@ public class KeyboardSwitcher implements KeyboardState.SwitchActions { // Implements {@link KeyboardState.SwitchActions}. @Override public void cancelLongPressTimer() { - final MainKeyboardView keyboardView = getKeyboardView(); + final MainKeyboardView keyboardView = getMainKeyboardView(); if (keyboardView != null) { final TimerProxy timer = keyboardView.getTimerProxy(); timer.cancelLongPressTimer(); @@ -345,7 +345,7 @@ public class KeyboardSwitcher implements KeyboardState.SwitchActions { mState.onCodeInput(code, isSinglePointer(), mLatinIME.getCurrentAutoCapsState()); } - public MainKeyboardView getKeyboardView() { + public MainKeyboardView getMainKeyboardView() { return mKeyboardView; } diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardView.java b/java/src/com/android/inputmethod/keyboard/KeyboardView.java index 69e4d9805..0e6de7032 100644 --- a/java/src/com/android/inputmethod/keyboard/KeyboardView.java +++ b/java/src/com/android/inputmethod/keyboard/KeyboardView.java @@ -140,7 +140,7 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy { private final DrawingHandler mDrawingHandler = new DrawingHandler(this); public static class DrawingHandler extends StaticInnerHandlerWrapper { - private static final int MSG_DISMISS_KEY_PREVIEW = 1; + private static final int MSG_DISMISS_KEY_PREVIEW = 0; public DrawingHandler(KeyboardView outerInstance) { super(outerInstance); @@ -902,6 +902,9 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy { public void cancelAllMessages() { mDrawingHandler.cancelAllMessages(); + if (mPreviewPlacerView != null) { + mPreviewPlacerView.cancelAllMessages(); + } } // Called by {@link PointerTracker} constructor to create a TextView. @@ -943,6 +946,11 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy { mPreviewPlacerView.setGestureFloatingPreviewText(gestureFloatingPreviewText); } + public void dismissGestureFloatingPreviewText() { + locatePreviewPlacerView(); + mPreviewPlacerView.dismissGestureFloatingPreviewText(); + } + @Override public void showGestureTrail(PointerTracker tracker) { locatePreviewPlacerView(); diff --git a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java index 79459083f..fe9cb9415 100644 --- a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java +++ b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java @@ -122,10 +122,10 @@ public class MainKeyboardView extends KeyboardView implements PointerTracker.Key private static class KeyTimerHandler extends StaticInnerHandlerWrapper implements TimerProxy { + private static final int MSG_TYPING_STATE_EXPIRED = 0; private static final int MSG_REPEAT_KEY = 1; private static final int MSG_LONGPRESS_KEY = 2; private static final int MSG_DOUBLE_TAP = 3; - private static final int MSG_TYPING_STATE_EXPIRED = 4; private final KeyTimerParams mParams; @@ -139,6 +139,9 @@ public class MainKeyboardView extends KeyboardView implements PointerTracker.Key final MainKeyboardView keyboardView = getOuterInstance(); final PointerTracker tracker = (PointerTracker) msg.obj; switch (msg.what) { + case MSG_TYPING_STATE_EXPIRED: + startWhileTypingFadeinAnimation(keyboardView); + break; case MSG_REPEAT_KEY: final Key currentKey = tracker.getKey(); if (currentKey != null && currentKey.mCode == msg.arg1) { @@ -153,9 +156,6 @@ public class MainKeyboardView extends KeyboardView implements PointerTracker.Key KeyboardSwitcher.getInstance().onLongPressTimeout(msg.arg1); } break; - case MSG_TYPING_STATE_EXPIRED: - startWhileTypingFadeinAnimation(keyboardView); - break; } } diff --git a/java/src/com/android/inputmethod/keyboard/PointerTracker.java b/java/src/com/android/inputmethod/keyboard/PointerTracker.java index e7e11f481..184011ffe 100644 --- a/java/src/com/android/inputmethod/keyboard/PointerTracker.java +++ b/java/src/com/android/inputmethod/keyboard/PointerTracker.java @@ -34,7 +34,7 @@ import com.android.inputmethod.research.ResearchLogger; import java.util.ArrayList; -public class PointerTracker { +public class PointerTracker implements PointerTrackerQueue.ElementActions { private static final String TAG = PointerTracker.class.getSimpleName(); private static final boolean DEBUG_EVENT = false; private static final boolean DEBUG_MOVE_EVENT = false; @@ -414,6 +414,7 @@ public class PointerTracker { mKeyQuarterWidthSquared = keyQuarterWidth * keyQuarterWidth; } + @Override public boolean isInSlidingKeyInput() { return mIsInSlidingKeyInput; } @@ -422,6 +423,7 @@ public class PointerTracker { return mCurrentKey; } + @Override public boolean isModifier() { return mCurrentKey != null && mCurrentKey.isModifier(); } @@ -805,7 +807,7 @@ public class PointerTracker { if (ProductionFlag.IS_EXPERIMENTAL) { ResearchLogger.pointerTracker_onMoveEvent(x, y, lastX, lastY); } - onUpEventInternal(x, y, eventTime); + onUpEventInternal(); onDownEventInternal(x, y, eventTime); } else { // HACK: If there are currently multiple touches, register the key even if @@ -815,7 +817,7 @@ public class PointerTracker { // this hack. if (me != null && me.getPointerCount() > 1 && !sPointerTrackerQueue.hasModifierKeyOlderThan(this)) { - onUpEventInternal(x, y, eventTime); + onUpEventInternal(); } if (!mIsPossibleGesture) { mKeyAlreadyProcessed = true; @@ -860,20 +862,21 @@ public class PointerTracker { } queue.remove(this); } - onUpEventInternal(x, y, eventTime); + onUpEventInternal(); } // Let this pointer tracker know that one of newer-than-this pointer trackers got an up event. // This pointer tracker needs to keep the key top graphics "pressed", but needs to get a // "virtual" up event. - public void onPhantomUpEvent(int x, int y, long eventTime) { + @Override + public void onPhantomUpEvent(long eventTime) { if (DEBUG_EVENT) - printTouchEvent("onPhntEvent:", x, y, eventTime); - onUpEventInternal(x, y, eventTime); + printTouchEvent("onPhntEvent:", getLastX(), getLastY(), eventTime); + onUpEventInternal(); mKeyAlreadyProcessed = true; } - private void onUpEventInternal(int x, int y, long eventTime) { + private void onUpEventInternal() { mTimerProxy.cancelKeyTimers(); mIsInSlidingKeyInput = false; mIsPossibleGesture = false; diff --git a/java/src/com/android/inputmethod/keyboard/internal/PointerTrackerQueue.java b/java/src/com/android/inputmethod/keyboard/internal/PointerTrackerQueue.java index e4a71844a..bd1648014 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/PointerTrackerQueue.java +++ b/java/src/com/android/inputmethod/keyboard/internal/PointerTrackerQueue.java @@ -18,9 +18,6 @@ package com.android.inputmethod.keyboard.internal; import android.util.Log; -import com.android.inputmethod.keyboard.Keyboard; -import com.android.inputmethod.keyboard.PointerTracker; - import java.util.Iterator; import java.util.LinkedList; @@ -28,37 +25,43 @@ public class PointerTrackerQueue { private static final String TAG = PointerTrackerQueue.class.getSimpleName(); private static final boolean DEBUG = false; + public interface ElementActions { + public boolean isModifier(); + public boolean isInSlidingKeyInput(); + public void onPhantomUpEvent(long eventTime); + } + // TODO: Use ring buffer instead of {@link LinkedList}. - private final LinkedList mQueue = new LinkedList(); + private final LinkedList mQueue = new LinkedList(); public int size() { return mQueue.size(); } - public synchronized void add(PointerTracker tracker) { + public synchronized void add(ElementActions tracker) { mQueue.add(tracker); } - public synchronized void remove(PointerTracker tracker) { + public synchronized void remove(ElementActions tracker) { mQueue.remove(tracker); } - public synchronized void releaseAllPointersOlderThan(PointerTracker tracker, + public synchronized void releaseAllPointersOlderThan(ElementActions tracker, long eventTime) { if (DEBUG) { - Log.d(TAG, "releaseAllPoniterOlderThan: [" + tracker.mPointerId + "] " + this); + Log.d(TAG, "releaseAllPoniterOlderThan: " + tracker + " " + this); } if (!mQueue.contains(tracker)) { return; } - final Iterator it = mQueue.iterator(); + final Iterator it = mQueue.iterator(); while (it.hasNext()) { - final PointerTracker t = it.next(); + final ElementActions t = it.next(); if (t == tracker) { break; } if (!t.isModifier()) { - t.onPhantomUpEvent(t.getLastX(), t.getLastY(), eventTime); + t.onPhantomUpEvent(eventTime); it.remove(); } } @@ -68,28 +71,28 @@ public class PointerTrackerQueue { releaseAllPointersExcept(null, eventTime); } - public synchronized void releaseAllPointersExcept(PointerTracker tracker, long eventTime) { + public synchronized void releaseAllPointersExcept(ElementActions tracker, long eventTime) { if (DEBUG) { if (tracker == null) { Log.d(TAG, "releaseAllPoniters: " + this); } else { - Log.d(TAG, "releaseAllPoniterExcept: [" + tracker.mPointerId + "] " + this); + Log.d(TAG, "releaseAllPoniterExcept: " + tracker + " " + this); } } - final Iterator it = mQueue.iterator(); + final Iterator it = mQueue.iterator(); while (it.hasNext()) { - final PointerTracker t = it.next(); + final ElementActions t = it.next(); if (t != tracker) { - t.onPhantomUpEvent(t.getLastX(), t.getLastY(), eventTime); + t.onPhantomUpEvent(eventTime); it.remove(); } } } - public synchronized boolean hasModifierKeyOlderThan(PointerTracker tracker) { - final Iterator it = mQueue.iterator(); + public synchronized boolean hasModifierKeyOlderThan(ElementActions tracker) { + final Iterator it = mQueue.iterator(); while (it.hasNext()) { - final PointerTracker t = it.next(); + final ElementActions t = it.next(); if (t == tracker) { break; } @@ -101,7 +104,7 @@ public class PointerTrackerQueue { } public synchronized boolean isAnyInSlidingKeyInput() { - for (final PointerTracker tracker : mQueue) { + for (final ElementActions tracker : mQueue) { if (tracker.isInSlidingKeyInput()) { return true; } @@ -112,12 +115,11 @@ public class PointerTrackerQueue { @Override public String toString() { final StringBuilder sb = new StringBuilder(); - for (final PointerTracker tracker : mQueue) { + for (final ElementActions tracker : mQueue) { if (sb.length() > 0) sb.append(" "); - sb.append("[" + tracker.mPointerId + " " - + Keyboard.printableCode(tracker.getKey().mCode) + "]"); + sb.append(tracker.toString()); } - return sb.toString(); + return "[" + sb.toString() + "]"; } } diff --git a/java/src/com/android/inputmethod/keyboard/internal/PreviewPlacerView.java b/java/src/com/android/inputmethod/keyboard/internal/PreviewPlacerView.java index c38febf49..d0fecf060 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/PreviewPlacerView.java +++ b/java/src/com/android/inputmethod/keyboard/internal/PreviewPlacerView.java @@ -21,12 +21,14 @@ import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Paint.Align; +import android.os.Message; import android.text.TextUtils; import android.util.SparseArray; import android.widget.RelativeLayout; import com.android.inputmethod.keyboard.PointerTracker; import com.android.inputmethod.latin.R; +import com.android.inputmethod.latin.StaticInnerHandlerWrapper; public class PreviewPlacerView extends RelativeLayout { private final Paint mGesturePaint; @@ -39,6 +41,7 @@ public class PreviewPlacerView extends RelativeLayout { private final int mGestureFloatingPreviewTextShadingBorder; private final int mGestureFloatingPreviewTextConnectorColor; private final int mGestureFloatingPreviewTextConnectorWidth; + /* package */ final int mGestureFloatingPreviewTextLingerTimeout; private int mXOrigin; private int mYOrigin; @@ -49,6 +52,43 @@ public class PreviewPlacerView extends RelativeLayout { private boolean mDrawsGesturePreviewTrail; private boolean mDrawsGestureFloatingPreviewText; + private final DrawingHandler mDrawingHandler = new DrawingHandler(this); + + private static class DrawingHandler extends StaticInnerHandlerWrapper { + private static final int MSG_DISMISS_GESTURE_FLOATING_PREVIEW_TEXT = 0; + + public DrawingHandler(PreviewPlacerView outerInstance) { + super(outerInstance); + } + + @Override + public void handleMessage(Message msg) { + final PreviewPlacerView placerView = getOuterInstance(); + if (placerView == null) return; + switch (msg.what) { + case MSG_DISMISS_GESTURE_FLOATING_PREVIEW_TEXT: + placerView.setGestureFloatingPreviewText(null); + break; + } + } + + private void cancelDismissGestureFloatingPreviewText() { + removeMessages(MSG_DISMISS_GESTURE_FLOATING_PREVIEW_TEXT); + } + + public void dismissGestureFloatingPreviewText() { + cancelDismissGestureFloatingPreviewText(); + final PreviewPlacerView placerView = getOuterInstance(); + sendMessageDelayed( + obtainMessage(MSG_DISMISS_GESTURE_FLOATING_PREVIEW_TEXT), + placerView.mGestureFloatingPreviewTextLingerTimeout); + } + + public void cancelAllMessages() { + cancelDismissGestureFloatingPreviewText(); + } + } + public PreviewPlacerView(Context context, TypedArray keyboardViewAttr) { super(context); setWillNotDraw(false); @@ -71,6 +111,8 @@ public class PreviewPlacerView extends RelativeLayout { R.styleable.KeyboardView_gestureFloatingPreviewTextConnectorColor, 0); mGestureFloatingPreviewTextConnectorWidth = keyboardViewAttr.getDimensionPixelSize( R.styleable.KeyboardView_gestureFloatingPreviewTextConnectorWidth, 0); + mGestureFloatingPreviewTextLingerTimeout = keyboardViewAttr.getInt( + R.styleable.KeyboardView_gestureFloatingPreviewTextLingerTimeout, 0); final int gesturePreviewTrailColor = keyboardViewAttr.getColor( R.styleable.KeyboardView_gesturePreviewTrailColor, 0); final int gesturePreviewTrailWidth = keyboardViewAttr.getDimensionPixelSize( @@ -136,6 +178,14 @@ public class PreviewPlacerView extends RelativeLayout { invalidate(); } + public void dismissGestureFloatingPreviewText() { + mDrawingHandler.dismissGestureFloatingPreviewText(); + } + + public void cancelAllMessages() { + mDrawingHandler.cancelAllMessages(); + } + private void drawGestureFloatingPreviewText(Canvas canvas, PointerTracker tracker, String gestureFloatingPreviewText) { if (TextUtils.isEmpty(gestureFloatingPreviewText)) { diff --git a/java/src/com/android/inputmethod/latin/Dictionary.java b/java/src/com/android/inputmethod/latin/Dictionary.java index fd40aa6da..60fe17b19 100644 --- a/java/src/com/android/inputmethod/latin/Dictionary.java +++ b/java/src/com/android/inputmethod/latin/Dictionary.java @@ -16,8 +16,6 @@ package com.android.inputmethod.latin; -import android.text.TextUtils; - import com.android.inputmethod.keyboard.ProximityInfo; import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo; diff --git a/java/src/com/android/inputmethod/latin/DictionaryCollection.java b/java/src/com/android/inputmethod/latin/DictionaryCollection.java index 88ac07d7a..ee80f2532 100644 --- a/java/src/com/android/inputmethod/latin/DictionaryCollection.java +++ b/java/src/com/android/inputmethod/latin/DictionaryCollection.java @@ -65,7 +65,7 @@ public class DictionaryCollection extends Dictionary { prevWord, proximityInfo); if (null == suggestions) suggestions = new ArrayList(); final int length = dictionaries.size(); - for (int i = 0; i < length; ++ i) { + for (int i = 1; i < length; ++ i) { final ArrayList sugg = dictionaries.get(i).getSuggestions(composer, prevWord, proximityInfo); if (null != sugg) suggestions.addAll(sugg); diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java index a7446695e..ff7654a14 100644 --- a/java/src/com/android/inputmethod/latin/LatinIME.java +++ b/java/src/com/android/inputmethod/latin/LatinIME.java @@ -181,9 +181,9 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen public final UIHandler mHandler = new UIHandler(this); public static class UIHandler extends StaticInnerHandlerWrapper { - private static final int MSG_UPDATE_SHIFT_STATE = 1; - private static final int MSG_PENDING_IMS_CALLBACK = 6; - private static final int MSG_UPDATE_SUGGESTION_STRIP = 7; + private static final int MSG_UPDATE_SHIFT_STATE = 0; + private static final int MSG_PENDING_IMS_CALLBACK = 1; + private static final int MSG_UPDATE_SUGGESTION_STRIP = 2; private int mDelayUpdateSuggestions; private int mDelayUpdateShiftState; @@ -613,7 +613,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen private void onStartInputViewInternal(EditorInfo editorInfo, boolean restarting) { super.onStartInputView(editorInfo, restarting); final KeyboardSwitcher switcher = mKeyboardSwitcher; - MainKeyboardView inputView = switcher.getKeyboardView(); + final MainKeyboardView mainKeyboardView = switcher.getMainKeyboardView(); if (editorInfo == null) { Log.e(TAG, "Null EditorInfo in onStartInputView()"); @@ -656,7 +656,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen LatinImeLogger.onStartInputView(editorInfo); // In landscape mode, this method gets called without the input view being created. - if (inputView == null) { + if (mainKeyboardView == null) { return; } @@ -693,7 +693,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen } if (!restarting) { - inputView.closing(); + mainKeyboardView.closing(); loadSettings(); if (mSuggest != null && mCurrentSettings.mCorrectionEnabled) { @@ -719,7 +719,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen mHandler.cancelUpdateSuggestionStrip(); mHandler.cancelDoubleSpacesTimer(); - inputView.setKeyPreviewPopupEnabled(mCurrentSettings.mKeyPreviewPopupOn, + mainKeyboardView.setKeyPreviewPopupEnabled(mCurrentSettings.mKeyPreviewPopupOn, mCurrentSettings.mKeyPreviewPopupDismissDelay); if (TRACE) Debug.startMethodTracing("/data/trace/latinime"); @@ -738,8 +738,10 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen getCurrentInputConnection()); } super.onWindowHidden(); - KeyboardView inputView = mKeyboardSwitcher.getKeyboardView(); - if (inputView != null) inputView.closing(); + final KeyboardView mainKeyboardView = mKeyboardSwitcher.getMainKeyboardView(); + if (mainKeyboardView != null) { + mainKeyboardView.closing(); + } } private void onFinishInputInternal() { @@ -750,15 +752,19 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen ResearchLogger.getInstance().latinIME_onFinishInputInternal(); } - KeyboardView inputView = mKeyboardSwitcher.getKeyboardView(); - if (inputView != null) inputView.closing(); + final KeyboardView mainKeyboardView = mKeyboardSwitcher.getMainKeyboardView(); + if (mainKeyboardView != null) { + mainKeyboardView.closing(); + } } private void onFinishInputViewInternal(boolean finishingInput) { super.onFinishInputView(finishingInput); mKeyboardSwitcher.onFinishInputView(); - KeyboardView inputView = mKeyboardSwitcher.getKeyboardView(); - if (inputView != null) inputView.cancelAllMessages(); + final KeyboardView mainKeyboardView = mKeyboardSwitcher.getMainKeyboardView(); + if (mainKeyboardView != null) { + mainKeyboardView.cancelAllMessages(); + } // Remove pending messages related to update suggestions mHandler.cancelUpdateSuggestionStrip(); } @@ -928,8 +934,9 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen private void setSuggestionStripShownInternal(boolean shown, boolean needsInputViewShown) { // TODO: Modify this if we support suggestions with hard keyboard if (onEvaluateInputViewShown() && mSuggestionsContainer != null) { - final MainKeyboardView keyboardView = mKeyboardSwitcher.getKeyboardView(); - final boolean inputViewShown = (keyboardView != null) ? keyboardView.isShown() : false; + final MainKeyboardView mainKeyboardView = mKeyboardSwitcher.getMainKeyboardView(); + final boolean inputViewShown = (mainKeyboardView != null) + ? mainKeyboardView.isShown() : false; final boolean shouldShowSuggestions = shown && (needsInputViewShown ? inputViewShown : true); if (isFullscreenMode()) { @@ -952,11 +959,11 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen return currentHeight; } - final KeyboardView keyboardView = mKeyboardSwitcher.getKeyboardView(); - if (keyboardView == null) { + final KeyboardView mainKeyboardView = mKeyboardSwitcher.getMainKeyboardView(); + if (mainKeyboardView == null) { return 0; } - final int keyboardHeight = keyboardView.getHeight(); + final int keyboardHeight = mainKeyboardView.getHeight(); final int suggestionsHeight = mSuggestionsContainer.getHeight(); final int displayHeight = mResources.getDisplayMetrics().heightPixels; final Rect rect = new Rect(); @@ -974,9 +981,10 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen @Override public void onComputeInsets(InputMethodService.Insets outInsets) { super.onComputeInsets(outInsets); - final KeyboardView inputView = mKeyboardSwitcher.getKeyboardView(); - if (inputView == null || mSuggestionsContainer == null) + final KeyboardView mainKeyboardView = mKeyboardSwitcher.getMainKeyboardView(); + if (mainKeyboardView == null || mSuggestionsContainer == null) { return; + } final int adjustedBackingHeight = getAdjustedBackingViewHeight(); final boolean backingGone = (mKeyPreviewBackingView.getVisibility() == View.GONE); final int backingHeight = backingGone ? 0 : adjustedBackingHeight; @@ -989,13 +997,12 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen final int extraHeight = extractHeight + backingHeight + suggestionsHeight; int touchY = extraHeight; // Need to set touchable region only if input view is being shown - final MainKeyboardView keyboardView = mKeyboardSwitcher.getKeyboardView(); - if (keyboardView != null && keyboardView.isShown()) { + if (mainKeyboardView.isShown()) { if (mSuggestionsContainer.getVisibility() == View.VISIBLE) { touchY -= suggestionsHeight; } - final int touchWidth = inputView.getWidth(); - final int touchHeight = inputView.getHeight() + extraHeight + final int touchWidth = mainKeyboardView.getWidth(); + final int touchHeight = mainKeyboardView.getHeight() + extraHeight // Extend touchable region below the keyboard. + EXTENDED_TOUCHABLE_REGION_HEIGHT; outInsets.touchableInsets = InputMethodService.Insets.TOUCHABLE_INSETS_REGION; @@ -1358,7 +1365,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen showSuggestionStrip(suggestedWords, null); final String gestureFloatingPreviewText = (suggestedWords.size() > 0) ? suggestedWords.getWord(0) : null; - mKeyboardSwitcher.getKeyboardView() + mKeyboardSwitcher.getMainKeyboardView() .showGestureFloatingPreviewText(gestureFloatingPreviewText); } @@ -1367,7 +1374,11 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen mWordComposer.setBatchInputPointers(batchPointers); final SuggestedWords suggestedWords = getSuggestedWords(); showSuggestionStrip(suggestedWords, null); - mKeyboardSwitcher.getKeyboardView().showGestureFloatingPreviewText(null); + final String gestureFloatingPreviewText = (suggestedWords.size() > 0) + ? suggestedWords.getWord(0) : null; + final MainKeyboardView mainKeyboardView = mKeyboardSwitcher.getMainKeyboardView(); + mainKeyboardView.showGestureFloatingPreviewText(gestureFloatingPreviewText); + mainKeyboardView.dismissGestureFloatingPreviewText(); if (suggestedWords == null || suggestedWords.size() == 0) { return; } @@ -1557,7 +1568,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen keyY = y; } else { final KeyDetector keyDetector = - mKeyboardSwitcher.getKeyboardView().getKeyDetector(); + mKeyboardSwitcher.getMainKeyboardView().getKeyDetector(); keyX = keyDetector.getTouchX(x); keyY = keyDetector.getTouchY(y); } @@ -1659,9 +1670,9 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen private void handleClose() { commitTyped(LastComposedWord.NOT_A_SEPARATOR); requestHideSelf(0); - MainKeyboardView inputView = mKeyboardSwitcher.getKeyboardView(); - if (inputView != null) { - inputView.closing(); + final MainKeyboardView mainKeyboardView = mKeyboardSwitcher.getMainKeyboardView(); + if (mainKeyboardView != null) { + mainKeyboardView.closing(); } } @@ -2043,7 +2054,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen // onConfigurationChanged before SoftInputWindow is shown. initSuggest(); loadSettings(); - if (mKeyboardSwitcher.getKeyboardView() != null) { + if (mKeyboardSwitcher.getMainKeyboardView() != null) { // Reload keyboard because the current language has been changed. mKeyboardSwitcher.loadKeyboard(getCurrentInputEditorInfo(), mCurrentSettings); updateKeyboardViewGestureHandlingModeByMainDictionaryAvailability(); @@ -2055,11 +2066,11 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen } private void updateKeyboardViewGestureHandlingModeByMainDictionaryAvailability() { - final MainKeyboardView keyboardView = mKeyboardSwitcher.getKeyboardView(); - if (keyboardView != null) { + final MainKeyboardView mainKeyboardView = mKeyboardSwitcher.getMainKeyboardView(); + if (mainKeyboardView != null) { final boolean shouldHandleGesture = mCurrentSettings.mGestureInputEnabled && mIsMainDictionaryAvailable; - keyboardView.setGestureHandlingMode(shouldHandleGesture, + mainKeyboardView.setGestureHandlingMode(shouldHandleGesture, mCurrentSettings.mGesturePreviewTrailEnabled, mCurrentSettings.mGestureFloatingPreviewTextEnabled); } @@ -2068,7 +2079,8 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen // TODO: Remove this method from {@link LatinIME} and move {@link FeedbackManager} to // {@link KeyboardSwitcher}. Called from KeyboardSwitcher public void hapticAndAudioFeedback(final int primaryCode) { - mFeedbackManager.hapticAndAudioFeedback(primaryCode, mKeyboardSwitcher.getKeyboardView()); + mFeedbackManager.hapticAndAudioFeedback( + primaryCode, mKeyboardSwitcher.getMainKeyboardView()); } // Callback called by PointerTracker through the KeyboardActionListener. This is called when a @@ -2179,8 +2191,10 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen } public void showOptionDialog(AlertDialog dialog) { - final IBinder windowToken = mKeyboardSwitcher.getKeyboardView().getWindowToken(); - if (windowToken == null) return; + final IBinder windowToken = mKeyboardSwitcher.getMainKeyboardView().getWindowToken(); + if (windowToken == null) { + return; + } dialog.setCancelable(true); dialog.setCanceledOnTouchOutside(true); diff --git a/java/src/com/android/inputmethod/latin/Utils.java b/java/src/com/android/inputmethod/latin/Utils.java index 8f71de0e7..c6b5c338b 100644 --- a/java/src/com/android/inputmethod/latin/Utils.java +++ b/java/src/com/android/inputmethod/latin/Utils.java @@ -44,7 +44,6 @@ import java.io.IOException; import java.io.PrintWriter; import java.nio.channels.FileChannel; import java.text.SimpleDateFormat; -import java.util.ArrayList; import java.util.Date; import java.util.HashMap; @@ -220,7 +219,7 @@ public class Utils { } public static String getStackTrace() { - return getStackTrace(Integer.MAX_VALUE); + return getStackTrace(Integer.MAX_VALUE - 1); } public static class UsabilityStudyLogUtils { diff --git a/java/src/com/android/inputmethod/research/ResearchLogger.java b/java/src/com/android/inputmethod/research/ResearchLogger.java index 77c498648..3cad2d099 100644 --- a/java/src/com/android/inputmethod/research/ResearchLogger.java +++ b/java/src/com/android/inputmethod/research/ResearchLogger.java @@ -209,7 +209,7 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang if (mSplashDialog != null && mSplashDialog.isShowing()) { return; } - final IBinder windowToken = mKeyboardSwitcher.getKeyboardView().getWindowToken(); + final IBinder windowToken = mKeyboardSwitcher.getMainKeyboardView().getWindowToken(); if (windowToken == null) { return; } @@ -520,11 +520,11 @@ public class ResearchLogger implements SharedPreferences.OnSharedPreferenceChang if (mKeyboardSwitcher == null) { return; } - final KeyboardView keyboardView = mKeyboardSwitcher.getKeyboardView(); - if (keyboardView == null) { + final KeyboardView mainKeyboardView = mKeyboardSwitcher.getMainKeyboardView(); + if (mainKeyboardView == null) { return; } - keyboardView.invalidateAllKeys(); + mainKeyboardView.invalidateAllKeys(); } diff --git a/tests/src/com/android/inputmethod/keyboard/internal/KeyboardStateMultiTouchTests.java b/tests/src/com/android/inputmethod/keyboard/internal/KeyboardStateMultiTouchTests.java index 64cf7a61b..f5ad7239e 100644 --- a/tests/src/com/android/inputmethod/keyboard/internal/KeyboardStateMultiTouchTests.java +++ b/tests/src/com/android/inputmethod/keyboard/internal/KeyboardStateMultiTouchTests.java @@ -420,38 +420,38 @@ public class KeyboardStateMultiTouchTests extends KeyboardStateTestsBase { public void testDoubleTapShiftAndChording() { // TODO: The following tests fail due to bug. Temporarily commented. - // First shift key tap. - pressAndReleaseKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED); - // Second shift key tap, maybe shift locked. - secondPressKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED); - // Press/release letter key, remain in manual shifted. - chordingPressAndReleaseKey('A', ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED); - // Release shift key, back to alphabet shifted (not shift locked). - releaseKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED); - - // Long press shift key, enter alphabet shift locked. - longPressAndReleaseKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED, - ALPHABET_SHIFT_LOCKED); - // First shift key tap. - pressAndReleaseKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED, ALPHABET_UNSHIFTED); - // Second shift key tap, maybe shift unlocked. - secondPressKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED); - // Press/release letter key, remain in manual shifted. - chordingPressAndReleaseKey('A', ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED); - // Release shift key, back to alphabet (not shift locked). - releaseKey(CODE_SHIFT, ALPHABET_UNSHIFTED); - - // Set capitalize the first character of all words mode. - setAutoCapsMode(CAP_MODE_WORDS); - // Load keyboard, should be in automatic shifted. - loadKeyboard(ALPHABET_AUTOMATIC_SHIFTED); - // First shift key tap. - pressAndReleaseKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED, ALPHABET_UNSHIFTED); - // Second shift key tap, maybe shift locked. - secondPressKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED); - // Press/release letter key, remain in manual shifted. - chordingPressAndReleaseKey('A', ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED); - // Release shift key, back to alphabet (not shift locked). - releaseKey(CODE_SHIFT, ALPHABET_UNSHIFTED); +// // First shift key tap. +// pressAndReleaseKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED); +// // Second shift key tap, maybe shift locked. +// secondPressKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED); +// // Press/release letter key, remain in manual shifted. +// chordingPressAndReleaseKey('A', ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED); +// // Release shift key, back to alphabet shifted (not shift locked). +// releaseKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED); +// +// // Long press shift key, enter alphabet shift locked. +// longPressAndReleaseKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED, +// ALPHABET_SHIFT_LOCKED); +// // First shift key tap. +// pressAndReleaseKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED, ALPHABET_UNSHIFTED); +// // Second shift key tap, maybe shift unlocked. +// secondPressKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED); +// // Press/release letter key, remain in manual shifted. +// chordingPressAndReleaseKey('A', ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED); +// // Release shift key, back to alphabet (not shift locked). +// releaseKey(CODE_SHIFT, ALPHABET_UNSHIFTED); +// +// // Set capitalize the first character of all words mode. +// setAutoCapsMode(CAP_MODE_WORDS); +// // Load keyboard, should be in automatic shifted. +// loadKeyboard(ALPHABET_AUTOMATIC_SHIFTED); +// // First shift key tap. +// pressAndReleaseKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED, ALPHABET_UNSHIFTED); +// // Second shift key tap, maybe shift locked. +// secondPressKey(CODE_SHIFT, ALPHABET_MANUAL_SHIFTED); +// // Press/release letter key, remain in manual shifted. +// chordingPressAndReleaseKey('A', ALPHABET_MANUAL_SHIFTED, ALPHABET_MANUAL_SHIFTED); +// // Release shift key, back to alphabet (not shift locked). +// releaseKey(CODE_SHIFT, ALPHABET_UNSHIFTED); } } diff --git a/tests/src/com/android/inputmethod/keyboard/internal/PointerTrackerQueueTests.java b/tests/src/com/android/inputmethod/keyboard/internal/PointerTrackerQueueTests.java new file mode 100644 index 000000000..99fbc967d --- /dev/null +++ b/tests/src/com/android/inputmethod/keyboard/internal/PointerTrackerQueueTests.java @@ -0,0 +1,316 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.android.inputmethod.keyboard.internal; + +import android.test.AndroidTestCase; + +public class PointerTrackerQueueTests extends AndroidTestCase { + public static class Element implements PointerTrackerQueue.ElementActions { + public static int sPhantomUpCount; + public static final long NOT_HAPPENED = -1; + + public final int mId; + public boolean mIsModifier; + public boolean mIsInSlidingKeyInput; + public long mPhantomUpEventTime = NOT_HAPPENED; + + public Element(int id) { + mId = id; + } + + @Override + public boolean isModifier() { + return mIsModifier; + } + + @Override + public boolean isInSlidingKeyInput() { + return mIsInSlidingKeyInput; + } + + @Override + public void onPhantomUpEvent(long eventTime) { + sPhantomUpCount++; + mPhantomUpEventTime = eventTime + sPhantomUpCount; + } + + @Override + public String toString() { + return Integer.toString(mId); + } + } + + private final Element mElement1 = new Element(1); + private final Element mElement2 = new Element(2); + private final Element mElement3 = new Element(3); + private final Element mElement4 = new Element(4); + private final PointerTrackerQueue mQueue = new PointerTrackerQueue(); + + public void testEmpty() { + assertEquals("empty queue", 0, mQueue.size()); + assertEquals("empty queue", "[]", mQueue.toString()); + } + + public void testAdd() { + mQueue.add(mElement1); + assertEquals("add element1", 1, mQueue.size()); + assertEquals("after adding element1", "[1]", mQueue.toString()); + mQueue.add(mElement2); + assertEquals("add element2", 2, mQueue.size()); + assertEquals("after adding element2", "[1 2]", mQueue.toString()); + mQueue.add(mElement3); + assertEquals("add element3", 3, mQueue.size()); + assertEquals("after adding element3", "[1 2 3]", mQueue.toString()); + mQueue.add(mElement4); + assertEquals("add element4", 4, mQueue.size()); + assertEquals("after adding element4", "[1 2 3 4]", mQueue.toString()); + } + + public void testRemove() { + Element.sPhantomUpCount = 0; + + mQueue.add(mElement1); + mQueue.add(mElement2); + mQueue.add(mElement3); + mQueue.add(mElement4); + + mQueue.remove(mElement2); + assertEquals("remove element2", 3, mQueue.size()); + assertEquals("after removing element2", "[1 3 4]", mQueue.toString()); + mQueue.remove(mElement4); + assertEquals("remove element4", 2, mQueue.size()); + assertEquals("after removing element4", "[1 3]", mQueue.toString()); + mQueue.remove(mElement4); + assertEquals("remove element4 again", 2, mQueue.size()); + assertEquals("after removing element4 again", "[1 3]", mQueue.toString()); + mQueue.remove(mElement1); + assertEquals("remove element1", 1, mQueue.size()); + assertEquals("after removing element4", "[3]", mQueue.toString()); + mQueue.remove(mElement3); + assertEquals("remove element3", 0, mQueue.size()); + assertEquals("after removing element3", "[]", mQueue.toString()); + mQueue.remove(mElement1); + assertEquals("remove element1 again", 0, mQueue.size()); + assertEquals("after removing element1 again", "[]", mQueue.toString()); + + assertEquals("after remove elements", 0, Element.sPhantomUpCount); + assertEquals("after remove element1", + Element.NOT_HAPPENED, mElement1.mPhantomUpEventTime); + assertEquals("after remove element2", + Element.NOT_HAPPENED, mElement2.mPhantomUpEventTime); + assertEquals("after remove element3", + Element.NOT_HAPPENED, mElement3.mPhantomUpEventTime); + assertEquals("after remove element4", + Element.NOT_HAPPENED, mElement4.mPhantomUpEventTime); + } + + public void testAddAndRemove() { + Element.sPhantomUpCount = 0; + + mQueue.add(mElement1); + mQueue.add(mElement2); + mQueue.add(mElement3); + mQueue.add(mElement4); + + mQueue.remove(mElement2); + assertEquals("remove element2", 3, mQueue.size()); + assertEquals("after removing element2", "[1 3 4]", mQueue.toString()); + mQueue.remove(mElement4); + assertEquals("remove element4", 2, mQueue.size()); + assertEquals("after removing element4", "[1 3]", mQueue.toString()); + mQueue.add(mElement2); + assertEquals("add element2", 3, mQueue.size()); + assertEquals("after adding element2", "[1 3 2]", mQueue.toString()); + mQueue.remove(mElement4); + assertEquals("remove element4 again", 3, mQueue.size()); + assertEquals("after removing element4 again", "[1 3 2]", mQueue.toString()); + mQueue.remove(mElement1); + assertEquals("remove element1", 2, mQueue.size()); + assertEquals("after removing element4", "[3 2]", mQueue.toString()); + mQueue.add(mElement1); + assertEquals("add element1", 3, mQueue.size()); + assertEquals("after adding element1", "[3 2 1]", mQueue.toString()); + mQueue.remove(mElement3); + assertEquals("remove element3", 2, mQueue.size()); + assertEquals("after removing element3", "[2 1]", mQueue.toString()); + mQueue.remove(mElement1); + assertEquals("remove element1 again", 1, mQueue.size()); + assertEquals("after removing element1 again", "[2]", mQueue.toString()); + + assertEquals("after remove element1", + Element.NOT_HAPPENED, mElement1.mPhantomUpEventTime); + assertEquals("after remove element2", + Element.NOT_HAPPENED, mElement2.mPhantomUpEventTime); + assertEquals("after remove element3", + Element.NOT_HAPPENED, mElement3.mPhantomUpEventTime); + assertEquals("after remove element4", + Element.NOT_HAPPENED, mElement4.mPhantomUpEventTime); + } + + public void testReleaseAllPointers() { + mElement2.mIsModifier = true; + mQueue.add(mElement1); + mQueue.add(mElement2); + mQueue.add(mElement3); + mQueue.add(mElement4); + + final long eventTime = 123; + Element.sPhantomUpCount = 0; + mQueue.releaseAllPointers(eventTime); + assertEquals("after releaseAllPointers", 4, Element.sPhantomUpCount); + assertEquals("after releaseAllPointers", 0, mQueue.size()); + assertEquals("after releaseAllPointers", "[]", mQueue.toString()); + assertEquals("after releaseAllPointers element1", + eventTime + 1, mElement1.mPhantomUpEventTime); + assertEquals("after releaseAllPointers element2", + eventTime + 2, mElement2.mPhantomUpEventTime); + assertEquals("after releaseAllPointers element3", + eventTime + 3, mElement3.mPhantomUpEventTime); + assertEquals("after releaseAllPointers element4", + eventTime + 4, mElement4.mPhantomUpEventTime); + } + + public void testReleaseAllPointersOlderThan() { + mElement2.mIsModifier = true; + mQueue.add(mElement1); + mQueue.add(mElement2); + mQueue.add(mElement3); + mQueue.add(mElement4); + + final long eventTime = 123; + Element.sPhantomUpCount = 0; + mQueue.releaseAllPointersOlderThan(mElement4, eventTime); + assertEquals("after releaseAllPointersOlderThan", 2, Element.sPhantomUpCount); + assertEquals("after releaseAllPointersOlderThan", 2, mQueue.size()); + assertEquals("after releaseAllPointersOlderThan", "[2 4]", mQueue.toString()); + assertEquals("after releaseAllPointersOlderThan element1", + eventTime + 1, mElement1.mPhantomUpEventTime); + assertEquals("after releaseAllPointersOlderThan element2", + Element.NOT_HAPPENED, mElement2.mPhantomUpEventTime); + assertEquals("after releaseAllPointersOlderThan element3", + eventTime + 2, mElement3.mPhantomUpEventTime); + assertEquals("after releaseAllPointersOlderThan element4", + Element.NOT_HAPPENED, mElement4.mPhantomUpEventTime); + } + + public void testReleaseAllPointersOlderThanWithoutModifier() { + mQueue.add(mElement1); + mQueue.add(mElement2); + mQueue.add(mElement3); + mQueue.add(mElement4); + + final long eventTime = 123; + Element.sPhantomUpCount = 0; + mQueue.releaseAllPointersOlderThan(mElement4, eventTime); + assertEquals("after releaseAllPointersOlderThan without modifier", + 3, Element.sPhantomUpCount); + assertEquals("after releaseAllPointersOlderThan without modifier", 1, mQueue.size()); + assertEquals("after releaseAllPointersOlderThan without modifier", + "[4]", mQueue.toString()); + assertEquals("after releaseAllPointersOlderThan without modifier element1", + eventTime + 1, mElement1.mPhantomUpEventTime); + assertEquals("after releaseAllPointersOlderThan without modifier element2", + eventTime + 2, mElement2.mPhantomUpEventTime); + assertEquals("after releaseAllPointersOlderThan without modifier element3", + eventTime + 3, mElement3.mPhantomUpEventTime); + assertEquals("after releaseAllPointersOlderThan without modifier element4", + Element.NOT_HAPPENED, mElement4.mPhantomUpEventTime); + } + + public void testReleaseAllPointersExcept() { + mElement2.mIsModifier = true; + mQueue.add(mElement1); + mQueue.add(mElement2); + mQueue.add(mElement3); + mQueue.add(mElement4); + + final long eventTime = 123; + Element.sPhantomUpCount = 0; + mQueue.releaseAllPointersExcept(mElement3, eventTime); + assertEquals("after releaseAllPointersExcept", 3, Element.sPhantomUpCount); + assertEquals("after releaseAllPointersExcept", 1, mQueue.size()); + assertEquals("after releaseAllPointersExcept", "[3]", mQueue.toString()); + assertEquals("after releaseAllPointersExcept element1", + eventTime + 1, mElement1.mPhantomUpEventTime); + assertEquals("after releaseAllPointersExcept element2", + eventTime + 2, mElement2.mPhantomUpEventTime); + assertEquals("after releaseAllPointersExcept element3", + Element.NOT_HAPPENED, mElement3.mPhantomUpEventTime); + assertEquals("after releaseAllPointersExcept element4", + eventTime + 3, mElement4.mPhantomUpEventTime); + } + + public void testHasModifierKeyOlderThan() { + Element.sPhantomUpCount = 0; + assertFalse("hasModifierKeyOlderThan empty", mQueue.hasModifierKeyOlderThan(mElement1)); + + mQueue.add(mElement1); + mQueue.add(mElement2); + mQueue.add(mElement3); + mQueue.add(mElement4); + + assertFalse("hasModifierKeyOlderThan element1", mQueue.hasModifierKeyOlderThan(mElement1)); + assertFalse("hasModifierKeyOlderThan element2", mQueue.hasModifierKeyOlderThan(mElement2)); + assertFalse("hasModifierKeyOlderThan element3", mQueue.hasModifierKeyOlderThan(mElement3)); + assertFalse("hasModifierKeyOlderThan element4", mQueue.hasModifierKeyOlderThan(mElement4)); + + mElement2.mIsModifier = true; + assertFalse("hasModifierKeyOlderThan element1", mQueue.hasModifierKeyOlderThan(mElement1)); + assertFalse("hasModifierKeyOlderThan element2", mQueue.hasModifierKeyOlderThan(mElement2)); + assertTrue("hasModifierKeyOlderThan element3", mQueue.hasModifierKeyOlderThan(mElement3)); + assertTrue("hasModifierKeyOlderThan element4", mQueue.hasModifierKeyOlderThan(mElement4)); + + assertEquals("after hasModifierKeyOlderThan", 0, Element.sPhantomUpCount); + assertEquals("after hasModifierKeyOlderThan", 4, mQueue.size()); + assertEquals("after hasModifierKeyOlderThan", "[1 2 3 4]", mQueue.toString()); + assertEquals("after hasModifierKeyOlderThan element1", + Element.NOT_HAPPENED, mElement1.mPhantomUpEventTime); + assertEquals("after hasModifierKeyOlderThan element2", + Element.NOT_HAPPENED, mElement2.mPhantomUpEventTime); + assertEquals("after hasModifierKeyOlderThan element3", + Element.NOT_HAPPENED, mElement3.mPhantomUpEventTime); + assertEquals("after hasModifierKeyOlderThan element4", + Element.NOT_HAPPENED, mElement4.mPhantomUpEventTime); + } + + public void testIsAnyInSlidingKeyInput() { + Element.sPhantomUpCount = 0; + assertFalse("isAnyInSlidingKeyInput empty", mQueue.isAnyInSlidingKeyInput()); + + mQueue.add(mElement1); + mQueue.add(mElement2); + mQueue.add(mElement3); + mQueue.add(mElement4); + + assertFalse("isAnyInSlidingKeyInput element1", mQueue.isAnyInSlidingKeyInput()); + + mElement3.mIsInSlidingKeyInput = true; + assertTrue("isAnyInSlidingKeyInput element1", mQueue.isAnyInSlidingKeyInput()); + + assertEquals("after isAnyInSlidingKeyInput", 0, Element.sPhantomUpCount); + assertEquals("after isAnyInSlidingKeyInput", 4, mQueue.size()); + assertEquals("after isAnyInSlidingKeyInput", "[1 2 3 4]", mQueue.toString()); + assertEquals("after isAnyInSlidingKeyInput element1", + Element.NOT_HAPPENED, mElement1.mPhantomUpEventTime); + assertEquals("after isAnyInSlidingKeyInput element2", + Element.NOT_HAPPENED, mElement2.mPhantomUpEventTime); + assertEquals("after isAnyInSlidingKeyInput element3", + Element.NOT_HAPPENED, mElement3.mPhantomUpEventTime); + assertEquals("after isAnyInSlidingKeyInput element4", + Element.NOT_HAPPENED, mElement4.mPhantomUpEventTime); + } +} diff --git a/tools/dicttool/etc/Android.mk b/tools/dicttool/etc/Android.mk index 03d4a96ee..1eab70fc1 100644 --- a/tools/dicttool/etc/Android.mk +++ b/tools/dicttool/etc/Android.mk @@ -16,5 +16,5 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := eng -LOCAL_PREBUILT_EXECUTABLES := dicttool +LOCAL_PREBUILT_EXECUTABLES := dicttool makedict include $(BUILD_HOST_PREBUILT) diff --git a/tools/makedict/etc/Android.mk b/tools/dicttool/etc/makedict old mode 100644 new mode 100755 similarity index 64% rename from tools/makedict/etc/Android.mk rename to tools/dicttool/etc/makedict index 1b7d7cf0e..fffeb2376 --- a/tools/makedict/etc/Android.mk +++ b/tools/dicttool/etc/makedict @@ -1,10 +1,11 @@ -# Copyright (C) 2011 The Android Open Source Project +#!/bin/sh +# Copyright (C) 2012, The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # -# http://www.apache.org/licenses/LICENSE-2.0 +# http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, @@ -12,8 +13,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -LOCAL_PATH := $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_PREBUILT_EXECUTABLES := makedict -include $(BUILD_HOST_PREBUILT) +# Dicttool supports making the dictionary using the 'makedict' command and +# the same arguments that the old 'makedict' command used to accept. +dicttool makedict $@ diff --git a/tools/makedict/Android.mk b/tools/makedict/Android.mk deleted file mode 100644 index cac3a831c..000000000 --- a/tools/makedict/Android.mk +++ /dev/null @@ -1,29 +0,0 @@ -# -# Copyright (C) 2011 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -LOCAL_PATH := $(call my-dir) -include $(CLEAR_VARS) - -MAKEDICT_CORE_SOURCE_DIRECTORY := ../../java/src/com/android/inputmethod/latin/makedict - -LOCAL_MAIN_SRC_FILES := $(call all-java-files-under,$(MAKEDICT_CORE_SOURCE_DIRECTORY)) -LOCAL_TOOL_SRC_FILES := $(call all-java-files-under,src) -LOCAL_SRC_FILES := $(LOCAL_TOOL_SRC_FILES) -LOCAL_JAR_MANIFEST := etc/manifest.txt -LOCAL_MODULE := makedict -LOCAL_JAVA_LIBRARIES := junit - -include $(BUILD_HOST_JAVA_LIBRARY) -include $(LOCAL_PATH)/etc/Android.mk diff --git a/tools/makedict/etc/makedict b/tools/makedict/etc/makedict deleted file mode 100755 index 7c1c02e85..000000000 --- a/tools/makedict/etc/makedict +++ /dev/null @@ -1,63 +0,0 @@ -#!/bin/sh -# Copyright 2011, The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# Set up prog to be the path of this script, including following symlinks, -# and set up progdir to be the fully-qualified pathname of its directory. -prog="$0" -while [ -h "${prog}" ]; do - newProg=`/bin/ls -ld "${prog}"` - newProg=`expr "${newProg}" : ".* -> \(.*\)$"` - if expr "x${newProg}" : 'x/' >/dev/null; then - prog="${newProg}" - else - progdir=`dirname "${prog}"` - prog="${progdir}/${newProg}" - fi -done -oldwd=`pwd` -progdir=`dirname "${prog}"` -cd "${progdir}" -progdir=`pwd` -prog="${progdir}"/`basename "${prog}"` -cd "${oldwd}" - -jarfile=makedict.jar -frameworkdir="$progdir" -if [ ! -r "$frameworkdir/$jarfile" ] -then - frameworkdir=`dirname "$progdir"`/tools/lib - libdir=`dirname "$progdir"`/tools/lib -fi -if [ ! -r "$frameworkdir/$jarfile" ] -then - frameworkdir=`dirname "$progdir"`/framework - libdir=`dirname "$progdir"`/lib -fi -if [ ! -r "$frameworkdir/$jarfile" ] -then - echo `basename "$prog"`": can't find $jarfile" - exit 1 -fi - -if [ "$OSTYPE" = "cygwin" ] ; then - jarpath=`cygpath -w "$frameworkdir/$jarfile"` - progdir=`cygpath -w "$progdir"` -else - jarpath="$frameworkdir/$jarfile" -fi - -# need to use "java.ext.dirs" because "-jar" causes classpath to be ignored -# might need more memory, e.g. -Xmx128M -exec java -ea -Djava.ext.dirs="$frameworkdir" -jar "$jarpath" "$@" diff --git a/tools/makedict/etc/manifest.txt b/tools/makedict/etc/manifest.txt deleted file mode 100644 index 4f085e7c8..000000000 --- a/tools/makedict/etc/manifest.txt +++ /dev/null @@ -1 +0,0 @@ -Main-Class: com.android.inputmethod.latin.makedict.DictionaryMaker