Holding PointerTrackerQueue inside PointerTracker

Bug: 4768084
Change-Id: Id5006e549c4018a656abd088f14a209415baafed
diff --git a/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java b/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java
index a87ff98..b18cbd3 100644
--- a/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java
+++ b/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java
@@ -200,8 +200,8 @@
     }
 
     private void fireKeyPressEvent(PointerTracker tracker, int x, int y, long eventTime) {
-        tracker.onDownEvent(x, y, eventTime, null);
-        tracker.onUpEvent(x, y, eventTime + DELAY_KEY_PRESS, null);
+        tracker.onDownEvent(x, y, eventTime);
+        tracker.onUpEvent(x, y, eventTime + DELAY_KEY_PRESS);
     }
 
     private class KeyboardFlickGestureDetector extends FlickGestureDetector {
diff --git a/java/src/com/android/inputmethod/keyboard/LatinKeyboardBaseView.java b/java/src/com/android/inputmethod/keyboard/LatinKeyboardBaseView.java
index c8cfb43..e5b0de7 100644
--- a/java/src/com/android/inputmethod/keyboard/LatinKeyboardBaseView.java
+++ b/java/src/com/android/inputmethod/keyboard/LatinKeyboardBaseView.java
@@ -74,7 +74,7 @@
     private final ArrayList<PointerTracker> mPointerTrackers = new ArrayList<PointerTracker>();
 
     // TODO: Let the PointerTracker class manage this pointer queue
-    private final PointerTrackerQueue mPointerQueue = new PointerTrackerQueue();
+    private final PointerTrackerQueue mPointerQueue;
 
     private final boolean mHasDistinctMultitouch;
     private int mOldPointerCount = 1;
@@ -268,6 +268,8 @@
         mHasDistinctMultitouch = context.getPackageManager()
                 .hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH_DISTINCT);
         mKeyRepeatInterval = res.getInteger(R.integer.config_key_repeat_interval);
+
+        mPointerQueue = mHasDistinctMultitouch ? new PointerTrackerQueue() : null;
     }
 
     public void startIgnoringDoubleTap() {
@@ -365,20 +367,20 @@
         boolean result = onLongPress(parentKey, tracker);
         if (result) {
             dismissAllKeyPreviews();
-            tracker.onLongPressed(mPointerQueue);
+            tracker.onLongPressed();
         }
         return result;
     }
 
     private void onLongPressShiftKey(PointerTracker tracker) {
-        tracker.onLongPressed(mPointerQueue);
+        tracker.onLongPressed();
         mKeyboardActionListener.onCodeInput(Keyboard.CODE_CAPSLOCK, null, 0, 0);
     }
 
     private void onDoubleTapShiftKey(@SuppressWarnings("unused") PointerTracker tracker) {
         // When shift key is double tapped, the first tap is correctly processed as usual tap. And
         // the second tap is treated as this double tap event, so that we need not mark tracker
-        // calling setAlreadyProcessed() nor remove the tracker from mPointerQueueueue.
+        // calling setAlreadyProcessed() nor remove the tracker from mPointerQueue.
         mKeyboardActionListener.onCodeInput(Keyboard.CODE_CAPSLOCK, null, 0, 0);
     }
 
@@ -482,7 +484,7 @@
         for (int i = pointers.size(); i <= id; i++) {
             final PointerTracker tracker =
                 new PointerTracker(i, getContext(), mKeyTimerHandler, mKeyDetector, this,
-                        mHasDistinctMultitouch);
+                        mPointerQueue);
             if (keyboard != null)
                 tracker.setKeyboard(keyboard, mKeyDetector);
             if (listener != null)
@@ -565,9 +567,9 @@
                 // previous key.
                 final int newKeyIndex = tracker.getKeyIndexOn(x, y);
                 if (mOldKeyIndex != newKeyIndex) {
-                    tracker.onDownEvent(x, y, eventTime, null);
+                    tracker.onDownEvent(x, y, eventTime);
                     if (action == MotionEvent.ACTION_UP)
-                        tracker.onUpEvent(x, y, eventTime, null);
+                        tracker.onUpEvent(x, y, eventTime);
                 }
             } else if (pointerCount == 2 && oldPointerCount == 1) {
                 // Single-touch to multi-touch transition.
@@ -575,9 +577,9 @@
                 final int lastX = tracker.getLastX();
                 final int lastY = tracker.getLastY();
                 mOldKeyIndex = tracker.getKeyIndexOn(lastX, lastY);
-                tracker.onUpEvent(lastX, lastY, eventTime, null);
+                tracker.onUpEvent(lastX, lastY, eventTime);
             } else if (pointerCount == 1 && oldPointerCount == 1) {
-                tracker.onTouchEvent(action, x, y, eventTime, null);
+                tracker.onTouchEvent(action, x, y, eventTime);
             } else {
                 Log.w(TAG, "Unknown touch panel behavior: pointer count is " + pointerCount
                         + " (old " + oldPointerCount + ")");
@@ -585,25 +587,24 @@
             return true;
         }
 
