From 83e63ace2a1bd5b3c27d26d914456c2b0def17c5 Mon Sep 17 00:00:00 2001
From: "Tadashi G. Takaoka" <takaoka@google.com>
Date: Tue, 7 Sep 2010 15:37:59 +0900
Subject: [PATCH] Dismiss mini keyboard when finger is released outside mini
 keyboard

Bug: 2978975

Change-Id: Ie634e8ae827fe093c5c673b75d85835050b03794
---
 java/src/com/android/inputmethod/latin/LatinIME.java   |  4 ++++
 .../inputmethod/latin/LatinKeyboardBaseView.java       |  9 +++++++++
 .../com/android/inputmethod/latin/PointerTracker.java  | 10 +++++++---
 3 files changed, 20 insertions(+), 3 deletions(-)

diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index e5c6a54ce..229e13b8f 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -1213,6 +1213,10 @@ public class LatinIME extends InputMethodService
         mEnteredText = text;
     }
 
+    public void onCancel() {
+        // User released a finger outside any key
+    }
+
     private void handleBackspace() {
         if (VOICE_INSTALLED && mVoiceInputHighlighted) {
             mVoiceInput.incrementTextModificationDeleteCount(
diff --git a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java
index a0366c273..8f1ec6591 100644
--- a/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java
+++ b/java/src/com/android/inputmethod/latin/LatinKeyboardBaseView.java
@@ -123,6 +123,11 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
          */
         void onText(CharSequence text);
 
+        /**
+         * Called when user released a finger outside any key.
+         */
+        void onCancel();
+
         /**
          * Called when the user quickly moves the finger from right to
          * left.
@@ -1005,6 +1010,10 @@ public class LatinKeyboardBaseView extends View implements PointerTracker.UIProx
                 dismissPopupKeyboard();
             }
 
+            public void onCancel() {
+                dismissPopupKeyboard();
+            }
+
             public void swipeLeft() {
             }
             public void swipeRight() {
diff --git a/java/src/com/android/inputmethod/latin/PointerTracker.java b/java/src/com/android/inputmethod/latin/PointerTracker.java
index f849158ae..8b1f019d4 100644
--- a/java/src/com/android/inputmethod/latin/PointerTracker.java
+++ b/java/src/com/android/inputmethod/latin/PointerTracker.java
@@ -389,9 +389,13 @@ public class PointerTracker {
     }
 
     private void detectAndSendKey(int index, int x, int y, long eventTime) {
-        if (isValidKeyIndex(index)) {
-            final Key key = mKeys[index];
-            OnKeyboardActionListener listener = mListener;
+        final OnKeyboardActionListener listener = mListener;
+        final Key key = getKey(index);
+
+        if (key == null) {
+            if (listener != null)
+                listener.onCancel();
+        } else {
             if (key.text != null) {
                 if (listener != null) {
                     listener.onText(key.text);