diff --git a/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java b/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java
index 039c77b9c641af6e701f10b54fcebad929c495c8..5af5d044f327cda306e80f99706028ad461000ee 100644
--- a/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java
+++ b/java/src/com/android/inputmethod/accessibility/AccessibilityEntityProvider.java
@@ -196,8 +196,7 @@ public class AccessibilityEntityProvider extends AccessibilityNodeProviderCompat
             info.setSource(mKeyboardView, virtualViewId);
             info.setBoundsInScreen(boundsInScreen);
             info.setEnabled(true);
-            info.setClickable(true);
-            info.addAction(AccessibilityNodeInfoCompat.ACTION_CLICK);
+            info.setVisibleToUser(true);
 
             if (mAccessibilityFocusedView == virtualViewId) {
                 info.addAction(AccessibilityNodeInfoCompat.ACTION_CLEAR_ACCESSIBILITY_FOCUS);
@@ -226,6 +225,9 @@ public class AccessibilityEntityProvider extends AccessibilityNodeProviderCompat
 
         mKeyboardView.onTouchEvent(downEvent);
         mKeyboardView.onTouchEvent(upEvent);
+
+        downEvent.recycle();
+        upEvent.recycle();
     }
 
     @Override
@@ -252,9 +254,6 @@ public class AccessibilityEntityProvider extends AccessibilityNodeProviderCompat
         final int virtualViewId = generateVirtualViewIdForKey(key);
 
         switch (action) {
-        case AccessibilityNodeInfoCompat.ACTION_CLICK:
-            simulateKeyPress(key);
-            return true;
         case AccessibilityNodeInfoCompat.ACTION_ACCESSIBILITY_FOCUS:
             if (mAccessibilityFocusedView == virtualViewId) {
                 return false;
diff --git a/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java b/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java
index e42de0b4c83973ad7a3696a969c5288a42524a27..77940c0864a97646ac5382011c43270df25e3d9e 100644
--- a/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java
+++ b/java/src/com/android/inputmethod/accessibility/AccessibleKeyboardViewProxy.java
@@ -105,8 +105,21 @@ public class AccessibleKeyboardViewProxy extends AccessibilityDelegateCompat {
     }
 
     /**
-     * Receives hover events when accessibility is turned on in SDK versions ICS
-     * and higher.
+     * Receives motion events when touch exploration is turned on in SDK
+     * versions ICS and higher.
+     *
+     * @param event The motion event.
+     * @return {@code true} if the event is handled
+     */
+    public boolean onTouchEvent(MotionEvent event) {
+        // To avoid accidental key presses during touch exploration, always drop
+        // non-hover touch events.
+        return false;
+    }
+
+    /**
+     * Receives hover events when touch exploration is turned on in SDK versions
+     * ICS and higher.
      *
      * @param event The hover event.
      * @return {@code true} if the event is handled
diff --git a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
index 06973ef990cb5d96261e3e59b787cc5b924a716a..f6b66a79ee8f328041a5cc342d416d92d582ecb6 100644
--- a/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
+++ b/java/src/com/android/inputmethod/keyboard/MainKeyboardView.java
@@ -665,6 +665,9 @@ public class MainKeyboardView extends KeyboardView implements PointerTracker.Key
         if (getKeyboard() == null) {
             return false;
         }
+        if (AccessibilityUtils.getInstance().isTouchExplorationEnabled()) {
+            return AccessibleKeyboardViewProxy.getInstance().onTouchEvent(me);
+        }
         return mTouchScreenRegulator.onTouchEvent(me);
     }