-        final PointerTrackerQueue queue = mPointerQueue;
         if (action == MotionEvent.ACTION_MOVE) {
             for (int i = 0; i < pointerCount; i++) {
                 final PointerTracker tracker = getPointerTracker(me.getPointerId(i));
-                tracker.onMoveEvent((int)me.getX(i), (int)me.getY(i), eventTime, queue);
+                tracker.onMoveEvent((int)me.getX(i), (int)me.getY(i), eventTime);
             }
         } else {
             final PointerTracker tracker = getPointerTracker(id);
             switch (action) {
             case MotionEvent.ACTION_DOWN:
             case MotionEvent.ACTION_POINTER_DOWN:
-                tracker.onDownEvent(x, y, eventTime, queue);
+                tracker.onDownEvent(x, y, eventTime);
                 break;
             case MotionEvent.ACTION_UP:
             case MotionEvent.ACTION_POINTER_UP:
-                tracker.onUpEvent(x, y, eventTime, queue);
+                tracker.onUpEvent(x, y, eventTime);
                 break;
             case MotionEvent.ACTION_CANCEL:
-                tracker.onCancelEvent(x, y, eventTime, queue);
+                tracker.onCancelEvent(x, y, eventTime);
                 break;
             }
         }
diff --git a/java/src/com/android/inputmethod/keyboard/PointerTracker.java b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
index 4ceabff..ca90342 100644
--- a/java/src/com/android/inputmethod/keyboard/PointerTracker.java
+++ b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
@@ -34,7 +34,6 @@
 
 public class PointerTracker {
     private static final String TAG = PointerTracker.class.getSimpleName();
-    private static final boolean ENABLE_ASSERTION = false;
     private static final boolean DEBUG_EVENT = false;
     private static final boolean DEBUG_MOVE_EVENT = false;
     private static final boolean DEBUG_LISTENER = false;
@@ -56,10 +55,10 @@
 
     private final DrawingProxy mDrawingProxy;
     private final KeyTimerHandler mKeyTimerHandler;
+    private final PointerTrackerQueue mPointerTrackerQueue;
     private KeyDetector mKeyDetector;
     private KeyboardActionListener mListener = EMPTY_LISTENER;
     private final KeyboardSwitcher mKeyboardSwitcher;
-    private final boolean mHasDistinctMultitouch;
     private final boolean mConfigSlidingKeyInputEnabled;
 
     private final int mTouchNoiseThresholdMillis;
@@ -112,16 +111,16 @@
     };
 
     public PointerTracker(int id, Context context, KeyTimerHandler keyTimerHandler,
-            KeyDetector keyDetector, DrawingProxy drawingProxy, boolean hasDistinctMultitouch) {
+            KeyDetector keyDetector, DrawingProxy drawingProxy, PointerTrackerQueue queue) {
         if (drawingProxy == null || keyTimerHandler == null || keyDetector == null)
             throw new NullPointerException();
         mPointerId = id;
         mDrawingProxy = drawingProxy;
         mKeyTimerHandler = keyTimerHandler;
+        mPointerTrackerQueue = queue;  // This is null for non-distinct multi-touch device.
         mKeyDetector = keyDetector;
         mKeyboardSwitcher = KeyboardSwitcher.getInstance();
         mKeyState = new PointerTrackerKeyState(keyDetector);
-        mHasDistinctMultitouch = hasDistinctMultitouch;
         final Resources res = context.getResources();
         mConfigSlidingKeyInputEnabled = res.getBoolean(R.bool.config_sliding_key_input_enabled);
         mDelayBeforeKeyRepeatStart = res.getInteger(R.integer.config_delay_before_key_repeat_start);
@@ -273,36 +272,26 @@
         }
     }
 
