diff --git a/api/test-current.txt b/api/test-current.txt index f13e0dede74d5..e7eda22881303 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -1319,6 +1319,7 @@ package android.view { public class KeyEvent extends android.view.InputEvent implements android.os.Parcelable { method public static java.lang.String actionToString(int); + field public static final int LAST_KEYCODE = 285; // 0x11d } public final class KeyboardShortcutGroup implements android.os.Parcelable { diff --git a/cmds/input/src/com/android/commands/input/Input.java b/cmds/input/src/com/android/commands/input/Input.java index d3ec32076292b..74edffb4738d6 100644 --- a/cmds/input/src/com/android/commands/input/Input.java +++ b/cmds/input/src/com/android/commands/input/Input.java @@ -91,9 +91,6 @@ public class Input { if (args.length > start) { for (int i = start; i < args.length; i++) { int keyCode = KeyEvent.keyCodeFromString(args[i]); - if (keyCode == KeyEvent.KEYCODE_UNKNOWN) { - keyCode = KeyEvent.keyCodeFromString("KEYCODE_" + args[i]); - } sendKeyEvent(inputSource, keyCode, longpress); } return; diff --git a/core/java/android/view/KeyEvent.java b/core/java/android/view/KeyEvent.java index 378bb1a337380..dd5abaa4b038c 100644 --- a/core/java/android/view/KeyEvent.java +++ b/core/java/android/view/KeyEvent.java @@ -16,6 +16,7 @@ package android.view; +import android.annotation.NonNull; import android.annotation.TestApi; import android.os.Parcel; import android.os.Parcelable; @@ -810,7 +811,12 @@ public class KeyEvent extends InputEvent implements Parcelable { /** Key code constant: Refresh key. */ public static final int KEYCODE_REFRESH = 285; - private static final int LAST_KEYCODE = KEYCODE_REFRESH; + /** + * Integer value of the last KEYCODE. Increases as new keycodes are added to KeyEvent. + * @hide + */ + @TestApi + public static final int LAST_KEYCODE = KEYCODE_REFRESH; // NOTE: If you add a new keycode here you must also add it to: // isSystem() @@ -2889,25 +2895,34 @@ public class KeyEvent extends InputEvent implements Parcelable { /** * Gets a keycode by its symbolic name such as "KEYCODE_A" or an equivalent - * numeric constant such as "1001". + * numeric constant such as "29". For symbolic names, + * starting in {@link android.os.Build.VERSION_CODES#Q} the prefix "KEYCODE_" is optional. * * @param symbolicName The symbolic name of the keycode. * @return The keycode or {@link #KEYCODE_UNKNOWN} if not found. * @see #keycodeToString(int) */ - public static int keyCodeFromString(String symbolicName) { - if (symbolicName.startsWith(LABEL_PREFIX)) { - symbolicName = symbolicName.substring(LABEL_PREFIX.length()); - int keyCode = nativeKeyCodeFromString(symbolicName); - if (keyCode > 0) { + public static int keyCodeFromString(@NonNull String symbolicName) { + try { + int keyCode = Integer.parseInt(symbolicName); + if (keyCodeIsValid(keyCode)) { return keyCode; } - } - try { - return Integer.parseInt(symbolicName, 10); } catch (NumberFormatException ex) { - return KEYCODE_UNKNOWN; } + + if (symbolicName.startsWith(LABEL_PREFIX)) { + symbolicName = symbolicName.substring(LABEL_PREFIX.length()); + } + int keyCode = nativeKeyCodeFromString(symbolicName); + if (keyCodeIsValid(keyCode)) { + return keyCode; + } + return KEYCODE_UNKNOWN; + } + + private static boolean keyCodeIsValid(int keyCode) { + return keyCode >= KEYCODE_UNKNOWN && keyCode <= LAST_KEYCODE; } /**