Merge "Don't start long press timer while other one is running"
diff --git a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
index 8b4986f..e8a8971 100644
--- a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
@@ -425,8 +425,8 @@
      */
     @Override
     public void setKeyboard(final Keyboard keyboard) {
-        // Remove any pending messages, except dismissing preview and key repeat.
-        mKeyTimerHandler.cancelLongPressTimer();
+        // Remove any pending messages.
+        mKeyTimerHandler.cancelAllKeyTimers();
         super.setKeyboard(keyboard);
         mKeyDetector.setKeyboard(
                 keyboard, -getPaddingLeft(), -getPaddingTop() + getVerticalCorrection());
@@ -987,7 +987,7 @@
         if (mNonDistinctMultitouchHelper != null) {
             if (me.getPointerCount() > 1 && mKeyTimerHandler.isInKeyRepeat()) {
                 // Key repeating timer will be canceled if 2 or more keys are in action.
-                mKeyTimerHandler.cancelKeyRepeatTimer();
+                mKeyTimerHandler.cancelKeyRepeatTimers();
             }
             // Non distinct multitouch screen support
             mNonDistinctMultitouchHelper.processMotionEvent(me, mKeyDetector);
diff --git a/java/src/com/android/inputmethod/keyboard/PointerTracker.java b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
index f4329b4..ae6aee4 100644
--- a/java/src/com/android/inputmethod/keyboard/PointerTracker.java
+++ b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
@@ -67,13 +67,13 @@
     public interface TimerProxy {
         public void startTypingStateTimer(Key typedKey);
         public boolean isTypingState();
-        public void startKeyRepeatTimer(PointerTracker tracker, int repeatCount, int delay);
-        public void startLongPressTimer(PointerTracker tracker, int delay);
-        public void cancelLongPressTimer();
+        public void startKeyRepeatTimerOf(PointerTracker tracker, int repeatCount, int delay);
+        public void startLongPressTimerOf(PointerTracker tracker, int delay);
+        public void cancelLongPressTimerOf(PointerTracker tracker);
+        public void cancelKeyTimersOf(PointerTracker tracker);
         public void startDoubleTapShiftKeyTimer();
         public void cancelDoubleTapShiftKeyTimer();
         public boolean isInDoubleTapShiftKeyTimeout();
-        public void cancelKeyTimers();
         public void startUpdateBatchInputTimer(PointerTracker tracker);
         public void cancelUpdateBatchInputTimer(PointerTracker tracker);
         public void cancelAllUpdateBatchInputTimers();
@@ -84,11 +84,13 @@
             @Override
             public boolean isTypingState() { return false; }
             @Override
-            public void startKeyRepeatTimer(PointerTracker tracker, int repeatCount, int delay) {}
+            public void startKeyRepeatTimerOf(PointerTracker tracker, int repeatCount, int delay) {}
             @Override
-            public void startLongPressTimer(PointerTracker tracker, int delay) {}
+            public void startLongPressTimerOf(PointerTracker tracker, int delay) {}
             @Override
-            public void cancelLongPressTimer() {}
+            public void cancelLongPressTimerOf(PointerTracker tracker) {}
+            @Override
+            public void cancelKeyTimersOf(PointerTracker tracker) {}
             @Override
             public void startDoubleTapShiftKeyTimer() {}
             @Override
@@ -96,8 +98,6 @@
             @Override
             public boolean isInDoubleTapShiftKeyTimeout() { return false; }
             @Override
-            public void cancelKeyTimers() {}
-            @Override
             public void startUpdateBatchInputTimer(PointerTracker tracker) {}
             @Override
             public void cancelUpdateBatchInputTimer(PointerTracker tracker) {}
@@ -741,7 +741,7 @@
             sListener.onStartBatchInput();
             dismissAllMoreKeysPanels();
         }
-        sTimerProxy.cancelLongPressTimer();
+        sTimerProxy.cancelLongPressTimerOf(this);
         // A gesture floating preview text will be shown at the oldest pointer/finger on the screen.
         sDrawingProxy.showGestureTrail(
                 this, isOldestTrackerInQueue() /* showsFloatingPreviewText */);
@@ -1072,7 +1072,7 @@
         setReleasedKeyGraphics(oldKey);
         callListenerOnRelease(oldKey, oldKey.getCode(), true /* withSliding */);
         startKeySelectionByDraggingFinger(oldKey);
-        sTimerProxy.cancelKeyTimers();
+        sTimerProxy.cancelKeyTimersOf(this);
     }
 
     private void dragFingerFromOldKeyToNewKey(final Key key, final int x, final int y,
@@ -1195,15 +1195,12 @@
         if (DEBUG_EVENT) {
             printTouchEvent("onPhntEvent:", mLastX, mLastY, eventTime);
         }
-        if (isShowingMoreKeysPanel()) {
-            return;
-        }
         onUpEventInternal(mLastX, mLastY, eventTime);
         cancelTrackingForAction();
     }
 
     private void onUpEventInternal(final int x, final int y, final long eventTime) {
-        sTimerProxy.cancelKeyTimers();
+        sTimerProxy.cancelKeyTimersOf(this);
         final boolean isInDraggingFinger = mIsInDraggingFinger;
         final boolean isInSlidingKeyInput = mIsInSlidingKeyInput;
         resetKeySelectionByDraggingFinger();
@@ -1282,7 +1279,7 @@
     }
 
     private void onCancelEventInternal() {
-        sTimerProxy.cancelKeyTimers();
+        sTimerProxy.cancelKeyTimersOf(this);
         setReleasedKeyGraphics(mCurrentKey);
         resetKeySelectionByDraggingFinger();
         if (isShowingMoreKeysPanel()) {
@@ -1345,7 +1342,7 @@
         if (mIsInDraggingFinger && key.getMoreKeys() == null) return;
 
         final int delay = getLongPressTimeout(key.getCode());
-        sTimerProxy.startLongPressTimer(this, delay);
+        sTimerProxy.startLongPressTimerOf(this, delay);
     }
 
     private int getLongPressTimeout(final int code) {
@@ -1398,7 +1395,7 @@
     private void startKeyRepeatTimer(final int repeatCount) {
         final int delay =
                 (repeatCount == 1) ? sParams.mKeyRepeatStartTimeout : sParams.mKeyRepeatInterval;
-        sTimerProxy.startKeyRepeatTimer(this, repeatCount, delay);
+        sTimerProxy.startKeyRepeatTimerOf(this, repeatCount, delay);
     }
 
     private void printTouchEvent(final String title, final int x, final int y,
diff --git a/java/src/com/android/inputmethod/keyboard/internal/TimerHandler.java b/java/src/com/android/inputmethod/keyboard/internal/TimerHandler.java
index 966cb95..88d0878 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/TimerHandler.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/TimerHandler.java
@@ -66,6 +66,7 @@
             tracker.onKeyRepeat(msg.arg1 /* code */, msg.arg2 /* repeatCount */);
             break;
         case MSG_LONGPRESS_KEY:
+            cancelLongPressTimers();
             callbacks.onLongPress(tracker);
             break;
         case MSG_UPDATE_BATCH_INPUT:
@@ -76,7 +77,7 @@
     }
 
     @Override
-    public void startKeyRepeatTimer(final PointerTracker tracker, final int repeatCount,
+    public void startKeyRepeatTimerOf(final PointerTracker tracker, final int repeatCount,
             final int delay) {
         final Key key = tracker.getKey();
         if (key == null || delay == 0) {
@@ -86,7 +87,11 @@
                 obtainMessage(MSG_REPEAT_KEY, key.getCode(), repeatCount, tracker), delay);
     }
 
-    public void cancelKeyRepeatTimer() {
+    private void cancelKeyRepeatTimerOf(final PointerTracker tracker) {
+        removeMessages(MSG_REPEAT_KEY, tracker);
+    }
+
+    public void cancelKeyRepeatTimers() {
         removeMessages(MSG_REPEAT_KEY);
     }
 
@@ -96,14 +101,19 @@
     }
 
     @Override
-    public void startLongPressTimer(final PointerTracker tracker, final int delay) {
-        cancelLongPressTimer();
-        if (delay <= 0) return;
+    public void startLongPressTimerOf(final PointerTracker tracker, final int delay) {
+        if (delay <= 0) {
+            return;
+        }
         sendMessageDelayed(obtainMessage(MSG_LONGPRESS_KEY, tracker), delay);
     }
 
     @Override
-    public void cancelLongPressTimer() {
+    public void cancelLongPressTimerOf(final PointerTracker tracker) {
+        removeMessages(MSG_LONGPRESS_KEY, tracker);
+    }
+
+    private void cancelLongPressTimers() {
         removeMessages(MSG_LONGPRESS_KEY);
     }
 
@@ -159,9 +169,14 @@
     }
 
     @Override
-    public void cancelKeyTimers() {
-        cancelKeyRepeatTimer();
-        cancelLongPressTimer();
+    public void cancelKeyTimersOf(final PointerTracker tracker) {
+        cancelKeyRepeatTimerOf(tracker);
+        cancelLongPressTimerOf(tracker);
+    }
+
+    public void cancelAllKeyTimers() {
+        cancelKeyRepeatTimers();
+        cancelLongPressTimers();
     }
 
     @Override
@@ -185,7 +200,7 @@
     }
 
     public void cancelAllMessages() {
-        cancelKeyTimers();
+        cancelAllKeyTimers();
         cancelAllUpdateBatchInputTimers();
     }
 }