From 5c31de33ccc99404f54452de1974bb2960b31343 Mon Sep 17 00:00:00 2001 From: Yohei Yukawa Date: Thu, 11 Jun 2015 11:45:34 -0700 Subject: [PATCH] Keyboard.Key#onReleased() should handle inside parameter. The boolean parameter of Keyboard.Key#onReleased(boolean) has been somehow ignored since Capcake. With this CL, that method starts working as documented. Alternatively we could fix the issue when and only when the application's targetSdkVersion >= 23. We didn't do that because: - Although Keyboard.Key class is a public API, it is supposed to be used almost only by android.inputmethodservice.KeyboardView. The risk of unwanted compatibility problems is low. - Fixing that is beneficial for users because it actually fixes UX issue when applications/IMEs that still rely on KeyboardView run in Android M. - All the fields that are related to Keyboard.Key#onReleased are public fields so developers can easily work around anyway. Bug: 21446448 Change-Id: I392166c77cd9dd2c432dc4f1274312f8355de02b --- .../android/inputmethodservice/Keyboard.java | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/core/java/android/inputmethodservice/Keyboard.java b/core/java/android/inputmethodservice/Keyboard.java index 45f18897b0e2d..4d0ee7d2a7305 100644 --- a/core/java/android/inputmethodservice/Keyboard.java +++ b/core/java/android/inputmethodservice/Keyboard.java @@ -400,16 +400,26 @@ public class Keyboard { public void onPressed() { pressed = !pressed; } - + /** - * Changes the pressed state of the key. If it is a sticky key, it will also change the - * toggled state of the key if the finger was release inside. - * @param inside whether the finger was released inside the key + * Changes the pressed state of the key. + * + *

Toggled state of the key will be flipped when all the following conditions are + * fulfilled:

+ * + * + * + * @param inside whether the finger was released inside the key. Works only on Android M and + * later. See the method document for details. * @see #onPressed() */ public void onReleased(boolean inside) { pressed = !pressed; - if (sticky) { + if (sticky && inside) { on = !on; } }