KeyEvent.java revision 037c33eae74bee2774897d969d48947f9abe254f
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.view;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable;
216b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brownimport android.text.method.MetaKeyKeyListener;
228d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackbornimport android.util.Log;
2328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brownimport android.util.Slog;
246f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brownimport android.util.SparseArray;
2583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackbornimport android.util.SparseIntArray;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyCharacterMap;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyCharacterMap.KeyData;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
30dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * Object used to report key and button events.
31dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * <p>
32dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * Each key press is described by a sequence of key events.  A key press
33dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * starts with a key event with {@link #ACTION_DOWN}.  If the key is held
34dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * sufficiently long that it repeats, then the initial down is followed
35dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * additional key events with {@link #ACTION_DOWN} and a non-zero value for
36dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * {@link #getRepeatCount()}.  The last key event is a {@link #ACTION_UP}
37dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * for the key up.  If the key press is canceled, the key up event will have the
38dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * {@link #FLAG_CANCELED} flag set.
39dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * </p><p>
40dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * Key events are generally accompanied by a key code ({@link #getKeyCode()}),
41dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * scan code ({@link #getScanCode()}) and meta state ({@link #getMetaState()}).
42dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * Key code constants are defined in this class.  Scan code constants are raw
43dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * device-specific codes obtained from the OS and so are not generally meaningful
44dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * to applications unless interpreted using the {@link KeyCharacterMap}.
45dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * Meta states describe the pressed state of key modifiers
46dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * such as {@link #META_SHIFT_ON} or {@link #META_ALT_ON}.
47dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * </p><p>
48497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown * Key codes typically correspond one-to-one with individual keys on an input device.
49497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown * Many keys and key combinations serve quite different functions on different
50497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown * input devices so care must be taken when interpreting them.  Always use the
51497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown * {@link KeyCharacterMap} associated with the input device when mapping keys
52497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown * to characters.  Be aware that there may be multiple key input devices active
53497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown * at the same time and each will have its own key character map.
54497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown * </p><p>
55405bc51c5dc73846a4abdc325cd234eb2d37469fJean Chalard * As soft input methods can use multiple and inventive ways of inputting text,
56405bc51c5dc73846a4abdc325cd234eb2d37469fJean Chalard * there is no guarantee that any key press on a soft keyboard will generate a key
57405bc51c5dc73846a4abdc325cd234eb2d37469fJean Chalard * event: this is left to the IME's discretion, and in fact sending such events is
58405bc51c5dc73846a4abdc325cd234eb2d37469fJean Chalard * discouraged.  You should never rely on receiving KeyEvents for any key on a soft
59405bc51c5dc73846a4abdc325cd234eb2d37469fJean Chalard * input method.  In particular, the default software keyboard will never send any
60405bc51c5dc73846a4abdc325cd234eb2d37469fJean Chalard * key event to any application targetting Jelly Bean or later, and will only send
61405bc51c5dc73846a4abdc325cd234eb2d37469fJean Chalard * events for some presses of the delete and return keys to applications targetting
62405bc51c5dc73846a4abdc325cd234eb2d37469fJean Chalard * Ice Cream Sandwich or earlier.  Be aware that other software input methods may
63405bc51c5dc73846a4abdc325cd234eb2d37469fJean Chalard * never send key events regardless of the version.  Consider using editor actions
64405bc51c5dc73846a4abdc325cd234eb2d37469fJean Chalard * like {@link android.view.inputmethod.EditorInfo#IME_ACTION_DONE} if you need
65405bc51c5dc73846a4abdc325cd234eb2d37469fJean Chalard * specific interaction with the software keyboard, as it gives more visibility to
66405bc51c5dc73846a4abdc325cd234eb2d37469fJean Chalard * the user as to how your application will react to key presses.
67405bc51c5dc73846a4abdc325cd234eb2d37469fJean Chalard * </p><p>
68dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * When interacting with an IME, the framework may deliver key events
69dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * with the special action {@link #ACTION_MULTIPLE} that either specifies
70dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * that single repeated key code or a sequence of characters to insert.
71dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * </p><p>
72b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown * In general, the framework cannot guarantee that the key events it delivers
73b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown * to a view always constitute complete key sequences since some events may be dropped
74b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown * or modified by containing views before they are delivered.  The view implementation
75b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown * should be prepared to handle {@link #FLAG_CANCELED} and should tolerate anomalous
76b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown * situations such as receiving a new {@link #ACTION_DOWN} without first having
77b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown * received an {@link #ACTION_UP} for the prior key press.
78dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * </p><p>
79dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * Refer to {@link InputDevice} for more information about how different kinds of
80dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * input devices and sources represent keys and buttons.
81dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * </p>
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
83c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brownpublic class KeyEvent extends InputEvent implements Parcelable {
84dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Unknown key code. */
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_UNKNOWN         = 0;
86dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Soft Left key.
87dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * Usually situated below the display on phones and used as a multi-function
88dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * feature key for selecting a software defined function shown on the bottom left
89dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * of the display. */
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_SOFT_LEFT       = 1;
91dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Soft Right key.
92dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * Usually situated below the display on phones and used as a multi-function
93dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * feature key for selecting a software defined function shown on the bottom right
94dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * of the display. */
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_SOFT_RIGHT      = 2;
96dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Home key.
97dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * This key is handled by the framework and is never delivered to applications. */
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_HOME            = 3;
99dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Back key. */
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_BACK            = 4;
101dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Call key. */
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_CALL            = 5;
103dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: End Call key. */
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_ENDCALL         = 6;
105dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: '0' key. */
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_0               = 7;
107dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: '1' key. */
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_1               = 8;
109dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: '2' key. */
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_2               = 9;
111dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: '3' key. */
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_3               = 10;
113dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: '4' key. */
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_4               = 11;
115dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: '5' key. */
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_5               = 12;
117dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: '6' key. */
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_6               = 13;
119dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: '7' key. */
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_7               = 14;
121dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: '8' key. */
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_8               = 15;
123dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: '9' key. */
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_9               = 16;
125dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: '*' key. */
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_STAR            = 17;
127dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: '#' key. */
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_POUND           = 18;
129dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Directional Pad Up key.
130dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * May also be synthesized from trackball motions. */
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_DPAD_UP         = 19;
132dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Directional Pad Down key.
133dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * May also be synthesized from trackball motions. */
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_DPAD_DOWN       = 20;
135dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Directional Pad Left key.
136dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * May also be synthesized from trackball motions. */
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_DPAD_LEFT       = 21;
138dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Directional Pad Right key.
139dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * May also be synthesized from trackball motions. */
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_DPAD_RIGHT      = 22;
141dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Directional Pad Center key.
142dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * May also be synthesized from trackball motions. */
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_DPAD_CENTER     = 23;
144b0418da0e7594a8c2164a46985c5f1993632e010Jeff Brown    /** Key code constant: Volume Up key.
145b0418da0e7594a8c2164a46985c5f1993632e010Jeff Brown     * Adjusts the speaker volume up. */
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_VOLUME_UP       = 24;
147b0418da0e7594a8c2164a46985c5f1993632e010Jeff Brown    /** Key code constant: Volume Down key.
148b0418da0e7594a8c2164a46985c5f1993632e010Jeff Brown     * Adjusts the speaker volume down. */
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_VOLUME_DOWN     = 25;
150dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Power key. */
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_POWER           = 26;
152dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Camera key.
153dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * Used to launch a camera application or take pictures. */
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_CAMERA          = 27;
155dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Clear key. */
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_CLEAR           = 28;
157dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'A' key. */
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_A               = 29;
159dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'B' key. */
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_B               = 30;
161dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'C' key. */
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_C               = 31;
163dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'D' key. */
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_D               = 32;
165dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'E' key. */
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_E               = 33;
167dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'F' key. */
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_F               = 34;
169dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'G' key. */
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_G               = 35;
171dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'H' key. */
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_H               = 36;
173dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'I' key. */
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_I               = 37;
175dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'J' key. */
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_J               = 38;
177dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'K' key. */
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_K               = 39;
179dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'L' key. */
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_L               = 40;
181dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'M' key. */
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_M               = 41;
183dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'N' key. */
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_N               = 42;
185dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'O' key. */
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_O               = 43;
187dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'P' key. */
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_P               = 44;
189dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'Q' key. */
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_Q               = 45;
191dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'R' key. */
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_R               = 46;
193dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'S' key. */
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_S               = 47;
195dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'T' key. */
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_T               = 48;
197dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'U' key. */
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_U               = 49;
199dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'V' key. */
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_V               = 50;
201dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'W' key. */
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_W               = 51;
203dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'X' key. */
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_X               = 52;
205dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'Y' key. */
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_Y               = 53;
207dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'Z' key. */
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_Z               = 54;
209dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: ',' key. */
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_COMMA           = 55;
211dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: '.' key. */
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_PERIOD          = 56;
213dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Left Alt modifier key. */
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_ALT_LEFT        = 57;
215dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Right Alt modifier key. */
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_ALT_RIGHT       = 58;
217dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Left Shift modifier key. */
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_SHIFT_LEFT      = 59;
219dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Right Shift modifier key. */
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_SHIFT_RIGHT     = 60;
221dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Tab key. */
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_TAB             = 61;
223dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Space key. */
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_SPACE           = 62;
225224d4a15353656182939aaf4be8cbbf5ab7c63c5Jeff Brown    /** Key code constant: Symbol modifier key.
226224d4a15353656182939aaf4be8cbbf5ab7c63c5Jeff Brown     * Used to enter alternate symbols. */
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_SYM             = 63;
228dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Explorer special function key.
229dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * Used to launch a browser application. */
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_EXPLORER        = 64;
231dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Envelope special function key.
232dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * Used to launch a mail application. */
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_ENVELOPE        = 65;
234dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Enter key. */
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_ENTER           = 66;
236224d4a15353656182939aaf4be8cbbf5ab7c63c5Jeff Brown    /** Key code constant: Backspace key.
237497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * Deletes characters before the insertion point, unlike {@link #KEYCODE_FORWARD_DEL}. */
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_DEL             = 67;
239dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: '`' (backtick) key. */
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_GRAVE           = 68;
241dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: '-'. */
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_MINUS           = 69;
243dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: '=' key. */
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_EQUALS          = 70;
245dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: '[' key. */
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_LEFT_BRACKET    = 71;
247dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: ']' key. */
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_RIGHT_BRACKET   = 72;
249dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: '\' key. */
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_BACKSLASH       = 73;
251dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: ';' key. */
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_SEMICOLON       = 74;
253dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: ''' (apostrophe) key. */
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_APOSTROPHE      = 75;
255dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: '/' key. */
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_SLASH           = 76;
257dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: '@' key. */
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_AT              = 77;
259224d4a15353656182939aaf4be8cbbf5ab7c63c5Jeff Brown    /** Key code constant: Number modifier key.
260224d4a15353656182939aaf4be8cbbf5ab7c63c5Jeff Brown     * Used to enter numeric symbols.
261224d4a15353656182939aaf4be8cbbf5ab7c63c5Jeff Brown     * This key is not Num Lock; it is more like {@link #KEYCODE_ALT_LEFT} and is
262224d4a15353656182939aaf4be8cbbf5ab7c63c5Jeff Brown     * interpreted as an ALT key by {@link android.text.method.MetaKeyKeyListener}. */
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_NUM             = 78;
264dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Headset Hook key.
265dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * Used to hang up calls and stop media. */
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_HEADSETHOOK     = 79;
267dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Camera Focus key.
268dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * Used to focus the camera. */
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_FOCUS           = 80;   // *Camera* focus
270dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: '+' key. */
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_PLUS            = 81;
272dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Menu key. */
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_MENU            = 82;
274dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Notification key. */
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_NOTIFICATION    = 83;
276dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Search key. */
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_SEARCH          = 84;
278dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Play/Pause media key. */
279935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn    public static final int KEYCODE_MEDIA_PLAY_PAUSE= 85;
280dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Stop media key. */
281935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn    public static final int KEYCODE_MEDIA_STOP      = 86;
282dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Play Next media key. */
283935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn    public static final int KEYCODE_MEDIA_NEXT      = 87;
284dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Play Previous media key. */
285935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn    public static final int KEYCODE_MEDIA_PREVIOUS  = 88;
286dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Rewind media key. */
287935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn    public static final int KEYCODE_MEDIA_REWIND    = 89;
288dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Fast Forward media key. */
289935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn    public static final int KEYCODE_MEDIA_FAST_FORWARD = 90;
290b0418da0e7594a8c2164a46985c5f1993632e010Jeff Brown    /** Key code constant: Mute key.
291b0418da0e7594a8c2164a46985c5f1993632e010Jeff Brown     * Mutes the microphone, unlike {@link #KEYCODE_VOLUME_MUTE}. */
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_MUTE            = 91;
293dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Page Up key. */
2944fedd80c1d3997d62073518973b1fe09862ebaa5Chih-Wei Huang    public static final int KEYCODE_PAGE_UP         = 92;
295dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Page Down key. */
2964fedd80c1d3997d62073518973b1fe09862ebaa5Chih-Wei Huang    public static final int KEYCODE_PAGE_DOWN       = 93;
297dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Picture Symbols modifier key.
298dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * Used to switch symbol sets (Emoji, Kao-moji). */
299b032bc037399110f41cfdb838a792b3c65756323mogimo    public static final int KEYCODE_PICTSYMBOLS     = 94;   // switch symbol-sets (Emoji,Kao-moji)
300dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Switch Charset modifier key.
301dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * Used to switch character sets (Kanji, Katakana). */
302b032bc037399110f41cfdb838a792b3c65756323mogimo    public static final int KEYCODE_SWITCH_CHARSET  = 95;   // switch char-sets (Kanji,Katakana)
303dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: A Button key.
304dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * On a game controller, the A button should be either the button labeled A
3056b57bde221c593b46daf020d03f938924ea1ef28Michael Wright     * or the first button on the bottom row of controller buttons. */
306fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown    public static final int KEYCODE_BUTTON_A        = 96;
307dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: B Button key.
308dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * On a game controller, the B button should be either the button labeled B
3096b57bde221c593b46daf020d03f938924ea1ef28Michael Wright     * or the second button on the bottom row of controller buttons. */
310fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown    public static final int KEYCODE_BUTTON_B        = 97;
311dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: C Button key.
312dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * On a game controller, the C button should be either the button labeled C
3136b57bde221c593b46daf020d03f938924ea1ef28Michael Wright     * or the third button on the bottom row of controller buttons. */
314fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown    public static final int KEYCODE_BUTTON_C        = 98;
315dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: X Button key.
316dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * On a game controller, the X button should be either the button labeled X
3176b57bde221c593b46daf020d03f938924ea1ef28Michael Wright     * or the first button on the upper row of controller buttons. */
318fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown    public static final int KEYCODE_BUTTON_X        = 99;
319dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Y Button key.
320dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * On a game controller, the Y button should be either the button labeled Y
3216b57bde221c593b46daf020d03f938924ea1ef28Michael Wright     * or the second button on the upper row of controller buttons. */
322fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown    public static final int KEYCODE_BUTTON_Y        = 100;
323dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Z Button key.
324dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * On a game controller, the Z button should be either the button labeled Z
3256b57bde221c593b46daf020d03f938924ea1ef28Michael Wright     * or the third button on the upper row of controller buttons. */
326fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown    public static final int KEYCODE_BUTTON_Z        = 101;
327dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: L1 Button key.
328dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * On a game controller, the L1 button should be either the button labeled L1 (or L)
329dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * or the top left trigger button. */
330fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown    public static final int KEYCODE_BUTTON_L1       = 102;
331dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: R1 Button key.
332dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * On a game controller, the R1 button should be either the button labeled R1 (or R)
333dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * or the top right trigger button. */
334fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown    public static final int KEYCODE_BUTTON_R1       = 103;
335dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: L2 Button key.
336dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * On a game controller, the L2 button should be either the button labeled L2
337dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * or the bottom left trigger button. */
338fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown    public static final int KEYCODE_BUTTON_L2       = 104;
339dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: R2 Button key.
340dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * On a game controller, the R2 button should be either the button labeled R2
341dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * or the bottom right trigger button. */
342fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown    public static final int KEYCODE_BUTTON_R2       = 105;
343dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Left Thumb Button key.
344dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * On a game controller, the left thumb button indicates that the left (or only)
345dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * joystick is pressed. */
346fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown    public static final int KEYCODE_BUTTON_THUMBL   = 106;
347dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Right Thumb Button key.
348dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * On a game controller, the right thumb button indicates that the right
349dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * joystick is pressed. */
350fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown    public static final int KEYCODE_BUTTON_THUMBR   = 107;
351dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Start Button key.
352dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * On a game controller, the button labeled Start. */
353fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown    public static final int KEYCODE_BUTTON_START    = 108;
354dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Select Button key.
355dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * On a game controller, the button labeled Select. */
356fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown    public static final int KEYCODE_BUTTON_SELECT   = 109;
357dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Mode Button key.
358dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * On a game controller, the button labeled Mode. */
359fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown    public static final int KEYCODE_BUTTON_MODE     = 110;
360497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: Escape key. */
361497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_ESCAPE          = 111;
362497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: Forward Delete key.
363497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * Deletes characters ahead of the insertion point, unlike {@link #KEYCODE_DEL}. */
364497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_FORWARD_DEL     = 112;
365497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: Left Control modifier key. */
366497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_CTRL_LEFT       = 113;
367497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: Right Control modifier key. */
368497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_CTRL_RIGHT      = 114;
36928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    /** Key code constant: Caps Lock key. */
370497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_CAPS_LOCK       = 115;
371497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: Scroll Lock key. */
372497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_SCROLL_LOCK     = 116;
373497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: Left Meta modifier key. */
374497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_META_LEFT       = 117;
375497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: Right Meta modifier key. */
376497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_META_RIGHT      = 118;
377497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: Function modifier key. */
378497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_FUNCTION        = 119;
379497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: System Request / Print Screen key. */
380497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_SYSRQ           = 120;
381497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: Break / Pause key. */
382497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_BREAK           = 121;
383497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: Home Movement key.
384497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * Used for scrolling or moving the cursor around to the start of a line
385497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * or to the top of a list. */
386497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_MOVE_HOME       = 122;
387497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: End Movement key.
388497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * Used for scrolling or moving the cursor around to the end of a line
389497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * or to the bottom of a list. */
390497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_MOVE_END        = 123;
391497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: Insert key.
392497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * Toggles insert / overwrite edit mode. */
393497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_INSERT          = 124;
394497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: Forward key.
395497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * Navigates forward in the history stack.  Complement of {@link #KEYCODE_BACK}. */
396497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_FORWARD         = 125;
397497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: Play media key. */
398497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_MEDIA_PLAY      = 126;
399497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: Pause media key. */
400497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_MEDIA_PAUSE     = 127;
401497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: Close media key.
402497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * May be used to close a CD tray, for example. */
403497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_MEDIA_CLOSE     = 128;
404497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: Eject media key.
405497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * May be used to eject a CD tray, for example. */
406497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_MEDIA_EJECT     = 129;
407497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: Record media key. */
408497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_MEDIA_RECORD    = 130;
409497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: F1 key. */
410497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_F1              = 131;
411497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: F2 key. */
412497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_F2              = 132;
413497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: F3 key. */
414497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_F3              = 133;
415497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: F4 key. */
416497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_F4              = 134;
417497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: F5 key. */
418497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_F5              = 135;
419497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: F6 key. */
420497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_F6              = 136;
421497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: F7 key. */
422497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_F7              = 137;
423497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: F8 key. */
424497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_F8              = 138;
425497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: F9 key. */
426497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_F9              = 139;
427497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: F10 key. */
428497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_F10             = 140;
429497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: F11 key. */
430497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_F11             = 141;
431497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: F12 key. */
432497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_F12             = 142;
43328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    /** Key code constant: Num Lock key.
434497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * This is the Num Lock key; it is different from {@link #KEYCODE_NUM}.
43528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * This key alters the behavior of other keys on the numeric keypad. */
436497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_NUM_LOCK        = 143;
437497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: Numeric keypad '0' key. */
438497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_NUMPAD_0        = 144;
439497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: Numeric keypad '1' key. */
440497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_NUMPAD_1        = 145;
441497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: Numeric keypad '2' key. */
442497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_NUMPAD_2        = 146;
443497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: Numeric keypad '3' key. */
444497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_NUMPAD_3        = 147;
445497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: Numeric keypad '4' key. */
446497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_NUMPAD_4        = 148;
447497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: Numeric keypad '5' key. */
448497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_NUMPAD_5        = 149;
449497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: Numeric keypad '6' key. */
450497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_NUMPAD_6        = 150;
451497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: Numeric keypad '7' key. */
452497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_NUMPAD_7        = 151;
453497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: Numeric keypad '8' key. */
454497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_NUMPAD_8        = 152;
455497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: Numeric keypad '9' key. */
456497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_NUMPAD_9        = 153;
457497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: Numeric keypad '/' key (for division). */
458497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_NUMPAD_DIVIDE   = 154;
459497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: Numeric keypad '*' key (for multiplication). */
460497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_NUMPAD_MULTIPLY = 155;
461497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: Numeric keypad '-' key (for subtraction). */
462497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_NUMPAD_SUBTRACT = 156;
463497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: Numeric keypad '+' key (for addition). */
464497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_NUMPAD_ADD      = 157;
465497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: Numeric keypad '.' key (for decimals or digit grouping). */
466497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_NUMPAD_DOT      = 158;
467497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: Numeric keypad ',' key (for decimals or digit grouping). */
468497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_NUMPAD_COMMA    = 159;
469497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: Numeric keypad Enter key. */
470497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_NUMPAD_ENTER    = 160;
471497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: Numeric keypad '=' key. */
472497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_NUMPAD_EQUALS   = 161;
473497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: Numeric keypad '(' key. */
474497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_NUMPAD_LEFT_PAREN = 162;
475497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /** Key code constant: Numeric keypad ')' key. */
476497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int KEYCODE_NUMPAD_RIGHT_PAREN = 163;
477b0418da0e7594a8c2164a46985c5f1993632e010Jeff Brown    /** Key code constant: Volume Mute key.
478b0418da0e7594a8c2164a46985c5f1993632e010Jeff Brown     * Mutes the speaker, unlike {@link #KEYCODE_MUTE}.
479b0418da0e7594a8c2164a46985c5f1993632e010Jeff Brown     * This key should normally be implemented as a toggle such that the first press
480b0418da0e7594a8c2164a46985c5f1993632e010Jeff Brown     * mutes the speaker and the second press restores the original volume. */
481b0418da0e7594a8c2164a46985c5f1993632e010Jeff Brown    public static final int KEYCODE_VOLUME_MUTE     = 164;
4823adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer    /** Key code constant: Info key.
4833adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer     * Common on TV remotes to show additional information related to what is
4843adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer     * currently being viewed. */
4853adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer    public static final int KEYCODE_INFO            = 165;
4863adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer    /** Key code constant: Channel up key.
4873adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer     * On TV remotes, increments the television channel. */
4883adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer    public static final int KEYCODE_CHANNEL_UP      = 166;
4893adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer    /** Key code constant: Channel down key.
4903adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer     * On TV remotes, decrements the television channel. */
4913adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer    public static final int KEYCODE_CHANNEL_DOWN    = 167;
4923adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer    /** Key code constant: Zoom in key. */
4933adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer    public static final int KEYCODE_ZOOM_IN         = 168;
4943adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer    /** Key code constant: Zoom out key. */
4953adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer    public static final int KEYCODE_ZOOM_OUT        = 169;
4963adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer    /** Key code constant: TV key.
4973adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer     * On TV remotes, switches to viewing live TV. */
4983adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer    public static final int KEYCODE_TV              = 170;
4993adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer    /** Key code constant: Window key.
5003adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer     * On TV remotes, toggles picture-in-picture mode or other windowing functions. */
5013adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer    public static final int KEYCODE_WINDOW          = 171;
5023adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer    /** Key code constant: Guide key.
5033adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer     * On TV remotes, shows a programming guide. */
5043adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer    public static final int KEYCODE_GUIDE           = 172;
5053adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer    /** Key code constant: DVR key.
5063adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer     * On some TV remotes, switches to a DVR mode for recorded shows. */
5073adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer    public static final int KEYCODE_DVR             = 173;
5083adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer    /** Key code constant: Bookmark key.
5093adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer     * On some TV remotes, bookmarks content or web pages. */
5103adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer    public static final int KEYCODE_BOOKMARK        = 174;
5113adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer    /** Key code constant: Toggle captions key.
5123adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer     * Switches the mode for closed-captioning text, for example during television shows. */
5133adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer    public static final int KEYCODE_CAPTIONS        = 175;
5143adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer    /** Key code constant: Settings key.
5153adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer     * Starts the system settings activity. */
5163adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer    public static final int KEYCODE_SETTINGS        = 176;
5173adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer    /** Key code constant: TV power key.
5183adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer     * On TV remotes, toggles the power on a television screen. */
5193adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer    public static final int KEYCODE_TV_POWER        = 177;
5203adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer    /** Key code constant: TV input key.
5213adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer     * On TV remotes, switches the input on a television screen. */
5223adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer    public static final int KEYCODE_TV_INPUT        = 178;
5233adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer    /** Key code constant: Set-top-box power key.
5243adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer     * On TV remotes, toggles the power on an external Set-top-box. */
5253adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer    public static final int KEYCODE_STB_POWER       = 179;
5263adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer    /** Key code constant: Set-top-box input key.
5273adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer     * On TV remotes, switches the input mode on an external Set-top-box. */
5283adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer    public static final int KEYCODE_STB_INPUT       = 180;
5293adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer    /** Key code constant: A/V Receiver power key.
5303adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer     * On TV remotes, toggles the power on an external A/V Receiver. */
5313adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer    public static final int KEYCODE_AVR_POWER       = 181;
5323adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer    /** Key code constant: A/V Receiver input key.
5333adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer     * On TV remotes, switches the input mode on an external A/V Receiver. */
5343adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer    public static final int KEYCODE_AVR_INPUT       = 182;
5353adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer    /** Key code constant: Red "programmable" key.
5363adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer     * On TV remotes, acts as a contextual/programmable key. */
5373adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer    public static final int KEYCODE_PROG_RED        = 183;
5383adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer    /** Key code constant: Green "programmable" key.
5393adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer     * On TV remotes, actsas a contextual/programmable key. */
5403adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer    public static final int KEYCODE_PROG_GREEN      = 184;
5413adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer    /** Key code constant: Yellow "programmable" key.
5423adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer     * On TV remotes, acts as a contextual/programmable key. */
5433adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer    public static final int KEYCODE_PROG_YELLOW     = 185;
5443adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer    /** Key code constant: Blue "programmable" key.
5453adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer     * On TV remotes, acts as a contextual/programmable key. */
5463adf490a5aaa2e87676c8985b566fcb0dfeb74b9Jason Bayer    public static final int KEYCODE_PROG_BLUE       = 186;
54749ed71db425c5054e3ad9526496a7e116c89556bJeff Brown    /** Key code constant: App switch key.
54849ed71db425c5054e3ad9526496a7e116c89556bJeff Brown     * Should bring up the application switcher dialog. */
54949ed71db425c5054e3ad9526496a7e116c89556bJeff Brown    public static final int KEYCODE_APP_SWITCH      = 187;
550cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    /** Key code constant: Generic Game Pad Button #1.*/
551cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    public static final int KEYCODE_BUTTON_1        = 188;
552cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    /** Key code constant: Generic Game Pad Button #2.*/
553cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    public static final int KEYCODE_BUTTON_2        = 189;
554cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    /** Key code constant: Generic Game Pad Button #3.*/
555cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    public static final int KEYCODE_BUTTON_3        = 190;
556cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    /** Key code constant: Generic Game Pad Button #4.*/
557cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    public static final int KEYCODE_BUTTON_4        = 191;
558cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    /** Key code constant: Generic Game Pad Button #5.*/
559cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    public static final int KEYCODE_BUTTON_5        = 192;
560cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    /** Key code constant: Generic Game Pad Button #6.*/
561cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    public static final int KEYCODE_BUTTON_6        = 193;
562cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    /** Key code constant: Generic Game Pad Button #7.*/
563cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    public static final int KEYCODE_BUTTON_7        = 194;
564cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    /** Key code constant: Generic Game Pad Button #8.*/
565cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    public static final int KEYCODE_BUTTON_8        = 195;
566cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    /** Key code constant: Generic Game Pad Button #9.*/
567cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    public static final int KEYCODE_BUTTON_9        = 196;
568cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    /** Key code constant: Generic Game Pad Button #10.*/
569cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    public static final int KEYCODE_BUTTON_10       = 197;
570cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    /** Key code constant: Generic Game Pad Button #11.*/
571cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    public static final int KEYCODE_BUTTON_11       = 198;
572cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    /** Key code constant: Generic Game Pad Button #12.*/
573cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    public static final int KEYCODE_BUTTON_12       = 199;
574cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    /** Key code constant: Generic Game Pad Button #13.*/
575cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    public static final int KEYCODE_BUTTON_13       = 200;
576cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    /** Key code constant: Generic Game Pad Button #14.*/
577cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    public static final int KEYCODE_BUTTON_14       = 201;
578cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    /** Key code constant: Generic Game Pad Button #15.*/
579cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    public static final int KEYCODE_BUTTON_15       = 202;
580cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    /** Key code constant: Generic Game Pad Button #16.*/
581cb1404e45639d20439d7700b06d57ca1a1aad1faJeff Brown    public static final int KEYCODE_BUTTON_16       = 203;
5829812aed2765c671e6c3f5255ac1b8a2fe0e72ef6Jeff Brown    /** Key code constant: Language Switch key.
5839812aed2765c671e6c3f5255ac1b8a2fe0e72ef6Jeff Brown     * Toggles the current input language such as switching between English and Japanese on
5849812aed2765c671e6c3f5255ac1b8a2fe0e72ef6Jeff Brown     * a QWERTY keyboard.  On some devices, the same function may be performed by
5859812aed2765c671e6c3f5255ac1b8a2fe0e72ef6Jeff Brown     * pressing Shift+Spacebar. */
5869812aed2765c671e6c3f5255ac1b8a2fe0e72ef6Jeff Brown    public static final int KEYCODE_LANGUAGE_SWITCH = 204;
5879812aed2765c671e6c3f5255ac1b8a2fe0e72ef6Jeff Brown    /** Key code constant: Manner Mode key.
5889812aed2765c671e6c3f5255ac1b8a2fe0e72ef6Jeff Brown     * Toggles silent or vibrate mode on and off to make the device behave more politely
5899812aed2765c671e6c3f5255ac1b8a2fe0e72ef6Jeff Brown     * in certain settings such as on a crowded train.  On some devices, the key may only
5909812aed2765c671e6c3f5255ac1b8a2fe0e72ef6Jeff Brown     * operate when long-pressed. */
5919812aed2765c671e6c3f5255ac1b8a2fe0e72ef6Jeff Brown    public static final int KEYCODE_MANNER_MODE     = 205;
5929812aed2765c671e6c3f5255ac1b8a2fe0e72ef6Jeff Brown    /** Key code constant: 3D Mode key.
5939812aed2765c671e6c3f5255ac1b8a2fe0e72ef6Jeff Brown     * Toggles the display between 2D and 3D mode. */
5949812aed2765c671e6c3f5255ac1b8a2fe0e72ef6Jeff Brown    public static final int KEYCODE_3D_MODE         = 206;
5956651a638348c15e89e265b0a53c775cac9beafa2Jeff Brown    /** Key code constant: Contacts special function key.
5966651a638348c15e89e265b0a53c775cac9beafa2Jeff Brown     * Used to launch an address book application. */
5976651a638348c15e89e265b0a53c775cac9beafa2Jeff Brown    public static final int KEYCODE_CONTACTS        = 207;
5986651a638348c15e89e265b0a53c775cac9beafa2Jeff Brown    /** Key code constant: Calendar special function key.
5996651a638348c15e89e265b0a53c775cac9beafa2Jeff Brown     * Used to launch a calendar application. */
6006651a638348c15e89e265b0a53c775cac9beafa2Jeff Brown    public static final int KEYCODE_CALENDAR        = 208;
6016651a638348c15e89e265b0a53c775cac9beafa2Jeff Brown    /** Key code constant: Music special function key.
6026651a638348c15e89e265b0a53c775cac9beafa2Jeff Brown     * Used to launch a music player application. */
6036651a638348c15e89e265b0a53c775cac9beafa2Jeff Brown    public static final int KEYCODE_MUSIC           = 209;
6046651a638348c15e89e265b0a53c775cac9beafa2Jeff Brown    /** Key code constant: Calculator special function key.
6056651a638348c15e89e265b0a53c775cac9beafa2Jeff Brown     * Used to launch a calculator application. */
6066651a638348c15e89e265b0a53c775cac9beafa2Jeff Brown    public static final int KEYCODE_CALCULATOR      = 210;
6077511f9cd2ff39075ff56c2558c785caffc8b4383Yang Chuang    /** Key code constant: Japanese full-width / half-width key. */
6087511f9cd2ff39075ff56c2558c785caffc8b4383Yang Chuang    public static final int KEYCODE_ZENKAKU_HANKAKU = 211;
6097511f9cd2ff39075ff56c2558c785caffc8b4383Yang Chuang    /** Key code constant: Japanese alphanumeric key. */
6107511f9cd2ff39075ff56c2558c785caffc8b4383Yang Chuang    public static final int KEYCODE_EISU            = 212;
6117511f9cd2ff39075ff56c2558c785caffc8b4383Yang Chuang    /** Key code constant: Japanese non-conversion key. */
6127511f9cd2ff39075ff56c2558c785caffc8b4383Yang Chuang    public static final int KEYCODE_MUHENKAN        = 213;
6137511f9cd2ff39075ff56c2558c785caffc8b4383Yang Chuang    /** Key code constant: Japanese conversion key. */
6147511f9cd2ff39075ff56c2558c785caffc8b4383Yang Chuang    public static final int KEYCODE_HENKAN          = 214;
6157511f9cd2ff39075ff56c2558c785caffc8b4383Yang Chuang    /** Key code constant: Japanese katakana / hiragana key. */
6167511f9cd2ff39075ff56c2558c785caffc8b4383Yang Chuang    public static final int KEYCODE_KATAKANA_HIRAGANA = 215;
6177511f9cd2ff39075ff56c2558c785caffc8b4383Yang Chuang    /** Key code constant: Japanese Yen key. */
6187511f9cd2ff39075ff56c2558c785caffc8b4383Yang Chuang    public static final int KEYCODE_YEN             = 216;
6197511f9cd2ff39075ff56c2558c785caffc8b4383Yang Chuang    /** Key code constant: Japanese Ro key. */
6207511f9cd2ff39075ff56c2558c785caffc8b4383Yang Chuang    public static final int KEYCODE_RO              = 217;
6217511f9cd2ff39075ff56c2558c785caffc8b4383Yang Chuang    /** Key code constant: Japanese kana key. */
6227511f9cd2ff39075ff56c2558c785caffc8b4383Yang Chuang    public static final int KEYCODE_KANA            = 218;
623de7a8ead2467a4a152a5a9b2416c8048f1b48bbbJeff Brown    /** Key code constant: Assist key.
624de7a8ead2467a4a152a5a9b2416c8048f1b48bbbJeff Brown     * Launches the global assist activity.  Not delivered to applications. */
625de7a8ead2467a4a152a5a9b2416c8048f1b48bbbJeff Brown    public static final int KEYCODE_ASSIST          = 219;
6261df477acf60538f9de18bd597e090d075fa83509Michael Wright    /** Key code constant: Brightness Down key.
6271df477acf60538f9de18bd597e090d075fa83509Michael Wright     * Adjusts the screen brightness down. */
6281df477acf60538f9de18bd597e090d075fa83509Michael Wright    public static final int KEYCODE_BRIGHTNESS_DOWN = 220;
6291df477acf60538f9de18bd597e090d075fa83509Michael Wright    /** Key code constant: Brightness Up key.
6301df477acf60538f9de18bd597e090d075fa83509Michael Wright     * Adjusts the screen brightness up. */
6311df477acf60538f9de18bd597e090d075fa83509Michael Wright    public static final int KEYCODE_BRIGHTNESS_UP   = 221;
6326212a49a9475768316a999596ffc4dd0f4ce96e5Jeff Brown    /** Key code constant: Audio Track key.
633bfdad8ecad06f855c8facf72177b0f01919ff629Jaekyun Seok     * Switches the audio tracks. */
634bfdad8ecad06f855c8facf72177b0f01919ff629Jaekyun Seok    public static final int KEYCODE_MEDIA_AUDIO_TRACK = 222;
6356212a49a9475768316a999596ffc4dd0f4ce96e5Jeff Brown    /** Key code constant: Sleep key.
6366212a49a9475768316a999596ffc4dd0f4ce96e5Jeff Brown     * Puts the device to sleep.  Behaves somewhat like {@link #KEYCODE_POWER} but it
6376212a49a9475768316a999596ffc4dd0f4ce96e5Jeff Brown     * has no effect if the device is already asleep. */
6386212a49a9475768316a999596ffc4dd0f4ce96e5Jeff Brown    public static final int KEYCODE_SLEEP           = 223;
6396212a49a9475768316a999596ffc4dd0f4ce96e5Jeff Brown    /** Key code constant: Wakeup key.
6406212a49a9475768316a999596ffc4dd0f4ce96e5Jeff Brown     * Wakes up the device.  Behaves somewhat like {@link #KEYCODE_POWER} but it
6416212a49a9475768316a999596ffc4dd0f4ce96e5Jeff Brown     * has no effect if the device is already awake. */
6426212a49a9475768316a999596ffc4dd0f4ce96e5Jeff Brown    public static final int KEYCODE_WAKEUP          = 224;
643497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
6446212a49a9475768316a999596ffc4dd0f4ce96e5Jeff Brown    private static final int LAST_KEYCODE = KEYCODE_WAKEUP;
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // NOTE: If you add a new keycode here you must also add it to:
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //  isSystem()
64861c37ae7cad456a6cc337b0a05aeb6b3091cf10eChirayu Desai    //  frameworks/native/include/android/keycodes.h
64961c37ae7cad456a6cc337b0a05aeb6b3091cf10eChirayu Desai    //  frameworks/base/include/androidfw/KeycodeLabels.h
650fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown    //  external/webkit/WebKit/android/plugins/ANPKeyCodes.h
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //  frameworks/base/core/res/res/values/attrs.xml
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //  emulator?
6536651a638348c15e89e265b0a53c775cac9beafa2Jeff Brown    //  LAST_KEYCODE
6546651a638348c15e89e265b0a53c775cac9beafa2Jeff Brown    //  KEYCODE_SYMBOLIC_NAMES
655935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn    //
656935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn    //  Also Android currently does not reserve code ranges for vendor-
657935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn    //  specific key codes.  If you have new key codes to have, you
658935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn    //  MUST contribute a patch to the open source project to define
659935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn    //  those new codes.  This is intended to maintain a consistent
660935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn    //  set of key code definitions across all Android devices.
661497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
6626f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    // Symbolic names of all key codes.
6636f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    private static final SparseArray<String> KEYCODE_SYMBOLIC_NAMES = new SparseArray<String>();
6646f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    private static void populateKeycodeSymbolicNames() {
6656f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        SparseArray<String> names = KEYCODE_SYMBOLIC_NAMES;
6666f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_UNKNOWN, "KEYCODE_UNKNOWN");
6676f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_SOFT_LEFT, "KEYCODE_SOFT_LEFT");
6686f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_SOFT_RIGHT, "KEYCODE_SOFT_RIGHT");
6696f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_HOME, "KEYCODE_HOME");
6706f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BACK, "KEYCODE_BACK");
6716f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_CALL, "KEYCODE_CALL");
6726f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_ENDCALL, "KEYCODE_ENDCALL");
6736f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_0, "KEYCODE_0");
6746f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_1, "KEYCODE_1");
6756f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_2, "KEYCODE_2");
6766f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_3, "KEYCODE_3");
6776f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_4, "KEYCODE_4");
6786f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_5, "KEYCODE_5");
6796f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_6, "KEYCODE_6");
6806f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_7, "KEYCODE_7");
6816f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_8, "KEYCODE_8");
6826f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_9, "KEYCODE_9");
6836f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_STAR, "KEYCODE_STAR");
6846f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_POUND, "KEYCODE_POUND");
6856f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_DPAD_UP, "KEYCODE_DPAD_UP");
6866f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_DPAD_DOWN, "KEYCODE_DPAD_DOWN");
6876f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_DPAD_LEFT, "KEYCODE_DPAD_LEFT");
6886f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_DPAD_RIGHT, "KEYCODE_DPAD_RIGHT");
6896f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_DPAD_CENTER, "KEYCODE_DPAD_CENTER");
6906f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_VOLUME_UP, "KEYCODE_VOLUME_UP");
6916f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_VOLUME_DOWN, "KEYCODE_VOLUME_DOWN");
6926f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_POWER, "KEYCODE_POWER");
6936f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_CAMERA, "KEYCODE_CAMERA");
6946f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_CLEAR, "KEYCODE_CLEAR");
6956f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_A, "KEYCODE_A");
6966f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_B, "KEYCODE_B");
6976f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_C, "KEYCODE_C");
6986f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_D, "KEYCODE_D");
6996f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_E, "KEYCODE_E");
7006f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_F, "KEYCODE_F");
7016f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_G, "KEYCODE_G");
7026f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_H, "KEYCODE_H");
7036f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_I, "KEYCODE_I");
7046f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_J, "KEYCODE_J");
7056f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_K, "KEYCODE_K");
7066f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_L, "KEYCODE_L");
7076f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_M, "KEYCODE_M");
7086f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_N, "KEYCODE_N");
7096f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_O, "KEYCODE_O");
7106f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_P, "KEYCODE_P");
7116f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_Q, "KEYCODE_Q");
7126f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_R, "KEYCODE_R");
7136f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_S, "KEYCODE_S");
7146f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_T, "KEYCODE_T");
7156f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_U, "KEYCODE_U");
7166f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_V, "KEYCODE_V");
7176f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_W, "KEYCODE_W");
7186f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_X, "KEYCODE_X");
7196f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_Y, "KEYCODE_Y");
7206f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_Z, "KEYCODE_Z");
7216f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_COMMA, "KEYCODE_COMMA");
7226f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_PERIOD, "KEYCODE_PERIOD");
7236f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_ALT_LEFT, "KEYCODE_ALT_LEFT");
7246f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_ALT_RIGHT, "KEYCODE_ALT_RIGHT");
7256f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_SHIFT_LEFT, "KEYCODE_SHIFT_LEFT");
7266f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_SHIFT_RIGHT, "KEYCODE_SHIFT_RIGHT");
7276f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_TAB, "KEYCODE_TAB");
7286f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_SPACE, "KEYCODE_SPACE");
7296f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_SYM, "KEYCODE_SYM");
7306f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_EXPLORER, "KEYCODE_EXPLORER");
7316f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_ENVELOPE, "KEYCODE_ENVELOPE");
7326f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_ENTER, "KEYCODE_ENTER");
7336f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_DEL, "KEYCODE_DEL");
7346f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_GRAVE, "KEYCODE_GRAVE");
7356f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_MINUS, "KEYCODE_MINUS");
7366f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_EQUALS, "KEYCODE_EQUALS");
7376f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_LEFT_BRACKET, "KEYCODE_LEFT_BRACKET");
7386f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_RIGHT_BRACKET, "KEYCODE_RIGHT_BRACKET");
7396f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BACKSLASH, "KEYCODE_BACKSLASH");
7406f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_SEMICOLON, "KEYCODE_SEMICOLON");
7416f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_APOSTROPHE, "KEYCODE_APOSTROPHE");
7426f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_SLASH, "KEYCODE_SLASH");
7436f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_AT, "KEYCODE_AT");
7446f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_NUM, "KEYCODE_NUM");
7456f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_HEADSETHOOK, "KEYCODE_HEADSETHOOK");
7466f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_FOCUS, "KEYCODE_FOCUS");
7476f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_PLUS, "KEYCODE_PLUS");
7486f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_MENU, "KEYCODE_MENU");
7496f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_NOTIFICATION, "KEYCODE_NOTIFICATION");
7506f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_SEARCH, "KEYCODE_SEARCH");
7516f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_MEDIA_PLAY_PAUSE, "KEYCODE_MEDIA_PLAY_PAUSE");
7526f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_MEDIA_STOP, "KEYCODE_MEDIA_STOP");
7536f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_MEDIA_NEXT, "KEYCODE_MEDIA_NEXT");
7546f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_MEDIA_PREVIOUS, "KEYCODE_MEDIA_PREVIOUS");
7556f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_MEDIA_REWIND, "KEYCODE_MEDIA_REWIND");
7566f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_MEDIA_FAST_FORWARD, "KEYCODE_MEDIA_FAST_FORWARD");
7576f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_MUTE, "KEYCODE_MUTE");
7586f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_PAGE_UP, "KEYCODE_PAGE_UP");
7596f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_PAGE_DOWN, "KEYCODE_PAGE_DOWN");
7606f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_PICTSYMBOLS, "KEYCODE_PICTSYMBOLS");
7616f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_SWITCH_CHARSET, "KEYCODE_SWITCH_CHARSET");
7626f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_A, "KEYCODE_BUTTON_A");
7636f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_B, "KEYCODE_BUTTON_B");
7646f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_C, "KEYCODE_BUTTON_C");
7656f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_X, "KEYCODE_BUTTON_X");
7666f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_Y, "KEYCODE_BUTTON_Y");
7676f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_Z, "KEYCODE_BUTTON_Z");
7686f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_L1, "KEYCODE_BUTTON_L1");
7696f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_R1, "KEYCODE_BUTTON_R1");
7706f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_L2, "KEYCODE_BUTTON_L2");
7716f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_R2, "KEYCODE_BUTTON_R2");
7726f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_THUMBL, "KEYCODE_BUTTON_THUMBL");
7736f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_THUMBR, "KEYCODE_BUTTON_THUMBR");
7746f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_START, "KEYCODE_BUTTON_START");
7756f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_SELECT, "KEYCODE_BUTTON_SELECT");
7766f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_MODE, "KEYCODE_BUTTON_MODE");
7776f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_ESCAPE, "KEYCODE_ESCAPE");
7786f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_FORWARD_DEL, "KEYCODE_FORWARD_DEL");
7796f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_CTRL_LEFT, "KEYCODE_CTRL_LEFT");
7806f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_CTRL_RIGHT, "KEYCODE_CTRL_RIGHT");
7816f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_CAPS_LOCK, "KEYCODE_CAPS_LOCK");
7826f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_SCROLL_LOCK, "KEYCODE_SCROLL_LOCK");
7836f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_META_LEFT, "KEYCODE_META_LEFT");
7846f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_META_RIGHT, "KEYCODE_META_RIGHT");
7856f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_FUNCTION, "KEYCODE_FUNCTION");
7866f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_SYSRQ, "KEYCODE_SYSRQ");
7876f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BREAK, "KEYCODE_BREAK");
7886f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_MOVE_HOME, "KEYCODE_MOVE_HOME");
7896f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_MOVE_END, "KEYCODE_MOVE_END");
7906f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_INSERT, "KEYCODE_INSERT");
7916f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_FORWARD, "KEYCODE_FORWARD");
7926f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_MEDIA_PLAY, "KEYCODE_MEDIA_PLAY");
7936f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_MEDIA_PAUSE, "KEYCODE_MEDIA_PAUSE");
7946f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_MEDIA_CLOSE, "KEYCODE_MEDIA_CLOSE");
7956f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_MEDIA_EJECT, "KEYCODE_MEDIA_EJECT");
7966f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_MEDIA_RECORD, "KEYCODE_MEDIA_RECORD");
7976f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_F1, "KEYCODE_F1");
7986f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_F2, "KEYCODE_F2");
7996f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_F3, "KEYCODE_F3");
8006f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_F4, "KEYCODE_F4");
8016f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_F5, "KEYCODE_F5");
8026f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_F6, "KEYCODE_F6");
8036f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_F7, "KEYCODE_F7");
8046f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_F8, "KEYCODE_F8");
8056f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_F9, "KEYCODE_F9");
8066f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_F10, "KEYCODE_F10");
8076f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_F11, "KEYCODE_F11");
8086f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_F12, "KEYCODE_F12");
8096f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_NUM_LOCK, "KEYCODE_NUM_LOCK");
8106f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_NUMPAD_0, "KEYCODE_NUMPAD_0");
8116f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_NUMPAD_1, "KEYCODE_NUMPAD_1");
8126f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_NUMPAD_2, "KEYCODE_NUMPAD_2");
8136f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_NUMPAD_3, "KEYCODE_NUMPAD_3");
8146f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_NUMPAD_4, "KEYCODE_NUMPAD_4");
8156f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_NUMPAD_5, "KEYCODE_NUMPAD_5");
8166f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_NUMPAD_6, "KEYCODE_NUMPAD_6");
8176f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_NUMPAD_7, "KEYCODE_NUMPAD_7");
8186f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_NUMPAD_8, "KEYCODE_NUMPAD_8");
8196f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_NUMPAD_9, "KEYCODE_NUMPAD_9");
8206f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_NUMPAD_DIVIDE, "KEYCODE_NUMPAD_DIVIDE");
8216f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_NUMPAD_MULTIPLY, "KEYCODE_NUMPAD_MULTIPLY");
8226f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_NUMPAD_SUBTRACT, "KEYCODE_NUMPAD_SUBTRACT");
8236f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_NUMPAD_ADD, "KEYCODE_NUMPAD_ADD");
8246f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_NUMPAD_DOT, "KEYCODE_NUMPAD_DOT");
8256f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_NUMPAD_COMMA, "KEYCODE_NUMPAD_COMMA");
8266f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_NUMPAD_ENTER, "KEYCODE_NUMPAD_ENTER");
8276f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_NUMPAD_EQUALS, "KEYCODE_NUMPAD_EQUALS");
8286f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_NUMPAD_LEFT_PAREN, "KEYCODE_NUMPAD_LEFT_PAREN");
8296f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_NUMPAD_RIGHT_PAREN, "KEYCODE_NUMPAD_RIGHT_PAREN");
8306f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_VOLUME_MUTE, "KEYCODE_VOLUME_MUTE");
8316f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_INFO, "KEYCODE_INFO");
8326f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_CHANNEL_UP, "KEYCODE_CHANNEL_UP");
8336f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_CHANNEL_DOWN, "KEYCODE_CHANNEL_DOWN");
8346f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_ZOOM_IN, "KEYCODE_ZOOM_IN");
8356f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_ZOOM_OUT, "KEYCODE_ZOOM_OUT");
8366f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_TV, "KEYCODE_TV");
8376f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_WINDOW, "KEYCODE_WINDOW");
8386f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_GUIDE, "KEYCODE_GUIDE");
8396f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_DVR, "KEYCODE_DVR");
8406f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BOOKMARK, "KEYCODE_BOOKMARK");
8416f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_CAPTIONS, "KEYCODE_CAPTIONS");
8426f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_SETTINGS, "KEYCODE_SETTINGS");
8436f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_TV_POWER, "KEYCODE_TV_POWER");
8446f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_TV_INPUT, "KEYCODE_TV_INPUT");
8456f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_STB_INPUT, "KEYCODE_STB_INPUT");
8466f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_STB_POWER, "KEYCODE_STB_POWER");
8476f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_AVR_POWER, "KEYCODE_AVR_POWER");
8486f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_AVR_INPUT, "KEYCODE_AVR_INPUT");
8496f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_PROG_RED, "KEYCODE_PROG_RED");
8506f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_PROG_GREEN, "KEYCODE_PROG_GREEN");
8516f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_PROG_YELLOW, "KEYCODE_PROG_YELLOW");
8526f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_PROG_BLUE, "KEYCODE_PROG_BLUE");
8536f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_APP_SWITCH, "KEYCODE_APP_SWITCH");
8546f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_1, "KEYCODE_BUTTON_1");
8556f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_2, "KEYCODE_BUTTON_2");
8566f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_3, "KEYCODE_BUTTON_3");
8576f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_4, "KEYCODE_BUTTON_4");
8586f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_5, "KEYCODE_BUTTON_5");
8596f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_6, "KEYCODE_BUTTON_6");
8606f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_7, "KEYCODE_BUTTON_7");
8616f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_8, "KEYCODE_BUTTON_8");
8626f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_9, "KEYCODE_BUTTON_9");
8636f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_10, "KEYCODE_BUTTON_10");
8646f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_11, "KEYCODE_BUTTON_11");
8656f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_12, "KEYCODE_BUTTON_12");
8666f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_13, "KEYCODE_BUTTON_13");
8676f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_14, "KEYCODE_BUTTON_14");
8686f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_15, "KEYCODE_BUTTON_15");
8696f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_16, "KEYCODE_BUTTON_16");
8709812aed2765c671e6c3f5255ac1b8a2fe0e72ef6Jeff Brown        names.append(KEYCODE_LANGUAGE_SWITCH, "KEYCODE_LANGUAGE_SWITCH");
8719812aed2765c671e6c3f5255ac1b8a2fe0e72ef6Jeff Brown        names.append(KEYCODE_MANNER_MODE, "KEYCODE_MANNER_MODE");
8729812aed2765c671e6c3f5255ac1b8a2fe0e72ef6Jeff Brown        names.append(KEYCODE_3D_MODE, "KEYCODE_3D_MODE");
8736651a638348c15e89e265b0a53c775cac9beafa2Jeff Brown        names.append(KEYCODE_CONTACTS, "KEYCODE_CONTACTS");
8746651a638348c15e89e265b0a53c775cac9beafa2Jeff Brown        names.append(KEYCODE_CALENDAR, "KEYCODE_CALENDAR");
8756651a638348c15e89e265b0a53c775cac9beafa2Jeff Brown        names.append(KEYCODE_MUSIC, "KEYCODE_MUSIC");
8766651a638348c15e89e265b0a53c775cac9beafa2Jeff Brown        names.append(KEYCODE_CALCULATOR, "KEYCODE_CALCULATOR");
8777511f9cd2ff39075ff56c2558c785caffc8b4383Yang Chuang        names.append(KEYCODE_ZENKAKU_HANKAKU, "KEYCODE_ZENKAKU_HANKAKU");
8787511f9cd2ff39075ff56c2558c785caffc8b4383Yang Chuang        names.append(KEYCODE_EISU, "KEYCODE_EISU");
8797511f9cd2ff39075ff56c2558c785caffc8b4383Yang Chuang        names.append(KEYCODE_MUHENKAN, "KEYCODE_MUHENKAN");
8807511f9cd2ff39075ff56c2558c785caffc8b4383Yang Chuang        names.append(KEYCODE_HENKAN, "KEYCODE_HENKAN");
8817511f9cd2ff39075ff56c2558c785caffc8b4383Yang Chuang        names.append(KEYCODE_KATAKANA_HIRAGANA, "KEYCODE_KATAKANA_HIRAGANA");
8827511f9cd2ff39075ff56c2558c785caffc8b4383Yang Chuang        names.append(KEYCODE_YEN, "KEYCODE_YEN");
8837511f9cd2ff39075ff56c2558c785caffc8b4383Yang Chuang        names.append(KEYCODE_RO, "KEYCODE_RO");
8847511f9cd2ff39075ff56c2558c785caffc8b4383Yang Chuang        names.append(KEYCODE_KANA, "KEYCODE_KANA");
885de7a8ead2467a4a152a5a9b2416c8048f1b48bbbJeff Brown        names.append(KEYCODE_ASSIST, "KEYCODE_ASSIST");
8861df477acf60538f9de18bd597e090d075fa83509Michael Wright        names.append(KEYCODE_BRIGHTNESS_DOWN, "KEYCODE_BRIGHTNESS_DOWN");
8871df477acf60538f9de18bd597e090d075fa83509Michael Wright        names.append(KEYCODE_BRIGHTNESS_UP, "KEYCODE_BRIGHTNESS_UP");
888bfdad8ecad06f855c8facf72177b0f01919ff629Jaekyun Seok        names.append(KEYCODE_MEDIA_AUDIO_TRACK, "KEYCODE_MEDIA_AUDIO_TRACK");
8896212a49a9475768316a999596ffc4dd0f4ce96e5Jeff Brown        names.append(KEYCODE_SLEEP, "KEYCODE_SLEEP");
8906212a49a9475768316a999596ffc4dd0f4ce96e5Jeff Brown        names.append(KEYCODE_WAKEUP, "KEYCODE_WAKEUP");
891497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    };
892497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
893497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    // Symbolic names of all metakeys in bit order from least significant to most significant.
894497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    // Accordingly there are exactly 32 values in this table.
895497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    private static final String[] META_SYMBOLIC_NAMES = new String[] {
896497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "META_SHIFT_ON",
897497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "META_ALT_ON",
898497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "META_SYM_ON",
899497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "META_FUNCTION_ON",
900497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "META_ALT_LEFT_ON",
901497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "META_ALT_RIGHT_ON",
902497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "META_SHIFT_LEFT_ON",
903497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "META_SHIFT_RIGHT_ON",
904497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "META_CAP_LOCKED",
905497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "META_ALT_LOCKED",
906497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "META_SYM_LOCKED",
907497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "0x00000800",
908497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "META_CTRL_ON",
909497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "META_CTRL_LEFT_ON",
910497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "META_CTRL_RIGHT_ON",
911497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "0x00008000",
912497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "META_META_ON",
913497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "META_META_LEFT_ON",
914497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "META_META_RIGHT_ON",
915497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "0x00080000",
91651e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown        "META_CAPS_LOCK_ON",
91751e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown        "META_NUM_LOCK_ON",
91851e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown        "META_SCROLL_LOCK_ON",
919497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "0x00800000",
920497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "0x01000000",
921497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "0x02000000",
922497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "0x04000000",
923497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "0x08000000",
924497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "0x10000000",
925497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "0x20000000",
926497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "0x40000000",
927497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "0x80000000",
928497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    };
929497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @deprecated There are now more than MAX_KEYCODE keycodes.
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use {@link #getMaxKeyCode()} instead.
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Deprecated
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int MAX_KEYCODE             = 84;
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getAction} value: the key has been pressed down.
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ACTION_DOWN             = 0;
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getAction} value: the key has been released.
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ACTION_UP               = 1;
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getAction} value: multiple duplicate key events have
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * occurred in a row, or a complex string is being delivered.  If the
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * key code is not {#link {@link #KEYCODE_UNKNOWN} then the
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {#link {@link #getRepeatCount()} method returns the number of times
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the given key code should be executed.
95146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown     * Otherwise, if the key code is {@link #KEYCODE_UNKNOWN}, then
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this is a sequence of characters as returned by {@link #getCharacters}.
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ACTION_MULTIPLE         = 2;
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
957497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * SHIFT key locked in CAPS mode.
958497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * Reserved for use by {@link MetaKeyKeyListener} for a published constant in its API.
959497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @hide
960497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     */
961497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int META_CAP_LOCKED = 0x100;
962497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
963497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /**
964497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * ALT key locked.
965497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * Reserved for use by {@link MetaKeyKeyListener} for a published constant in its API.
966497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @hide
967497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     */
968497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int META_ALT_LOCKED = 0x200;
969497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
970497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /**
971497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * SYM key locked.
972497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * Reserved for use by {@link MetaKeyKeyListener} for a published constant in its API.
973497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @hide
974497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     */
975497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int META_SYM_LOCKED = 0x400;
976497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
977497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /**
978497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * Text is in selection mode.
979497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * Reserved for use by {@link MetaKeyKeyListener} for a private unpublished constant
980497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * in its API that is currently being retained for legacy reasons.
981497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @hide
982497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     */
983497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int META_SELECTING = 0x800;
984497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
985497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /**
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This mask is used to check whether one of the ALT meta keys is pressed.</p>
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isAltPressed()
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getMetaState()
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_ALT_LEFT
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_ALT_RIGHT
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int META_ALT_ON = 0x02;
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This mask is used to check whether the left ALT meta key is pressed.</p>
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isAltPressed()
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getMetaState()
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_ALT_LEFT
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int META_ALT_LEFT_ON = 0x10;
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This mask is used to check whether the right the ALT meta key is pressed.</p>
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isAltPressed()
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getMetaState()
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_ALT_RIGHT
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int META_ALT_RIGHT_ON = 0x20;
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This mask is used to check whether one of the SHIFT meta keys is pressed.</p>
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isShiftPressed()
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getMetaState()
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_SHIFT_LEFT
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_SHIFT_RIGHT
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int META_SHIFT_ON = 0x1;
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This mask is used to check whether the left SHIFT meta key is pressed.</p>
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isShiftPressed()
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getMetaState()
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_SHIFT_LEFT
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int META_SHIFT_LEFT_ON = 0x40;
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This mask is used to check whether the right SHIFT meta key is pressed.</p>
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isShiftPressed()
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getMetaState()
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_SHIFT_RIGHT
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int META_SHIFT_RIGHT_ON = 0x80;
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This mask is used to check whether the SYM meta key is pressed.</p>
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isSymPressed()
10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getMetaState()
10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int META_SYM_ON = 0x4;
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1050497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * <p>This mask is used to check whether the FUNCTION meta key is pressed.</p>
1051497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
1052497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #isFunctionPressed()
1053497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #getMetaState()
1054497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     */
1055497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int META_FUNCTION_ON = 0x8;
1056497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
1057497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /**
1058497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * <p>This mask is used to check whether one of the CTRL meta keys is pressed.</p>
1059497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
1060497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #isCtrlPressed()
1061497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #getMetaState()
1062497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #KEYCODE_CTRL_LEFT
1063497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #KEYCODE_CTRL_RIGHT
1064497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     */
1065497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int META_CTRL_ON = 0x1000;
1066497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
1067497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /**
1068497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * <p>This mask is used to check whether the left CTRL meta key is pressed.</p>
1069497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
1070497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #isCtrlPressed()
1071497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #getMetaState()
1072497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #KEYCODE_CTRL_LEFT
1073497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     */
1074497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int META_CTRL_LEFT_ON = 0x2000;
1075497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
1076497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /**
1077497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * <p>This mask is used to check whether the right CTRL meta key is pressed.</p>
1078497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
1079497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #isCtrlPressed()
1080497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #getMetaState()
1081497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #KEYCODE_CTRL_RIGHT
1082497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     */
1083497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int META_CTRL_RIGHT_ON = 0x4000;
1084497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
1085497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /**
1086497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * <p>This mask is used to check whether one of the META meta keys is pressed.</p>
1087497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
1088497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #isMetaPressed()
1089497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #getMetaState()
1090497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #KEYCODE_META_LEFT
1091497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #KEYCODE_META_RIGHT
1092497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     */
1093497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int META_META_ON = 0x10000;
1094497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
1095497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /**
1096497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * <p>This mask is used to check whether the left META meta key is pressed.</p>
1097497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
1098497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #isMetaPressed()
1099497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #getMetaState()
1100497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #KEYCODE_META_LEFT
1101497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     */
1102497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int META_META_LEFT_ON = 0x20000;
1103497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
1104497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /**
1105497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * <p>This mask is used to check whether the right META meta key is pressed.</p>
1106497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
1107497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #isMetaPressed()
1108497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #getMetaState()
1109497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #KEYCODE_META_RIGHT
1110497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     */
1111497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int META_META_RIGHT_ON = 0x40000;
1112497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
1113497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /**
111451e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown     * <p>This mask is used to check whether the CAPS LOCK meta key is on.</p>
1115497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
111651e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown     * @see #isCapsLockOn()
1117497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #getMetaState()
1118497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #KEYCODE_CAPS_LOCK
1119497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     */
112051e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    public static final int META_CAPS_LOCK_ON = 0x100000;
1121497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
1122497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /**
112351e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown     * <p>This mask is used to check whether the NUM LOCK meta key is on.</p>
1124497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
112551e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown     * @see #isNumLockOn()
1126497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #getMetaState()
1127497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #KEYCODE_NUM_LOCK
1128497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     */
112951e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    public static final int META_NUM_LOCK_ON = 0x200000;
1130497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
1131497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /**
113251e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown     * <p>This mask is used to check whether the SCROLL LOCK meta key is on.</p>
1133497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
113451e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown     * @see #isScrollLockOn()
1135497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #getMetaState()
1136497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #KEYCODE_SCROLL_LOCK
1137497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     */
113851e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    public static final int META_SCROLL_LOCK_ON = 0x400000;
1139497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
114064da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown    /**
114164da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     * This mask is a combination of {@link #META_SHIFT_ON}, {@link #META_SHIFT_LEFT_ON}
114264da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     * and {@link #META_SHIFT_RIGHT_ON}.
114364da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     */
1144c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown    public static final int META_SHIFT_MASK = META_SHIFT_ON
1145c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown            | META_SHIFT_LEFT_ON | META_SHIFT_RIGHT_ON;
1146c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown
114764da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown    /**
114864da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     * This mask is a combination of {@link #META_ALT_ON}, {@link #META_ALT_LEFT_ON}
114964da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     * and {@link #META_ALT_RIGHT_ON}.
115064da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     */
1151c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown    public static final int META_ALT_MASK = META_ALT_ON
1152c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown            | META_ALT_LEFT_ON | META_ALT_RIGHT_ON;
1153c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown
115464da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown    /**
115564da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     * This mask is a combination of {@link #META_CTRL_ON}, {@link #META_CTRL_LEFT_ON}
115664da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     * and {@link #META_CTRL_RIGHT_ON}.
115764da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     */
1158c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown    public static final int META_CTRL_MASK = META_CTRL_ON
1159c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown            | META_CTRL_LEFT_ON | META_CTRL_RIGHT_ON;
1160c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown
116164da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown    /**
116264da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     * This mask is a combination of {@link #META_META_ON}, {@link #META_META_LEFT_ON}
116364da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     * and {@link #META_META_RIGHT_ON}.
116464da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     */
116564da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown    public static final int META_META_MASK = META_META_ON
1166c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown            | META_META_LEFT_ON | META_META_RIGHT_ON;
1167c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown
1168497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /**
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This mask is set if the device woke because of this key event.
1170037c33eae74bee2774897d969d48947f9abe254fJeff Brown     *
1171037c33eae74bee2774897d969d48947f9abe254fJeff Brown     * @deprecated This flag will never be set by the system since the system
1172037c33eae74bee2774897d969d48947f9abe254fJeff Brown     * consumes all wake keys itself.
11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1174037c33eae74bee2774897d969d48947f9abe254fJeff Brown    @Deprecated
11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FLAG_WOKE_HERE = 0x1;
1176037c33eae74bee2774897d969d48947f9abe254fJeff Brown
11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This mask is set if the key event was generated by a software keyboard.
11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FLAG_SOFT_KEYBOARD = 0x2;
11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This mask is set if we don't want the key event to cause us to leave
11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * touch mode.
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FLAG_KEEP_TOUCH_MODE = 0x4;
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1189105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * This mask is set if an event was known to come from a trusted part
1190105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * of the system.  That is, the event is known to come from the user,
1191105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * and could not have been spoofed by a third party component.
1192105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
1193105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public static final int FLAG_FROM_SYSTEM = 0x8;
1194105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1195105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
1196105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * This mask is used for compatibility, to identify enter keys that are
1197105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * coming from an IME whose enter key has been auto-labelled "next" or
1198105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * "done".  This allows TextView to dispatch these as normal enter keys
1199105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * for old applications, but still do the appropriate action when
1200105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * receiving them.
1201105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
1202105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public static final int FLAG_EDITOR_ACTION = 0x10;
1203105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1204105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
1205ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * When associated with up key events, this indicates that the key press
1206ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * has been canceled.  Typically this is used with virtual touch screen
1207ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * keys, where the user can slide from the virtual key area on to the
1208ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * display: in that case, the application will receive a canceled up
1209ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * event and should not perform the action normally associated with the
1210ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * key.  Note that for this to work, the application can not perform an
1211ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * action for a key until it receives an up or the long press timeout has
1212ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * expired.
1213ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     */
1214ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn    public static final int FLAG_CANCELED = 0x20;
1215ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn
1216ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn    /**
1217ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * This key event was generated by a virtual (on-screen) hard key area.
1218ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * Typically this is an area of the touchscreen, outside of the regular
1219ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * display, dedicated to "hardware" buttons.
1220ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     */
1221ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn    public static final int FLAG_VIRTUAL_HARD_KEY = 0x40;
1222ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn
1223ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn    /**
122483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * This flag is set for the first key repeat that occurs after the
122583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * long press timeout.
122683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     */
122783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public static final int FLAG_LONG_PRESS = 0x80;
122883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
122983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    /**
123083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * Set when a key event has {@link #FLAG_CANCELED} set because a long
123183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * press action was executed while it was down.
123283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     */
123383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public static final int FLAG_CANCELED_LONG_PRESS = 0x100;
123483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
123583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    /**
123683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * Set for {@link #ACTION_UP} when this event's key code is still being
123783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * tracked from its initial down.  That is, somebody requested that tracking
123883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * started on the key down and a long press has not caused
123983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * the tracking to be canceled.
124083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     */
124183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public static final int FLAG_TRACKING = 0x200;
124249ed71db425c5054e3ad9526496a7e116c89556bJeff Brown
124349ed71db425c5054e3ad9526496a7e116c89556bJeff Brown    /**
124449ed71db425c5054e3ad9526496a7e116c89556bJeff Brown     * Set when a key event has been synthesized to implement default behavior
124549ed71db425c5054e3ad9526496a7e116c89556bJeff Brown     * for an event that the application did not handle.
124649ed71db425c5054e3ad9526496a7e116c89556bJeff Brown     * Fallback key events are generated by unhandled trackball motions
124749ed71db425c5054e3ad9526496a7e116c89556bJeff Brown     * (to emulate a directional keypad) and by certain unhandled key presses
124849ed71db425c5054e3ad9526496a7e116c89556bJeff Brown     * that are declared in the key map (such as special function numeric keypad
124949ed71db425c5054e3ad9526496a7e116c89556bJeff Brown     * keys when numlock is off).
125049ed71db425c5054e3ad9526496a7e116c89556bJeff Brown     */
125149ed71db425c5054e3ad9526496a7e116c89556bJeff Brown    public static final int FLAG_FALLBACK = 0x400;
125249ed71db425c5054e3ad9526496a7e116c89556bJeff Brown
125383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    /**
1254a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright     * Signifies that the key is being predispatched.
1255a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright     * @hide
1256a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright     */
1257a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright    public static final int FLAG_PREDISPATCH = 0x20000000;
1258a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright
1259a44dd26a75e24cc021802288fb81f4761e47be6bMichael Wright    /**
126083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * Private control to determine when an app is tracking a key sequence.
126183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * @hide
126283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     */
126383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public static final int FLAG_START_TRACKING = 0x40000000;
126421bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown
126521bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    /**
126621bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown     * Private flag that indicates when the system has detected that this key event
126721bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown     * may be inconsistent with respect to the sequence of previously delivered key events,
126821bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown     * such as when a key up event is sent but the key was not down.
126921bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown     *
127021bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown     * @hide
127121bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown     * @see #isTainted
127221bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown     * @see #setTainted
127321bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown     */
127421bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    public static final int FLAG_TAINTED = 0x80000000;
127521bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown
127683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    /**
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the maximum keycode.
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static int getMaxKeyCode() {
12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return LAST_KEYCODE;
12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Get the character that is produced by putting accent on the character
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * c.
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * For example, getDeadChar('`', 'e') returns &egrave;.
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static int getDeadChar(int accent, int c) {
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return KeyCharacterMap.getDeadChar(accent, c);
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12928d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn    static final boolean DEBUG = false;
12938d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn    static final String TAG = "KeyEvent";
12941f2451007c660091b7b090c1ea332f9044515d2dJeff Brown
12951f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    private static final int MAX_RECYCLED = 10;
12961f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    private static final Object gRecyclerLock = new Object();
12971f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    private static int gRecyclerUsed;
12981f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    private static KeyEvent gRecyclerTop;
12991f2451007c660091b7b090c1ea332f9044515d2dJeff Brown
13001f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    private KeyEvent mNext;
13011f2451007c660091b7b090c1ea332f9044515d2dJeff Brown
130291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    private int mDeviceId;
130391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    private int mSource;
13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mMetaState;
13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mAction;
13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mKeyCode;
130746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    private int mScanCode;
13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mRepeatCount;
13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mFlags;
13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private long mDownTime;
13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private long mEventTime;
13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String mCharacters;
13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public interface Callback {
13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
131683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * Called when a key down event has occurred.  If you return true,
131783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * you can first call {@link KeyEvent#startTracking()
131883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * KeyEvent.startTracking()} to have the framework track the event
131983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * through its {@link #onKeyUp(int, KeyEvent)} and also call your
132083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * {@link #onKeyLongPress(int, KeyEvent)} if it occurs.
13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param keyCode The value in event.getKeyCode().
13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param event Description of the key event.
13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return If you handled the event, return true.  If you want to allow
13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *         the event to be handled by the next receiver, return false.
13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean onKeyDown(int keyCode, KeyEvent event);
13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
133183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * Called when a long press has occurred.  If you return true,
133283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * the final key up will have {@link KeyEvent#FLAG_CANCELED} and
133383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * {@link KeyEvent#FLAG_CANCELED_LONG_PRESS} set.  Note that in
133483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * order to receive this callback, someone in the event change
133583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * <em>must</em> return true from {@link #onKeyDown} <em>and</em>
133683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * call {@link KeyEvent#startTracking()} on the event.
133783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         *
133883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * @param keyCode The value in event.getKeyCode().
133983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * @param event Description of the key event.
134083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         *
134183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * @return If you handled the event, return true.  If you want to allow
134283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         *         the event to be handled by the next receiver, return false.
134383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         */
134483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        boolean onKeyLongPress(int keyCode, KeyEvent event);
134583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
134683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        /**
13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Called when a key up event has occurred.
13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param keyCode The value in event.getKeyCode().
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param event Description of the key event.
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return If you handled the event, return true.  If you want to allow
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *         the event to be handled by the next receiver, return false.
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean onKeyUp(int keyCode, KeyEvent event);
13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Called when multiple down/up pairs of the same key have occurred
13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * in a row.
13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param keyCode The value in event.getKeyCode().
13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param count Number of pairs as returned by event.getRepeatCount().
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param event Description of the key event.
13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return If you handled the event, return true.  If you want to allow
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *         the event to be handled by the next receiver, return false.
13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean onKeyMultiple(int keyCode, int count, KeyEvent event);
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1371497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    static {
13726f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        populateKeycodeSymbolicNames();
1373497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    }
1374497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
13751f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    private KeyEvent() {
13761f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    }
13771f2451007c660091b7b090c1ea332f9044515d2dJeff Brown
13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new key event.
13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param action Action code: either {@link #ACTION_DOWN},
13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.
13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param code The key code.
13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public KeyEvent(int action, int code) {
13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAction = action;
13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mKeyCode = code;
13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRepeatCount = 0;
13896b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        mDeviceId = KeyCharacterMap.VIRTUAL_KEYBOARD;
13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new key event.
13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param downTime The time (in {@link android.os.SystemClock#uptimeMillis})
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * at which this key code originally went down.
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param eventTime The time (in {@link android.os.SystemClock#uptimeMillis})
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * at which this event happened.
13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param action Action code: either {@link #ACTION_DOWN},
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.
14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param code The key code.
14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param repeat A repeat count for down events (> 0 if this is after the
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * initial down) or event count for multiple events.
14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public KeyEvent(long downTime, long eventTime, int action,
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int code, int repeat) {
14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDownTime = downTime;
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mEventTime = eventTime;
14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAction = action;
14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mKeyCode = code;
14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRepeatCount = repeat;
14126b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        mDeviceId = KeyCharacterMap.VIRTUAL_KEYBOARD;
14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new key event.
14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param downTime The time (in {@link android.os.SystemClock#uptimeMillis})
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * at which this key code originally went down.
14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param eventTime The time (in {@link android.os.SystemClock#uptimeMillis})
14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * at which this event happened.
14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param action Action code: either {@link #ACTION_DOWN},
14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.
14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param code The key code.
14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param repeat A repeat count for down events (> 0 if this is after the
14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * initial down) or event count for multiple events.
14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param metaState Flags indicating which meta keys are currently pressed.
14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public KeyEvent(long downTime, long eventTime, int action,
14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int code, int repeat, int metaState) {
14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDownTime = downTime;
14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mEventTime = eventTime;
14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAction = action;
14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mKeyCode = code;
14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRepeatCount = repeat;
14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMetaState = metaState;
14376b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        mDeviceId = KeyCharacterMap.VIRTUAL_KEYBOARD;
14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new key event.
14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param downTime The time (in {@link android.os.SystemClock#uptimeMillis})
14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * at which this key code originally went down.
14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param eventTime The time (in {@link android.os.SystemClock#uptimeMillis})
14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * at which this event happened.
14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param action Action code: either {@link #ACTION_DOWN},
14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.
14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param code The key code.
14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param repeat A repeat count for down events (> 0 if this is after the
14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * initial down) or event count for multiple events.
14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param metaState Flags indicating which meta keys are currently pressed.
1453c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param deviceId The device ID that generated the key event.
14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param scancode Raw device scan code of the event.
14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public KeyEvent(long downTime, long eventTime, int action,
14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int code, int repeat, int metaState,
1458c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown                    int deviceId, int scancode) {
14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDownTime = downTime;
14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mEventTime = eventTime;
14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAction = action;
14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mKeyCode = code;
14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRepeatCount = repeat;
14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMetaState = metaState;
1465c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mDeviceId = deviceId;
146646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        mScanCode = scancode;
14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new key event.
14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param downTime The time (in {@link android.os.SystemClock#uptimeMillis})
14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * at which this key code originally went down.
14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param eventTime The time (in {@link android.os.SystemClock#uptimeMillis})
14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * at which this event happened.
14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param action Action code: either {@link #ACTION_DOWN},
14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.
14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param code The key code.
14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param repeat A repeat count for down events (> 0 if this is after the
14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * initial down) or event count for multiple events.
14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param metaState Flags indicating which meta keys are currently pressed.
1482c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param deviceId The device ID that generated the key event.
14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param scancode Raw device scan code of the event.
14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param flags The flags for this key event
14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public KeyEvent(long downTime, long eventTime, int action,
14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int code, int repeat, int metaState,
1488c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown                    int deviceId, int scancode, int flags) {
14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDownTime = downTime;
14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mEventTime = eventTime;
14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAction = action;
14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mKeyCode = code;
14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRepeatCount = repeat;
14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMetaState = metaState;
1495c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mDeviceId = deviceId;
149646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        mScanCode = scancode;
14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFlags = flags;
14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1501c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Create a new key event.
1502c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
1503c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param downTime The time (in {@link android.os.SystemClock#uptimeMillis})
1504c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * at which this key code originally went down.
1505c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param eventTime The time (in {@link android.os.SystemClock#uptimeMillis})
1506c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * at which this event happened.
1507c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param action Action code: either {@link #ACTION_DOWN},
1508c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.
1509c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param code The key code.
1510c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param repeat A repeat count for down events (> 0 if this is after the
1511c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * initial down) or event count for multiple events.
1512c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param metaState Flags indicating which meta keys are currently pressed.
1513c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param deviceId The device ID that generated the key event.
1514c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param scancode Raw device scan code of the event.
1515c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param flags The flags for this key event
1516c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param source The input source such as {@link InputDevice#SOURCE_KEYBOARD}.
1517c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
1518c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public KeyEvent(long downTime, long eventTime, int action,
1519c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown                    int code, int repeat, int metaState,
1520c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown                    int deviceId, int scancode, int flags, int source) {
1521c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mDownTime = downTime;
1522c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mEventTime = eventTime;
1523c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mAction = action;
1524c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mKeyCode = code;
1525c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mRepeatCount = repeat;
1526c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mMetaState = metaState;
1527c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mDeviceId = deviceId;
1528c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mScanCode = scancode;
1529c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mFlags = flags;
1530c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mSource = source;
1531c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
1532c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
1533c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new key event for a string of characters.  The key code,
1535c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * action, repeat count and source will automatically be set to
1536c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * {@link #KEYCODE_UNKNOWN}, {@link #ACTION_MULTIPLE}, 0, and
1537c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * {@link InputDevice#SOURCE_KEYBOARD} for you.
15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param time The time (in {@link android.os.SystemClock#uptimeMillis})
15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * at which this event occured.
15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param characters The string of characters.
1542c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param deviceId The device ID that generated the key event.
15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param flags The flags for this key event
15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1545c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public KeyEvent(long time, String characters, int deviceId, int flags) {
15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDownTime = time;
15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mEventTime = time;
15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCharacters = characters;
15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAction = ACTION_MULTIPLE;
15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mKeyCode = KEYCODE_UNKNOWN;
15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRepeatCount = 0;
1552c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mDeviceId = deviceId;
15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFlags = flags;
1554c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mSource = InputDevice.SOURCE_KEYBOARD;
15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1558105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * Make an exact copy of an existing key event.
1559105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
1560105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public KeyEvent(KeyEvent origEvent) {
1561105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mDownTime = origEvent.mDownTime;
1562105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mEventTime = origEvent.mEventTime;
1563105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mAction = origEvent.mAction;
1564105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mKeyCode = origEvent.mKeyCode;
1565105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mRepeatCount = origEvent.mRepeatCount;
1566105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mMetaState = origEvent.mMetaState;
1567105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mDeviceId = origEvent.mDeviceId;
1568c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mSource = origEvent.mSource;
156946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        mScanCode = origEvent.mScanCode;
1570105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mFlags = origEvent.mFlags;
1571105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mCharacters = origEvent.mCharacters;
1572105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1573105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1574105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Copy an existing key event, modifying its time and repeat count.
15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
157783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * @deprecated Use {@link #changeTimeRepeat(KeyEvent, long, int)}
157883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * instead.
157983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     *
15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param origEvent The existing event to be copied.
15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param eventTime The new event time
15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * (in {@link android.os.SystemClock#uptimeMillis}) of the event.
15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param newRepeat The new repeat count of the event.
15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
158583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    @Deprecated
15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public KeyEvent(KeyEvent origEvent, long eventTime, int newRepeat) {
15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDownTime = origEvent.mDownTime;
15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mEventTime = eventTime;
15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAction = origEvent.mAction;
15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mKeyCode = origEvent.mKeyCode;
15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRepeatCount = newRepeat;
15929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMetaState = origEvent.mMetaState;
15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDeviceId = origEvent.mDeviceId;
1594c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mSource = origEvent.mSource;
159546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        mScanCode = origEvent.mScanCode;
15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFlags = origEvent.mFlags;
15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCharacters = origEvent.mCharacters;
15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16001f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    private static KeyEvent obtain() {
16011f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        final KeyEvent ev;
16021f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        synchronized (gRecyclerLock) {
16031f2451007c660091b7b090c1ea332f9044515d2dJeff Brown            ev = gRecyclerTop;
16041f2451007c660091b7b090c1ea332f9044515d2dJeff Brown            if (ev == null) {
16051f2451007c660091b7b090c1ea332f9044515d2dJeff Brown                return new KeyEvent();
16061f2451007c660091b7b090c1ea332f9044515d2dJeff Brown            }
16071f2451007c660091b7b090c1ea332f9044515d2dJeff Brown            gRecyclerTop = ev.mNext;
16081f2451007c660091b7b090c1ea332f9044515d2dJeff Brown            gRecyclerUsed -= 1;
16091f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        }
16101f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        ev.mNext = null;
161132cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown        ev.prepareForReuse();
16121f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        return ev;
16131f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    }
16141f2451007c660091b7b090c1ea332f9044515d2dJeff Brown
16151f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    /**
16161f2451007c660091b7b090c1ea332f9044515d2dJeff Brown     * Obtains a (potentially recycled) key event.
16171f2451007c660091b7b090c1ea332f9044515d2dJeff Brown     *
16181f2451007c660091b7b090c1ea332f9044515d2dJeff Brown     * @hide
16191f2451007c660091b7b090c1ea332f9044515d2dJeff Brown     */
16201f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    public static KeyEvent obtain(long downTime, long eventTime, int action,
16211f2451007c660091b7b090c1ea332f9044515d2dJeff Brown                    int code, int repeat, int metaState,
16221f2451007c660091b7b090c1ea332f9044515d2dJeff Brown                    int deviceId, int scancode, int flags, int source, String characters) {
16231f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        KeyEvent ev = obtain();
16241f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        ev.mDownTime = downTime;
16251f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        ev.mEventTime = eventTime;
16261f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        ev.mAction = action;
16271f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        ev.mKeyCode = code;
16281f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        ev.mRepeatCount = repeat;
16291f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        ev.mMetaState = metaState;
16301f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        ev.mDeviceId = deviceId;
16311f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        ev.mScanCode = scancode;
16321f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        ev.mFlags = flags;
16331f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        ev.mSource = source;
16341f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        ev.mCharacters = characters;
16351f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        return ev;
16361f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    }
16371f2451007c660091b7b090c1ea332f9044515d2dJeff Brown
16381f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    /**
163921bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown     * Obtains a (potentially recycled) copy of another key event.
164021bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown     *
164121bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown     * @hide
164221bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown     */
164321bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    public static KeyEvent obtain(KeyEvent other) {
164421bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        KeyEvent ev = obtain();
164521bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        ev.mDownTime = other.mDownTime;
164621bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        ev.mEventTime = other.mEventTime;
164721bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        ev.mAction = other.mAction;
164821bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        ev.mKeyCode = other.mKeyCode;
164921bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        ev.mRepeatCount = other.mRepeatCount;
165021bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        ev.mMetaState = other.mMetaState;
165121bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        ev.mDeviceId = other.mDeviceId;
165221bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        ev.mScanCode = other.mScanCode;
165321bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        ev.mFlags = other.mFlags;
165421bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        ev.mSource = other.mSource;
165521bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        ev.mCharacters = other.mCharacters;
165621bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        return ev;
165721bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    }
165821bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown
165921bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    /** @hide */
166021bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    @Override
166121bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    public KeyEvent copy() {
166221bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        return obtain(this);
166321bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    }
166421bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown
166521bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    /**
16661f2451007c660091b7b090c1ea332f9044515d2dJeff Brown     * Recycles a key event.
16671f2451007c660091b7b090c1ea332f9044515d2dJeff Brown     * Key events should only be recycled if they are owned by the system since user
16681f2451007c660091b7b090c1ea332f9044515d2dJeff Brown     * code expects them to be essentially immutable, "tracking" notwithstanding.
16691f2451007c660091b7b090c1ea332f9044515d2dJeff Brown     *
16701f2451007c660091b7b090c1ea332f9044515d2dJeff Brown     * @hide
16711f2451007c660091b7b090c1ea332f9044515d2dJeff Brown     */
167292cc2d8dc35f2bdd1bb95ab24787066371064899Jeff Brown    @Override
16731f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    public final void recycle() {
167432cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown        super.recycle();
16751f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        mCharacters = null;
16761f2451007c660091b7b090c1ea332f9044515d2dJeff Brown
16771f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        synchronized (gRecyclerLock) {
16781f2451007c660091b7b090c1ea332f9044515d2dJeff Brown            if (gRecyclerUsed < MAX_RECYCLED) {
16791f2451007c660091b7b090c1ea332f9044515d2dJeff Brown                gRecyclerUsed++;
16801f2451007c660091b7b090c1ea332f9044515d2dJeff Brown                mNext = gRecyclerTop;
16811f2451007c660091b7b090c1ea332f9044515d2dJeff Brown                gRecyclerTop = this;
16821f2451007c660091b7b090c1ea332f9044515d2dJeff Brown            }
16831f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        }
16841f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    }
16851f2451007c660091b7b090c1ea332f9044515d2dJeff Brown
168692cc2d8dc35f2bdd1bb95ab24787066371064899Jeff Brown    /** @hide */
168792cc2d8dc35f2bdd1bb95ab24787066371064899Jeff Brown    @Override
168892cc2d8dc35f2bdd1bb95ab24787066371064899Jeff Brown    public final void recycleIfNeededAfterDispatch() {
168992cc2d8dc35f2bdd1bb95ab24787066371064899Jeff Brown        // Do nothing.
169092cc2d8dc35f2bdd1bb95ab24787066371064899Jeff Brown    }
169192cc2d8dc35f2bdd1bb95ab24787066371064899Jeff Brown
16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1693105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * Create a new key event that is the same as the given one, but whose
1694105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * event time and repeat count are replaced with the given value.
1695105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     *
1696105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * @param event The existing event to be copied.  This is not modified.
1697105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * @param eventTime The new event time
1698105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * (in {@link android.os.SystemClock#uptimeMillis}) of the event.
1699105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * @param newRepeat The new repeat count of the event.
1700105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
1701105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public static KeyEvent changeTimeRepeat(KeyEvent event, long eventTime,
1702105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            int newRepeat) {
1703105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        return new KeyEvent(event, eventTime, newRepeat);
1704105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1705105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1706105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
170783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * Create a new key event that is the same as the given one, but whose
170883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * event time and repeat count are replaced with the given value.
170983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     *
171083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * @param event The existing event to be copied.  This is not modified.
171183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * @param eventTime The new event time
171283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * (in {@link android.os.SystemClock#uptimeMillis}) of the event.
171383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * @param newRepeat The new repeat count of the event.
171483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * @param newFlags New flags for the event, replacing the entire value
171583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * in the original event.
171683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     */
171783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public static KeyEvent changeTimeRepeat(KeyEvent event, long eventTime,
171883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            int newRepeat, int newFlags) {
171983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        KeyEvent ret = new KeyEvent(event);
172083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        ret.mEventTime = eventTime;
172183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        ret.mRepeatCount = newRepeat;
172283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        ret.mFlags = newFlags;
172383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        return ret;
172483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    }
172583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
172683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    /**
17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Copy an existing key event, modifying its action.
17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param origEvent The existing event to be copied.
17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param action The new action code of the event.
17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1732105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    private KeyEvent(KeyEvent origEvent, int action) {
17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDownTime = origEvent.mDownTime;
17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mEventTime = origEvent.mEventTime;
17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAction = action;
17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mKeyCode = origEvent.mKeyCode;
17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRepeatCount = origEvent.mRepeatCount;
17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMetaState = origEvent.mMetaState;
17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDeviceId = origEvent.mDeviceId;
1740c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mSource = origEvent.mSource;
174146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        mScanCode = origEvent.mScanCode;
17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFlags = origEvent.mFlags;
17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Don't copy mCharacters, since one way or the other we'll lose it
17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // when changing the action.
17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1748105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * Create a new key event that is the same as the given one, but whose
1749105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * action is replaced with the given value.
1750105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     *
1751105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * @param event The existing event to be copied.  This is not modified.
1752105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * @param action The new action code of the event.
1753105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
1754105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public static KeyEvent changeAction(KeyEvent event, int action) {
1755105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        return new KeyEvent(event, action);
1756105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1757105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1758105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
1759105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * Create a new key event that is the same as the given one, but whose
1760105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * flags are replaced with the given value.
1761105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     *
1762105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * @param event The existing event to be copied.  This is not modified.
1763105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * @param flags The new flags constant.
1764105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
1765105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public static KeyEvent changeFlags(KeyEvent event, int flags) {
1766105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        event = new KeyEvent(event);
1767105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        event.mFlags = flags;
1768105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        return event;
1769105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
177021bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown
177121bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    /** @hide */
177221bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    @Override
177321bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    public final boolean isTainted() {
177421bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        return (mFlags & FLAG_TAINTED) != 0;
177521bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    }
177621bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown
177721bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    /** @hide */
177821bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    @Override
177921bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    public final void setTainted(boolean tainted) {
178021bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        mFlags = tainted ? mFlags | FLAG_TAINTED : mFlags & ~FLAG_TAINTED;
178121bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    }
178221bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown
1783105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Don't use in new code, instead explicitly check
17859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getAction()}.
17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return If the action is ACTION_DOWN, returns true; else false.
17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @deprecated
17909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
17929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Deprecated public final boolean isDown() {
17939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mAction == ACTION_DOWN;
17949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
17979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Is this a system key?  System keys can not be used for menu shortcuts.
17989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
17999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * TODO: this information should come from a table somewhere.
18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * TODO: should the dpad keys be here?  arguably, because they also shouldn't be menu shortcuts
18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final boolean isSystem() {
18033c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn        return native_isSystemKey(mKeyCode);
18043c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn    }
18053c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn
18063c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn    /** @hide */
18073c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn    public final boolean hasDefaultAction() {
18083c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn        return native_hasDefaultAction(mKeyCode);
18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18116f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    /**
18126f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown     * Returns true if the specified keycode is a gamepad button.
18136f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown     * @return True if the keycode is a gamepad button, such as {@link #KEYCODE_BUTTON_A}.
18146f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown     */
18156f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    public static final boolean isGamepadButton(int keyCode) {
18166f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        switch (keyCode) {
18176f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_A:
18186f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_B:
18196f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_C:
18206f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_X:
18216f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_Y:
18226f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_Z:
18236f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_L1:
18246f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_R1:
18256f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_L2:
18266f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_R2:
18276f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_THUMBL:
18286f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_THUMBR:
18296f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_START:
18306f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_SELECT:
18316f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_MODE:
18326f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_1:
18336f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_2:
18346f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_3:
18356f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_4:
18366f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_5:
18376f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_6:
18386f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_7:
18396f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_8:
18406f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_9:
18416f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_10:
18426f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_11:
18436f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_12:
18446f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_13:
18456f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_14:
18466f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_15:
18476f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_16:
18486f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown                return true;
18496f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            default:
18506f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown                return false;
18516f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        }
18526f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    }
18536f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown
18541e3c93975ee9c88284449406d49df2569f03f498Michael Wright    /**
18551e3c93975ee9c88284449406d49df2569f03f498Michael Wright     * Returns true if the key event should be treated as a confirming action.
18561e3c93975ee9c88284449406d49df2569f03f498Michael Wright     * @return True for a confirmation key, such as {@link #KEYCODE_DPAD_CENTER},
18571e3c93975ee9c88284449406d49df2569f03f498Michael Wright     * {@link #KEYCODE_ENTER}, or {@link #KEYCODE_BUTTON_A}.
185825b0c3096131e532e57f5aac48769430dca42c75Michael Wright     */
18591e3c93975ee9c88284449406d49df2569f03f498Michael Wright    public final boolean isConfirmKey() {
18601e3c93975ee9c88284449406d49df2569f03f498Michael Wright        switch (mKeyCode) {
186125b0c3096131e532e57f5aac48769430dca42c75Michael Wright            case KeyEvent.KEYCODE_DPAD_CENTER:
186225b0c3096131e532e57f5aac48769430dca42c75Michael Wright            case KeyEvent.KEYCODE_ENTER:
18631e3c93975ee9c88284449406d49df2569f03f498Michael Wright            case KeyEvent.KEYCODE_BUTTON_A:
18641e3c93975ee9c88284449406d49df2569f03f498Michael Wright                return true;
18651e3c93975ee9c88284449406d49df2569f03f498Michael Wright            default:
18661e3c93975ee9c88284449406d49df2569f03f498Michael Wright                return false;
18671e3c93975ee9c88284449406d49df2569f03f498Michael Wright        }
18681e3c93975ee9c88284449406d49df2569f03f498Michael Wright    }
18691e3c93975ee9c88284449406d49df2569f03f498Michael Wright
18701e3c93975ee9c88284449406d49df2569f03f498Michael Wright    /**
18711e3c93975ee9c88284449406d49df2569f03f498Michael Wright     * Returns true if the key event should be treated as a cancelling action.
18721e3c93975ee9c88284449406d49df2569f03f498Michael Wright     * @return True for a cancellation key, such as {@link #KEYCODE_ESCAPE},
18731e3c93975ee9c88284449406d49df2569f03f498Michael Wright     * {@link #KEYCODE_BACK}, or {@link #KEYCODE_BUTTON_B}.
18741e3c93975ee9c88284449406d49df2569f03f498Michael Wright     */
18751e3c93975ee9c88284449406d49df2569f03f498Michael Wright    public final boolean isCancelKey() {
18761e3c93975ee9c88284449406d49df2569f03f498Michael Wright        switch (mKeyCode) {
18771e3c93975ee9c88284449406d49df2569f03f498Michael Wright            case KeyEvent.KEYCODE_BUTTON_B:
18781e3c93975ee9c88284449406d49df2569f03f498Michael Wright            case KeyEvent.KEYCODE_ESCAPE:
18791e3c93975ee9c88284449406d49df2569f03f498Michael Wright            case KeyEvent.KEYCODE_BACK:
188025b0c3096131e532e57f5aac48769430dca42c75Michael Wright                return true;
188125b0c3096131e532e57f5aac48769430dca42c75Michael Wright            default:
188225b0c3096131e532e57f5aac48769430dca42c75Michael Wright                return false;
188325b0c3096131e532e57f5aac48769430dca42c75Michael Wright        }
188425b0c3096131e532e57f5aac48769430dca42c75Michael Wright    }
188525b0c3096131e532e57f5aac48769430dca42c75Michael Wright
188691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    /** {@inheritDoc} */
188791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Override
188891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public final int getDeviceId() {
188991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return mDeviceId;
189091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
189191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
189291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    /** {@inheritDoc} */
189391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Override
189491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public final int getSource() {
189591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return mSource;
189691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
189791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
189891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    /** {@inheritDoc} */
189991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Override
190091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public final void setSource(int source) {
190191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        mSource = source;
190291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
19039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
19059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Returns the state of the meta keys.</p>
19069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return an integer in which each bit set to 1 represents a pressed
19089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         meta key
19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
19109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isAltPressed()
19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isShiftPressed()
19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isSymPressed()
1913497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #isCtrlPressed()
1914497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #isMetaPressed()
1915497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #isFunctionPressed()
191651e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown     * @see #isCapsLockOn()
191751e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown     * @see #isNumLockOn()
191851e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown     * @see #isScrollLockOn()
19199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #META_ALT_ON
1920497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #META_ALT_LEFT_ON
1921497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #META_ALT_RIGHT_ON
19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #META_SHIFT_ON
1923497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #META_SHIFT_LEFT_ON
1924497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #META_SHIFT_RIGHT_ON
19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #META_SYM_ON
1926497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #META_FUNCTION_ON
1927497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #META_CTRL_ON
1928497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #META_CTRL_LEFT_ON
1929497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #META_CTRL_RIGHT_ON
1930497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #META_META_ON
1931497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #META_META_LEFT_ON
1932497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #META_META_RIGHT_ON
193351e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown     * @see #META_CAPS_LOCK_ON
193451e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown     * @see #META_NUM_LOCK_ON
193551e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown     * @see #META_SCROLL_LOCK_ON
19365487500cf3d9f6d7703ce0704cb91837aa95d716Jeff Brown     * @see #getModifiers
19379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
19389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getMetaState() {
19399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mMetaState;
19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
19435487500cf3d9f6d7703ce0704cb91837aa95d716Jeff Brown     * Returns the state of the modifier keys.
19445487500cf3d9f6d7703ce0704cb91837aa95d716Jeff Brown     * <p>
19455487500cf3d9f6d7703ce0704cb91837aa95d716Jeff Brown     * For the purposes of this function, {@link #KEYCODE_CAPS_LOCK},
19465487500cf3d9f6d7703ce0704cb91837aa95d716Jeff Brown     * {@link #KEYCODE_SCROLL_LOCK}, and {@link #KEYCODE_NUM_LOCK} are
19475487500cf3d9f6d7703ce0704cb91837aa95d716Jeff Brown     * not considered modifier keys.  Consequently, this function specifically masks out
19485487500cf3d9f6d7703ce0704cb91837aa95d716Jeff Brown     * {@link #META_CAPS_LOCK_ON}, {@link #META_SCROLL_LOCK_ON} and {@link #META_NUM_LOCK_ON}.
19495487500cf3d9f6d7703ce0704cb91837aa95d716Jeff Brown     * </p><p>
19505487500cf3d9f6d7703ce0704cb91837aa95d716Jeff Brown     * The value returned consists of the meta state (from {@link #getMetaState})
19515487500cf3d9f6d7703ce0704cb91837aa95d716Jeff Brown     * normalized using {@link #normalizeMetaState(int)} and then masked with
19525487500cf3d9f6d7703ce0704cb91837aa95d716Jeff Brown     * {@link #getModifierMetaStateMask} so that only valid modifier bits are retained.
19535487500cf3d9f6d7703ce0704cb91837aa95d716Jeff Brown     * </p>
19545487500cf3d9f6d7703ce0704cb91837aa95d716Jeff Brown     *
19555487500cf3d9f6d7703ce0704cb91837aa95d716Jeff Brown     * @return An integer in which each bit set to 1 represents a pressed modifier key.
19565487500cf3d9f6d7703ce0704cb91837aa95d716Jeff Brown     * @see #getMetaState
19575487500cf3d9f6d7703ce0704cb91837aa95d716Jeff Brown     */
19585487500cf3d9f6d7703ce0704cb91837aa95d716Jeff Brown    public final int getModifiers() {
19595487500cf3d9f6d7703ce0704cb91837aa95d716Jeff Brown        return normalizeMetaState(mMetaState) & META_MODIFIER_MASK;
19605487500cf3d9f6d7703ce0704cb91837aa95d716Jeff Brown    }
19615487500cf3d9f6d7703ce0704cb91837aa95d716Jeff Brown
19625487500cf3d9f6d7703ce0704cb91837aa95d716Jeff Brown    /**
19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the flags for this key event.
19649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
19659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #FLAG_WOKE_HERE
19669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
19679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getFlags() {
19689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mFlags;
19699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
197128cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    // Mask of all modifier key meta states.  Specifically excludes locked keys like caps lock.
197228cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    private static final int META_MODIFIER_MASK =
197328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown            META_SHIFT_ON | META_SHIFT_LEFT_ON | META_SHIFT_RIGHT_ON
197428cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown            | META_ALT_ON | META_ALT_LEFT_ON | META_ALT_RIGHT_ON
197528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown            | META_CTRL_ON | META_CTRL_LEFT_ON | META_CTRL_RIGHT_ON
197628cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown            | META_META_ON | META_META_LEFT_ON | META_META_RIGHT_ON
197728cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown            | META_SYM_ON | META_FUNCTION_ON;
197828cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown
197928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    // Mask of all lock key meta states.
198028cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    private static final int META_LOCK_MASK =
198128cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown            META_CAPS_LOCK_ON | META_NUM_LOCK_ON | META_SCROLL_LOCK_ON;
198228cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown
198328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    // Mask of all valid meta states.
198428cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    private static final int META_ALL_MASK = META_MODIFIER_MASK | META_LOCK_MASK;
198528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown
198628cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    // Mask of all synthetic meta states that are reserved for API compatibility with
198728cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    // historical uses in MetaKeyKeyListener.
198828cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    private static final int META_SYNTHETIC_MASK =
198928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown            META_CAP_LOCKED | META_ALT_LOCKED | META_SYM_LOCKED | META_SELECTING;
199028cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown
199128cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    // Mask of all meta states that are not valid use in specifying a modifier key.
199228cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    // These bits are known to be used for purposes other than specifying modifiers.
199328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    private static final int META_INVALID_MODIFIER_MASK =
199428cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown            META_LOCK_MASK | META_SYNTHETIC_MASK;
199528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown
199628cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    /**
199728cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * Gets a mask that includes all valid modifier key meta state bits.
199828cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * <p>
199928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * For the purposes of this function, {@link #KEYCODE_CAPS_LOCK},
200028cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link #KEYCODE_SCROLL_LOCK}, and {@link #KEYCODE_NUM_LOCK} are
200128cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * not considered modifier keys.  Consequently, the mask specifically excludes
200228cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link #META_CAPS_LOCK_ON}, {@link #META_SCROLL_LOCK_ON} and {@link #META_NUM_LOCK_ON}.
200328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * </p>
200428cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     *
200528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * @return The modifier meta state mask which is a combination of
200628cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link #META_SHIFT_ON}, {@link #META_SHIFT_LEFT_ON}, {@link #META_SHIFT_RIGHT_ON},
200728cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link #META_ALT_ON}, {@link #META_ALT_LEFT_ON}, {@link #META_ALT_RIGHT_ON},
200828cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link #META_CTRL_ON}, {@link #META_CTRL_LEFT_ON}, {@link #META_CTRL_RIGHT_ON},
200928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link #META_META_ON}, {@link #META_META_LEFT_ON}, {@link #META_META_RIGHT_ON},
201028cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link #META_SYM_ON}, {@link #META_FUNCTION_ON}.
201128cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     */
201228cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    public static int getModifierMetaStateMask() {
201328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        return META_MODIFIER_MASK;
201428cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    }
201528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown
20169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
20179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns true if this key code is a modifier key.
201828cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * <p>
201928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * For the purposes of this function, {@link #KEYCODE_CAPS_LOCK},
202028cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link #KEYCODE_SCROLL_LOCK}, and {@link #KEYCODE_NUM_LOCK} are
202128cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * not considered modifier keys.  Consequently, this function return false
202228cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * for those keys.
202328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * </p>
20249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
202528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * @return True if the key code is one of
20269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #KEYCODE_SHIFT_LEFT} {@link #KEYCODE_SHIFT_RIGHT},
2027497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * {@link #KEYCODE_ALT_LEFT}, {@link #KEYCODE_ALT_RIGHT},
2028497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * {@link #KEYCODE_CTRL_LEFT}, {@link #KEYCODE_CTRL_RIGHT},
202928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link #KEYCODE_META_LEFT}, or {@link #KEYCODE_META_RIGHT},
203028cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link #KEYCODE_SYM}, {@link #KEYCODE_NUM}, {@link #KEYCODE_FUNCTION}.
20319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static boolean isModifierKey(int keyCode) {
2033497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        switch (keyCode) {
2034497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown            case KEYCODE_SHIFT_LEFT:
2035497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown            case KEYCODE_SHIFT_RIGHT:
2036497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown            case KEYCODE_ALT_LEFT:
2037497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown            case KEYCODE_ALT_RIGHT:
2038497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown            case KEYCODE_CTRL_LEFT:
2039497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown            case KEYCODE_CTRL_RIGHT:
2040497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown            case KEYCODE_META_LEFT:
2041497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown            case KEYCODE_META_RIGHT:
204228cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown            case KEYCODE_SYM:
204328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown            case KEYCODE_NUM:
204428cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown            case KEYCODE_FUNCTION:
2045497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown                return true;
2046497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown            default:
2047497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown                return false;
2048497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        }
20499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
205228cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * Normalizes the specified meta state.
205328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * <p>
205428cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * The meta state is normalized such that if either the left or right modifier meta state
205528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * bits are set then the result will also include the universal bit for that modifier.
205628cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * </p><p>
205728cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * If the specified meta state contains {@link #META_ALT_LEFT_ON} then
205828cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * the result will also contain {@link #META_ALT_ON} in addition to {@link #META_ALT_LEFT_ON}
205928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * and the other bits that were specified in the input.  The same is process is
206028cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * performed for shift, control and meta.
206128cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * </p><p>
206228cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * If the specified meta state contains synthetic meta states defined by
206328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link MetaKeyKeyListener}, then those states are translated here and the original
206428cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * synthetic meta states are removed from the result.
206528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link MetaKeyKeyListener#META_CAP_LOCKED} is translated to {@link #META_CAPS_LOCK_ON}.
206628cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link MetaKeyKeyListener#META_ALT_LOCKED} is translated to {@link #META_ALT_ON}.
206728cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link MetaKeyKeyListener#META_SYM_LOCKED} is translated to {@link #META_SYM_ON}.
206828cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * </p><p>
206928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * Undefined meta state bits are removed.
207028cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * </p>
207128cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     *
207228cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * @param metaState The meta state.
207328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * @return The normalized meta state.
207428cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     */
207528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    public static int normalizeMetaState(int metaState) {
207628cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        if ((metaState & (META_SHIFT_LEFT_ON | META_SHIFT_RIGHT_ON)) != 0) {
207728cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown            metaState |= META_SHIFT_ON;
207828cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        }
207928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        if ((metaState & (META_ALT_LEFT_ON | META_ALT_RIGHT_ON)) != 0) {
208028cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown            metaState |= META_ALT_ON;
208128cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        }
208228cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        if ((metaState & (META_CTRL_LEFT_ON | META_CTRL_RIGHT_ON)) != 0) {
208328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown            metaState |= META_CTRL_ON;
208428cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        }
208528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        if ((metaState & (META_META_LEFT_ON | META_META_RIGHT_ON)) != 0) {
208628cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown            metaState |= META_META_ON;
208728cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        }
208828cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        if ((metaState & MetaKeyKeyListener.META_CAP_LOCKED) != 0) {
208928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown            metaState |= META_CAPS_LOCK_ON;
209028cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        }
209128cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        if ((metaState & MetaKeyKeyListener.META_ALT_LOCKED) != 0) {
209228cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown            metaState |= META_ALT_ON;
209328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        }
209428cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        if ((metaState & MetaKeyKeyListener.META_SYM_LOCKED) != 0) {
209528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown            metaState |= META_SYM_ON;
209628cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        }
209728cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        return metaState & META_ALL_MASK;
209828cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    }
209928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown
210028cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    /**
210128cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * Returns true if no modifiers keys are pressed according to the specified meta state.
210228cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * <p>
210328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * For the purposes of this function, {@link #KEYCODE_CAPS_LOCK},
210428cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link #KEYCODE_SCROLL_LOCK}, and {@link #KEYCODE_NUM_LOCK} are
210528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * not considered modifier keys.  Consequently, this function ignores
210628cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link #META_CAPS_LOCK_ON}, {@link #META_SCROLL_LOCK_ON} and {@link #META_NUM_LOCK_ON}.
210728cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * </p><p>
210828cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * The meta state is normalized prior to comparison using {@link #normalizeMetaState(int)}.
210928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * </p>
211028cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     *
211128cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * @param metaState The meta state to consider.
211228cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * @return True if no modifier keys are pressed.
211328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * @see #hasNoModifiers()
211428cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     */
211528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    public static boolean metaStateHasNoModifiers(int metaState) {
211628cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        return (normalizeMetaState(metaState) & META_MODIFIER_MASK) == 0;
211728cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    }
211828cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown
211928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    /**
212028cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * Returns true if only the specified modifier keys are pressed according to
212128cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * the specified meta state.  Returns false if a different combination of modifier
212228cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * keys are pressed.
212328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * <p>
212428cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * For the purposes of this function, {@link #KEYCODE_CAPS_LOCK},
212528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link #KEYCODE_SCROLL_LOCK}, and {@link #KEYCODE_NUM_LOCK} are
212628cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * not considered modifier keys.  Consequently, this function ignores
212728cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link #META_CAPS_LOCK_ON}, {@link #META_SCROLL_LOCK_ON} and {@link #META_NUM_LOCK_ON}.
212828cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * </p><p>
212928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * If the specified modifier mask includes directional modifiers, such as
213028cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link #META_SHIFT_LEFT_ON}, then this method ensures that the
213128cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * modifier is pressed on that side.
213228cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * If the specified modifier mask includes non-directional modifiers, such as
213328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link #META_SHIFT_ON}, then this method ensures that the modifier
213428cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * is pressed on either side.
213528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * If the specified modifier mask includes both directional and non-directional modifiers
213628cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * for the same type of key, such as {@link #META_SHIFT_ON} and {@link #META_SHIFT_LEFT_ON},
213728cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * then this method throws an illegal argument exception.
213828cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * </p>
213928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     *
214028cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * @param metaState The meta state to consider.
214128cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * @param modifiers The meta state of the modifier keys to check.  May be a combination
214228cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * of modifier meta states as defined by {@link #getModifierMetaStateMask()}.  May be 0 to
214328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * ensure that no modifier keys are pressed.
214428cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * @return True if only the specified modifier keys are pressed.
214528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * @throws IllegalArgumentException if the modifiers parameter contains invalid modifiers
214628cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * @see #hasModifiers
214728cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     */
214828cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    public static boolean metaStateHasModifiers(int metaState, int modifiers) {
214928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        // Note: For forward compatibility, we allow the parameter to contain meta states
215028cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        //       that we do not recognize but we explicitly disallow meta states that
215128cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        //       are not valid modifiers.
215228cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        if ((modifiers & META_INVALID_MODIFIER_MASK) != 0) {
215328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown            throw new IllegalArgumentException("modifiers must not contain "
215428cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown                    + "META_CAPS_LOCK_ON, META_NUM_LOCK_ON, META_SCROLL_LOCK_ON, "
215528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown                    + "META_CAP_LOCKED, META_ALT_LOCKED, META_SYM_LOCKED, "
215628cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown                    + "or META_SELECTING");
215728cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        }
215828cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown
215928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        metaState = normalizeMetaState(metaState) & META_MODIFIER_MASK;
216028cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        metaState = metaStateFilterDirectionalModifiers(metaState, modifiers,
216128cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown                META_SHIFT_ON, META_SHIFT_LEFT_ON, META_SHIFT_RIGHT_ON);
216228cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        metaState = metaStateFilterDirectionalModifiers(metaState, modifiers,
216328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown                META_ALT_ON, META_ALT_LEFT_ON, META_ALT_RIGHT_ON);
216428cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        metaState = metaStateFilterDirectionalModifiers(metaState, modifiers,
216528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown                META_CTRL_ON, META_CTRL_LEFT_ON, META_CTRL_RIGHT_ON);
216628cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        metaState = metaStateFilterDirectionalModifiers(metaState, modifiers,
216728cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown                META_META_ON, META_META_LEFT_ON, META_META_RIGHT_ON);
216828cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        return metaState == modifiers;
216928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    }
217028cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown
217128cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    private static int metaStateFilterDirectionalModifiers(int metaState,
217228cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown            int modifiers, int basic, int left, int right) {
217328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        final boolean wantBasic = (modifiers & basic) != 0;
217428cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        final int directional = left | right;
217528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        final boolean wantLeftOrRight = (modifiers & directional) != 0;
217628cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown
217728cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        if (wantBasic) {
217828cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown            if (wantLeftOrRight) {
217928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown                throw new IllegalArgumentException("modifiers must not contain "
218028cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown                        + metaStateToString(basic) + " combined with "
218128cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown                        + metaStateToString(left) + " or " + metaStateToString(right));
218228cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown            }
218328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown            return metaState & ~directional;
218428cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        } else if (wantLeftOrRight) {
218528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown            return metaState & ~basic;
218628cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        } else {
218728cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown            return metaState;
218828cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        }
218928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    }
219028cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown
219128cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    /**
219228cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * Returns true if no modifier keys are pressed.
219328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * <p>
219428cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * For the purposes of this function, {@link #KEYCODE_CAPS_LOCK},
219528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link #KEYCODE_SCROLL_LOCK}, and {@link #KEYCODE_NUM_LOCK} are
219628cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * not considered modifier keys.  Consequently, this function ignores
219728cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link #META_CAPS_LOCK_ON}, {@link #META_SCROLL_LOCK_ON} and {@link #META_NUM_LOCK_ON}.
219828cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * </p><p>
219928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * The meta state is normalized prior to comparison using {@link #normalizeMetaState(int)}.
220028cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * </p>
220128cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     *
220228cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * @return True if no modifier keys are pressed.
220328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * @see #metaStateHasNoModifiers
220428cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     */
220528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    public final boolean hasNoModifiers() {
220628cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        return metaStateHasNoModifiers(mMetaState);
220728cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    }
220828cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown
220928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    /**
221028cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * Returns true if only the specified modifiers keys are pressed.
221128cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * Returns false if a different combination of modifier keys are pressed.
221228cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * <p>
221328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * For the purposes of this function, {@link #KEYCODE_CAPS_LOCK},
221428cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link #KEYCODE_SCROLL_LOCK}, and {@link #KEYCODE_NUM_LOCK} are
221528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * not considered modifier keys.  Consequently, this function ignores
221628cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link #META_CAPS_LOCK_ON}, {@link #META_SCROLL_LOCK_ON} and {@link #META_NUM_LOCK_ON}.
221728cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * </p><p>
221828cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * If the specified modifier mask includes directional modifiers, such as
221928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link #META_SHIFT_LEFT_ON}, then this method ensures that the
222028cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * modifier is pressed on that side.
222128cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * If the specified modifier mask includes non-directional modifiers, such as
222228cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link #META_SHIFT_ON}, then this method ensures that the modifier
222328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * is pressed on either side.
222428cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * If the specified modifier mask includes both directional and non-directional modifiers
222528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * for the same type of key, such as {@link #META_SHIFT_ON} and {@link #META_SHIFT_LEFT_ON},
222628cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * then this method throws an illegal argument exception.
222728cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * </p>
222828cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     *
222928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * @param modifiers The meta state of the modifier keys to check.  May be a combination
223028cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * of modifier meta states as defined by {@link #getModifierMetaStateMask()}.  May be 0 to
223128cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * ensure that no modifier keys are pressed.
223228cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * @return True if only the specified modifier keys are pressed.
223328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * @throws IllegalArgumentException if the modifiers parameter contains invalid modifiers
223428cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * @see #metaStateHasModifiers
223528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     */
223628cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    public final boolean hasModifiers(int modifiers) {
223728cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        return metaStateHasModifiers(mMetaState, modifiers);
223828cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    }
223928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown
224028cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    /**
22419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Returns the pressed state of the ALT meta key.</p>
22429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
22439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the ALT key is pressed, false otherwise
22449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
22459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_ALT_LEFT
22469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_ALT_RIGHT
22479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #META_ALT_ON
22489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
22499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final boolean isAltPressed() {
22509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (mMetaState & META_ALT_ON) != 0;
22519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
22549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Returns the pressed state of the SHIFT meta key.</p>
22559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
22569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the SHIFT key is pressed, false otherwise
22579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
22589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_SHIFT_LEFT
22599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_SHIFT_RIGHT
22609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #META_SHIFT_ON
22619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
22629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final boolean isShiftPressed() {
22639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (mMetaState & META_SHIFT_ON) != 0;
22649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
22679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Returns the pressed state of the SYM meta key.</p>
22689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
22699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the SYM key is pressed, false otherwise
22709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
22719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_SYM
22729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #META_SYM_ON
22739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
22749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final boolean isSymPressed() {
22759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (mMetaState & META_SYM_ON) != 0;
22769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2279497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * <p>Returns the pressed state of the CTRL meta key.</p>
2280497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
2281497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @return true if the CTRL key is pressed, false otherwise
2282497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
2283497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #KEYCODE_CTRL_LEFT
2284497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #KEYCODE_CTRL_RIGHT
2285497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #META_CTRL_ON
2286497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     */
2287497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public final boolean isCtrlPressed() {
2288497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        return (mMetaState & META_CTRL_ON) != 0;
2289497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    }
2290497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
2291497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /**
2292497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * <p>Returns the pressed state of the META meta key.</p>
2293497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
2294497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @return true if the META key is pressed, false otherwise
2295497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
2296497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #KEYCODE_META_LEFT
2297497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #KEYCODE_META_RIGHT
2298497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #META_META_ON
2299497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     */
2300497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public final boolean isMetaPressed() {
2301497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        return (mMetaState & META_META_ON) != 0;
2302497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    }
2303497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
2304497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /**
2305497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * <p>Returns the pressed state of the FUNCTION meta key.</p>
2306497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
2307497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @return true if the FUNCTION key is pressed, false otherwise
2308497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
2309497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #KEYCODE_FUNCTION
2310497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #META_FUNCTION_ON
2311497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     */
2312497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public final boolean isFunctionPressed() {
2313497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        return (mMetaState & META_FUNCTION_ON) != 0;
2314497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    }
2315497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
2316497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /**
231751e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown     * <p>Returns the locked state of the CAPS LOCK meta key.</p>
2318497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
231951e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown     * @return true if the CAPS LOCK key is on, false otherwise
2320497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
2321497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #KEYCODE_CAPS_LOCK
232251e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown     * @see #META_CAPS_LOCK_ON
2323497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     */
232451e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    public final boolean isCapsLockOn() {
232551e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown        return (mMetaState & META_CAPS_LOCK_ON) != 0;
2326497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    }
2327497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
2328497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /**
232951e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown     * <p>Returns the locked state of the NUM LOCK meta key.</p>
2330497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
233151e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown     * @return true if the NUM LOCK key is on, false otherwise
2332497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
2333497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #KEYCODE_NUM_LOCK
233451e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown     * @see #META_NUM_LOCK_ON
2335497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     */
233651e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    public final boolean isNumLockOn() {
233751e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown        return (mMetaState & META_NUM_LOCK_ON) != 0;
2338497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    }
2339497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
2340497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /**
234151e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown     * <p>Returns the locked state of the SCROLL LOCK meta key.</p>
2342497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
234351e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown     * @return true if the SCROLL LOCK key is on, false otherwise
2344497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
2345497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #KEYCODE_SCROLL_LOCK
234651e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown     * @see #META_SCROLL_LOCK_ON
2347497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     */
234851e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    public final boolean isScrollLockOn() {
234951e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown        return (mMetaState & META_SCROLL_LOCK_ON) != 0;
2350497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    }
2351497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
2352497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /**
23539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the action of this key event.  May be either
23549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #ACTION_DOWN}, {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.
23559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The event action: ACTION_DOWN, ACTION_UP, or ACTION_MULTIPLE.
23579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
23589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getAction() {
23599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mAction;
23609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2363ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * For {@link #ACTION_UP} events, indicates that the event has been
2364ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * canceled as per {@link #FLAG_CANCELED}.
2365ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     */
2366ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn    public final boolean isCanceled() {
2367ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn        return (mFlags&FLAG_CANCELED) != 0;
2368ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn    }
2369ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn
2370ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn    /**
237183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * Call this during {@link Callback#onKeyDown} to have the system track
237283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * the key through its final up (possibly including a long press).  Note
237383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * that only one key can be tracked at a time -- if another key down
237483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * event is received while a previous one is being tracked, tracking is
237583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * stopped on the previous event.
237683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     */
237783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public final void startTracking() {
237883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        mFlags |= FLAG_START_TRACKING;
237983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    }
238083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
238183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    /**
238283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * For {@link #ACTION_UP} events, indicates that the event is still being
238383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * tracked from its initial down event as per
238483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * {@link #FLAG_TRACKING}.
238583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     */
238683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public final boolean isTracking() {
238783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        return (mFlags&FLAG_TRACKING) != 0;
238883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    }
238983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
239083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    /**
239183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * For {@link #ACTION_DOWN} events, indicates that the event has been
239283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * canceled as per {@link #FLAG_LONG_PRESS}.
239383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     */
239483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public final boolean isLongPress() {
239583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        return (mFlags&FLAG_LONG_PRESS) != 0;
239683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    }
239783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
239883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    /**
23999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the key code of the key event.  This is the physical key that
24009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * was pressed, <em>not</em> the Unicode character.
24019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
24029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The key code of the event.
24039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
24049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getKeyCode() {
24059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mKeyCode;
24069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
24099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * For the special case of a {@link #ACTION_MULTIPLE} event with key
24109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * code of {@link #KEYCODE_UNKNOWN}, this is a raw string of characters
24119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * associated with the event.  In all other cases it is null.
24129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
24139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns a String of 1 or more characters associated with
24149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the event.
24159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
24169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final String getCharacters() {
24179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mCharacters;
24189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
24219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the hardware key id of this key event.  These values are not
24229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * reliable and vary from device to device.
24239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
24249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@more}
24259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Mostly this is here for debugging purposes.
24269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
24279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getScanCode() {
242846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        return mScanCode;
24299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
24329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the repeat count of the event.  For both key up and key down
24339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * events, this is the number of times the key has repeated with the first
24349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * down starting at 0 and counting up from there.  For multiple key
24359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * events, this is the number of down/up pairs that have occurred.
24369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
24379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The number of times the key has repeated.
24389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
24399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getRepeatCount() {
24409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mRepeatCount;
24419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
24449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the time of the most recent key down event,
24459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in the {@link android.os.SystemClock#uptimeMillis} time base.  If this
24469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is a down event, this will be the same as {@link #getEventTime()}.
24479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Note that when chording keys, this value is the down time of the
24489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * most recently pressed key, which may <em>not</em> be the same physical
24499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * key of this event.
24509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
24519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the most recent key down time, in the
24529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.os.SystemClock#uptimeMillis} time base
24539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
24549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final long getDownTime() {
24559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mDownTime;
24569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2459b11499d2db0ba9782363ec6bf714b583e8585212Jeff Brown     * Retrieve the time this event occurred,
24609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in the {@link android.os.SystemClock#uptimeMillis} time base.
2461b11499d2db0ba9782363ec6bf714b583e8585212Jeff Brown     *
24629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the time this event occurred,
24639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in the {@link android.os.SystemClock#uptimeMillis} time base.
24649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2465b11499d2db0ba9782363ec6bf714b583e8585212Jeff Brown    @Override
24669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final long getEventTime() {
24679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mEventTime;
24689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2470b11499d2db0ba9782363ec6bf714b583e8585212Jeff Brown    /**
2471b11499d2db0ba9782363ec6bf714b583e8585212Jeff Brown     * Retrieve the time this event occurred,
2472b11499d2db0ba9782363ec6bf714b583e8585212Jeff Brown     * in the {@link android.os.SystemClock#uptimeMillis} time base but with
2473b11499d2db0ba9782363ec6bf714b583e8585212Jeff Brown     * nanosecond (instead of millisecond) precision.
2474b11499d2db0ba9782363ec6bf714b583e8585212Jeff Brown     * <p>
2475b11499d2db0ba9782363ec6bf714b583e8585212Jeff Brown     * The value is in nanosecond precision but it may not have nanosecond accuracy.
2476b11499d2db0ba9782363ec6bf714b583e8585212Jeff Brown     * </p>
2477b11499d2db0ba9782363ec6bf714b583e8585212Jeff Brown     *
2478b11499d2db0ba9782363ec6bf714b583e8585212Jeff Brown     * @return Returns the time this event occurred,
2479b11499d2db0ba9782363ec6bf714b583e8585212Jeff Brown     * in the {@link android.os.SystemClock#uptimeMillis} time base but with
2480b11499d2db0ba9782363ec6bf714b583e8585212Jeff Brown     * nanosecond (instead of millisecond) precision.
2481b11499d2db0ba9782363ec6bf714b583e8585212Jeff Brown     *
2482b11499d2db0ba9782363ec6bf714b583e8585212Jeff Brown     * @hide
2483b11499d2db0ba9782363ec6bf714b583e8585212Jeff Brown     */
24844e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown    @Override
24854e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown    public final long getEventTimeNano() {
24864e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown        return mEventTime * 1000000L;
24874e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown    }
24884e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown
24899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
24909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Renamed to {@link #getDeviceId}.
24919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
24929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
24936b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * @deprecated use {@link #getDeviceId()} instead.
24949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
24956b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    @Deprecated
24969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getKeyboardDevice() {
24979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mDeviceId;
24989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
25016b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * Gets the {@link KeyCharacterMap} associated with the keyboard device.
25026b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     *
25036b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * @return The associated key character map.
25048ab3dc7a3e430cc69975091b962758f49bc84ef2Andrew Sapperstein     * @throws {@link KeyCharacterMap.UnavailableException} if the key character map
25056b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * could not be loaded because it was malformed or the default key character map
25066b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * is missing from the system.
25076b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     *
25088ab3dc7a3e430cc69975091b962758f49bc84ef2Andrew Sapperstein     * @see KeyCharacterMap#load
25096b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     */
25106b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    public final KeyCharacterMap getKeyCharacterMap() {
25116b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        return KeyCharacterMap.load(mDeviceId);
25126b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    }
25136b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown
25146b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    /**
25156b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * Gets the primary character for this key.
25166b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * In other words, the label that is physically printed on it.
25176b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     *
25186b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * @return The display label character, or 0 if none (eg. for non-printing keys).
25199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
25209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public char getDisplayLabel() {
25216b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        return getKeyCharacterMap().getDisplayLabel(mKeyCode);
25229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
25256b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * Gets the Unicode character generated by the specified key and meta
25266b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * key state combination.
25279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
25286b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * Returns the Unicode character that the specified key would produce
25296b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * when the specified meta bits (see {@link MetaKeyKeyListener})
25306b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * were active.
25319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </p><p>
25329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns 0 if the key is not one that is used to type Unicode
25339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * characters.
25349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </p><p>
25356b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * If the return value has bit {@link KeyCharacterMap#COMBINING_ACCENT} set, the
25366b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * key is a "dead key" that should be combined with another to
25376b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * actually produce a character -- see {@link KeyCharacterMap#getDeadChar} --
25386b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * after masking with {@link KeyCharacterMap#COMBINING_ACCENT_MASK}.
25399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </p>
25406b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     *
25416b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * @return The associated character or combining accent, or 0 if none.
25429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
25439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getUnicodeChar() {
25449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getUnicodeChar(mMetaState);
25459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
25486b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * Gets the Unicode character generated by the specified key and meta
25496b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * key state combination.
25509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
25516b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * Returns the Unicode character that the specified key would produce
25526b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * when the specified meta bits (see {@link MetaKeyKeyListener})
25536b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * were active.
25549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </p><p>
25559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns 0 if the key is not one that is used to type Unicode
25569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * characters.
25579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </p><p>
25586b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * If the return value has bit {@link KeyCharacterMap#COMBINING_ACCENT} set, the
25596b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * key is a "dead key" that should be combined with another to
25606b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * actually produce a character -- see {@link KeyCharacterMap#getDeadChar} --
25616b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * after masking with {@link KeyCharacterMap#COMBINING_ACCENT_MASK}.
25629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </p>
25636b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     *
25646b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * @param metaState The meta key modifier state.
25656b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * @return The associated character or combining accent, or 0 if none.
25669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
25676b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    public int getUnicodeChar(int metaState) {
25686b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        return getKeyCharacterMap().get(mKeyCode, metaState);
25699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
25726b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * Get the character conversion data for a given key code.
25739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
25746b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * @param results A {@link KeyCharacterMap.KeyData} instance that will be
25756b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * filled with the results.
25766b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * @return True if the key was mapped.  If the key was not mapped, results is not modified.
25779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
25786b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * @deprecated instead use {@link #getDisplayLabel()},
25796b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * {@link #getNumber()} or {@link #getUnicodeChar(int)}.
25809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
25816b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    @Deprecated
25829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean getKeyData(KeyData results) {
25836b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        return getKeyCharacterMap().getKeyData(mKeyCode, results);
25849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
25876b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * Gets the first character in the character array that can be generated
25886b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * by the specified key code.
25896b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * <p>
25906b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * This is a convenience function that returns the same value as
25916b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * {@link #getMatch(char[],int) getMatch(chars, 0)}.
25926b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * </p>
25936b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     *
25946b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * @param chars The array of matching characters to consider.
25956b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * @return The matching associated character, or 0 if none.
25969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
25979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public char getMatch(char[] chars) {
25989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getMatch(chars, 0);
25999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
26026b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * Gets the first character in the character array that can be generated
26036b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * by the specified key code.  If there are multiple choices, prefers
26046b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * the one that would be generated with the specified meta key modifier state.
26056b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     *
26066b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * @param chars The array of matching characters to consider.
26076b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * @param metaState The preferred meta key modifier state.
26086b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * @return The matching associated character, or 0 if none.
26099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
26106b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    public char getMatch(char[] chars, int metaState) {
26116b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        return getKeyCharacterMap().getMatch(mKeyCode, chars, metaState);
26129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
26156b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * Gets the number or symbol associated with the key.
26166b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * <p>
26176b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * The character value is returned, not the numeric value.
26186b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * If the key is not a number, but is a symbol, the symbol is retuned.
26196b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * </p><p>
26206b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * This method is intended to to support dial pads and other numeric or
26216b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * symbolic entry on keyboards where certain keys serve dual function
26226b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * as alphabetic and symbolic keys.  This method returns the number
26236b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * or symbol associated with the key independent of whether the user
26246b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * has pressed the required modifier.
26256b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * </p><p>
26266b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * For example, on one particular keyboard the keys on the top QWERTY row generate
26276b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * numbers when ALT is pressed such that ALT-Q maps to '1'.  So for that keyboard
26286b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * when {@link #getNumber} is called with {@link KeyEvent#KEYCODE_Q} it returns '1'
26296b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * so that the user can type numbers without pressing ALT when it makes sense.
26306b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * </p>
26316b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     *
26326b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * @return The associated numeric or symbolic character, or 0 if none.
26339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
26349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public char getNumber() {
26356b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        return getKeyCharacterMap().getNumber(mKeyCode);
26369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
26396b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * Returns true if this key produces a glyph.
26406b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     *
26416b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * @return True if the key is a printing key.
26429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
26439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isPrintingKey() {
26446b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        return getKeyCharacterMap().isPrintingKey(mKeyCode);
26459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
264883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * @deprecated Use {@link #dispatch(Callback, DispatcherState, Object)} instead.
264983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     */
265083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    @Deprecated
265183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public final boolean dispatch(Callback receiver) {
265283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        return dispatch(receiver, null, null);
265383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    }
265483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
265583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    /**
26569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Deliver this key event to a {@link Callback} interface.  If this is
26579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * an ACTION_MULTIPLE event and it is not handled, then an attempt will
26589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be made to deliver a single normal event.
26599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param receiver The Callback that will be given the event.
266183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * @param state State information retained across events.
266283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * @param target The target of the dispatch, for use in tracking.
26639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The return value from the Callback method that was called.
26659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
266683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public final boolean dispatch(Callback receiver, DispatcherState state,
266783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            Object target) {
26689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (mAction) {
266983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            case ACTION_DOWN: {
267083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                mFlags &= ~FLAG_START_TRACKING;
26718d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                if (DEBUG) Log.v(TAG, "Key down to " + target + " in " + state
26728d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                        + ": " + this);
267383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                boolean res = receiver.onKeyDown(mKeyCode, this);
267483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                if (state != null) {
267583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                    if (res && mRepeatCount == 0 && (mFlags&FLAG_START_TRACKING) != 0) {
26768d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                        if (DEBUG) Log.v(TAG, "  Start tracking!");
267783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                        state.startTracking(this, target);
267883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                    } else if (isLongPress() && state.isTracking(this)) {
267983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                        try {
268083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                            if (receiver.onKeyLongPress(mKeyCode, this)) {
26818d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                                if (DEBUG) Log.v(TAG, "  Clear from long press!");
268283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                                state.performedLongPress(this);
268383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                                res = true;
268483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                            }
268583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                        } catch (AbstractMethodError e) {
268683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                        }
268783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                    }
268883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                }
268983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                return res;
269083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            }
26919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case ACTION_UP:
26928d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                if (DEBUG) Log.v(TAG, "Key up to " + target + " in " + state
26938d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                        + ": " + this);
269483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                if (state != null) {
269583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                    state.handleUpEvent(this);
269683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                }
26979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return receiver.onKeyUp(mKeyCode, this);
26989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case ACTION_MULTIPLE:
26999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int count = mRepeatCount;
27009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int code = mKeyCode;
27019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (receiver.onKeyMultiple(code, count, this)) {
27029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return true;
27039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
27049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (code != KeyEvent.KEYCODE_UNKNOWN) {
27059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAction = ACTION_DOWN;
27069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mRepeatCount = 0;
27079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    boolean handled = receiver.onKeyDown(code, this);
27089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (handled) {
27099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mAction = ACTION_UP;
27109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        receiver.onKeyUp(code, this);
27119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
27129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAction = ACTION_MULTIPLE;
27139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mRepeatCount = count;
27149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return handled;
27159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
271683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                return false;
27179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
27199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
272183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    /**
272283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * Use with {@link KeyEvent#dispatch(Callback, DispatcherState, Object)}
272383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * for more advanced key dispatching, such as long presses.
272483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     */
272583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public static class DispatcherState {
272683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        int mDownKeyCode;
272783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        Object mDownTarget;
272883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        SparseIntArray mActiveLongPresses = new SparseIntArray();
272983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
273083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        /**
273183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * Reset back to initial state.
273283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         */
273383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        public void reset() {
27348d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn            if (DEBUG) Log.v(TAG, "Reset: " + this);
273583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            mDownKeyCode = 0;
273683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            mDownTarget = null;
273783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            mActiveLongPresses.clear();
273883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        }
273983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
274083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        /**
274183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * Stop any tracking associated with this target.
274283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         */
274383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        public void reset(Object target) {
274483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            if (mDownTarget == target) {
27458d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                if (DEBUG) Log.v(TAG, "Reset in " + target + ": " + this);
274683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                mDownKeyCode = 0;
274783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                mDownTarget = null;
274883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            }
274983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        }
275083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
275183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        /**
275283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * Start tracking the key code associated with the given event.  This
275383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * can only be called on a key down.  It will allow you to see any
275483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * long press associated with the key, and will result in
275583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * {@link KeyEvent#isTracking} return true on the long press and up
275683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * events.
275783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         *
275883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * <p>This is only needed if you are directly dispatching events, rather
275983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * than handling them in {@link Callback#onKeyDown}.
276083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         */
276183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        public void startTracking(KeyEvent event, Object target) {
276283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            if (event.getAction() != ACTION_DOWN) {
276383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                throw new IllegalArgumentException(
276483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                        "Can only start tracking on a down event");
276583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            }
27668d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn            if (DEBUG) Log.v(TAG, "Start trackingt in " + target + ": " + this);
276783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            mDownKeyCode = event.getKeyCode();
276883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            mDownTarget = target;
276983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        }
277083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
277183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        /**
277283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * Return true if the key event is for a key code that is currently
277383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * being tracked by the dispatcher.
277483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         */
277583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        public boolean isTracking(KeyEvent event) {
277683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            return mDownKeyCode == event.getKeyCode();
277783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        }
277883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
277983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        /**
278083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * Keep track of the given event's key code as having performed an
278183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * action with a long press, so no action should occur on the up.
278283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * <p>This is only needed if you are directly dispatching events, rather
278383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * than handling them in {@link Callback#onKeyLongPress}.
278483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         */
278583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        public void performedLongPress(KeyEvent event) {
278683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            mActiveLongPresses.put(event.getKeyCode(), 1);
278783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        }
278883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
278983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        /**
279083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * Handle key up event to stop tracking.  This resets the dispatcher state,
279183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * and updates the key event state based on it.
279283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * <p>This is only needed if you are directly dispatching events, rather
279383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * than handling them in {@link Callback#onKeyUp}.
279483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         */
279583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        public void handleUpEvent(KeyEvent event) {
279683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            final int keyCode = event.getKeyCode();
27978d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn            if (DEBUG) Log.v(TAG, "Handle key up " + event + ": " + this);
279883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            int index = mActiveLongPresses.indexOfKey(keyCode);
279983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            if (index >= 0) {
28008d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                if (DEBUG) Log.v(TAG, "  Index: " + index);
280183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                event.mFlags |= FLAG_CANCELED | FLAG_CANCELED_LONG_PRESS;
280283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                mActiveLongPresses.removeAt(index);
280383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            }
280483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            if (mDownKeyCode == keyCode) {
28058d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                if (DEBUG) Log.v(TAG, "  Tracking!");
280683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                event.mFlags |= FLAG_TRACKING;
280783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                mDownKeyCode = 0;
280883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                mDownTarget = null;
280983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            }
281083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        }
281183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    }
2812497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
2813497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    @Override
28149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String toString() {
2815fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        StringBuilder msg = new StringBuilder();
2816fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        msg.append("KeyEvent { action=").append(actionToString(mAction));
2817fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        msg.append(", keyCode=").append(keyCodeToString(mKeyCode));
2818fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        msg.append(", scanCode=").append(mScanCode);
2819fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        if (mCharacters != null) {
2820fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            msg.append(", characters=\"").append(mCharacters).append("\"");
2821fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        }
2822fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        msg.append(", metaState=").append(metaStateToString(mMetaState));
2823fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        msg.append(", flags=0x").append(Integer.toHexString(mFlags));
2824fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        msg.append(", repeatCount=").append(mRepeatCount);
2825fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        msg.append(", eventTime=").append(mEventTime);
2826fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        msg.append(", downTime=").append(mDownTime);
2827fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        msg.append(", deviceId=").append(mDeviceId);
2828fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        msg.append(", source=0x").append(Integer.toHexString(mSource));
2829fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        msg.append(" }");
2830fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        return msg.toString();
2831497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    }
2832497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
2833497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /**
2834497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * Returns a string that represents the symbolic name of the specified action
28356f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown     * such as "ACTION_DOWN", or an equivalent numeric constant such as "35" if unknown.
2836497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
2837497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @param action The action.
2838497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @return The symbolic name of the specified action.
2839497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @hide
2840497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     */
2841497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static String actionToString(int action) {
2842497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        switch (action) {
2843497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown            case ACTION_DOWN:
2844497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown                return "ACTION_DOWN";
2845497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown            case ACTION_UP:
2846497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown                return "ACTION_UP";
2847497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown            case ACTION_MULTIPLE:
2848497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown                return "ACTION_MULTIPLE";
2849497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown            default:
2850497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown                return Integer.toString(action);
2851497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        }
2852497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    }
2853497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
2854497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /**
2855497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * Returns a string that represents the symbolic name of the specified keycode
28566f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown     * such as "KEYCODE_A", "KEYCODE_DPAD_UP", or an equivalent numeric constant
28576f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown     * such as "1001" if unknown.
2858497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
2859497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @param keyCode The key code.
2860497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @return The symbolic name of the specified keycode.
2861497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
2862497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see KeyCharacterMap#getDisplayLabel
2863497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     */
2864497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static String keyCodeToString(int keyCode) {
28656f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        String symbolicName = KEYCODE_SYMBOLIC_NAMES.get(keyCode);
28666f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        return symbolicName != null ? symbolicName : Integer.toString(keyCode);
2867497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    }
2868497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
2869497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /**
28706f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown     * Gets a keycode by its symbolic name such as "KEYCODE_A" or an equivalent
28716f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown     * numeric constant such as "1001".
2872497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
2873497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @param symbolicName The symbolic name of the keycode.
28746f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown     * @return The keycode or {@link #KEYCODE_UNKNOWN} if not found.
2875072137c80a9ce30a1c79cc416932a24bd2e4dccbMichael Wright     * @see #keycodeToString(int)
2876497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     */
2877497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static int keyCodeFromString(String symbolicName) {
2878497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        if (symbolicName == null) {
2879497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown            throw new IllegalArgumentException("symbolicName must not be null");
2880497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        }
2881497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
28826f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        final int count = KEYCODE_SYMBOLIC_NAMES.size();
2883497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        for (int i = 0; i < count; i++) {
28846f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            if (symbolicName.equals(KEYCODE_SYMBOLIC_NAMES.valueAt(i))) {
2885497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown                return i;
2886497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown            }
2887497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        }
2888497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
2889497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        try {
28906f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            return Integer.parseInt(symbolicName, 10);
2891497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        } catch (NumberFormatException ex) {
28926f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            return KEYCODE_UNKNOWN;
2893497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        }
2894497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    }
2895497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
2896497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /**
2897497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * Returns a string that represents the symbolic name of the specified combined meta
2898497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * key modifier state flags such as "0", "META_SHIFT_ON",
28996f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown     * "META_ALT_ON|META_SHIFT_ON" or an equivalent numeric constant such as "0x10000000"
29006f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown     * if unknown.
2901497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
2902497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @param metaState The meta state.
2903497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @return The symbolic name of the specified combined meta state flags.
2904497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @hide
2905497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     */
2906497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static String metaStateToString(int metaState) {
2907497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        if (metaState == 0) {
2908497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown            return "0";
2909497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        }
2910497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        StringBuilder result = null;
2911497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        int i = 0;
2912497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        while (metaState != 0) {
2913497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown            final boolean isSet = (metaState & 1) != 0;
2914497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown            metaState >>>= 1; // unsigned shift!
2915497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown            if (isSet) {
2916497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown                final String name = META_SYMBOLIC_NAMES[i];
2917497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown                if (result == null) {
2918497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown                    if (metaState == 0) {
2919497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown                        return name;
2920497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown                    }
2921497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown                    result = new StringBuilder(name);
2922497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown                } else {
2923497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown                    result.append('|');
2924497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown                    result.append(name);
2925497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown                }
2926497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown            }
2927497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown            i += 1;
2928497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        }
2929497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        return result.toString();
29309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final Parcelable.Creator<KeyEvent> CREATOR
29339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            = new Parcelable.Creator<KeyEvent>() {
29349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public KeyEvent createFromParcel(Parcel in) {
29356ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown            in.readInt(); // skip token, we already know this is a KeyEvent
29366ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown            return KeyEvent.createFromParcelBody(in);
29379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public KeyEvent[] newArray(int size) {
29409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new KeyEvent[size];
29419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
29436ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown
29446ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown    /** @hide */
29456ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown    public static KeyEvent createFromParcelBody(Parcel in) {
29466ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        return new KeyEvent(in);
29476ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown    }
29486ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown
29496ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown    private KeyEvent(Parcel in) {
295091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        mDeviceId = in.readInt();
295191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        mSource = in.readInt();
29526ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        mAction = in.readInt();
29536ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        mKeyCode = in.readInt();
29546ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        mRepeatCount = in.readInt();
29556ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        mMetaState = in.readInt();
29566ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        mScanCode = in.readInt();
29576ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        mFlags = in.readInt();
29586ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        mDownTime = in.readLong();
29596ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        mEventTime = in.readLong();
29609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeToParcel(Parcel out, int flags) {
29636ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        out.writeInt(PARCEL_TOKEN_KEY_EVENT);
296491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
296591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        out.writeInt(mDeviceId);
296691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        out.writeInt(mSource);
29679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mAction);
29689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mKeyCode);
29699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mRepeatCount);
29709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mMetaState);
297146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        out.writeInt(mScanCode);
29729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mFlags);
29739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mDownTime);
29749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mEventTime);
29759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29773c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn    private native boolean native_isSystemKey(int keyCode);
29783c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn    private native boolean native_hasDefaultAction(int keyCode);
29799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2980