-    private void checkAssertion(PointerTrackerQueue queue) {
-        if (mHasDistinctMultitouch && queue == null)
-            throw new RuntimeException(
-                    "PointerTrackerQueue must be passed on distinct multi touch device");
-        if (!mHasDistinctMultitouch && queue != null)
-            throw new RuntimeException(
-                    "PointerTrackerQueue must be null on non-distinct multi touch device");
-    }
-
-    public void onTouchEvent(int action, int x, int y, long eventTime, PointerTrackerQueue queue) {
+    public void onTouchEvent(int action, int x, int y, long eventTime) {
         switch (action) {
         case MotionEvent.ACTION_MOVE:
-            onMoveEvent(x, y, eventTime, queue);
+            onMoveEvent(x, y, eventTime);
             break;
         case MotionEvent.ACTION_DOWN:
         case MotionEvent.ACTION_POINTER_DOWN:
-            onDownEvent(x, y, eventTime, queue);
+            onDownEvent(x, y, eventTime);
             break;
         case MotionEvent.ACTION_UP:
         case MotionEvent.ACTION_POINTER_UP:
-            onUpEvent(x, y, eventTime, queue);
+            onUpEvent(x, y, eventTime);
             break;
         case MotionEvent.ACTION_CANCEL:
-            onCancelEvent(x, y, eventTime, queue);
+            onCancelEvent(x, y, eventTime);
             break;
         }
     }
 
-    public void onDownEvent(int x, int y, long eventTime, PointerTrackerQueue queue) {
-        if (ENABLE_ASSERTION) checkAssertion(queue);
+    public void onDownEvent(int x, int y, long eventTime) {
         if (DEBUG_EVENT)
             printTouchEvent("onDownEvent:", x, y, eventTime);
 
@@ -321,6 +310,7 @@
             }
         }
 
+        final PointerTrackerQueue queue = mPointerTrackerQueue;
         if (queue != null) {
             if (isOnModifierKey(x, y)) {
                 // Before processing a down event of modifier key, all pointers already being
@@ -364,8 +354,7 @@
         mIsInSlidingKeyInput = true;
     }
 
-    public void onMoveEvent(int x, int y, long eventTime, PointerTrackerQueue queue) {
-        if (ENABLE_ASSERTION) checkAssertion(queue);
+    public void onMoveEvent(int x, int y, long eventTime) {
         if (DEBUG_MOVE_EVENT)
             printTouchEvent("onMoveEvent:", x, y, eventTime);
         if (mKeyAlreadyProcessed)
@@ -449,6 +438,7 @@
                         keyboard.updateSpacebarPreviewIcon(diff);
                         // Display spacebar slide language switcher.
                         showKeyPreview(keyIndex);
+                        final PointerTrackerQueue queue = mPointerTrackerQueue;
                         if (queue != null)
                             queue.releaseAllPointersExcept(this, eventTime, true);
                     }
@@ -472,11 +462,11 @@
         }
     }
 
-    public void onUpEvent(int x, int y, long eventTime, PointerTrackerQueue queue) {
-        if (ENABLE_ASSERTION) checkAssertion(queue);
+    public void onUpEvent(int x, int y, long eventTime) {
         if (DEBUG_EVENT)
             printTouchEvent("onUpEvent  :", x, y, eventTime);
 
+        final PointerTrackerQueue queue = mPointerTrackerQueue;
         if (queue != null) {
             if (isModifier()) {
                 // Before processing an up event of modifier key, all pointers already being
@@ -540,8 +530,9 @@
         }
     }
 
-    public void onLongPressed(PointerTrackerQueue queue) {
+    public void onLongPressed() {
         mKeyAlreadyProcessed = true;
+        final PointerTrackerQueue queue = mPointerTrackerQueue;
         if (queue != null) {
             // TODO: Support chording + long-press input.
             queue.releaseAllPointersExcept(this, SystemClock.uptimeMillis(), true);
@@ -549,11 +540,11 @@
         }
     }
 
-    public void onCancelEvent(int x, int y, long eventTime, PointerTrackerQueue queue) {
-        if (ENABLE_ASSERTION) checkAssertion(queue);
+    public void onCancelEvent(int x, int y, long eventTime) {
         if (DEBUG_EVENT)
             printTouchEvent("onCancelEvt:", x, y, eventTime);
 
+        final PointerTrackerQueue queue = mPointerTrackerQueue;
         if (queue != null) {
             queue.releaseAllPointersExcept(this, eventTime, true);
             queue.remove(this);