Display spacebar language switcher even when key preview is off

Bug: 4313884
Change-Id: I9d4a474302dadbfc610324799f8768b803705e52
diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardView.java b/java/src/com/android/inputmethod/keyboard/KeyboardView.java
index eb09a45..95ecb3b 100644
--- a/java/src/com/android/inputmethod/keyboard/KeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/KeyboardView.java
@@ -889,8 +889,11 @@
 
     @Override
     public void showKeyPreview(int keyIndex, PointerTracker tracker) {
-        if (mShowKeyPreview || mKeyboard.needSpacebarPreview(keyIndex)) {
+        if (mShowKeyPreview) {
             mHandler.showKeyPreview(mDelayBeforePreview, keyIndex, tracker);
+        } else if (mKeyboard.needSpacebarPreview(keyIndex)) {
+            // Show key preview (in this case, slide language switcher) without any delay.
+            showKey(keyIndex, tracker);
         }
     }
 
@@ -899,6 +902,9 @@
         if (mShowKeyPreview) {
             mHandler.cancelShowKeyPreview(tracker);
             mHandler.dismissKeyPreview(mDelayAfterPreview, tracker);
+        } else if (mKeyboard.needSpacebarPreview(KeyDetector.NOT_A_KEY)) {
+            // Dismiss key preview (in this case, slide language switcher) without any delay.
+            mPreviewText.setVisibility(View.INVISIBLE);
         }
     }
 
diff --git a/java/src/com/android/inputmethod/keyboard/PointerTracker.java b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
index 64f2f96..249f664 100644
--- a/java/src/com/android/inputmethod/keyboard/PointerTracker.java
+++ b/java/src/com/android/inputmethod/keyboard/PointerTracker.java
@@ -392,7 +392,7 @@
                 startLongPressTimer(keyIndex);
                 showKeyPreview(keyIndex);
                 setPressedKeyGraphics(keyIndex);
-            } else if (!isMinorMoveBounce(x, y, keyIndex)) {
+            } else if (isMajorEnoughMoveToBeOnNewKey(x, y, keyIndex)) {
                 // The pointer has been slid in to the new key from the previous key, we must call
                 // onRelease() first to notify that the previous key has been released, then call
                 // onPress() to notify that the new key is being pressed.
@@ -430,9 +430,12 @@
                     }
                     return;
                 }
+            } else if (mKeyboard.needSpacebarPreview(keyIndex)) {
+                // Display spacebar slide language switcher.
+                showKeyPreview(keyIndex);
             }
         } else {
-            if (oldKey != null && !isMinorMoveBounce(x, y, keyIndex)) {
+            if (oldKey != null && isMajorEnoughMoveToBeOnNewKey(x, y, keyIndex)) {
                 // The pointer has been slid out from the previous key, we must call onRelease() to
                 // notify that the previous key has been released.
                 setReleasedKeyGraphics(oldKeyIndex);
@@ -483,7 +486,7 @@
         mIsInSlidingKeyInput = false;
         final PointerTrackerKeyState keyState = mKeyState;
         final int keyX, keyY;
-        if (!isMinorMoveBounce(x, y, keyState.onMoveKey(x, y))) {
+        if (isMajorEnoughMoveToBeOnNewKey(x, y, keyState.onMoveKey(x, y))) {
             keyX = x;
             keyY = y;
         } else {
@@ -544,16 +547,16 @@
         return mKeyState.getDownTime();
     }
 
-    private boolean isMinorMoveBounce(int x, int y, int newKey) {
+    private boolean isMajorEnoughMoveToBeOnNewKey(int x, int y, int newKey) {
         if (mKeys == null || mKeyHysteresisDistanceSquared < 0)
             throw new IllegalStateException("keyboard and/or hysteresis not set");
         int curKey = mKeyState.getKeyIndex();
         if (newKey == curKey) {
-            return true;
-        } else if (isValidKeyIndex(curKey)) {
-            return mKeys.get(curKey).squaredDistanceToEdge(x, y) < mKeyHysteresisDistanceSquared;
-        } else {
             return false;
+        } else if (isValidKeyIndex(curKey)) {
+            return mKeys.get(curKey).squaredDistanceToEdge(x, y) >= mKeyHysteresisDistanceSquared;
+        } else {
+            return true;
         }
     }