Merge "Use Iterator in PointerTrackerQueue"
diff --git a/java/src/com/android/inputmethod/keyboard/KeyDetector.java b/java/src/com/android/inputmethod/keyboard/KeyDetector.java
index 4b708a7..2a6e0a2 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyDetector.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyDetector.java
@@ -213,12 +213,31 @@
             getNearbyKeyCodes(allCodes);
             if (DEBUG) {
                 Log.d(TAG, "x=" + x + " y=" + y
-                        + " primary="
-                        + (primaryKey == null ? "none" : primaryKey.mCode)
-                        + " codes=" + Arrays.toString(allCodes));
+                        + " primary=" + printableCode(primaryKey)
+                        + " codes=" + printableCodes(allCodes));
             }
         }
 
         return primaryKey;
     }
+
+    public static String printableCode(Key key) {
+        return key != null ? printableCode(key.mCode) : "none";
+    }
+
+    public static String printableCode(int primaryCode) {
+        if (primaryCode < 0) return String.format("%4d", primaryCode);
+        if (primaryCode < 0x100) return String.format("\\u%02x", primaryCode);
+        return String.format("\\u04x", primaryCode);
+    }
+
+    public static String printableCodes(int[] codes) {
+        final StringBuilder sb = new StringBuilder();
+        for (final int code : codes) {
+            if (code == NOT_A_CODE) break;
+            if (sb.length() > 0) sb.append(", ");
+            sb.append(code);
+        }
+        return "[" + sb + "]";
+    }
 }
diff --git a/java/src/com/android/inputmethod/keyboard/PointerTracker.java b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
index 4e8765d..9e0c5ce 100644
--- a/java/src/com/android/inputmethod/keyboard/PointerTracker.java
+++ b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
@@ -28,7 +28,6 @@
 import com.android.inputmethod.latin.R;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
 
 public class PointerTracker {
@@ -239,9 +238,11 @@
     // Returns true if keyboard has been changed by this callback.
     private boolean callListenerOnPressAndCheckKeyboardLayoutChange(Key key, boolean withSliding) {
         final boolean ignoreModifierKey = mIgnoreModifierKey && key.isModifier();
-        if (DEBUG_LISTENER)
-            Log.d(TAG, "onPress    : " + keyCodePrintable(key.mCode) + " sliding=" + withSliding
-                    + " ignoreModifier=" + ignoreModifierKey);
+        if (DEBUG_LISTENER) {
+            Log.d(TAG, "onPress    : " + KeyDetector.printableCode(key.mCode)
+                    + " sliding=" + withSliding + " ignoreModifier=" + ignoreModifierKey
+                    + " enabled=" + key.isEnabled());
+        }
         if (ignoreModifierKey) {
             return false;
         }
@@ -263,9 +264,10 @@
         // If code is CODE_DUMMY here, this key will be ignored or generate text.
         final CharSequence text = (code != Keyboard.CODE_DUMMY) ? null : key.mOutputText;
         if (DEBUG_LISTENER) {
-            Log.d(TAG, "onCodeInput: " + keyCodePrintable(code) + " text=" + text
-                    + " codes="+ Arrays.toString(keyCodes) + " x=" + x + " y=" + y
-                    + " ignoreModifier=" + ignoreModifierKey + " alterCode=" + alterCode);
+            Log.d(TAG, "onCodeInput: " + KeyDetector.printableCode(code) + " text=" + text
+                    + " codes="+ KeyDetector.printableCodes(keyCodes) + " x=" + x + " y=" + y
+                    + " ignoreModifier=" + ignoreModifierKey + " alterCode=" + alterCode
+                    + " enabled=" + key.isEnabled());
         }
         if (ignoreModifierKey) {
             return;
@@ -286,9 +288,11 @@
     // primaryCode is different from {@link Key#mCode}.
     private void callListenerOnRelease(Key key, int primaryCode, boolean withSliding) {
         final boolean ignoreModifierKey = mIgnoreModifierKey && key.isModifier();
-        if (DEBUG_LISTENER)
-            Log.d(TAG, "onRelease  : " + keyCodePrintable(primaryCode) + " sliding="
-                    + withSliding + " ignoreModifier=" + ignoreModifierKey);
+        if (DEBUG_LISTENER) {
+            Log.d(TAG, "onRelease  : " + KeyDetector.printableCode(primaryCode)
+                    + " sliding=" + withSliding + " ignoreModifier=" + ignoreModifierKey
+                    + " enabled="+ key.isEnabled());
+        }
         if (ignoreModifierKey) {
             return;
         }
@@ -480,7 +484,8 @@
         Key key = onDownKey(x, y, eventTime);
         // Sliding key is allowed when 1) enabled by configuration, 2) this pointer starts sliding
         // from modifier key, or 3) this pointer's KeyDetector always allows sliding input.
-        mIsAllowedSlidingKeyInput = sConfigSlidingKeyInputEnabled || key.isModifier()
+        mIsAllowedSlidingKeyInput = sConfigSlidingKeyInputEnabled
+                || (key != null && key.isModifier())
                 || mKeyDetector.alwaysAllowsSlidingInput();
         mKeyboardLayoutHasBeenChanged = false;
         mKeyAlreadyProcessed = false;
@@ -762,16 +767,10 @@
 
     private void printTouchEvent(String title, int x, int y, long eventTime) {
         final Key key = mKeyDetector.getKeyAndNearbyCodes(x, y, null);
-        final String code = (key == null) ? "----" : keyCodePrintable(key.mCode);
+        final String code = KeyDetector.printableCode(key);
         final long delta = eventTime - mPreviousEventTime;
         Log.d(TAG, String.format("%s%s[%d] %4d %4d %5d %s", title,
                 (mKeyAlreadyProcessed ? "-" : " "), mPointerId, x, y, delta, code));
         mPreviousEventTime = eventTime;
     }
-
-    private static String keyCodePrintable(int primaryCode) {
-        if (primaryCode < 0) return String.format("%4d", primaryCode);
-        if (primaryCode < 0x100) return String.format("\\u%02x", primaryCode);
-        return String.format("\\u04x", primaryCode);
-    }
 }