Merge "Remove useless member variables (A93)"
diff --git a/java/src/com/android/inputmethod/keyboard/PointerTracker.java b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
index 32ef408..1ae0020 100644
--- a/java/src/com/android/inputmethod/keyboard/PointerTracker.java
+++ b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
@@ -610,6 +610,15 @@
                         onUpEventInternal();
                         onDownEventInternal(x, y, eventTime);
                     } else {
+                        // HACK: If there are currently multiple touches, register the key even if
+                        // the finger slides off the key. This defends against noise from some
+                        // touch panels when there are close multiple touches.
+                        // Caveat: When in chording input mode with a modifier key, we don't use
+                        // this hack.
+                        if (me != null && me.getPointerCount() > 1
+                                && !sPointerTrackerQueue.hasModifierKeyOlderThan(this)) {
+                            onUpEventInternal();
+                        }
                         mKeyAlreadyProcessed = true;
                         setReleasedKeyGraphics(oldKey);
                     }
diff --git a/java/src/com/android/inputmethod/keyboard/internal/PointerTrackerQueue.java b/java/src/com/android/inputmethod/keyboard/internal/PointerTrackerQueue.java
index 5db65c6..d3bb85d 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/PointerTrackerQueue.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/PointerTrackerQueue.java
@@ -28,6 +28,7 @@
     private static final String TAG = PointerTrackerQueue.class.getSimpleName();
     private static final boolean DEBUG = false;
 
+    // TODO: Use ring buffer instead of {@link LinkedList}.
     private final LinkedList<PointerTracker> mQueue = new LinkedList<PointerTracker>();
 
     public synchronized void add(PointerTracker tracker) {
@@ -81,6 +82,20 @@
         }
     }
 
+    public synchronized boolean hasModifierKeyOlderThan(PointerTracker tracker) {
+        final Iterator<PointerTracker> it = mQueue.iterator();
+        while (it.hasNext()) {
+            final PointerTracker t = it.next();
+            if (t == tracker) {
+                break;
+            }
+            if (t.isModifier()) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     public synchronized boolean isAnyInSlidingKeyInput() {
         for (final PointerTracker tracker : mQueue) {
             if (tracker.isInSlidingKeyInput()) {