• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2006 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.view;
18 
19 import static android.view.Display.INVALID_DISPLAY;
20 
21 import android.annotation.NonNull;
22 import android.annotation.TestApi;
23 import android.annotation.UnsupportedAppUsage;
24 import android.os.Build;
25 import android.os.Parcel;
26 import android.os.Parcelable;
27 import android.text.method.MetaKeyKeyListener;
28 import android.util.Log;
29 import android.util.SparseIntArray;
30 import android.view.KeyCharacterMap.KeyData;
31 
32 /**
33  * Object used to report key and button events.
34  * <p>
35  * Each key press is described by a sequence of key events.  A key press
36  * starts with a key event with {@link #ACTION_DOWN}.  If the key is held
37  * sufficiently long that it repeats, then the initial down is followed
38  * additional key events with {@link #ACTION_DOWN} and a non-zero value for
39  * {@link #getRepeatCount()}.  The last key event is a {@link #ACTION_UP}
40  * for the key up.  If the key press is canceled, the key up event will have the
41  * {@link #FLAG_CANCELED} flag set.
42  * </p><p>
43  * Key events are generally accompanied by a key code ({@link #getKeyCode()}),
44  * scan code ({@link #getScanCode()}) and meta state ({@link #getMetaState()}).
45  * Key code constants are defined in this class.  Scan code constants are raw
46  * device-specific codes obtained from the OS and so are not generally meaningful
47  * to applications unless interpreted using the {@link KeyCharacterMap}.
48  * Meta states describe the pressed state of key modifiers
49  * such as {@link #META_SHIFT_ON} or {@link #META_ALT_ON}.
50  * </p><p>
51  * Key codes typically correspond one-to-one with individual keys on an input device.
52  * Many keys and key combinations serve quite different functions on different
53  * input devices so care must be taken when interpreting them.  Always use the
54  * {@link KeyCharacterMap} associated with the input device when mapping keys
55  * to characters.  Be aware that there may be multiple key input devices active
56  * at the same time and each will have its own key character map.
57  * </p><p>
58  * As soft input methods can use multiple and inventive ways of inputting text,
59  * there is no guarantee that any key press on a soft keyboard will generate a key
60  * event: this is left to the IME's discretion, and in fact sending such events is
61  * discouraged.  You should never rely on receiving KeyEvents for any key on a soft
62  * input method.  In particular, the default software keyboard will never send any
63  * key event to any application targetting Jelly Bean or later, and will only send
64  * events for some presses of the delete and return keys to applications targetting
65  * Ice Cream Sandwich or earlier.  Be aware that other software input methods may
66  * never send key events regardless of the version.  Consider using editor actions
67  * like {@link android.view.inputmethod.EditorInfo#IME_ACTION_DONE} if you need
68  * specific interaction with the software keyboard, as it gives more visibility to
69  * the user as to how your application will react to key presses.
70  * </p><p>
71  * When interacting with an IME, the framework may deliver key events
72  * with the special action {@link #ACTION_MULTIPLE} that either specifies
73  * that single repeated key code or a sequence of characters to insert.
74  * </p><p>
75  * In general, the framework cannot guarantee that the key events it delivers
76  * to a view always constitute complete key sequences since some events may be dropped
77  * or modified by containing views before they are delivered.  The view implementation
78  * should be prepared to handle {@link #FLAG_CANCELED} and should tolerate anomalous
79  * situations such as receiving a new {@link #ACTION_DOWN} without first having
80  * received an {@link #ACTION_UP} for the prior key press.
81  * </p><p>
82  * Refer to {@link InputDevice} for more information about how different kinds of
83  * input devices and sources represent keys and buttons.
84  * </p>
85  */
86 public class KeyEvent extends InputEvent implements Parcelable {
87     /** Key code constant: Unknown key code. */
88     public static final int KEYCODE_UNKNOWN         = 0;
89     /** Key code constant: Soft Left key.
90      * Usually situated below the display on phones and used as a multi-function
91      * feature key for selecting a software defined function shown on the bottom left
92      * of the display. */
93     public static final int KEYCODE_SOFT_LEFT       = 1;
94     /** Key code constant: Soft Right key.
95      * Usually situated below the display on phones and used as a multi-function
96      * feature key for selecting a software defined function shown on the bottom right
97      * of the display. */
98     public static final int KEYCODE_SOFT_RIGHT      = 2;
99     /** Key code constant: Home key.
100      * This key is handled by the framework and is never delivered to applications. */
101     public static final int KEYCODE_HOME            = 3;
102     /** Key code constant: Back key. */
103     public static final int KEYCODE_BACK            = 4;
104     /** Key code constant: Call key. */
105     public static final int KEYCODE_CALL            = 5;
106     /** Key code constant: End Call key. */
107     public static final int KEYCODE_ENDCALL         = 6;
108     /** Key code constant: '0' key. */
109     public static final int KEYCODE_0               = 7;
110     /** Key code constant: '1' key. */
111     public static final int KEYCODE_1               = 8;
112     /** Key code constant: '2' key. */
113     public static final int KEYCODE_2               = 9;
114     /** Key code constant: '3' key. */
115     public static final int KEYCODE_3               = 10;
116     /** Key code constant: '4' key. */
117     public static final int KEYCODE_4               = 11;
118     /** Key code constant: '5' key. */
119     public static final int KEYCODE_5               = 12;
120     /** Key code constant: '6' key. */
121     public static final int KEYCODE_6               = 13;
122     /** Key code constant: '7' key. */
123     public static final int KEYCODE_7               = 14;
124     /** Key code constant: '8' key. */
125     public static final int KEYCODE_8               = 15;
126     /** Key code constant: '9' key. */
127     public static final int KEYCODE_9               = 16;
128     /** Key code constant: '*' key. */
129     public static final int KEYCODE_STAR            = 17;
130     /** Key code constant: '#' key. */
131     public static final int KEYCODE_POUND           = 18;
132     /** Key code constant: Directional Pad Up key.
133      * May also be synthesized from trackball motions. */
134     public static final int KEYCODE_DPAD_UP         = 19;
135     /** Key code constant: Directional Pad Down key.
136      * May also be synthesized from trackball motions. */
137     public static final int KEYCODE_DPAD_DOWN       = 20;
138     /** Key code constant: Directional Pad Left key.
139      * May also be synthesized from trackball motions. */
140     public static final int KEYCODE_DPAD_LEFT       = 21;
141     /** Key code constant: Directional Pad Right key.
142      * May also be synthesized from trackball motions. */
143     public static final int KEYCODE_DPAD_RIGHT      = 22;
144     /** Key code constant: Directional Pad Center key.
145      * May also be synthesized from trackball motions. */
146     public static final int KEYCODE_DPAD_CENTER     = 23;
147     /** Key code constant: Volume Up key.
148      * Adjusts the speaker volume up. */
149     public static final int KEYCODE_VOLUME_UP       = 24;
150     /** Key code constant: Volume Down key.
151      * Adjusts the speaker volume down. */
152     public static final int KEYCODE_VOLUME_DOWN     = 25;
153     /** Key code constant: Power key. */
154     public static final int KEYCODE_POWER           = 26;
155     /** Key code constant: Camera key.
156      * Used to launch a camera application or take pictures. */
157     public static final int KEYCODE_CAMERA          = 27;
158     /** Key code constant: Clear key. */
159     public static final int KEYCODE_CLEAR           = 28;
160     /** Key code constant: 'A' key. */
161     public static final int KEYCODE_A               = 29;
162     /** Key code constant: 'B' key. */
163     public static final int KEYCODE_B               = 30;
164     /** Key code constant: 'C' key. */
165     public static final int KEYCODE_C               = 31;
166     /** Key code constant: 'D' key. */
167     public static final int KEYCODE_D               = 32;
168     /** Key code constant: 'E' key. */
169     public static final int KEYCODE_E               = 33;
170     /** Key code constant: 'F' key. */
171     public static final int KEYCODE_F               = 34;
172     /** Key code constant: 'G' key. */
173     public static final int KEYCODE_G               = 35;
174     /** Key code constant: 'H' key. */
175     public static final int KEYCODE_H               = 36;
176     /** Key code constant: 'I' key. */
177     public static final int KEYCODE_I               = 37;
178     /** Key code constant: 'J' key. */
179     public static final int KEYCODE_J               = 38;
180     /** Key code constant: 'K' key. */
181     public static final int KEYCODE_K               = 39;
182     /** Key code constant: 'L' key. */
183     public static final int KEYCODE_L               = 40;
184     /** Key code constant: 'M' key. */
185     public static final int KEYCODE_M               = 41;
186     /** Key code constant: 'N' key. */
187     public static final int KEYCODE_N               = 42;
188     /** Key code constant: 'O' key. */
189     public static final int KEYCODE_O               = 43;
190     /** Key code constant: 'P' key. */
191     public static final int KEYCODE_P               = 44;
192     /** Key code constant: 'Q' key. */
193     public static final int KEYCODE_Q               = 45;
194     /** Key code constant: 'R' key. */
195     public static final int KEYCODE_R               = 46;
196     /** Key code constant: 'S' key. */
197     public static final int KEYCODE_S               = 47;
198     /** Key code constant: 'T' key. */
199     public static final int KEYCODE_T               = 48;
200     /** Key code constant: 'U' key. */
201     public static final int KEYCODE_U               = 49;
202     /** Key code constant: 'V' key. */
203     public static final int KEYCODE_V               = 50;
204     /** Key code constant: 'W' key. */
205     public static final int KEYCODE_W               = 51;
206     /** Key code constant: 'X' key. */
207     public static final int KEYCODE_X               = 52;
208     /** Key code constant: 'Y' key. */
209     public static final int KEYCODE_Y               = 53;
210     /** Key code constant: 'Z' key. */
211     public static final int KEYCODE_Z               = 54;
212     /** Key code constant: ',' key. */
213     public static final int KEYCODE_COMMA           = 55;
214     /** Key code constant: '.' key. */
215     public static final int KEYCODE_PERIOD          = 56;
216     /** Key code constant: Left Alt modifier key. */
217     public static final int KEYCODE_ALT_LEFT        = 57;
218     /** Key code constant: Right Alt modifier key. */
219     public static final int KEYCODE_ALT_RIGHT       = 58;
220     /** Key code constant: Left Shift modifier key. */
221     public static final int KEYCODE_SHIFT_LEFT      = 59;
222     /** Key code constant: Right Shift modifier key. */
223     public static final int KEYCODE_SHIFT_RIGHT     = 60;
224     /** Key code constant: Tab key. */
225     public static final int KEYCODE_TAB             = 61;
226     /** Key code constant: Space key. */
227     public static final int KEYCODE_SPACE           = 62;
228     /** Key code constant: Symbol modifier key.
229      * Used to enter alternate symbols. */
230     public static final int KEYCODE_SYM             = 63;
231     /** Key code constant: Explorer special function key.
232      * Used to launch a browser application. */
233     public static final int KEYCODE_EXPLORER        = 64;
234     /** Key code constant: Envelope special function key.
235      * Used to launch a mail application. */
236     public static final int KEYCODE_ENVELOPE        = 65;
237     /** Key code constant: Enter key. */
238     public static final int KEYCODE_ENTER           = 66;
239     /** Key code constant: Backspace key.
240      * Deletes characters before the insertion point, unlike {@link #KEYCODE_FORWARD_DEL}. */
241     public static final int KEYCODE_DEL             = 67;
242     /** Key code constant: '`' (backtick) key. */
243     public static final int KEYCODE_GRAVE           = 68;
244     /** Key code constant: '-'. */
245     public static final int KEYCODE_MINUS           = 69;
246     /** Key code constant: '=' key. */
247     public static final int KEYCODE_EQUALS          = 70;
248     /** Key code constant: '[' key. */
249     public static final int KEYCODE_LEFT_BRACKET    = 71;
250     /** Key code constant: ']' key. */
251     public static final int KEYCODE_RIGHT_BRACKET   = 72;
252     /** Key code constant: '\' key. */
253     public static final int KEYCODE_BACKSLASH       = 73;
254     /** Key code constant: ';' key. */
255     public static final int KEYCODE_SEMICOLON       = 74;
256     /** Key code constant: ''' (apostrophe) key. */
257     public static final int KEYCODE_APOSTROPHE      = 75;
258     /** Key code constant: '/' key. */
259     public static final int KEYCODE_SLASH           = 76;
260     /** Key code constant: '@' key. */
261     public static final int KEYCODE_AT              = 77;
262     /** Key code constant: Number modifier key.
263      * Used to enter numeric symbols.
264      * This key is not Num Lock; it is more like {@link #KEYCODE_ALT_LEFT} and is
265      * interpreted as an ALT key by {@link android.text.method.MetaKeyKeyListener}. */
266     public static final int KEYCODE_NUM             = 78;
267     /** Key code constant: Headset Hook key.
268      * Used to hang up calls and stop media. */
269     public static final int KEYCODE_HEADSETHOOK     = 79;
270     /** Key code constant: Camera Focus key.
271      * Used to focus the camera. */
272     public static final int KEYCODE_FOCUS           = 80;   // *Camera* focus
273     /** Key code constant: '+' key. */
274     public static final int KEYCODE_PLUS            = 81;
275     /** Key code constant: Menu key. */
276     public static final int KEYCODE_MENU            = 82;
277     /** Key code constant: Notification key. */
278     public static final int KEYCODE_NOTIFICATION    = 83;
279     /** Key code constant: Search key. */
280     public static final int KEYCODE_SEARCH          = 84;
281     /** Key code constant: Play/Pause media key. */
282     public static final int KEYCODE_MEDIA_PLAY_PAUSE= 85;
283     /** Key code constant: Stop media key. */
284     public static final int KEYCODE_MEDIA_STOP      = 86;
285     /** Key code constant: Play Next media key. */
286     public static final int KEYCODE_MEDIA_NEXT      = 87;
287     /** Key code constant: Play Previous media key. */
288     public static final int KEYCODE_MEDIA_PREVIOUS  = 88;
289     /** Key code constant: Rewind media key. */
290     public static final int KEYCODE_MEDIA_REWIND    = 89;
291     /** Key code constant: Fast Forward media key. */
292     public static final int KEYCODE_MEDIA_FAST_FORWARD = 90;
293     /** Key code constant: Mute key.
294      * Mutes the microphone, unlike {@link #KEYCODE_VOLUME_MUTE}. */
295     public static final int KEYCODE_MUTE            = 91;
296     /** Key code constant: Page Up key. */
297     public static final int KEYCODE_PAGE_UP         = 92;
298     /** Key code constant: Page Down key. */
299     public static final int KEYCODE_PAGE_DOWN       = 93;
300     /** Key code constant: Picture Symbols modifier key.
301      * Used to switch symbol sets (Emoji, Kao-moji). */
302     public static final int KEYCODE_PICTSYMBOLS     = 94;   // switch symbol-sets (Emoji,Kao-moji)
303     /** Key code constant: Switch Charset modifier key.
304      * Used to switch character sets (Kanji, Katakana). */
305     public static final int KEYCODE_SWITCH_CHARSET  = 95;   // switch char-sets (Kanji,Katakana)
306     /** Key code constant: A Button key.
307      * On a game controller, the A button should be either the button labeled A
308      * or the first button on the bottom row of controller buttons. */
309     public static final int KEYCODE_BUTTON_A        = 96;
310     /** Key code constant: B Button key.
311      * On a game controller, the B button should be either the button labeled B
312      * or the second button on the bottom row of controller buttons. */
313     public static final int KEYCODE_BUTTON_B        = 97;
314     /** Key code constant: C Button key.
315      * On a game controller, the C button should be either the button labeled C
316      * or the third button on the bottom row of controller buttons. */
317     public static final int KEYCODE_BUTTON_C        = 98;
318     /** Key code constant: X Button key.
319      * On a game controller, the X button should be either the button labeled X
320      * or the first button on the upper row of controller buttons. */
321     public static final int KEYCODE_BUTTON_X        = 99;
322     /** Key code constant: Y Button key.
323      * On a game controller, the Y button should be either the button labeled Y
324      * or the second button on the upper row of controller buttons. */
325     public static final int KEYCODE_BUTTON_Y        = 100;
326     /** Key code constant: Z Button key.
327      * On a game controller, the Z button should be either the button labeled Z
328      * or the third button on the upper row of controller buttons. */
329     public static final int KEYCODE_BUTTON_Z        = 101;
330     /** Key code constant: L1 Button key.
331      * On a game controller, the L1 button should be either the button labeled L1 (or L)
332      * or the top left trigger button. */
333     public static final int KEYCODE_BUTTON_L1       = 102;
334     /** Key code constant: R1 Button key.
335      * On a game controller, the R1 button should be either the button labeled R1 (or R)
336      * or the top right trigger button. */
337     public static final int KEYCODE_BUTTON_R1       = 103;
338     /** Key code constant: L2 Button key.
339      * On a game controller, the L2 button should be either the button labeled L2
340      * or the bottom left trigger button. */
341     public static final int KEYCODE_BUTTON_L2       = 104;
342     /** Key code constant: R2 Button key.
343      * On a game controller, the R2 button should be either the button labeled R2
344      * or the bottom right trigger button. */
345     public static final int KEYCODE_BUTTON_R2       = 105;
346     /** Key code constant: Left Thumb Button key.
347      * On a game controller, the left thumb button indicates that the left (or only)
348      * joystick is pressed. */
349     public static final int KEYCODE_BUTTON_THUMBL   = 106;
350     /** Key code constant: Right Thumb Button key.
351      * On a game controller, the right thumb button indicates that the right
352      * joystick is pressed. */
353     public static final int KEYCODE_BUTTON_THUMBR   = 107;
354     /** Key code constant: Start Button key.
355      * On a game controller, the button labeled Start. */
356     public static final int KEYCODE_BUTTON_START    = 108;
357     /** Key code constant: Select Button key.
358      * On a game controller, the button labeled Select. */
359     public static final int KEYCODE_BUTTON_SELECT   = 109;
360     /** Key code constant: Mode Button key.
361      * On a game controller, the button labeled Mode. */
362     public static final int KEYCODE_BUTTON_MODE     = 110;
363     /** Key code constant: Escape key. */
364     public static final int KEYCODE_ESCAPE          = 111;
365     /** Key code constant: Forward Delete key.
366      * Deletes characters ahead of the insertion point, unlike {@link #KEYCODE_DEL}. */
367     public static final int KEYCODE_FORWARD_DEL     = 112;
368     /** Key code constant: Left Control modifier key. */
369     public static final int KEYCODE_CTRL_LEFT       = 113;
370     /** Key code constant: Right Control modifier key. */
371     public static final int KEYCODE_CTRL_RIGHT      = 114;
372     /** Key code constant: Caps Lock key. */
373     public static final int KEYCODE_CAPS_LOCK       = 115;
374     /** Key code constant: Scroll Lock key. */
375     public static final int KEYCODE_SCROLL_LOCK     = 116;
376     /** Key code constant: Left Meta modifier key. */
377     public static final int KEYCODE_META_LEFT       = 117;
378     /** Key code constant: Right Meta modifier key. */
379     public static final int KEYCODE_META_RIGHT      = 118;
380     /** Key code constant: Function modifier key. */
381     public static final int KEYCODE_FUNCTION        = 119;
382     /** Key code constant: System Request / Print Screen key. */
383     public static final int KEYCODE_SYSRQ           = 120;
384     /** Key code constant: Break / Pause key. */
385     public static final int KEYCODE_BREAK           = 121;
386     /** Key code constant: Home Movement key.
387      * Used for scrolling or moving the cursor around to the start of a line
388      * or to the top of a list. */
389     public static final int KEYCODE_MOVE_HOME       = 122;
390     /** Key code constant: End Movement key.
391      * Used for scrolling or moving the cursor around to the end of a line
392      * or to the bottom of a list. */
393     public static final int KEYCODE_MOVE_END        = 123;
394     /** Key code constant: Insert key.
395      * Toggles insert / overwrite edit mode. */
396     public static final int KEYCODE_INSERT          = 124;
397     /** Key code constant: Forward key.
398      * Navigates forward in the history stack.  Complement of {@link #KEYCODE_BACK}. */
399     public static final int KEYCODE_FORWARD         = 125;
400     /** Key code constant: Play media key. */
401     public static final int KEYCODE_MEDIA_PLAY      = 126;
402     /** Key code constant: Pause media key. */
403     public static final int KEYCODE_MEDIA_PAUSE     = 127;
404     /** Key code constant: Close media key.
405      * May be used to close a CD tray, for example. */
406     public static final int KEYCODE_MEDIA_CLOSE     = 128;
407     /** Key code constant: Eject media key.
408      * May be used to eject a CD tray, for example. */
409     public static final int KEYCODE_MEDIA_EJECT     = 129;
410     /** Key code constant: Record media key. */
411     public static final int KEYCODE_MEDIA_RECORD    = 130;
412     /** Key code constant: F1 key. */
413     public static final int KEYCODE_F1              = 131;
414     /** Key code constant: F2 key. */
415     public static final int KEYCODE_F2              = 132;
416     /** Key code constant: F3 key. */
417     public static final int KEYCODE_F3              = 133;
418     /** Key code constant: F4 key. */
419     public static final int KEYCODE_F4              = 134;
420     /** Key code constant: F5 key. */
421     public static final int KEYCODE_F5              = 135;
422     /** Key code constant: F6 key. */
423     public static final int KEYCODE_F6              = 136;
424     /** Key code constant: F7 key. */
425     public static final int KEYCODE_F7              = 137;
426     /** Key code constant: F8 key. */
427     public static final int KEYCODE_F8              = 138;
428     /** Key code constant: F9 key. */
429     public static final int KEYCODE_F9              = 139;
430     /** Key code constant: F10 key. */
431     public static final int KEYCODE_F10             = 140;
432     /** Key code constant: F11 key. */
433     public static final int KEYCODE_F11             = 141;
434     /** Key code constant: F12 key. */
435     public static final int KEYCODE_F12             = 142;
436     /** Key code constant: Num Lock key.
437      * This is the Num Lock key; it is different from {@link #KEYCODE_NUM}.
438      * This key alters the behavior of other keys on the numeric keypad. */
439     public static final int KEYCODE_NUM_LOCK        = 143;
440     /** Key code constant: Numeric keypad '0' key. */
441     public static final int KEYCODE_NUMPAD_0        = 144;
442     /** Key code constant: Numeric keypad '1' key. */
443     public static final int KEYCODE_NUMPAD_1        = 145;
444     /** Key code constant: Numeric keypad '2' key. */
445     public static final int KEYCODE_NUMPAD_2        = 146;
446     /** Key code constant: Numeric keypad '3' key. */
447     public static final int KEYCODE_NUMPAD_3        = 147;
448     /** Key code constant: Numeric keypad '4' key. */
449     public static final int KEYCODE_NUMPAD_4        = 148;
450     /** Key code constant: Numeric keypad '5' key. */
451     public static final int KEYCODE_NUMPAD_5        = 149;
452     /** Key code constant: Numeric keypad '6' key. */
453     public static final int KEYCODE_NUMPAD_6        = 150;
454     /** Key code constant: Numeric keypad '7' key. */
455     public static final int KEYCODE_NUMPAD_7        = 151;
456     /** Key code constant: Numeric keypad '8' key. */
457     public static final int KEYCODE_NUMPAD_8        = 152;
458     /** Key code constant: Numeric keypad '9' key. */
459     public static final int KEYCODE_NUMPAD_9        = 153;
460     /** Key code constant: Numeric keypad '/' key (for division). */
461     public static final int KEYCODE_NUMPAD_DIVIDE   = 154;
462     /** Key code constant: Numeric keypad '*' key (for multiplication). */
463     public static final int KEYCODE_NUMPAD_MULTIPLY = 155;
464     /** Key code constant: Numeric keypad '-' key (for subtraction). */
465     public static final int KEYCODE_NUMPAD_SUBTRACT = 156;
466     /** Key code constant: Numeric keypad '+' key (for addition). */
467     public static final int KEYCODE_NUMPAD_ADD      = 157;
468     /** Key code constant: Numeric keypad '.' key (for decimals or digit grouping). */
469     public static final int KEYCODE_NUMPAD_DOT      = 158;
470     /** Key code constant: Numeric keypad ',' key (for decimals or digit grouping). */
471     public static final int KEYCODE_NUMPAD_COMMA    = 159;
472     /** Key code constant: Numeric keypad Enter key. */
473     public static final int KEYCODE_NUMPAD_ENTER    = 160;
474     /** Key code constant: Numeric keypad '=' key. */
475     public static final int KEYCODE_NUMPAD_EQUALS   = 161;
476     /** Key code constant: Numeric keypad '(' key. */
477     public static final int KEYCODE_NUMPAD_LEFT_PAREN = 162;
478     /** Key code constant: Numeric keypad ')' key. */
479     public static final int KEYCODE_NUMPAD_RIGHT_PAREN = 163;
480     /** Key code constant: Volume Mute key.
481      * Mutes the speaker, unlike {@link #KEYCODE_MUTE}.
482      * This key should normally be implemented as a toggle such that the first press
483      * mutes the speaker and the second press restores the original volume. */
484     public static final int KEYCODE_VOLUME_MUTE     = 164;
485     /** Key code constant: Info key.
486      * Common on TV remotes to show additional information related to what is
487      * currently being viewed. */
488     public static final int KEYCODE_INFO            = 165;
489     /** Key code constant: Channel up key.
490      * On TV remotes, increments the television channel. */
491     public static final int KEYCODE_CHANNEL_UP      = 166;
492     /** Key code constant: Channel down key.
493      * On TV remotes, decrements the television channel. */
494     public static final int KEYCODE_CHANNEL_DOWN    = 167;
495     /** Key code constant: Zoom in key. */
496     public static final int KEYCODE_ZOOM_IN         = 168;
497     /** Key code constant: Zoom out key. */
498     public static final int KEYCODE_ZOOM_OUT        = 169;
499     /** Key code constant: TV key.
500      * On TV remotes, switches to viewing live TV. */
501     public static final int KEYCODE_TV              = 170;
502     /** Key code constant: Window key.
503      * On TV remotes, toggles picture-in-picture mode or other windowing functions.
504      * On Android Wear devices, triggers a display offset. */
505     public static final int KEYCODE_WINDOW          = 171;
506     /** Key code constant: Guide key.
507      * On TV remotes, shows a programming guide. */
508     public static final int KEYCODE_GUIDE           = 172;
509     /** Key code constant: DVR key.
510      * On some TV remotes, switches to a DVR mode for recorded shows. */
511     public static final int KEYCODE_DVR             = 173;
512     /** Key code constant: Bookmark key.
513      * On some TV remotes, bookmarks content or web pages. */
514     public static final int KEYCODE_BOOKMARK        = 174;
515     /** Key code constant: Toggle captions key.
516      * Switches the mode for closed-captioning text, for example during television shows. */
517     public static final int KEYCODE_CAPTIONS        = 175;
518     /** Key code constant: Settings key.
519      * Starts the system settings activity. */
520     public static final int KEYCODE_SETTINGS        = 176;
521     /** Key code constant: TV power key.
522      * On TV remotes, toggles the power on a television screen. */
523     public static final int KEYCODE_TV_POWER        = 177;
524     /** Key code constant: TV input key.
525      * On TV remotes, switches the input on a television screen. */
526     public static final int KEYCODE_TV_INPUT        = 178;
527     /** Key code constant: Set-top-box power key.
528      * On TV remotes, toggles the power on an external Set-top-box. */
529     public static final int KEYCODE_STB_POWER       = 179;
530     /** Key code constant: Set-top-box input key.
531      * On TV remotes, switches the input mode on an external Set-top-box. */
532     public static final int KEYCODE_STB_INPUT       = 180;
533     /** Key code constant: A/V Receiver power key.
534      * On TV remotes, toggles the power on an external A/V Receiver. */
535     public static final int KEYCODE_AVR_POWER       = 181;
536     /** Key code constant: A/V Receiver input key.
537      * On TV remotes, switches the input mode on an external A/V Receiver. */
538     public static final int KEYCODE_AVR_INPUT       = 182;
539     /** Key code constant: Red "programmable" key.
540      * On TV remotes, acts as a contextual/programmable key. */
541     public static final int KEYCODE_PROG_RED        = 183;
542     /** Key code constant: Green "programmable" key.
543      * On TV remotes, actsas a contextual/programmable key. */
544     public static final int KEYCODE_PROG_GREEN      = 184;
545     /** Key code constant: Yellow "programmable" key.
546      * On TV remotes, acts as a contextual/programmable key. */
547     public static final int KEYCODE_PROG_YELLOW     = 185;
548     /** Key code constant: Blue "programmable" key.
549      * On TV remotes, acts as a contextual/programmable key. */
550     public static final int KEYCODE_PROG_BLUE       = 186;
551     /** Key code constant: App switch key.
552      * Should bring up the application switcher dialog. */
553     public static final int KEYCODE_APP_SWITCH      = 187;
554     /** Key code constant: Generic Game Pad Button #1.*/
555     public static final int KEYCODE_BUTTON_1        = 188;
556     /** Key code constant: Generic Game Pad Button #2.*/
557     public static final int KEYCODE_BUTTON_2        = 189;
558     /** Key code constant: Generic Game Pad Button #3.*/
559     public static final int KEYCODE_BUTTON_3        = 190;
560     /** Key code constant: Generic Game Pad Button #4.*/
561     public static final int KEYCODE_BUTTON_4        = 191;
562     /** Key code constant: Generic Game Pad Button #5.*/
563     public static final int KEYCODE_BUTTON_5        = 192;
564     /** Key code constant: Generic Game Pad Button #6.*/
565     public static final int KEYCODE_BUTTON_6        = 193;
566     /** Key code constant: Generic Game Pad Button #7.*/
567     public static final int KEYCODE_BUTTON_7        = 194;
568     /** Key code constant: Generic Game Pad Button #8.*/
569     public static final int KEYCODE_BUTTON_8        = 195;
570     /** Key code constant: Generic Game Pad Button #9.*/
571     public static final int KEYCODE_BUTTON_9        = 196;
572     /** Key code constant: Generic Game Pad Button #10.*/
573     public static final int KEYCODE_BUTTON_10       = 197;
574     /** Key code constant: Generic Game Pad Button #11.*/
575     public static final int KEYCODE_BUTTON_11       = 198;
576     /** Key code constant: Generic Game Pad Button #12.*/
577     public static final int KEYCODE_BUTTON_12       = 199;
578     /** Key code constant: Generic Game Pad Button #13.*/
579     public static final int KEYCODE_BUTTON_13       = 200;
580     /** Key code constant: Generic Game Pad Button #14.*/
581     public static final int KEYCODE_BUTTON_14       = 201;
582     /** Key code constant: Generic Game Pad Button #15.*/
583     public static final int KEYCODE_BUTTON_15       = 202;
584     /** Key code constant: Generic Game Pad Button #16.*/
585     public static final int KEYCODE_BUTTON_16       = 203;
586     /** Key code constant: Language Switch key.
587      * Toggles the current input language such as switching between English and Japanese on
588      * a QWERTY keyboard.  On some devices, the same function may be performed by
589      * pressing Shift+Spacebar. */
590     public static final int KEYCODE_LANGUAGE_SWITCH = 204;
591     /** Key code constant: Manner Mode key.
592      * Toggles silent or vibrate mode on and off to make the device behave more politely
593      * in certain settings such as on a crowded train.  On some devices, the key may only
594      * operate when long-pressed. */
595     public static final int KEYCODE_MANNER_MODE     = 205;
596     /** Key code constant: 3D Mode key.
597      * Toggles the display between 2D and 3D mode. */
598     public static final int KEYCODE_3D_MODE         = 206;
599     /** Key code constant: Contacts special function key.
600      * Used to launch an address book application. */
601     public static final int KEYCODE_CONTACTS        = 207;
602     /** Key code constant: Calendar special function key.
603      * Used to launch a calendar application. */
604     public static final int KEYCODE_CALENDAR        = 208;
605     /** Key code constant: Music special function key.
606      * Used to launch a music player application. */
607     public static final int KEYCODE_MUSIC           = 209;
608     /** Key code constant: Calculator special function key.
609      * Used to launch a calculator application. */
610     public static final int KEYCODE_CALCULATOR      = 210;
611     /** Key code constant: Japanese full-width / half-width key. */
612     public static final int KEYCODE_ZENKAKU_HANKAKU = 211;
613     /** Key code constant: Japanese alphanumeric key. */
614     public static final int KEYCODE_EISU            = 212;
615     /** Key code constant: Japanese non-conversion key. */
616     public static final int KEYCODE_MUHENKAN        = 213;
617     /** Key code constant: Japanese conversion key. */
618     public static final int KEYCODE_HENKAN          = 214;
619     /** Key code constant: Japanese katakana / hiragana key. */
620     public static final int KEYCODE_KATAKANA_HIRAGANA = 215;
621     /** Key code constant: Japanese Yen key. */
622     public static final int KEYCODE_YEN             = 216;
623     /** Key code constant: Japanese Ro key. */
624     public static final int KEYCODE_RO              = 217;
625     /** Key code constant: Japanese kana key. */
626     public static final int KEYCODE_KANA            = 218;
627     /** Key code constant: Assist key.
628      * Launches the global assist activity.  Not delivered to applications. */
629     public static final int KEYCODE_ASSIST          = 219;
630     /** Key code constant: Brightness Down key.
631      * Adjusts the screen brightness down. */
632     public static final int KEYCODE_BRIGHTNESS_DOWN = 220;
633     /** Key code constant: Brightness Up key.
634      * Adjusts the screen brightness up. */
635     public static final int KEYCODE_BRIGHTNESS_UP   = 221;
636     /** Key code constant: Audio Track key.
637      * Switches the audio tracks. */
638     public static final int KEYCODE_MEDIA_AUDIO_TRACK = 222;
639     /** Key code constant: Sleep key.
640      * Puts the device to sleep.  Behaves somewhat like {@link #KEYCODE_POWER} but it
641      * has no effect if the device is already asleep. */
642     public static final int KEYCODE_SLEEP           = 223;
643     /** Key code constant: Wakeup key.
644      * Wakes up the device.  Behaves somewhat like {@link #KEYCODE_POWER} but it
645      * has no effect if the device is already awake. */
646     public static final int KEYCODE_WAKEUP          = 224;
647     /** Key code constant: Pairing key.
648      * Initiates peripheral pairing mode. Useful for pairing remote control
649      * devices or game controllers, especially if no other input mode is
650      * available. */
651     public static final int KEYCODE_PAIRING         = 225;
652     /** Key code constant: Media Top Menu key.
653      * Goes to the top of media menu. */
654     public static final int KEYCODE_MEDIA_TOP_MENU  = 226;
655     /** Key code constant: '11' key. */
656     public static final int KEYCODE_11              = 227;
657     /** Key code constant: '12' key. */
658     public static final int KEYCODE_12              = 228;
659     /** Key code constant: Last Channel key.
660      * Goes to the last viewed channel. */
661     public static final int KEYCODE_LAST_CHANNEL    = 229;
662     /** Key code constant: TV data service key.
663      * Displays data services like weather, sports. */
664     public static final int KEYCODE_TV_DATA_SERVICE = 230;
665     /** Key code constant: Voice Assist key.
666      * Launches the global voice assist activity. Not delivered to applications. */
667     public static final int KEYCODE_VOICE_ASSIST = 231;
668     /** Key code constant: Radio key.
669      * Toggles TV service / Radio service. */
670     public static final int KEYCODE_TV_RADIO_SERVICE = 232;
671     /** Key code constant: Teletext key.
672      * Displays Teletext service. */
673     public static final int KEYCODE_TV_TELETEXT = 233;
674     /** Key code constant: Number entry key.
675      * Initiates to enter multi-digit channel nubmber when each digit key is assigned
676      * for selecting separate channel. Corresponds to Number Entry Mode (0x1D) of CEC
677      * User Control Code. */
678     public static final int KEYCODE_TV_NUMBER_ENTRY = 234;
679     /** Key code constant: Analog Terrestrial key.
680      * Switches to analog terrestrial broadcast service. */
681     public static final int KEYCODE_TV_TERRESTRIAL_ANALOG = 235;
682     /** Key code constant: Digital Terrestrial key.
683      * Switches to digital terrestrial broadcast service. */
684     public static final int KEYCODE_TV_TERRESTRIAL_DIGITAL = 236;
685     /** Key code constant: Satellite key.
686      * Switches to digital satellite broadcast service. */
687     public static final int KEYCODE_TV_SATELLITE = 237;
688     /** Key code constant: BS key.
689      * Switches to BS digital satellite broadcasting service available in Japan. */
690     public static final int KEYCODE_TV_SATELLITE_BS = 238;
691     /** Key code constant: CS key.
692      * Switches to CS digital satellite broadcasting service available in Japan. */
693     public static final int KEYCODE_TV_SATELLITE_CS = 239;
694     /** Key code constant: BS/CS key.
695      * Toggles between BS and CS digital satellite services. */
696     public static final int KEYCODE_TV_SATELLITE_SERVICE = 240;
697     /** Key code constant: Toggle Network key.
698      * Toggles selecting broacast services. */
699     public static final int KEYCODE_TV_NETWORK = 241;
700     /** Key code constant: Antenna/Cable key.
701      * Toggles broadcast input source between antenna and cable. */
702     public static final int KEYCODE_TV_ANTENNA_CABLE = 242;
703     /** Key code constant: HDMI #1 key.
704      * Switches to HDMI input #1. */
705     public static final int KEYCODE_TV_INPUT_HDMI_1 = 243;
706     /** Key code constant: HDMI #2 key.
707      * Switches to HDMI input #2. */
708     public static final int KEYCODE_TV_INPUT_HDMI_2 = 244;
709     /** Key code constant: HDMI #3 key.
710      * Switches to HDMI input #3. */
711     public static final int KEYCODE_TV_INPUT_HDMI_3 = 245;
712     /** Key code constant: HDMI #4 key.
713      * Switches to HDMI input #4. */
714     public static final int KEYCODE_TV_INPUT_HDMI_4 = 246;
715     /** Key code constant: Composite #1 key.
716      * Switches to composite video input #1. */
717     public static final int KEYCODE_TV_INPUT_COMPOSITE_1 = 247;
718     /** Key code constant: Composite #2 key.
719      * Switches to composite video input #2. */
720     public static final int KEYCODE_TV_INPUT_COMPOSITE_2 = 248;
721     /** Key code constant: Component #1 key.
722      * Switches to component video input #1. */
723     public static final int KEYCODE_TV_INPUT_COMPONENT_1 = 249;
724     /** Key code constant: Component #2 key.
725      * Switches to component video input #2. */
726     public static final int KEYCODE_TV_INPUT_COMPONENT_2 = 250;
727     /** Key code constant: VGA #1 key.
728      * Switches to VGA (analog RGB) input #1. */
729     public static final int KEYCODE_TV_INPUT_VGA_1 = 251;
730     /** Key code constant: Audio description key.
731      * Toggles audio description off / on. */
732     public static final int KEYCODE_TV_AUDIO_DESCRIPTION = 252;
733     /** Key code constant: Audio description mixing volume up key.
734      * Louden audio description volume as compared with normal audio volume. */
735     public static final int KEYCODE_TV_AUDIO_DESCRIPTION_MIX_UP = 253;
736     /** Key code constant: Audio description mixing volume down key.
737      * Lessen audio description volume as compared with normal audio volume. */
738     public static final int KEYCODE_TV_AUDIO_DESCRIPTION_MIX_DOWN = 254;
739     /** Key code constant: Zoom mode key.
740      * Changes Zoom mode (Normal, Full, Zoom, Wide-zoom, etc.) */
741     public static final int KEYCODE_TV_ZOOM_MODE = 255;
742     /** Key code constant: Contents menu key.
743      * Goes to the title list. Corresponds to Contents Menu (0x0B) of CEC User Control
744      * Code */
745     public static final int KEYCODE_TV_CONTENTS_MENU = 256;
746     /** Key code constant: Media context menu key.
747      * Goes to the context menu of media contents. Corresponds to Media Context-sensitive
748      * Menu (0x11) of CEC User Control Code. */
749     public static final int KEYCODE_TV_MEDIA_CONTEXT_MENU = 257;
750     /** Key code constant: Timer programming key.
751      * Goes to the timer recording menu. Corresponds to Timer Programming (0x54) of
752      * CEC User Control Code. */
753     public static final int KEYCODE_TV_TIMER_PROGRAMMING = 258;
754     /** Key code constant: Help key. */
755     public static final int KEYCODE_HELP = 259;
756     /** Key code constant: Navigate to previous key.
757      * Goes backward by one item in an ordered collection of items. */
758     public static final int KEYCODE_NAVIGATE_PREVIOUS = 260;
759     /** Key code constant: Navigate to next key.
760      * Advances to the next item in an ordered collection of items. */
761     public static final int KEYCODE_NAVIGATE_NEXT   = 261;
762     /** Key code constant: Navigate in key.
763      * Activates the item that currently has focus or expands to the next level of a navigation
764      * hierarchy. */
765     public static final int KEYCODE_NAVIGATE_IN     = 262;
766     /** Key code constant: Navigate out key.
767      * Backs out one level of a navigation hierarchy or collapses the item that currently has
768      * focus. */
769     public static final int KEYCODE_NAVIGATE_OUT    = 263;
770     /** Key code constant: Primary stem key for Wear
771      * Main power/reset button on watch. */
772     public static final int KEYCODE_STEM_PRIMARY = 264;
773     /** Key code constant: Generic stem key 1 for Wear */
774     public static final int KEYCODE_STEM_1 = 265;
775     /** Key code constant: Generic stem key 2 for Wear */
776     public static final int KEYCODE_STEM_2 = 266;
777     /** Key code constant: Generic stem key 3 for Wear */
778     public static final int KEYCODE_STEM_3 = 267;
779     /** Key code constant: Directional Pad Up-Left */
780     public static final int KEYCODE_DPAD_UP_LEFT    = 268;
781     /** Key code constant: Directional Pad Down-Left */
782     public static final int KEYCODE_DPAD_DOWN_LEFT  = 269;
783     /** Key code constant: Directional Pad Up-Right */
784     public static final int KEYCODE_DPAD_UP_RIGHT   = 270;
785     /** Key code constant: Directional Pad Down-Right */
786     public static final int KEYCODE_DPAD_DOWN_RIGHT = 271;
787     /** Key code constant: Skip forward media key. */
788     public static final int KEYCODE_MEDIA_SKIP_FORWARD = 272;
789     /** Key code constant: Skip backward media key. */
790     public static final int KEYCODE_MEDIA_SKIP_BACKWARD = 273;
791     /** Key code constant: Step forward media key.
792      * Steps media forward, one frame at a time. */
793     public static final int KEYCODE_MEDIA_STEP_FORWARD = 274;
794     /** Key code constant: Step backward media key.
795      * Steps media backward, one frame at a time. */
796     public static final int KEYCODE_MEDIA_STEP_BACKWARD = 275;
797     /** Key code constant: put device to sleep unless a wakelock is held. */
798     public static final int KEYCODE_SOFT_SLEEP = 276;
799     /** Key code constant: Cut key. */
800     public static final int KEYCODE_CUT = 277;
801     /** Key code constant: Copy key. */
802     public static final int KEYCODE_COPY = 278;
803     /** Key code constant: Paste key. */
804     public static final int KEYCODE_PASTE = 279;
805     /** Key code constant: Consumed by the system for navigation up */
806     public static final int KEYCODE_SYSTEM_NAVIGATION_UP = 280;
807     /** Key code constant: Consumed by the system for navigation down */
808     public static final int KEYCODE_SYSTEM_NAVIGATION_DOWN = 281;
809     /** Key code constant: Consumed by the system for navigation left*/
810     public static final int KEYCODE_SYSTEM_NAVIGATION_LEFT = 282;
811     /** Key code constant: Consumed by the system for navigation right */
812     public static final int KEYCODE_SYSTEM_NAVIGATION_RIGHT = 283;
813     /** Key code constant: Show all apps */
814     public static final int KEYCODE_ALL_APPS = 284;
815     /** Key code constant: Refresh key. */
816     public static final int KEYCODE_REFRESH = 285;
817     /** Key code constant: Thumbs up key. Apps can use this to let user upvote content. */
818     public static final int KEYCODE_THUMBS_UP = 286;
819     /** Key code constant: Thumbs down key. Apps can use this to let user downvote content. */
820     public static final int KEYCODE_THUMBS_DOWN = 287;
821     /**
822      * Key code constant: Used to switch current {@link android.accounts.Account} that is
823      * consuming content. May be consumed by system to set account globally.
824      */
825     public static final int KEYCODE_PROFILE_SWITCH = 288;
826 
827     /**
828      * Integer value of the last KEYCODE. Increases as new keycodes are added to KeyEvent.
829      * @hide
830      */
831     @TestApi
832     public static final int LAST_KEYCODE = KEYCODE_PROFILE_SWITCH;
833 
834     // NOTE: If you add a new keycode here you must also add it to:
835     //  isSystem()
836     //  isWakeKey()
837     //  frameworks/native/include/android/keycodes.h
838     //  frameworks/native/include/input/InputEventLabels.h
839     //  frameworks/base/core/res/res/values/attrs.xml
840     //  emulator?
841     //  LAST_KEYCODE
842     //
843     //  Also Android currently does not reserve code ranges for vendor-
844     //  specific key codes.  If you have new key codes to have, you
845     //  MUST contribute a patch to the open source project to define
846     //  those new codes.  This is intended to maintain a consistent
847     //  set of key code definitions across all Android devices.
848 
849     // Symbolic names of all metakeys in bit order from least significant to most significant.
850     // Accordingly there are exactly 32 values in this table.
851     @UnsupportedAppUsage
852     private static final String[] META_SYMBOLIC_NAMES = new String[] {
853         "META_SHIFT_ON",
854         "META_ALT_ON",
855         "META_SYM_ON",
856         "META_FUNCTION_ON",
857         "META_ALT_LEFT_ON",
858         "META_ALT_RIGHT_ON",
859         "META_SHIFT_LEFT_ON",
860         "META_SHIFT_RIGHT_ON",
861         "META_CAP_LOCKED",
862         "META_ALT_LOCKED",
863         "META_SYM_LOCKED",
864         "0x00000800",
865         "META_CTRL_ON",
866         "META_CTRL_LEFT_ON",
867         "META_CTRL_RIGHT_ON",
868         "0x00008000",
869         "META_META_ON",
870         "META_META_LEFT_ON",
871         "META_META_RIGHT_ON",
872         "0x00080000",
873         "META_CAPS_LOCK_ON",
874         "META_NUM_LOCK_ON",
875         "META_SCROLL_LOCK_ON",
876         "0x00800000",
877         "0x01000000",
878         "0x02000000",
879         "0x04000000",
880         "0x08000000",
881         "0x10000000",
882         "0x20000000",
883         "0x40000000",
884         "0x80000000",
885     };
886 
887     private static final String LABEL_PREFIX = "KEYCODE_";
888 
889     /**
890      * @deprecated There are now more than MAX_KEYCODE keycodes.
891      * Use {@link #getMaxKeyCode()} instead.
892      */
893     @Deprecated
894     public static final int MAX_KEYCODE             = 84;
895 
896     /**
897      * {@link #getAction} value: the key has been pressed down.
898      */
899     public static final int ACTION_DOWN             = 0;
900     /**
901      * {@link #getAction} value: the key has been released.
902      */
903     public static final int ACTION_UP               = 1;
904     /**
905      * @deprecated No longer used by the input system.
906      * {@link #getAction} value: multiple duplicate key events have
907      * occurred in a row, or a complex string is being delivered.  If the
908      * key code is not {@link #KEYCODE_UNKNOWN} then the
909      * {@link #getRepeatCount()} method returns the number of times
910      * the given key code should be executed.
911      * Otherwise, if the key code is {@link #KEYCODE_UNKNOWN}, then
912      * this is a sequence of characters as returned by {@link #getCharacters}.
913      */
914     @Deprecated
915     public static final int ACTION_MULTIPLE         = 2;
916 
917     /**
918      * SHIFT key locked in CAPS mode.
919      * Reserved for use by {@link MetaKeyKeyListener} for a published constant in its API.
920      * @hide
921      */
922     @UnsupportedAppUsage
923     public static final int META_CAP_LOCKED = 0x100;
924 
925     /**
926      * ALT key locked.
927      * Reserved for use by {@link MetaKeyKeyListener} for a published constant in its API.
928      * @hide
929      */
930     @UnsupportedAppUsage
931     public static final int META_ALT_LOCKED = 0x200;
932 
933     /**
934      * SYM key locked.
935      * Reserved for use by {@link MetaKeyKeyListener} for a published constant in its API.
936      * @hide
937      */
938     @UnsupportedAppUsage
939     public static final int META_SYM_LOCKED = 0x400;
940 
941     /**
942      * Text is in selection mode.
943      * Reserved for use by {@link MetaKeyKeyListener} for a private unpublished constant
944      * in its API that is currently being retained for legacy reasons.
945      * @hide
946      */
947     @UnsupportedAppUsage
948     public static final int META_SELECTING = 0x800;
949 
950     /**
951      * <p>This mask is used to check whether one of the ALT meta keys is pressed.</p>
952      *
953      * @see #isAltPressed()
954      * @see #getMetaState()
955      * @see #KEYCODE_ALT_LEFT
956      * @see #KEYCODE_ALT_RIGHT
957      */
958     public static final int META_ALT_ON = 0x02;
959 
960     /**
961      * <p>This mask is used to check whether the left ALT meta key is pressed.</p>
962      *
963      * @see #isAltPressed()
964      * @see #getMetaState()
965      * @see #KEYCODE_ALT_LEFT
966      */
967     public static final int META_ALT_LEFT_ON = 0x10;
968 
969     /**
970      * <p>This mask is used to check whether the right the ALT meta key is pressed.</p>
971      *
972      * @see #isAltPressed()
973      * @see #getMetaState()
974      * @see #KEYCODE_ALT_RIGHT
975      */
976     public static final int META_ALT_RIGHT_ON = 0x20;
977 
978     /**
979      * <p>This mask is used to check whether one of the SHIFT meta keys is pressed.</p>
980      *
981      * @see #isShiftPressed()
982      * @see #getMetaState()
983      * @see #KEYCODE_SHIFT_LEFT
984      * @see #KEYCODE_SHIFT_RIGHT
985      */
986     public static final int META_SHIFT_ON = 0x1;
987 
988     /**
989      * <p>This mask is used to check whether the left SHIFT meta key is pressed.</p>
990      *
991      * @see #isShiftPressed()
992      * @see #getMetaState()
993      * @see #KEYCODE_SHIFT_LEFT
994      */
995     public static final int META_SHIFT_LEFT_ON = 0x40;
996 
997     /**
998      * <p>This mask is used to check whether the right SHIFT meta key is pressed.</p>
999      *
1000      * @see #isShiftPressed()
1001      * @see #getMetaState()
1002      * @see #KEYCODE_SHIFT_RIGHT
1003      */
1004     public static final int META_SHIFT_RIGHT_ON = 0x80;
1005 
1006     /**
1007      * <p>This mask is used to check whether the SYM meta key is pressed.</p>
1008      *
1009      * @see #isSymPressed()
1010      * @see #getMetaState()
1011      */
1012     public static final int META_SYM_ON = 0x4;
1013 
1014     /**
1015      * <p>This mask is used to check whether the FUNCTION meta key is pressed.</p>
1016      *
1017      * @see #isFunctionPressed()
1018      * @see #getMetaState()
1019      */
1020     public static final int META_FUNCTION_ON = 0x8;
1021 
1022     /**
1023      * <p>This mask is used to check whether one of the CTRL meta keys is pressed.</p>
1024      *
1025      * @see #isCtrlPressed()
1026      * @see #getMetaState()
1027      * @see #KEYCODE_CTRL_LEFT
1028      * @see #KEYCODE_CTRL_RIGHT
1029      */
1030     public static final int META_CTRL_ON = 0x1000;
1031 
1032     /**
1033      * <p>This mask is used to check whether the left CTRL meta key is pressed.</p>
1034      *
1035      * @see #isCtrlPressed()
1036      * @see #getMetaState()
1037      * @see #KEYCODE_CTRL_LEFT
1038      */
1039     public static final int META_CTRL_LEFT_ON = 0x2000;
1040 
1041     /**
1042      * <p>This mask is used to check whether the right CTRL meta key is pressed.</p>
1043      *
1044      * @see #isCtrlPressed()
1045      * @see #getMetaState()
1046      * @see #KEYCODE_CTRL_RIGHT
1047      */
1048     public static final int META_CTRL_RIGHT_ON = 0x4000;
1049 
1050     /**
1051      * <p>This mask is used to check whether one of the META meta keys is pressed.</p>
1052      *
1053      * @see #isMetaPressed()
1054      * @see #getMetaState()
1055      * @see #KEYCODE_META_LEFT
1056      * @see #KEYCODE_META_RIGHT
1057      */
1058     public static final int META_META_ON = 0x10000;
1059 
1060     /**
1061      * <p>This mask is used to check whether the left META meta key is pressed.</p>
1062      *
1063      * @see #isMetaPressed()
1064      * @see #getMetaState()
1065      * @see #KEYCODE_META_LEFT
1066      */
1067     public static final int META_META_LEFT_ON = 0x20000;
1068 
1069     /**
1070      * <p>This mask is used to check whether the right META meta key is pressed.</p>
1071      *
1072      * @see #isMetaPressed()
1073      * @see #getMetaState()
1074      * @see #KEYCODE_META_RIGHT
1075      */
1076     public static final int META_META_RIGHT_ON = 0x40000;
1077 
1078     /**
1079      * <p>This mask is used to check whether the CAPS LOCK meta key is on.</p>
1080      *
1081      * @see #isCapsLockOn()
1082      * @see #getMetaState()
1083      * @see #KEYCODE_CAPS_LOCK
1084      */
1085     public static final int META_CAPS_LOCK_ON = 0x100000;
1086 
1087     /**
1088      * <p>This mask is used to check whether the NUM LOCK meta key is on.</p>
1089      *
1090      * @see #isNumLockOn()
1091      * @see #getMetaState()
1092      * @see #KEYCODE_NUM_LOCK
1093      */
1094     public static final int META_NUM_LOCK_ON = 0x200000;
1095 
1096     /**
1097      * <p>This mask is used to check whether the SCROLL LOCK meta key is on.</p>
1098      *
1099      * @see #isScrollLockOn()
1100      * @see #getMetaState()
1101      * @see #KEYCODE_SCROLL_LOCK
1102      */
1103     public static final int META_SCROLL_LOCK_ON = 0x400000;
1104 
1105     /**
1106      * This mask is a combination of {@link #META_SHIFT_ON}, {@link #META_SHIFT_LEFT_ON}
1107      * and {@link #META_SHIFT_RIGHT_ON}.
1108      */
1109     public static final int META_SHIFT_MASK = META_SHIFT_ON
1110             | META_SHIFT_LEFT_ON | META_SHIFT_RIGHT_ON;
1111 
1112     /**
1113      * This mask is a combination of {@link #META_ALT_ON}, {@link #META_ALT_LEFT_ON}
1114      * and {@link #META_ALT_RIGHT_ON}.
1115      */
1116     public static final int META_ALT_MASK = META_ALT_ON
1117             | META_ALT_LEFT_ON | META_ALT_RIGHT_ON;
1118 
1119     /**
1120      * This mask is a combination of {@link #META_CTRL_ON}, {@link #META_CTRL_LEFT_ON}
1121      * and {@link #META_CTRL_RIGHT_ON}.
1122      */
1123     public static final int META_CTRL_MASK = META_CTRL_ON
1124             | META_CTRL_LEFT_ON | META_CTRL_RIGHT_ON;
1125 
1126     /**
1127      * This mask is a combination of {@link #META_META_ON}, {@link #META_META_LEFT_ON}
1128      * and {@link #META_META_RIGHT_ON}.
1129      */
1130     public static final int META_META_MASK = META_META_ON
1131             | META_META_LEFT_ON | META_META_RIGHT_ON;
1132 
1133     /**
1134      * This mask is set if the device woke because of this key event.
1135      *
1136      * @deprecated This flag will never be set by the system since the system
1137      * consumes all wake keys itself.
1138      */
1139     @Deprecated
1140     public static final int FLAG_WOKE_HERE = 0x1;
1141 
1142     /**
1143      * This mask is set if the key event was generated by a software keyboard.
1144      */
1145     public static final int FLAG_SOFT_KEYBOARD = 0x2;
1146 
1147     /**
1148      * This mask is set if we don't want the key event to cause us to leave
1149      * touch mode.
1150      */
1151     public static final int FLAG_KEEP_TOUCH_MODE = 0x4;
1152 
1153     /**
1154      * This mask is set if an event was known to come from a trusted part
1155      * of the system.  That is, the event is known to come from the user,
1156      * and could not have been spoofed by a third party component.
1157      */
1158     public static final int FLAG_FROM_SYSTEM = 0x8;
1159 
1160     /**
1161      * This mask is used for compatibility, to identify enter keys that are
1162      * coming from an IME whose enter key has been auto-labelled "next" or
1163      * "done".  This allows TextView to dispatch these as normal enter keys
1164      * for old applications, but still do the appropriate action when
1165      * receiving them.
1166      */
1167     public static final int FLAG_EDITOR_ACTION = 0x10;
1168 
1169     /**
1170      * When associated with up key events, this indicates that the key press
1171      * has been canceled.  Typically this is used with virtual touch screen
1172      * keys, where the user can slide from the virtual key area on to the
1173      * display: in that case, the application will receive a canceled up
1174      * event and should not perform the action normally associated with the
1175      * key.  Note that for this to work, the application can not perform an
1176      * action for a key until it receives an up or the long press timeout has
1177      * expired.
1178      */
1179     public static final int FLAG_CANCELED = 0x20;
1180 
1181     /**
1182      * This key event was generated by a virtual (on-screen) hard key area.
1183      * Typically this is an area of the touchscreen, outside of the regular
1184      * display, dedicated to "hardware" buttons.
1185      */
1186     public static final int FLAG_VIRTUAL_HARD_KEY = 0x40;
1187 
1188     /**
1189      * This flag is set for the first key repeat that occurs after the
1190      * long press timeout.
1191      */
1192     public static final int FLAG_LONG_PRESS = 0x80;
1193 
1194     /**
1195      * Set when a key event has {@link #FLAG_CANCELED} set because a long
1196      * press action was executed while it was down.
1197      */
1198     public static final int FLAG_CANCELED_LONG_PRESS = 0x100;
1199 
1200     /**
1201      * Set for {@link #ACTION_UP} when this event's key code is still being
1202      * tracked from its initial down.  That is, somebody requested that tracking
1203      * started on the key down and a long press has not caused
1204      * the tracking to be canceled.
1205      */
1206     public static final int FLAG_TRACKING = 0x200;
1207 
1208     /**
1209      * Set when a key event has been synthesized to implement default behavior
1210      * for an event that the application did not handle.
1211      * Fallback key events are generated by unhandled trackball motions
1212      * (to emulate a directional keypad) and by certain unhandled key presses
1213      * that are declared in the key map (such as special function numeric keypad
1214      * keys when numlock is off).
1215      */
1216     public static final int FLAG_FALLBACK = 0x400;
1217 
1218     /**
1219      * Signifies that the key is being predispatched.
1220      * @hide
1221      */
1222     public static final int FLAG_PREDISPATCH = 0x20000000;
1223 
1224     /**
1225      * Private control to determine when an app is tracking a key sequence.
1226      * @hide
1227      */
1228     public static final int FLAG_START_TRACKING = 0x40000000;
1229 
1230     /**
1231      * Private flag that indicates when the system has detected that this key event
1232      * may be inconsistent with respect to the sequence of previously delivered key events,
1233      * such as when a key up event is sent but the key was not down.
1234      *
1235      * @hide
1236      * @see #isTainted
1237      * @see #setTainted
1238      */
1239     public static final int FLAG_TAINTED = 0x80000000;
1240 
1241     /**
1242      * Returns the maximum keycode.
1243      */
getMaxKeyCode()1244     public static int getMaxKeyCode() {
1245         return LAST_KEYCODE;
1246     }
1247 
1248     /**
1249      * Get the character that is produced by putting accent on the character
1250      * c.
1251      * For example, getDeadChar('`', 'e') returns &egrave;.
1252      */
getDeadChar(int accent, int c)1253     public static int getDeadChar(int accent, int c) {
1254         return KeyCharacterMap.getDeadChar(accent, c);
1255     }
1256 
1257     static final boolean DEBUG = false;
1258     static final String TAG = "KeyEvent";
1259 
1260     private static final int MAX_RECYCLED = 10;
1261     private static final Object gRecyclerLock = new Object();
1262     private static int gRecyclerUsed;
1263     private static KeyEvent gRecyclerTop;
1264 
1265     private KeyEvent mNext;
1266 
1267     @UnsupportedAppUsage
1268     private int mDeviceId;
1269     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
1270     private int mSource;
1271     private int mDisplayId;
1272     @UnsupportedAppUsage
1273     private int mMetaState;
1274     @UnsupportedAppUsage
1275     private int mAction;
1276     @UnsupportedAppUsage
1277     private int mKeyCode;
1278     @UnsupportedAppUsage
1279     private int mScanCode;
1280     @UnsupportedAppUsage
1281     private int mRepeatCount;
1282     @UnsupportedAppUsage
1283     private int mFlags;
1284     @UnsupportedAppUsage
1285     private long mDownTime;
1286     @UnsupportedAppUsage
1287     private long mEventTime;
1288     @UnsupportedAppUsage
1289     private String mCharacters;
1290 
1291     public interface Callback {
1292         /**
1293          * Called when a key down event has occurred.  If you return true,
1294          * you can first call {@link KeyEvent#startTracking()
1295          * KeyEvent.startTracking()} to have the framework track the event
1296          * through its {@link #onKeyUp(int, KeyEvent)} and also call your
1297          * {@link #onKeyLongPress(int, KeyEvent)} if it occurs.
1298          *
1299          * @param keyCode The value in event.getKeyCode().
1300          * @param event Description of the key event.
1301          *
1302          * @return If you handled the event, return true.  If you want to allow
1303          *         the event to be handled by the next receiver, return false.
1304          */
onKeyDown(int keyCode, KeyEvent event)1305         boolean onKeyDown(int keyCode, KeyEvent event);
1306 
1307         /**
1308          * Called when a long press has occurred.  If you return true,
1309          * the final key up will have {@link KeyEvent#FLAG_CANCELED} and
1310          * {@link KeyEvent#FLAG_CANCELED_LONG_PRESS} set.  Note that in
1311          * order to receive this callback, someone in the event change
1312          * <em>must</em> return true from {@link #onKeyDown} <em>and</em>
1313          * call {@link KeyEvent#startTracking()} on the event.
1314          *
1315          * @param keyCode The value in event.getKeyCode().
1316          * @param event Description of the key event.
1317          *
1318          * @return If you handled the event, return true.  If you want to allow
1319          *         the event to be handled by the next receiver, return false.
1320          */
onKeyLongPress(int keyCode, KeyEvent event)1321         boolean onKeyLongPress(int keyCode, KeyEvent event);
1322 
1323         /**
1324          * Called when a key up event has occurred.
1325          *
1326          * @param keyCode The value in event.getKeyCode().
1327          * @param event Description of the key event.
1328          *
1329          * @return If you handled the event, return true.  If you want to allow
1330          *         the event to be handled by the next receiver, return false.
1331          */
onKeyUp(int keyCode, KeyEvent event)1332         boolean onKeyUp(int keyCode, KeyEvent event);
1333 
1334         /**
1335          * Called when a user's interaction with an analog control, such as
1336          * flinging a trackball, generates simulated down/up events for the same
1337          * key multiple times in quick succession.
1338          *
1339          * @param keyCode The value in event.getKeyCode().
1340          * @param count Number of pairs as returned by event.getRepeatCount().
1341          * @param event Description of the key event.
1342          *
1343          * @return If you handled the event, return true.  If you want to allow
1344          *         the event to be handled by the next receiver, return false.
1345          */
onKeyMultiple(int keyCode, int count, KeyEvent event)1346         boolean onKeyMultiple(int keyCode, int count, KeyEvent event);
1347     }
1348 
nativeKeyCodeToString(int keyCode)1349     private static native String nativeKeyCodeToString(int keyCode);
nativeKeyCodeFromString(String keyCode)1350     private static native int nativeKeyCodeFromString(String keyCode);
1351 
KeyEvent()1352     private KeyEvent() {
1353     }
1354 
1355     /**
1356      * Create a new key event.
1357      *
1358      * @param action Action code: either {@link #ACTION_DOWN},
1359      * {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.
1360      * @param code The key code.
1361      */
KeyEvent(int action, int code)1362     public KeyEvent(int action, int code) {
1363         mAction = action;
1364         mKeyCode = code;
1365         mRepeatCount = 0;
1366         mDeviceId = KeyCharacterMap.VIRTUAL_KEYBOARD;
1367     }
1368 
1369     /**
1370      * Create a new key event.
1371      *
1372      * @param downTime The time (in {@link android.os.SystemClock#uptimeMillis})
1373      * at which this key code originally went down.
1374      * @param eventTime The time (in {@link android.os.SystemClock#uptimeMillis})
1375      * at which this event happened.
1376      * @param action Action code: either {@link #ACTION_DOWN},
1377      * {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.
1378      * @param code The key code.
1379      * @param repeat A repeat count for down events (> 0 if this is after the
1380      * initial down) or event count for multiple events.
1381      */
KeyEvent(long downTime, long eventTime, int action, int code, int repeat)1382     public KeyEvent(long downTime, long eventTime, int action,
1383                     int code, int repeat) {
1384         mDownTime = downTime;
1385         mEventTime = eventTime;
1386         mAction = action;
1387         mKeyCode = code;
1388         mRepeatCount = repeat;
1389         mDeviceId = KeyCharacterMap.VIRTUAL_KEYBOARD;
1390     }
1391 
1392     /**
1393      * Create a new key event.
1394      *
1395      * @param downTime The time (in {@link android.os.SystemClock#uptimeMillis})
1396      * at which this key code originally went down.
1397      * @param eventTime The time (in {@link android.os.SystemClock#uptimeMillis})
1398      * at which this event happened.
1399      * @param action Action code: either {@link #ACTION_DOWN},
1400      * {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.
1401      * @param code The key code.
1402      * @param repeat A repeat count for down events (> 0 if this is after the
1403      * initial down) or event count for multiple events.
1404      * @param metaState Flags indicating which meta keys are currently pressed.
1405      */
KeyEvent(long downTime, long eventTime, int action, int code, int repeat, int metaState)1406     public KeyEvent(long downTime, long eventTime, int action,
1407                     int code, int repeat, int metaState) {
1408         mDownTime = downTime;
1409         mEventTime = eventTime;
1410         mAction = action;
1411         mKeyCode = code;
1412         mRepeatCount = repeat;
1413         mMetaState = metaState;
1414         mDeviceId = KeyCharacterMap.VIRTUAL_KEYBOARD;
1415     }
1416 
1417     /**
1418      * Create a new key event.
1419      *
1420      * @param downTime The time (in {@link android.os.SystemClock#uptimeMillis})
1421      * at which this key code originally went down.
1422      * @param eventTime The time (in {@link android.os.SystemClock#uptimeMillis})
1423      * at which this event happened.
1424      * @param action Action code: either {@link #ACTION_DOWN},
1425      * {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.
1426      * @param code The key code.
1427      * @param repeat A repeat count for down events (> 0 if this is after the
1428      * initial down) or event count for multiple events.
1429      * @param metaState Flags indicating which meta keys are currently pressed.
1430      * @param deviceId The device ID that generated the key event.
1431      * @param scancode Raw device scan code of the event.
1432      */
KeyEvent(long downTime, long eventTime, int action, int code, int repeat, int metaState, int deviceId, int scancode)1433     public KeyEvent(long downTime, long eventTime, int action,
1434                     int code, int repeat, int metaState,
1435                     int deviceId, int scancode) {
1436         mDownTime = downTime;
1437         mEventTime = eventTime;
1438         mAction = action;
1439         mKeyCode = code;
1440         mRepeatCount = repeat;
1441         mMetaState = metaState;
1442         mDeviceId = deviceId;
1443         mScanCode = scancode;
1444     }
1445 
1446     /**
1447      * Create a new key event.
1448      *
1449      * @param downTime The time (in {@link android.os.SystemClock#uptimeMillis})
1450      * at which this key code originally went down.
1451      * @param eventTime The time (in {@link android.os.SystemClock#uptimeMillis})
1452      * at which this event happened.
1453      * @param action Action code: either {@link #ACTION_DOWN},
1454      * {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.
1455      * @param code The key code.
1456      * @param repeat A repeat count for down events (> 0 if this is after the
1457      * initial down) or event count for multiple events.
1458      * @param metaState Flags indicating which meta keys are currently pressed.
1459      * @param deviceId The device ID that generated the key event.
1460      * @param scancode Raw device scan code of the event.
1461      * @param flags The flags for this key event
1462      */
KeyEvent(long downTime, long eventTime, int action, int code, int repeat, int metaState, int deviceId, int scancode, int flags)1463     public KeyEvent(long downTime, long eventTime, int action,
1464                     int code, int repeat, int metaState,
1465                     int deviceId, int scancode, int flags) {
1466         mDownTime = downTime;
1467         mEventTime = eventTime;
1468         mAction = action;
1469         mKeyCode = code;
1470         mRepeatCount = repeat;
1471         mMetaState = metaState;
1472         mDeviceId = deviceId;
1473         mScanCode = scancode;
1474         mFlags = flags;
1475     }
1476 
1477     /**
1478      * Create a new key event.
1479      *
1480      * @param downTime The time (in {@link android.os.SystemClock#uptimeMillis})
1481      * at which this key code originally went down.
1482      * @param eventTime The time (in {@link android.os.SystemClock#uptimeMillis})
1483      * at which this event happened.
1484      * @param action Action code: either {@link #ACTION_DOWN},
1485      * {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.
1486      * @param code The key code.
1487      * @param repeat A repeat count for down events (> 0 if this is after the
1488      * initial down) or event count for multiple events.
1489      * @param metaState Flags indicating which meta keys are currently pressed.
1490      * @param deviceId The device ID that generated the key event.
1491      * @param scancode Raw device scan code of the event.
1492      * @param flags The flags for this key event
1493      * @param source The input source such as {@link InputDevice#SOURCE_KEYBOARD}.
1494      */
KeyEvent(long downTime, long eventTime, int action, int code, int repeat, int metaState, int deviceId, int scancode, int flags, int source)1495     public KeyEvent(long downTime, long eventTime, int action,
1496                     int code, int repeat, int metaState,
1497                     int deviceId, int scancode, int flags, int source) {
1498         mDownTime = downTime;
1499         mEventTime = eventTime;
1500         mAction = action;
1501         mKeyCode = code;
1502         mRepeatCount = repeat;
1503         mMetaState = metaState;
1504         mDeviceId = deviceId;
1505         mScanCode = scancode;
1506         mFlags = flags;
1507         mSource = source;
1508         mDisplayId = INVALID_DISPLAY;
1509     }
1510 
1511     /**
1512      * Create a new key event for a string of characters.  The key code,
1513      * action, repeat count and source will automatically be set to
1514      * {@link #KEYCODE_UNKNOWN}, {@link #ACTION_MULTIPLE}, 0, and
1515      * {@link InputDevice#SOURCE_KEYBOARD} for you.
1516      *
1517      * @param time The time (in {@link android.os.SystemClock#uptimeMillis})
1518      * at which this event occured.
1519      * @param characters The string of characters.
1520      * @param deviceId The device ID that generated the key event.
1521      * @param flags The flags for this key event
1522      */
KeyEvent(long time, String characters, int deviceId, int flags)1523     public KeyEvent(long time, String characters, int deviceId, int flags) {
1524         mDownTime = time;
1525         mEventTime = time;
1526         mCharacters = characters;
1527         mAction = ACTION_MULTIPLE;
1528         mKeyCode = KEYCODE_UNKNOWN;
1529         mRepeatCount = 0;
1530         mDeviceId = deviceId;
1531         mFlags = flags;
1532         mSource = InputDevice.SOURCE_KEYBOARD;
1533         mDisplayId = INVALID_DISPLAY;
1534     }
1535 
1536     /**
1537      * Make an exact copy of an existing key event.
1538      */
KeyEvent(KeyEvent origEvent)1539     public KeyEvent(KeyEvent origEvent) {
1540         mDownTime = origEvent.mDownTime;
1541         mEventTime = origEvent.mEventTime;
1542         mAction = origEvent.mAction;
1543         mKeyCode = origEvent.mKeyCode;
1544         mRepeatCount = origEvent.mRepeatCount;
1545         mMetaState = origEvent.mMetaState;
1546         mDeviceId = origEvent.mDeviceId;
1547         mSource = origEvent.mSource;
1548         mDisplayId = origEvent.mDisplayId;
1549         mScanCode = origEvent.mScanCode;
1550         mFlags = origEvent.mFlags;
1551         mCharacters = origEvent.mCharacters;
1552     }
1553 
1554     /**
1555      * Copy an existing key event, modifying its time and repeat count.
1556      *
1557      * @deprecated Use {@link #changeTimeRepeat(KeyEvent, long, int)}
1558      * instead.
1559      *
1560      * @param origEvent The existing event to be copied.
1561      * @param eventTime The new event time
1562      * (in {@link android.os.SystemClock#uptimeMillis}) of the event.
1563      * @param newRepeat The new repeat count of the event.
1564      */
1565     @Deprecated
KeyEvent(KeyEvent origEvent, long eventTime, int newRepeat)1566     public KeyEvent(KeyEvent origEvent, long eventTime, int newRepeat) {
1567         mDownTime = origEvent.mDownTime;
1568         mEventTime = eventTime;
1569         mAction = origEvent.mAction;
1570         mKeyCode = origEvent.mKeyCode;
1571         mRepeatCount = newRepeat;
1572         mMetaState = origEvent.mMetaState;
1573         mDeviceId = origEvent.mDeviceId;
1574         mSource = origEvent.mSource;
1575         mDisplayId = origEvent.mDisplayId;
1576         mScanCode = origEvent.mScanCode;
1577         mFlags = origEvent.mFlags;
1578         mCharacters = origEvent.mCharacters;
1579     }
1580 
obtain()1581     private static KeyEvent obtain() {
1582         final KeyEvent ev;
1583         synchronized (gRecyclerLock) {
1584             ev = gRecyclerTop;
1585             if (ev == null) {
1586                 return new KeyEvent();
1587             }
1588             gRecyclerTop = ev.mNext;
1589             gRecyclerUsed -= 1;
1590         }
1591         ev.mNext = null;
1592         ev.prepareForReuse();
1593         return ev;
1594     }
1595 
1596     /**
1597      * Obtains a (potentially recycled) key event.
1598      *
1599      * @hide
1600      */
obtain(long downTime, long eventTime, int action, int code, int repeat, int metaState, int deviceId, int scancode, int flags, int source, int displayId, String characters)1601     public static KeyEvent obtain(long downTime, long eventTime, int action,
1602             int code, int repeat, int metaState,
1603             int deviceId, int scancode, int flags, int source, int displayId, String characters) {
1604         KeyEvent ev = obtain();
1605         ev.mDownTime = downTime;
1606         ev.mEventTime = eventTime;
1607         ev.mAction = action;
1608         ev.mKeyCode = code;
1609         ev.mRepeatCount = repeat;
1610         ev.mMetaState = metaState;
1611         ev.mDeviceId = deviceId;
1612         ev.mScanCode = scancode;
1613         ev.mFlags = flags;
1614         ev.mSource = source;
1615         ev.mDisplayId = displayId;
1616         ev.mCharacters = characters;
1617         return ev;
1618     }
1619 
1620     /**
1621      * Obtains a (potentially recycled) key event.
1622      *
1623      * @hide
1624      */
1625     @UnsupportedAppUsage
obtain(long downTime, long eventTime, int action, int code, int repeat, int metaState, int deviceId, int scancode, int flags, int source, String characters)1626     public static KeyEvent obtain(long downTime, long eventTime, int action,
1627             int code, int repeat, int metaState,
1628             int deviceId, int scancode, int flags, int source, String characters) {
1629         return obtain(downTime, eventTime, action, code, repeat, metaState, deviceId, scancode,
1630                 flags, source, INVALID_DISPLAY, characters);
1631     }
1632 
1633     /**
1634 
1635     /**
1636      * Obtains a (potentially recycled) copy of another key event.
1637      *
1638      * @hide
1639      */
obtain(KeyEvent other)1640     public static KeyEvent obtain(KeyEvent other) {
1641         KeyEvent ev = obtain();
1642         ev.mDownTime = other.mDownTime;
1643         ev.mEventTime = other.mEventTime;
1644         ev.mAction = other.mAction;
1645         ev.mKeyCode = other.mKeyCode;
1646         ev.mRepeatCount = other.mRepeatCount;
1647         ev.mMetaState = other.mMetaState;
1648         ev.mDeviceId = other.mDeviceId;
1649         ev.mScanCode = other.mScanCode;
1650         ev.mFlags = other.mFlags;
1651         ev.mSource = other.mSource;
1652         ev.mDisplayId = other.mDisplayId;
1653         ev.mCharacters = other.mCharacters;
1654         return ev;
1655     }
1656 
1657     /** @hide */
1658     @Override
copy()1659     public KeyEvent copy() {
1660         return obtain(this);
1661     }
1662 
1663     /**
1664      * Recycles a key event.
1665      * Key events should only be recycled if they are owned by the system since user
1666      * code expects them to be essentially immutable, "tracking" notwithstanding.
1667      *
1668      * @hide
1669      */
1670     @Override
1671     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
recycle()1672     public final void recycle() {
1673         super.recycle();
1674         mCharacters = null;
1675 
1676         synchronized (gRecyclerLock) {
1677             if (gRecyclerUsed < MAX_RECYCLED) {
1678                 gRecyclerUsed++;
1679                 mNext = gRecyclerTop;
1680                 gRecyclerTop = this;
1681             }
1682         }
1683     }
1684 
1685     /** @hide */
1686     @Override
recycleIfNeededAfterDispatch()1687     public final void recycleIfNeededAfterDispatch() {
1688         // Do nothing.
1689     }
1690 
1691     /**
1692      * Create a new key event that is the same as the given one, but whose
1693      * event time and repeat count are replaced with the given value.
1694      *
1695      * @param event The existing event to be copied.  This is not modified.
1696      * @param eventTime The new event time
1697      * (in {@link android.os.SystemClock#uptimeMillis}) of the event.
1698      * @param newRepeat The new repeat count of the event.
1699      */
changeTimeRepeat(KeyEvent event, long eventTime, int newRepeat)1700     public static KeyEvent changeTimeRepeat(KeyEvent event, long eventTime,
1701             int newRepeat) {
1702         return new KeyEvent(event, eventTime, newRepeat);
1703     }
1704 
1705     /**
1706      * Create a new key event that is the same as the given one, but whose
1707      * event time and repeat count are replaced with the given value.
1708      *
1709      * @param event The existing event to be copied.  This is not modified.
1710      * @param eventTime The new event time
1711      * (in {@link android.os.SystemClock#uptimeMillis}) of the event.
1712      * @param newRepeat The new repeat count of the event.
1713      * @param newFlags New flags for the event, replacing the entire value
1714      * in the original event.
1715      */
changeTimeRepeat(KeyEvent event, long eventTime, int newRepeat, int newFlags)1716     public static KeyEvent changeTimeRepeat(KeyEvent event, long eventTime,
1717             int newRepeat, int newFlags) {
1718         KeyEvent ret = new KeyEvent(event);
1719         ret.mEventTime = eventTime;
1720         ret.mRepeatCount = newRepeat;
1721         ret.mFlags = newFlags;
1722         return ret;
1723     }
1724 
1725     /**
1726      * Copy an existing key event, modifying its action.
1727      *
1728      * @param origEvent The existing event to be copied.
1729      * @param action The new action code of the event.
1730      */
KeyEvent(KeyEvent origEvent, int action)1731     private KeyEvent(KeyEvent origEvent, int action) {
1732         mDownTime = origEvent.mDownTime;
1733         mEventTime = origEvent.mEventTime;
1734         mAction = action;
1735         mKeyCode = origEvent.mKeyCode;
1736         mRepeatCount = origEvent.mRepeatCount;
1737         mMetaState = origEvent.mMetaState;
1738         mDeviceId = origEvent.mDeviceId;
1739         mSource = origEvent.mSource;
1740         mDisplayId = origEvent.mDisplayId;
1741         mScanCode = origEvent.mScanCode;
1742         mFlags = origEvent.mFlags;
1743         // Don't copy mCharacters, since one way or the other we'll lose it
1744         // when changing the action.
1745     }
1746 
1747     /**
1748      * Create a new key event that is the same as the given one, but whose
1749      * action is replaced with the given value.
1750      *
1751      * @param event The existing event to be copied.  This is not modified.
1752      * @param action The new action code of the event.
1753      */
changeAction(KeyEvent event, int action)1754     public static KeyEvent changeAction(KeyEvent event, int action) {
1755         return new KeyEvent(event, action);
1756     }
1757 
1758     /**
1759      * Create a new key event that is the same as the given one, but whose
1760      * flags are replaced with the given value.
1761      *
1762      * @param event The existing event to be copied.  This is not modified.
1763      * @param flags The new flags constant.
1764      */
changeFlags(KeyEvent event, int flags)1765     public static KeyEvent changeFlags(KeyEvent event, int flags) {
1766         event = new KeyEvent(event);
1767         event.mFlags = flags;
1768         return event;
1769     }
1770 
1771     /** @hide */
1772     @Override
isTainted()1773     public final boolean isTainted() {
1774         return (mFlags & FLAG_TAINTED) != 0;
1775     }
1776 
1777     /** @hide */
1778     @Override
setTainted(boolean tainted)1779     public final void setTainted(boolean tainted) {
1780         mFlags = tainted ? mFlags | FLAG_TAINTED : mFlags & ~FLAG_TAINTED;
1781     }
1782 
1783     /**
1784      * Don't use in new code, instead explicitly check
1785      * {@link #getAction()}.
1786      *
1787      * @return If the action is ACTION_DOWN, returns true; else false.
1788      *
1789      * @deprecated
1790      * @hide
1791      */
1792     @UnsupportedAppUsage
isDown()1793     @Deprecated public final boolean isDown() {
1794         return mAction == ACTION_DOWN;
1795     }
1796 
1797     /** Is this a system key?  System keys can not be used for menu shortcuts.
1798      */
isSystem()1799     public final boolean isSystem() {
1800         return isSystemKey(mKeyCode);
1801     }
1802 
1803     /** @hide */
isWakeKey()1804     public final boolean isWakeKey() {
1805         return isWakeKey(mKeyCode);
1806     }
1807 
1808     /**
1809      * Returns true if the specified keycode is a gamepad button.
1810      * @return True if the keycode is a gamepad button, such as {@link #KEYCODE_BUTTON_A}.
1811      */
isGamepadButton(int keyCode)1812     public static final boolean isGamepadButton(int keyCode) {
1813         switch (keyCode) {
1814             case KeyEvent.KEYCODE_BUTTON_A:
1815             case KeyEvent.KEYCODE_BUTTON_B:
1816             case KeyEvent.KEYCODE_BUTTON_C:
1817             case KeyEvent.KEYCODE_BUTTON_X:
1818             case KeyEvent.KEYCODE_BUTTON_Y:
1819             case KeyEvent.KEYCODE_BUTTON_Z:
1820             case KeyEvent.KEYCODE_BUTTON_L1:
1821             case KeyEvent.KEYCODE_BUTTON_R1:
1822             case KeyEvent.KEYCODE_BUTTON_L2:
1823             case KeyEvent.KEYCODE_BUTTON_R2:
1824             case KeyEvent.KEYCODE_BUTTON_THUMBL:
1825             case KeyEvent.KEYCODE_BUTTON_THUMBR:
1826             case KeyEvent.KEYCODE_BUTTON_START:
1827             case KeyEvent.KEYCODE_BUTTON_SELECT:
1828             case KeyEvent.KEYCODE_BUTTON_MODE:
1829             case KeyEvent.KEYCODE_BUTTON_1:
1830             case KeyEvent.KEYCODE_BUTTON_2:
1831             case KeyEvent.KEYCODE_BUTTON_3:
1832             case KeyEvent.KEYCODE_BUTTON_4:
1833             case KeyEvent.KEYCODE_BUTTON_5:
1834             case KeyEvent.KEYCODE_BUTTON_6:
1835             case KeyEvent.KEYCODE_BUTTON_7:
1836             case KeyEvent.KEYCODE_BUTTON_8:
1837             case KeyEvent.KEYCODE_BUTTON_9:
1838             case KeyEvent.KEYCODE_BUTTON_10:
1839             case KeyEvent.KEYCODE_BUTTON_11:
1840             case KeyEvent.KEYCODE_BUTTON_12:
1841             case KeyEvent.KEYCODE_BUTTON_13:
1842             case KeyEvent.KEYCODE_BUTTON_14:
1843             case KeyEvent.KEYCODE_BUTTON_15:
1844             case KeyEvent.KEYCODE_BUTTON_16:
1845                 return true;
1846             default:
1847                 return false;
1848         }
1849     }
1850 
1851     /** Whether key will, by default, trigger a click on the focused view.
1852      * @hide
1853      */
1854     @UnsupportedAppUsage
isConfirmKey(int keyCode)1855     public static final boolean isConfirmKey(int keyCode) {
1856         switch (keyCode) {
1857             case KeyEvent.KEYCODE_DPAD_CENTER:
1858             case KeyEvent.KEYCODE_ENTER:
1859             case KeyEvent.KEYCODE_SPACE:
1860             case KeyEvent.KEYCODE_NUMPAD_ENTER:
1861                 return true;
1862             default:
1863                 return false;
1864         }
1865     }
1866 
1867     /**
1868      * Returns whether this key will be sent to the
1869      * {@link android.media.session.MediaSession.Callback} if not handled.
1870      *
1871      * @hide
1872      */
isMediaSessionKey(int keyCode)1873     public static final boolean isMediaSessionKey(int keyCode) {
1874         switch (keyCode) {
1875             case KeyEvent.KEYCODE_MEDIA_PLAY:
1876             case KeyEvent.KEYCODE_MEDIA_PAUSE:
1877             case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:
1878             case KeyEvent.KEYCODE_MUTE:
1879             case KeyEvent.KEYCODE_HEADSETHOOK:
1880             case KeyEvent.KEYCODE_MEDIA_STOP:
1881             case KeyEvent.KEYCODE_MEDIA_NEXT:
1882             case KeyEvent.KEYCODE_MEDIA_PREVIOUS:
1883             case KeyEvent.KEYCODE_MEDIA_REWIND:
1884             case KeyEvent.KEYCODE_MEDIA_RECORD:
1885             case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD:
1886                 return true;
1887         }
1888         return false;
1889     }
1890 
1891     /** Is this a system key? System keys can not be used for menu shortcuts.
1892      * @hide
1893      */
isSystemKey(int keyCode)1894     public static final boolean isSystemKey(int keyCode) {
1895         switch (keyCode) {
1896             case KeyEvent.KEYCODE_MENU:
1897             case KeyEvent.KEYCODE_SOFT_RIGHT:
1898             case KeyEvent.KEYCODE_HOME:
1899             case KeyEvent.KEYCODE_BACK:
1900             case KeyEvent.KEYCODE_CALL:
1901             case KeyEvent.KEYCODE_ENDCALL:
1902             case KeyEvent.KEYCODE_VOLUME_UP:
1903             case KeyEvent.KEYCODE_VOLUME_DOWN:
1904             case KeyEvent.KEYCODE_VOLUME_MUTE:
1905             case KeyEvent.KEYCODE_MUTE:
1906             case KeyEvent.KEYCODE_POWER:
1907             case KeyEvent.KEYCODE_HEADSETHOOK:
1908             case KeyEvent.KEYCODE_MEDIA_PLAY:
1909             case KeyEvent.KEYCODE_MEDIA_PAUSE:
1910             case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:
1911             case KeyEvent.KEYCODE_MEDIA_STOP:
1912             case KeyEvent.KEYCODE_MEDIA_NEXT:
1913             case KeyEvent.KEYCODE_MEDIA_PREVIOUS:
1914             case KeyEvent.KEYCODE_MEDIA_REWIND:
1915             case KeyEvent.KEYCODE_MEDIA_RECORD:
1916             case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD:
1917             case KeyEvent.KEYCODE_CAMERA:
1918             case KeyEvent.KEYCODE_FOCUS:
1919             case KeyEvent.KEYCODE_SEARCH:
1920             case KeyEvent.KEYCODE_BRIGHTNESS_DOWN:
1921             case KeyEvent.KEYCODE_BRIGHTNESS_UP:
1922             case KeyEvent.KEYCODE_MEDIA_AUDIO_TRACK:
1923             case KeyEvent.KEYCODE_SYSTEM_NAVIGATION_UP:
1924             case KeyEvent.KEYCODE_SYSTEM_NAVIGATION_DOWN:
1925             case KeyEvent.KEYCODE_SYSTEM_NAVIGATION_LEFT:
1926             case KeyEvent.KEYCODE_SYSTEM_NAVIGATION_RIGHT:
1927                 return true;
1928         }
1929 
1930         return false;
1931     }
1932 
1933     /** @hide */
isWakeKey(int keyCode)1934     public static final boolean isWakeKey(int keyCode) {
1935         switch (keyCode) {
1936             case KeyEvent.KEYCODE_BACK:
1937             case KeyEvent.KEYCODE_MENU:
1938             case KeyEvent.KEYCODE_WAKEUP:
1939             case KeyEvent.KEYCODE_PAIRING:
1940             case KeyEvent.KEYCODE_STEM_1:
1941             case KeyEvent.KEYCODE_STEM_2:
1942             case KeyEvent.KEYCODE_STEM_3:
1943                 return true;
1944         }
1945         return false;
1946     }
1947 
1948     /** @hide */
isMetaKey(int keyCode)1949     public static final boolean isMetaKey(int keyCode) {
1950         return keyCode == KeyEvent.KEYCODE_META_LEFT || keyCode == KeyEvent.KEYCODE_META_RIGHT;
1951     }
1952 
1953     /** @hide */
isAltKey(int keyCode)1954     public static final boolean isAltKey(int keyCode) {
1955         return keyCode == KeyEvent.KEYCODE_ALT_LEFT || keyCode == KeyEvent.KEYCODE_ALT_RIGHT;
1956     }
1957 
1958     /** {@inheritDoc} */
1959     @Override
getDeviceId()1960     public final int getDeviceId() {
1961         return mDeviceId;
1962     }
1963 
1964     /** {@inheritDoc} */
1965     @Override
getSource()1966     public final int getSource() {
1967         return mSource;
1968     }
1969 
1970     /** {@inheritDoc} */
1971     @Override
setSource(int source)1972     public final void setSource(int source) {
1973         mSource = source;
1974     }
1975 
1976     /** @hide */
1977     @Override
getDisplayId()1978     public final int getDisplayId() {
1979         return mDisplayId;
1980     }
1981 
1982     /** @hide */
1983     @TestApi
1984     @Override
setDisplayId(int displayId)1985     public final void setDisplayId(int displayId) {
1986         mDisplayId = displayId;
1987     }
1988 
1989     /**
1990      * <p>Returns the state of the meta keys.</p>
1991      *
1992      * @return an integer in which each bit set to 1 represents a pressed
1993      *         meta key
1994      *
1995      * @see #isAltPressed()
1996      * @see #isShiftPressed()
1997      * @see #isSymPressed()
1998      * @see #isCtrlPressed()
1999      * @see #isMetaPressed()
2000      * @see #isFunctionPressed()
2001      * @see #isCapsLockOn()
2002      * @see #isNumLockOn()
2003      * @see #isScrollLockOn()
2004      * @see #META_ALT_ON
2005      * @see #META_ALT_LEFT_ON
2006      * @see #META_ALT_RIGHT_ON
2007      * @see #META_SHIFT_ON
2008      * @see #META_SHIFT_LEFT_ON
2009      * @see #META_SHIFT_RIGHT_ON
2010      * @see #META_SYM_ON
2011      * @see #META_FUNCTION_ON
2012      * @see #META_CTRL_ON
2013      * @see #META_CTRL_LEFT_ON
2014      * @see #META_CTRL_RIGHT_ON
2015      * @see #META_META_ON
2016      * @see #META_META_LEFT_ON
2017      * @see #META_META_RIGHT_ON
2018      * @see #META_CAPS_LOCK_ON
2019      * @see #META_NUM_LOCK_ON
2020      * @see #META_SCROLL_LOCK_ON
2021      * @see #getModifiers
2022      */
getMetaState()2023     public final int getMetaState() {
2024         return mMetaState;
2025     }
2026 
2027     /**
2028      * Returns the state of the modifier keys.
2029      * <p>
2030      * For the purposes of this function, {@link #KEYCODE_CAPS_LOCK},
2031      * {@link #KEYCODE_SCROLL_LOCK}, and {@link #KEYCODE_NUM_LOCK} are
2032      * not considered modifier keys.  Consequently, this function specifically masks out
2033      * {@link #META_CAPS_LOCK_ON}, {@link #META_SCROLL_LOCK_ON} and {@link #META_NUM_LOCK_ON}.
2034      * </p><p>
2035      * The value returned consists of the meta state (from {@link #getMetaState})
2036      * normalized using {@link #normalizeMetaState(int)} and then masked with
2037      * {@link #getModifierMetaStateMask} so that only valid modifier bits are retained.
2038      * </p>
2039      *
2040      * @return An integer in which each bit set to 1 represents a pressed modifier key.
2041      * @see #getMetaState
2042      */
getModifiers()2043     public final int getModifiers() {
2044         return normalizeMetaState(mMetaState) & META_MODIFIER_MASK;
2045     }
2046 
2047     /**
2048      * Modifies the flags of the event.
2049      *
2050      * @param newFlags New flags for the event, replacing the entire value.
2051      * @hide
2052      */
setFlags(int newFlags)2053     public final void setFlags(int newFlags) {
2054         mFlags = newFlags;
2055     }
2056 
2057     /**
2058      * Returns the flags for this key event.
2059      *
2060      * @see #FLAG_WOKE_HERE
2061      */
getFlags()2062     public final int getFlags() {
2063         return mFlags;
2064     }
2065 
2066     // Mask of all modifier key meta states.  Specifically excludes locked keys like caps lock.
2067     @UnsupportedAppUsage
2068     private static final int META_MODIFIER_MASK =
2069             META_SHIFT_ON | META_SHIFT_LEFT_ON | META_SHIFT_RIGHT_ON
2070             | META_ALT_ON | META_ALT_LEFT_ON | META_ALT_RIGHT_ON
2071             | META_CTRL_ON | META_CTRL_LEFT_ON | META_CTRL_RIGHT_ON
2072             | META_META_ON | META_META_LEFT_ON | META_META_RIGHT_ON
2073             | META_SYM_ON | META_FUNCTION_ON;
2074 
2075     // Mask of all lock key meta states.
2076     @UnsupportedAppUsage
2077     private static final int META_LOCK_MASK =
2078             META_CAPS_LOCK_ON | META_NUM_LOCK_ON | META_SCROLL_LOCK_ON;
2079 
2080     // Mask of all valid meta states.
2081     @UnsupportedAppUsage
2082     private static final int META_ALL_MASK = META_MODIFIER_MASK | META_LOCK_MASK;
2083 
2084     // Mask of all synthetic meta states that are reserved for API compatibility with
2085     // historical uses in MetaKeyKeyListener.
2086     @UnsupportedAppUsage
2087     private static final int META_SYNTHETIC_MASK =
2088             META_CAP_LOCKED | META_ALT_LOCKED | META_SYM_LOCKED | META_SELECTING;
2089 
2090     // Mask of all meta states that are not valid use in specifying a modifier key.
2091     // These bits are known to be used for purposes other than specifying modifiers.
2092     @UnsupportedAppUsage
2093     private static final int META_INVALID_MODIFIER_MASK =
2094             META_LOCK_MASK | META_SYNTHETIC_MASK;
2095 
2096     /**
2097      * Gets a mask that includes all valid modifier key meta state bits.
2098      * <p>
2099      * For the purposes of this function, {@link #KEYCODE_CAPS_LOCK},
2100      * {@link #KEYCODE_SCROLL_LOCK}, and {@link #KEYCODE_NUM_LOCK} are
2101      * not considered modifier keys.  Consequently, the mask specifically excludes
2102      * {@link #META_CAPS_LOCK_ON}, {@link #META_SCROLL_LOCK_ON} and {@link #META_NUM_LOCK_ON}.
2103      * </p>
2104      *
2105      * @return The modifier meta state mask which is a combination of
2106      * {@link #META_SHIFT_ON}, {@link #META_SHIFT_LEFT_ON}, {@link #META_SHIFT_RIGHT_ON},
2107      * {@link #META_ALT_ON}, {@link #META_ALT_LEFT_ON}, {@link #META_ALT_RIGHT_ON},
2108      * {@link #META_CTRL_ON}, {@link #META_CTRL_LEFT_ON}, {@link #META_CTRL_RIGHT_ON},
2109      * {@link #META_META_ON}, {@link #META_META_LEFT_ON}, {@link #META_META_RIGHT_ON},
2110      * {@link #META_SYM_ON}, {@link #META_FUNCTION_ON}.
2111      */
getModifierMetaStateMask()2112     public static int getModifierMetaStateMask() {
2113         return META_MODIFIER_MASK;
2114     }
2115 
2116     /**
2117      * Returns true if this key code is a modifier key.
2118      * <p>
2119      * For the purposes of this function, {@link #KEYCODE_CAPS_LOCK},
2120      * {@link #KEYCODE_SCROLL_LOCK}, and {@link #KEYCODE_NUM_LOCK} are
2121      * not considered modifier keys.  Consequently, this function return false
2122      * for those keys.
2123      * </p>
2124      *
2125      * @return True if the key code is one of
2126      * {@link #KEYCODE_SHIFT_LEFT} {@link #KEYCODE_SHIFT_RIGHT},
2127      * {@link #KEYCODE_ALT_LEFT}, {@link #KEYCODE_ALT_RIGHT},
2128      * {@link #KEYCODE_CTRL_LEFT}, {@link #KEYCODE_CTRL_RIGHT},
2129      * {@link #KEYCODE_META_LEFT}, or {@link #KEYCODE_META_RIGHT},
2130      * {@link #KEYCODE_SYM}, {@link #KEYCODE_NUM}, {@link #KEYCODE_FUNCTION}.
2131      */
isModifierKey(int keyCode)2132     public static boolean isModifierKey(int keyCode) {
2133         switch (keyCode) {
2134             case KEYCODE_SHIFT_LEFT:
2135             case KEYCODE_SHIFT_RIGHT:
2136             case KEYCODE_ALT_LEFT:
2137             case KEYCODE_ALT_RIGHT:
2138             case KEYCODE_CTRL_LEFT:
2139             case KEYCODE_CTRL_RIGHT:
2140             case KEYCODE_META_LEFT:
2141             case KEYCODE_META_RIGHT:
2142             case KEYCODE_SYM:
2143             case KEYCODE_NUM:
2144             case KEYCODE_FUNCTION:
2145                 return true;
2146             default:
2147                 return false;
2148         }
2149     }
2150 
2151     /**
2152      * Normalizes the specified meta state.
2153      * <p>
2154      * The meta state is normalized such that if either the left or right modifier meta state
2155      * bits are set then the result will also include the universal bit for that modifier.
2156      * </p><p>
2157      * If the specified meta state contains {@link #META_ALT_LEFT_ON} then
2158      * the result will also contain {@link #META_ALT_ON} in addition to {@link #META_ALT_LEFT_ON}
2159      * and the other bits that were specified in the input.  The same is process is
2160      * performed for shift, control and meta.
2161      * </p><p>
2162      * If the specified meta state contains synthetic meta states defined by
2163      * {@link MetaKeyKeyListener}, then those states are translated here and the original
2164      * synthetic meta states are removed from the result.
2165      * {@link MetaKeyKeyListener#META_CAP_LOCKED} is translated to {@link #META_CAPS_LOCK_ON}.
2166      * {@link MetaKeyKeyListener#META_ALT_LOCKED} is translated to {@link #META_ALT_ON}.
2167      * {@link MetaKeyKeyListener#META_SYM_LOCKED} is translated to {@link #META_SYM_ON}.
2168      * </p><p>
2169      * Undefined meta state bits are removed.
2170      * </p>
2171      *
2172      * @param metaState The meta state.
2173      * @return The normalized meta state.
2174      */
normalizeMetaState(int metaState)2175     public static int normalizeMetaState(int metaState) {
2176         if ((metaState & (META_SHIFT_LEFT_ON | META_SHIFT_RIGHT_ON)) != 0) {
2177             metaState |= META_SHIFT_ON;
2178         }
2179         if ((metaState & (META_ALT_LEFT_ON | META_ALT_RIGHT_ON)) != 0) {
2180             metaState |= META_ALT_ON;
2181         }
2182         if ((metaState & (META_CTRL_LEFT_ON | META_CTRL_RIGHT_ON)) != 0) {
2183             metaState |= META_CTRL_ON;
2184         }
2185         if ((metaState & (META_META_LEFT_ON | META_META_RIGHT_ON)) != 0) {
2186             metaState |= META_META_ON;
2187         }
2188         if ((metaState & MetaKeyKeyListener.META_CAP_LOCKED) != 0) {
2189             metaState |= META_CAPS_LOCK_ON;
2190         }
2191         if ((metaState & MetaKeyKeyListener.META_ALT_LOCKED) != 0) {
2192             metaState |= META_ALT_ON;
2193         }
2194         if ((metaState & MetaKeyKeyListener.META_SYM_LOCKED) != 0) {
2195             metaState |= META_SYM_ON;
2196         }
2197         return metaState & META_ALL_MASK;
2198     }
2199 
2200     /**
2201      * Returns true if no modifiers keys are pressed according to the specified meta state.
2202      * <p>
2203      * For the purposes of this function, {@link #KEYCODE_CAPS_LOCK},
2204      * {@link #KEYCODE_SCROLL_LOCK}, and {@link #KEYCODE_NUM_LOCK} are
2205      * not considered modifier keys.  Consequently, this function ignores
2206      * {@link #META_CAPS_LOCK_ON}, {@link #META_SCROLL_LOCK_ON} and {@link #META_NUM_LOCK_ON}.
2207      * </p><p>
2208      * The meta state is normalized prior to comparison using {@link #normalizeMetaState(int)}.
2209      * </p>
2210      *
2211      * @param metaState The meta state to consider.
2212      * @return True if no modifier keys are pressed.
2213      * @see #hasNoModifiers()
2214      */
metaStateHasNoModifiers(int metaState)2215     public static boolean metaStateHasNoModifiers(int metaState) {
2216         return (normalizeMetaState(metaState) & META_MODIFIER_MASK) == 0;
2217     }
2218 
2219     /**
2220      * Returns true if only the specified modifier keys are pressed according to
2221      * the specified meta state.  Returns false if a different combination of modifier
2222      * keys are pressed.
2223      * <p>
2224      * For the purposes of this function, {@link #KEYCODE_CAPS_LOCK},
2225      * {@link #KEYCODE_SCROLL_LOCK}, and {@link #KEYCODE_NUM_LOCK} are
2226      * not considered modifier keys.  Consequently, this function ignores
2227      * {@link #META_CAPS_LOCK_ON}, {@link #META_SCROLL_LOCK_ON} and {@link #META_NUM_LOCK_ON}.
2228      * </p><p>
2229      * If the specified modifier mask includes directional modifiers, such as
2230      * {@link #META_SHIFT_LEFT_ON}, then this method ensures that the
2231      * modifier is pressed on that side.
2232      * If the specified modifier mask includes non-directional modifiers, such as
2233      * {@link #META_SHIFT_ON}, then this method ensures that the modifier
2234      * is pressed on either side.
2235      * If the specified modifier mask includes both directional and non-directional modifiers
2236      * for the same type of key, such as {@link #META_SHIFT_ON} and {@link #META_SHIFT_LEFT_ON},
2237      * then this method throws an illegal argument exception.
2238      * </p>
2239      *
2240      * @param metaState The meta state to consider.
2241      * @param modifiers The meta state of the modifier keys to check.  May be a combination
2242      * of modifier meta states as defined by {@link #getModifierMetaStateMask()}.  May be 0 to
2243      * ensure that no modifier keys are pressed.
2244      * @return True if only the specified modifier keys are pressed.
2245      * @throws IllegalArgumentException if the modifiers parameter contains invalid modifiers
2246      * @see #hasModifiers
2247      */
metaStateHasModifiers(int metaState, int modifiers)2248     public static boolean metaStateHasModifiers(int metaState, int modifiers) {
2249         // Note: For forward compatibility, we allow the parameter to contain meta states
2250         //       that we do not recognize but we explicitly disallow meta states that
2251         //       are not valid modifiers.
2252         if ((modifiers & META_INVALID_MODIFIER_MASK) != 0) {
2253             throw new IllegalArgumentException("modifiers must not contain "
2254                     + "META_CAPS_LOCK_ON, META_NUM_LOCK_ON, META_SCROLL_LOCK_ON, "
2255                     + "META_CAP_LOCKED, META_ALT_LOCKED, META_SYM_LOCKED, "
2256                     + "or META_SELECTING");
2257         }
2258 
2259         metaState = normalizeMetaState(metaState) & META_MODIFIER_MASK;
2260         metaState = metaStateFilterDirectionalModifiers(metaState, modifiers,
2261                 META_SHIFT_ON, META_SHIFT_LEFT_ON, META_SHIFT_RIGHT_ON);
2262         metaState = metaStateFilterDirectionalModifiers(metaState, modifiers,
2263                 META_ALT_ON, META_ALT_LEFT_ON, META_ALT_RIGHT_ON);
2264         metaState = metaStateFilterDirectionalModifiers(metaState, modifiers,
2265                 META_CTRL_ON, META_CTRL_LEFT_ON, META_CTRL_RIGHT_ON);
2266         metaState = metaStateFilterDirectionalModifiers(metaState, modifiers,
2267                 META_META_ON, META_META_LEFT_ON, META_META_RIGHT_ON);
2268         return metaState == modifiers;
2269     }
2270 
metaStateFilterDirectionalModifiers(int metaState, int modifiers, int basic, int left, int right)2271     private static int metaStateFilterDirectionalModifiers(int metaState,
2272             int modifiers, int basic, int left, int right) {
2273         final boolean wantBasic = (modifiers & basic) != 0;
2274         final int directional = left | right;
2275         final boolean wantLeftOrRight = (modifiers & directional) != 0;
2276 
2277         if (wantBasic) {
2278             if (wantLeftOrRight) {
2279                 throw new IllegalArgumentException("modifiers must not contain "
2280                         + metaStateToString(basic) + " combined with "
2281                         + metaStateToString(left) + " or " + metaStateToString(right));
2282             }
2283             return metaState & ~directional;
2284         } else if (wantLeftOrRight) {
2285             return metaState & ~basic;
2286         } else {
2287             return metaState;
2288         }
2289     }
2290 
2291     /**
2292      * Returns true if no modifier keys are pressed.
2293      * <p>
2294      * For the purposes of this function, {@link #KEYCODE_CAPS_LOCK},
2295      * {@link #KEYCODE_SCROLL_LOCK}, and {@link #KEYCODE_NUM_LOCK} are
2296      * not considered modifier keys.  Consequently, this function ignores
2297      * {@link #META_CAPS_LOCK_ON}, {@link #META_SCROLL_LOCK_ON} and {@link #META_NUM_LOCK_ON}.
2298      * </p><p>
2299      * The meta state is normalized prior to comparison using {@link #normalizeMetaState(int)}.
2300      * </p>
2301      *
2302      * @return True if no modifier keys are pressed.
2303      * @see #metaStateHasNoModifiers
2304      */
hasNoModifiers()2305     public final boolean hasNoModifiers() {
2306         return metaStateHasNoModifiers(mMetaState);
2307     }
2308 
2309     /**
2310      * Returns true if only the specified modifiers keys are pressed.
2311      * Returns false if a different combination of modifier keys are pressed.
2312      * <p>
2313      * For the purposes of this function, {@link #KEYCODE_CAPS_LOCK},
2314      * {@link #KEYCODE_SCROLL_LOCK}, and {@link #KEYCODE_NUM_LOCK} are
2315      * not considered modifier keys.  Consequently, this function ignores
2316      * {@link #META_CAPS_LOCK_ON}, {@link #META_SCROLL_LOCK_ON} and {@link #META_NUM_LOCK_ON}.
2317      * </p><p>
2318      * If the specified modifier mask includes directional modifiers, such as
2319      * {@link #META_SHIFT_LEFT_ON}, then this method ensures that the
2320      * modifier is pressed on that side.
2321      * If the specified modifier mask includes non-directional modifiers, such as
2322      * {@link #META_SHIFT_ON}, then this method ensures that the modifier
2323      * is pressed on either side.
2324      * If the specified modifier mask includes both directional and non-directional modifiers
2325      * for the same type of key, such as {@link #META_SHIFT_ON} and {@link #META_SHIFT_LEFT_ON},
2326      * then this method throws an illegal argument exception.
2327      * </p>
2328      *
2329      * @param modifiers The meta state of the modifier keys to check.  May be a combination
2330      * of modifier meta states as defined by {@link #getModifierMetaStateMask()}.  May be 0 to
2331      * ensure that no modifier keys are pressed.
2332      * @return True if only the specified modifier keys are pressed.
2333      * @throws IllegalArgumentException if the modifiers parameter contains invalid modifiers
2334      * @see #metaStateHasModifiers
2335      */
hasModifiers(int modifiers)2336     public final boolean hasModifiers(int modifiers) {
2337         return metaStateHasModifiers(mMetaState, modifiers);
2338     }
2339 
2340     /**
2341      * <p>Returns the pressed state of the ALT meta key.</p>
2342      *
2343      * @return true if the ALT key is pressed, false otherwise
2344      *
2345      * @see #KEYCODE_ALT_LEFT
2346      * @see #KEYCODE_ALT_RIGHT
2347      * @see #META_ALT_ON
2348      */
isAltPressed()2349     public final boolean isAltPressed() {
2350         return (mMetaState & META_ALT_ON) != 0;
2351     }
2352 
2353     /**
2354      * <p>Returns the pressed state of the SHIFT meta key.</p>
2355      *
2356      * @return true if the SHIFT key is pressed, false otherwise
2357      *
2358      * @see #KEYCODE_SHIFT_LEFT
2359      * @see #KEYCODE_SHIFT_RIGHT
2360      * @see #META_SHIFT_ON
2361      */
isShiftPressed()2362     public final boolean isShiftPressed() {
2363         return (mMetaState & META_SHIFT_ON) != 0;
2364     }
2365 
2366     /**
2367      * <p>Returns the pressed state of the SYM meta key.</p>
2368      *
2369      * @return true if the SYM key is pressed, false otherwise
2370      *
2371      * @see #KEYCODE_SYM
2372      * @see #META_SYM_ON
2373      */
isSymPressed()2374     public final boolean isSymPressed() {
2375         return (mMetaState & META_SYM_ON) != 0;
2376     }
2377 
2378     /**
2379      * <p>Returns the pressed state of the CTRL meta key.</p>
2380      *
2381      * @return true if the CTRL key is pressed, false otherwise
2382      *
2383      * @see #KEYCODE_CTRL_LEFT
2384      * @see #KEYCODE_CTRL_RIGHT
2385      * @see #META_CTRL_ON
2386      */
isCtrlPressed()2387     public final boolean isCtrlPressed() {
2388         return (mMetaState & META_CTRL_ON) != 0;
2389     }
2390 
2391     /**
2392      * <p>Returns the pressed state of the META meta key.</p>
2393      *
2394      * @return true if the META key is pressed, false otherwise
2395      *
2396      * @see #KEYCODE_META_LEFT
2397      * @see #KEYCODE_META_RIGHT
2398      * @see #META_META_ON
2399      */
isMetaPressed()2400     public final boolean isMetaPressed() {
2401         return (mMetaState & META_META_ON) != 0;
2402     }
2403 
2404     /**
2405      * <p>Returns the pressed state of the FUNCTION meta key.</p>
2406      *
2407      * @return true if the FUNCTION key is pressed, false otherwise
2408      *
2409      * @see #KEYCODE_FUNCTION
2410      * @see #META_FUNCTION_ON
2411      */
isFunctionPressed()2412     public final boolean isFunctionPressed() {
2413         return (mMetaState & META_FUNCTION_ON) != 0;
2414     }
2415 
2416     /**
2417      * <p>Returns the locked state of the CAPS LOCK meta key.</p>
2418      *
2419      * @return true if the CAPS LOCK key is on, false otherwise
2420      *
2421      * @see #KEYCODE_CAPS_LOCK
2422      * @see #META_CAPS_LOCK_ON
2423      */
isCapsLockOn()2424     public final boolean isCapsLockOn() {
2425         return (mMetaState & META_CAPS_LOCK_ON) != 0;
2426     }
2427 
2428     /**
2429      * <p>Returns the locked state of the NUM LOCK meta key.</p>
2430      *
2431      * @return true if the NUM LOCK key is on, false otherwise
2432      *
2433      * @see #KEYCODE_NUM_LOCK
2434      * @see #META_NUM_LOCK_ON
2435      */
isNumLockOn()2436     public final boolean isNumLockOn() {
2437         return (mMetaState & META_NUM_LOCK_ON) != 0;
2438     }
2439 
2440     /**
2441      * <p>Returns the locked state of the SCROLL LOCK meta key.</p>
2442      *
2443      * @return true if the SCROLL LOCK key is on, false otherwise
2444      *
2445      * @see #KEYCODE_SCROLL_LOCK
2446      * @see #META_SCROLL_LOCK_ON
2447      */
isScrollLockOn()2448     public final boolean isScrollLockOn() {
2449         return (mMetaState & META_SCROLL_LOCK_ON) != 0;
2450     }
2451 
2452     /**
2453      * Retrieve the action of this key event.  May be either
2454      * {@link #ACTION_DOWN}, {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.
2455      *
2456      * @return The event action: ACTION_DOWN, ACTION_UP, or ACTION_MULTIPLE.
2457      */
getAction()2458     public final int getAction() {
2459         return mAction;
2460     }
2461 
2462     /**
2463      * For {@link #ACTION_UP} events, indicates that the event has been
2464      * canceled as per {@link #FLAG_CANCELED}.
2465      */
isCanceled()2466     public final boolean isCanceled() {
2467         return (mFlags&FLAG_CANCELED) != 0;
2468     }
2469 
2470     /**
2471      * Set {@link #FLAG_CANCELED} flag for the key event.
2472      *
2473      * @hide
2474      */
2475     @Override
cancel()2476     public final void cancel() {
2477         mFlags |= FLAG_CANCELED;
2478     }
2479 
2480     /**
2481      * Call this during {@link Callback#onKeyDown} to have the system track
2482      * the key through its final up (possibly including a long press).  Note
2483      * that only one key can be tracked at a time -- if another key down
2484      * event is received while a previous one is being tracked, tracking is
2485      * stopped on the previous event.
2486      */
startTracking()2487     public final void startTracking() {
2488         mFlags |= FLAG_START_TRACKING;
2489     }
2490 
2491     /**
2492      * For {@link #ACTION_UP} events, indicates that the event is still being
2493      * tracked from its initial down event as per
2494      * {@link #FLAG_TRACKING}.
2495      */
isTracking()2496     public final boolean isTracking() {
2497         return (mFlags&FLAG_TRACKING) != 0;
2498     }
2499 
2500     /**
2501      * For {@link #ACTION_DOWN} events, indicates that the event has been
2502      * canceled as per {@link #FLAG_LONG_PRESS}.
2503      */
isLongPress()2504     public final boolean isLongPress() {
2505         return (mFlags&FLAG_LONG_PRESS) != 0;
2506     }
2507 
2508     /**
2509      * Retrieve the key code of the key event.  This is the physical key that
2510      * was pressed, <em>not</em> the Unicode character.
2511      *
2512      * @return The key code of the event.
2513      */
getKeyCode()2514     public final int getKeyCode() {
2515         return mKeyCode;
2516     }
2517 
2518     /**
2519      * For the special case of a {@link #ACTION_MULTIPLE} event with key
2520      * code of {@link #KEYCODE_UNKNOWN}, this is a raw string of characters
2521      * associated with the event.  In all other cases it is null.
2522      *
2523      * @return Returns a String of 1 or more characters associated with
2524      * the event.
2525      *
2526      * @deprecated no longer used by the input system.
2527      */
2528     @Deprecated
getCharacters()2529     public final String getCharacters() {
2530         return mCharacters;
2531     }
2532 
2533     /**
2534      * Retrieve the hardware key id of this key event.  These values are not
2535      * reliable and vary from device to device.
2536      *
2537      * {@more}
2538      * Mostly this is here for debugging purposes.
2539      */
getScanCode()2540     public final int getScanCode() {
2541         return mScanCode;
2542     }
2543 
2544     /**
2545      * Retrieve the repeat count of the event.  For key down events,
2546      * this is the number of times the key has repeated with the first
2547      * down starting at 0 and counting up from there.  For key up events,
2548      * this is always equal to zero. For multiple key events,
2549      * this is the number of down/up pairs that have occurred.
2550      *
2551      * @return The number of times the key has repeated.
2552      */
getRepeatCount()2553     public final int getRepeatCount() {
2554         return mRepeatCount;
2555     }
2556 
2557     /**
2558      * Modifies the down time and the event time of the event.
2559      *
2560      * @param downTime The new down time (in {@link android.os.SystemClock#uptimeMillis}) of the
2561      *                 event.
2562      * @param eventTime The new event time (in {@link android.os.SystemClock#uptimeMillis}) of the
2563      *                  event.
2564      * @hide
2565      */
setTime(long downTime, long eventTime)2566     public final void setTime(long downTime, long eventTime) {
2567         mDownTime = downTime;
2568         mEventTime = eventTime;
2569     }
2570 
2571     /**
2572      * Retrieve the time of the most recent key down event,
2573      * in the {@link android.os.SystemClock#uptimeMillis} time base.  If this
2574      * is a down event, this will be the same as {@link #getEventTime()}.
2575      * Note that when chording keys, this value is the down time of the
2576      * most recently pressed key, which may <em>not</em> be the same physical
2577      * key of this event.
2578      *
2579      * @return Returns the most recent key down time, in the
2580      * {@link android.os.SystemClock#uptimeMillis} time base
2581      */
getDownTime()2582     public final long getDownTime() {
2583         return mDownTime;
2584     }
2585 
2586     /**
2587      * Retrieve the time this event occurred,
2588      * in the {@link android.os.SystemClock#uptimeMillis} time base.
2589      *
2590      * @return Returns the time this event occurred,
2591      * in the {@link android.os.SystemClock#uptimeMillis} time base.
2592      */
2593     @Override
getEventTime()2594     public final long getEventTime() {
2595         return mEventTime;
2596     }
2597 
2598     /**
2599      * Retrieve the time this event occurred,
2600      * in the {@link android.os.SystemClock#uptimeMillis} time base but with
2601      * nanosecond (instead of millisecond) precision.
2602      * <p>
2603      * The value is in nanosecond precision but it may not have nanosecond accuracy.
2604      * </p>
2605      *
2606      * @return Returns the time this event occurred,
2607      * in the {@link android.os.SystemClock#uptimeMillis} time base but with
2608      * nanosecond (instead of millisecond) precision.
2609      *
2610      * @hide
2611      */
2612     @Override
getEventTimeNano()2613     public final long getEventTimeNano() {
2614         return mEventTime * 1000000L;
2615     }
2616 
2617     /**
2618      * Renamed to {@link #getDeviceId}.
2619      *
2620      * @hide
2621      * @deprecated use {@link #getDeviceId()} instead.
2622      */
2623     @Deprecated
getKeyboardDevice()2624     public final int getKeyboardDevice() {
2625         return mDeviceId;
2626     }
2627 
2628     /**
2629      * Gets the {@link KeyCharacterMap} associated with the keyboard device.
2630      *
2631      * @return The associated key character map.
2632      * @throws {@link KeyCharacterMap.UnavailableException} if the key character map
2633      * could not be loaded because it was malformed or the default key character map
2634      * is missing from the system.
2635      *
2636      * @see KeyCharacterMap#load
2637      */
getKeyCharacterMap()2638     public final KeyCharacterMap getKeyCharacterMap() {
2639         return KeyCharacterMap.load(mDeviceId);
2640     }
2641 
2642     /**
2643      * Gets the primary character for this key.
2644      * In other words, the label that is physically printed on it.
2645      *
2646      * @return The display label character, or 0 if none (eg. for non-printing keys).
2647      */
getDisplayLabel()2648     public char getDisplayLabel() {
2649         return getKeyCharacterMap().getDisplayLabel(mKeyCode);
2650     }
2651 
2652     /**
2653      * Gets the Unicode character generated by the specified key and meta
2654      * key state combination.
2655      * <p>
2656      * Returns the Unicode character that the specified key would produce
2657      * when the specified meta bits (see {@link MetaKeyKeyListener})
2658      * were active.
2659      * </p><p>
2660      * Returns 0 if the key is not one that is used to type Unicode
2661      * characters.
2662      * </p><p>
2663      * If the return value has bit {@link KeyCharacterMap#COMBINING_ACCENT} set, the
2664      * key is a "dead key" that should be combined with another to
2665      * actually produce a character -- see {@link KeyCharacterMap#getDeadChar} --
2666      * after masking with {@link KeyCharacterMap#COMBINING_ACCENT_MASK}.
2667      * </p>
2668      *
2669      * @return The associated character or combining accent, or 0 if none.
2670      */
getUnicodeChar()2671     public int getUnicodeChar() {
2672         return getUnicodeChar(mMetaState);
2673     }
2674 
2675     /**
2676      * Gets the Unicode character generated by the specified key and meta
2677      * key state combination.
2678      * <p>
2679      * Returns the Unicode character that the specified key would produce
2680      * when the specified meta bits (see {@link MetaKeyKeyListener})
2681      * were active.
2682      * </p><p>
2683      * Returns 0 if the key is not one that is used to type Unicode
2684      * characters.
2685      * </p><p>
2686      * If the return value has bit {@link KeyCharacterMap#COMBINING_ACCENT} set, the
2687      * key is a "dead key" that should be combined with another to
2688      * actually produce a character -- see {@link KeyCharacterMap#getDeadChar} --
2689      * after masking with {@link KeyCharacterMap#COMBINING_ACCENT_MASK}.
2690      * </p>
2691      *
2692      * @param metaState The meta key modifier state.
2693      * @return The associated character or combining accent, or 0 if none.
2694      */
getUnicodeChar(int metaState)2695     public int getUnicodeChar(int metaState) {
2696         return getKeyCharacterMap().get(mKeyCode, metaState);
2697     }
2698 
2699     /**
2700      * Get the character conversion data for a given key code.
2701      *
2702      * @param results A {@link KeyCharacterMap.KeyData} instance that will be
2703      * filled with the results.
2704      * @return True if the key was mapped.  If the key was not mapped, results is not modified.
2705      *
2706      * @deprecated instead use {@link #getDisplayLabel()},
2707      * {@link #getNumber()} or {@link #getUnicodeChar(int)}.
2708      */
2709     @Deprecated
getKeyData(KeyData results)2710     public boolean getKeyData(KeyData results) {
2711         return getKeyCharacterMap().getKeyData(mKeyCode, results);
2712     }
2713 
2714     /**
2715      * Gets the first character in the character array that can be generated
2716      * by the specified key code.
2717      * <p>
2718      * This is a convenience function that returns the same value as
2719      * {@link #getMatch(char[],int) getMatch(chars, 0)}.
2720      * </p>
2721      *
2722      * @param chars The array of matching characters to consider.
2723      * @return The matching associated character, or 0 if none.
2724      */
getMatch(char[] chars)2725     public char getMatch(char[] chars) {
2726         return getMatch(chars, 0);
2727     }
2728 
2729     /**
2730      * Gets the first character in the character array that can be generated
2731      * by the specified key code.  If there are multiple choices, prefers
2732      * the one that would be generated with the specified meta key modifier state.
2733      *
2734      * @param chars The array of matching characters to consider.
2735      * @param metaState The preferred meta key modifier state.
2736      * @return The matching associated character, or 0 if none.
2737      */
getMatch(char[] chars, int metaState)2738     public char getMatch(char[] chars, int metaState) {
2739         return getKeyCharacterMap().getMatch(mKeyCode, chars, metaState);
2740     }
2741 
2742     /**
2743      * Gets the number or symbol associated with the key.
2744      * <p>
2745      * The character value is returned, not the numeric value.
2746      * If the key is not a number, but is a symbol, the symbol is retuned.
2747      * </p><p>
2748      * This method is intended to to support dial pads and other numeric or
2749      * symbolic entry on keyboards where certain keys serve dual function
2750      * as alphabetic and symbolic keys.  This method returns the number
2751      * or symbol associated with the key independent of whether the user
2752      * has pressed the required modifier.
2753      * </p><p>
2754      * For example, on one particular keyboard the keys on the top QWERTY row generate
2755      * numbers when ALT is pressed such that ALT-Q maps to '1'.  So for that keyboard
2756      * when {@link #getNumber} is called with {@link KeyEvent#KEYCODE_Q} it returns '1'
2757      * so that the user can type numbers without pressing ALT when it makes sense.
2758      * </p>
2759      *
2760      * @return The associated numeric or symbolic character, or 0 if none.
2761      */
getNumber()2762     public char getNumber() {
2763         return getKeyCharacterMap().getNumber(mKeyCode);
2764     }
2765 
2766     /**
2767      * Returns true if this key produces a glyph.
2768      *
2769      * @return True if the key is a printing key.
2770      */
isPrintingKey()2771     public boolean isPrintingKey() {
2772         return getKeyCharacterMap().isPrintingKey(mKeyCode);
2773     }
2774 
2775     /**
2776      * @deprecated Use {@link #dispatch(Callback, DispatcherState, Object)} instead.
2777      */
2778     @Deprecated
dispatch(Callback receiver)2779     public final boolean dispatch(Callback receiver) {
2780         return dispatch(receiver, null, null);
2781     }
2782 
2783     /**
2784      * Deliver this key event to a {@link Callback} interface.  If this is
2785      * an ACTION_MULTIPLE event and it is not handled, then an attempt will
2786      * be made to deliver a single normal event.
2787      *
2788      * @param receiver The Callback that will be given the event.
2789      * @param state State information retained across events.
2790      * @param target The target of the dispatch, for use in tracking.
2791      *
2792      * @return The return value from the Callback method that was called.
2793      */
dispatch(Callback receiver, DispatcherState state, Object target)2794     public final boolean dispatch(Callback receiver, DispatcherState state,
2795             Object target) {
2796         switch (mAction) {
2797             case ACTION_DOWN: {
2798                 mFlags &= ~FLAG_START_TRACKING;
2799                 if (DEBUG) Log.v(TAG, "Key down to " + target + " in " + state
2800                         + ": " + this);
2801                 boolean res = receiver.onKeyDown(mKeyCode, this);
2802                 if (state != null) {
2803                     if (res && mRepeatCount == 0 && (mFlags&FLAG_START_TRACKING) != 0) {
2804                         if (DEBUG) Log.v(TAG, "  Start tracking!");
2805                         state.startTracking(this, target);
2806                     } else if (isLongPress() && state.isTracking(this)) {
2807                         try {
2808                             if (receiver.onKeyLongPress(mKeyCode, this)) {
2809                                 if (DEBUG) Log.v(TAG, "  Clear from long press!");
2810                                 state.performedLongPress(this);
2811                                 res = true;
2812                             }
2813                         } catch (AbstractMethodError e) {
2814                         }
2815                     }
2816                 }
2817                 return res;
2818             }
2819             case ACTION_UP:
2820                 if (DEBUG) Log.v(TAG, "Key up to " + target + " in " + state
2821                         + ": " + this);
2822                 if (state != null) {
2823                     state.handleUpEvent(this);
2824                 }
2825                 return receiver.onKeyUp(mKeyCode, this);
2826             case ACTION_MULTIPLE:
2827                 final int count = mRepeatCount;
2828                 final int code = mKeyCode;
2829                 if (receiver.onKeyMultiple(code, count, this)) {
2830                     return true;
2831                 }
2832                 if (code != KeyEvent.KEYCODE_UNKNOWN) {
2833                     mAction = ACTION_DOWN;
2834                     mRepeatCount = 0;
2835                     boolean handled = receiver.onKeyDown(code, this);
2836                     if (handled) {
2837                         mAction = ACTION_UP;
2838                         receiver.onKeyUp(code, this);
2839                     }
2840                     mAction = ACTION_MULTIPLE;
2841                     mRepeatCount = count;
2842                     return handled;
2843                 }
2844                 return false;
2845         }
2846         return false;
2847     }
2848 
2849     /**
2850      * Use with {@link KeyEvent#dispatch(Callback, DispatcherState, Object)}
2851      * for more advanced key dispatching, such as long presses.
2852      */
2853     public static class DispatcherState {
2854         int mDownKeyCode;
2855         Object mDownTarget;
2856         SparseIntArray mActiveLongPresses = new SparseIntArray();
2857 
2858         /**
2859          * Reset back to initial state.
2860          */
reset()2861         public void reset() {
2862             if (DEBUG) Log.v(TAG, "Reset: " + this);
2863             mDownKeyCode = 0;
2864             mDownTarget = null;
2865             mActiveLongPresses.clear();
2866         }
2867 
2868         /**
2869          * Stop any tracking associated with this target.
2870          */
reset(Object target)2871         public void reset(Object target) {
2872             if (mDownTarget == target) {
2873                 if (DEBUG) Log.v(TAG, "Reset in " + target + ": " + this);
2874                 mDownKeyCode = 0;
2875                 mDownTarget = null;
2876             }
2877         }
2878 
2879         /**
2880          * Start tracking the key code associated with the given event.  This
2881          * can only be called on a key down.  It will allow you to see any
2882          * long press associated with the key, and will result in
2883          * {@link KeyEvent#isTracking} return true on the long press and up
2884          * events.
2885          *
2886          * <p>This is only needed if you are directly dispatching events, rather
2887          * than handling them in {@link Callback#onKeyDown}.
2888          */
startTracking(KeyEvent event, Object target)2889         public void startTracking(KeyEvent event, Object target) {
2890             if (event.getAction() != ACTION_DOWN) {
2891                 throw new IllegalArgumentException(
2892                         "Can only start tracking on a down event");
2893             }
2894             if (DEBUG) Log.v(TAG, "Start trackingt in " + target + ": " + this);
2895             mDownKeyCode = event.getKeyCode();
2896             mDownTarget = target;
2897         }
2898 
2899         /**
2900          * Return true if the key event is for a key code that is currently
2901          * being tracked by the dispatcher.
2902          */
isTracking(KeyEvent event)2903         public boolean isTracking(KeyEvent event) {
2904             return mDownKeyCode == event.getKeyCode();
2905         }
2906 
2907         /**
2908          * Keep track of the given event's key code as having performed an
2909          * action with a long press, so no action should occur on the up.
2910          * <p>This is only needed if you are directly dispatching events, rather
2911          * than handling them in {@link Callback#onKeyLongPress}.
2912          */
performedLongPress(KeyEvent event)2913         public void performedLongPress(KeyEvent event) {
2914             mActiveLongPresses.put(event.getKeyCode(), 1);
2915         }
2916 
2917         /**
2918          * Handle key up event to stop tracking.  This resets the dispatcher state,
2919          * and updates the key event state based on it.
2920          * <p>This is only needed if you are directly dispatching events, rather
2921          * than handling them in {@link Callback#onKeyUp}.
2922          */
handleUpEvent(KeyEvent event)2923         public void handleUpEvent(KeyEvent event) {
2924             final int keyCode = event.getKeyCode();
2925             if (DEBUG) Log.v(TAG, "Handle key up " + event + ": " + this);
2926             int index = mActiveLongPresses.indexOfKey(keyCode);
2927             if (index >= 0) {
2928                 if (DEBUG) Log.v(TAG, "  Index: " + index);
2929                 event.mFlags |= FLAG_CANCELED | FLAG_CANCELED_LONG_PRESS;
2930                 mActiveLongPresses.removeAt(index);
2931             }
2932             if (mDownKeyCode == keyCode) {
2933                 if (DEBUG) Log.v(TAG, "  Tracking!");
2934                 event.mFlags |= FLAG_TRACKING;
2935                 mDownKeyCode = 0;
2936                 mDownTarget = null;
2937             }
2938         }
2939     }
2940 
2941     @Override
toString()2942     public String toString() {
2943         StringBuilder msg = new StringBuilder();
2944         msg.append("KeyEvent { action=").append(actionToString(mAction));
2945         msg.append(", keyCode=").append(keyCodeToString(mKeyCode));
2946         msg.append(", scanCode=").append(mScanCode);
2947         if (mCharacters != null) {
2948             msg.append(", characters=\"").append(mCharacters).append("\"");
2949         }
2950         msg.append(", metaState=").append(metaStateToString(mMetaState));
2951         msg.append(", flags=0x").append(Integer.toHexString(mFlags));
2952         msg.append(", repeatCount=").append(mRepeatCount);
2953         msg.append(", eventTime=").append(mEventTime);
2954         msg.append(", downTime=").append(mDownTime);
2955         msg.append(", deviceId=").append(mDeviceId);
2956         msg.append(", source=0x").append(Integer.toHexString(mSource));
2957         msg.append(", displayId=").append(mDisplayId);
2958         msg.append(" }");
2959         return msg.toString();
2960     }
2961 
2962     /**
2963      * Returns a string that represents the symbolic name of the specified action
2964      * such as "ACTION_DOWN", or an equivalent numeric constant such as "35" if unknown.
2965      *
2966      * @param action The action.
2967      * @return The symbolic name of the specified action.
2968      * @hide
2969      */
2970     @TestApi
actionToString(int action)2971     public static String actionToString(int action) {
2972         switch (action) {
2973             case ACTION_DOWN:
2974                 return "ACTION_DOWN";
2975             case ACTION_UP:
2976                 return "ACTION_UP";
2977             case ACTION_MULTIPLE:
2978                 return "ACTION_MULTIPLE";
2979             default:
2980                 return Integer.toString(action);
2981         }
2982     }
2983 
2984     /**
2985      * Returns a string that represents the symbolic name of the specified keycode
2986      * such as "KEYCODE_A", "KEYCODE_DPAD_UP", or an equivalent numeric constant
2987      * such as "1001" if unknown.
2988      *
2989      * This function is intended to be used mostly for debugging, logging, and testing. It is not
2990      * locale-specific and is not intended to be used in a user-facing manner.
2991      *
2992      * @param keyCode The key code.
2993      * @return The symbolic name of the specified keycode.
2994      *
2995      * @see KeyCharacterMap#getDisplayLabel
2996      */
keyCodeToString(int keyCode)2997     public static String keyCodeToString(int keyCode) {
2998         String symbolicName = nativeKeyCodeToString(keyCode);
2999         return symbolicName != null ? LABEL_PREFIX + symbolicName : Integer.toString(keyCode);
3000     }
3001 
3002     /**
3003      * Gets a keycode by its symbolic name such as "KEYCODE_A" or an equivalent
3004      * numeric constant such as "29". For symbolic names,
3005      * starting in {@link android.os.Build.VERSION_CODES#Q} the prefix "KEYCODE_" is optional.
3006      *
3007      * @param symbolicName The symbolic name of the keycode.
3008      * @return The keycode or {@link #KEYCODE_UNKNOWN} if not found.
3009      * @see #keyCodeToString(int)
3010      */
keyCodeFromString(@onNull String symbolicName)3011     public static int keyCodeFromString(@NonNull String symbolicName) {
3012         try {
3013             int keyCode = Integer.parseInt(symbolicName);
3014             if (keyCodeIsValid(keyCode)) {
3015                 return keyCode;
3016             }
3017         } catch (NumberFormatException ex) {
3018         }
3019 
3020         if (symbolicName.startsWith(LABEL_PREFIX)) {
3021             symbolicName = symbolicName.substring(LABEL_PREFIX.length());
3022         }
3023         int keyCode = nativeKeyCodeFromString(symbolicName);
3024         if (keyCodeIsValid(keyCode)) {
3025             return keyCode;
3026         }
3027         return KEYCODE_UNKNOWN;
3028     }
3029 
keyCodeIsValid(int keyCode)3030     private static boolean keyCodeIsValid(int keyCode) {
3031         return keyCode >= KEYCODE_UNKNOWN && keyCode <= LAST_KEYCODE;
3032     }
3033 
3034     /**
3035      * Returns a string that represents the symbolic name of the specified combined meta
3036      * key modifier state flags such as "0", "META_SHIFT_ON",
3037      * "META_ALT_ON|META_SHIFT_ON" or an equivalent numeric constant such as "0x10000000"
3038      * if unknown.
3039      *
3040      * @param metaState The meta state.
3041      * @return The symbolic name of the specified combined meta state flags.
3042      * @hide
3043      */
metaStateToString(int metaState)3044     public static String metaStateToString(int metaState) {
3045         if (metaState == 0) {
3046             return "0";
3047         }
3048         StringBuilder result = null;
3049         int i = 0;
3050         while (metaState != 0) {
3051             final boolean isSet = (metaState & 1) != 0;
3052             metaState >>>= 1; // unsigned shift!
3053             if (isSet) {
3054                 final String name = META_SYMBOLIC_NAMES[i];
3055                 if (result == null) {
3056                     if (metaState == 0) {
3057                         return name;
3058                     }
3059                     result = new StringBuilder(name);
3060                 } else {
3061                     result.append('|');
3062                     result.append(name);
3063                 }
3064             }
3065             i += 1;
3066         }
3067         return result.toString();
3068     }
3069 
3070     public static final @android.annotation.NonNull Parcelable.Creator<KeyEvent> CREATOR
3071             = new Parcelable.Creator<KeyEvent>() {
3072         @Override
3073         public KeyEvent createFromParcel(Parcel in) {
3074             in.readInt(); // skip token, we already know this is a KeyEvent
3075             return KeyEvent.createFromParcelBody(in);
3076         }
3077 
3078         @Override
3079         public KeyEvent[] newArray(int size) {
3080             return new KeyEvent[size];
3081         }
3082     };
3083 
3084     /** @hide */
createFromParcelBody(Parcel in)3085     public static KeyEvent createFromParcelBody(Parcel in) {
3086         return new KeyEvent(in);
3087     }
3088 
KeyEvent(Parcel in)3089     private KeyEvent(Parcel in) {
3090         mDeviceId = in.readInt();
3091         mSource = in.readInt();
3092         mDisplayId = in.readInt();
3093         mAction = in.readInt();
3094         mKeyCode = in.readInt();
3095         mRepeatCount = in.readInt();
3096         mMetaState = in.readInt();
3097         mScanCode = in.readInt();
3098         mFlags = in.readInt();
3099         mDownTime = in.readLong();
3100         mEventTime = in.readLong();
3101         mCharacters = in.readString();
3102     }
3103 
3104     @Override
writeToParcel(Parcel out, int flags)3105     public void writeToParcel(Parcel out, int flags) {
3106         out.writeInt(PARCEL_TOKEN_KEY_EVENT);
3107 
3108         out.writeInt(mDeviceId);
3109         out.writeInt(mSource);
3110         out.writeInt(mDisplayId);
3111         out.writeInt(mAction);
3112         out.writeInt(mKeyCode);
3113         out.writeInt(mRepeatCount);
3114         out.writeInt(mMetaState);
3115         out.writeInt(mScanCode);
3116         out.writeInt(mFlags);
3117         out.writeLong(mDownTime);
3118         out.writeLong(mEventTime);
3119         out.writeString(mCharacters);
3120     }
3121 }
3122