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
305dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * or the first button on the upper 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
309dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * or the second button on the upper 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
313dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * or the third button on the upper 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
317dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * or the first button on the lower 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
321dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * or the second button on the lower 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
325dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * or the third button on the lower 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;
626497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
627de7a8ead2467a4a152a5a9b2416c8048f1b48bbbJeff Brown    private static final int LAST_KEYCODE           = KEYCODE_ASSIST;
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // NOTE: If you add a new keycode here you must also add it to:
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //  isSystem()
63146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    //  native/include/android/keycodes.h
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //  frameworks/base/include/ui/KeycodeLabels.h
633fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown    //  external/webkit/WebKit/android/plugins/ANPKeyCodes.h
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //  frameworks/base/core/res/res/values/attrs.xml
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //  emulator?
6366651a638348c15e89e265b0a53c775cac9beafa2Jeff Brown    //  LAST_KEYCODE
6376651a638348c15e89e265b0a53c775cac9beafa2Jeff Brown    //  KEYCODE_SYMBOLIC_NAMES
638935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn    //
639935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn    //  Also Android currently does not reserve code ranges for vendor-
640935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn    //  specific key codes.  If you have new key codes to have, you
641935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn    //  MUST contribute a patch to the open source project to define
642935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn    //  those new codes.  This is intended to maintain a consistent
643935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn    //  set of key code definitions across all Android devices.
644497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
6456f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    // Symbolic names of all key codes.
6466f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    private static final SparseArray<String> KEYCODE_SYMBOLIC_NAMES = new SparseArray<String>();
6476f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    private static void populateKeycodeSymbolicNames() {
6486f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        SparseArray<String> names = KEYCODE_SYMBOLIC_NAMES;
6496f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_UNKNOWN, "KEYCODE_UNKNOWN");
6506f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_SOFT_LEFT, "KEYCODE_SOFT_LEFT");
6516f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_SOFT_RIGHT, "KEYCODE_SOFT_RIGHT");
6526f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_HOME, "KEYCODE_HOME");
6536f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BACK, "KEYCODE_BACK");
6546f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_CALL, "KEYCODE_CALL");
6556f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_ENDCALL, "KEYCODE_ENDCALL");
6566f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_0, "KEYCODE_0");
6576f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_1, "KEYCODE_1");
6586f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_2, "KEYCODE_2");
6596f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_3, "KEYCODE_3");
6606f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_4, "KEYCODE_4");
6616f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_5, "KEYCODE_5");
6626f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_6, "KEYCODE_6");
6636f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_7, "KEYCODE_7");
6646f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_8, "KEYCODE_8");
6656f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_9, "KEYCODE_9");
6666f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_STAR, "KEYCODE_STAR");
6676f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_POUND, "KEYCODE_POUND");
6686f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_DPAD_UP, "KEYCODE_DPAD_UP");
6696f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_DPAD_DOWN, "KEYCODE_DPAD_DOWN");
6706f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_DPAD_LEFT, "KEYCODE_DPAD_LEFT");
6716f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_DPAD_RIGHT, "KEYCODE_DPAD_RIGHT");
6726f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_DPAD_CENTER, "KEYCODE_DPAD_CENTER");
6736f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_VOLUME_UP, "KEYCODE_VOLUME_UP");
6746f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_VOLUME_DOWN, "KEYCODE_VOLUME_DOWN");
6756f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_POWER, "KEYCODE_POWER");
6766f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_CAMERA, "KEYCODE_CAMERA");
6776f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_CLEAR, "KEYCODE_CLEAR");
6786f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_A, "KEYCODE_A");
6796f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_B, "KEYCODE_B");
6806f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_C, "KEYCODE_C");
6816f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_D, "KEYCODE_D");
6826f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_E, "KEYCODE_E");
6836f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_F, "KEYCODE_F");
6846f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_G, "KEYCODE_G");
6856f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_H, "KEYCODE_H");
6866f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_I, "KEYCODE_I");
6876f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_J, "KEYCODE_J");
6886f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_K, "KEYCODE_K");
6896f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_L, "KEYCODE_L");
6906f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_M, "KEYCODE_M");
6916f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_N, "KEYCODE_N");
6926f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_O, "KEYCODE_O");
6936f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_P, "KEYCODE_P");
6946f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_Q, "KEYCODE_Q");
6956f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_R, "KEYCODE_R");
6966f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_S, "KEYCODE_S");
6976f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_T, "KEYCODE_T");
6986f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_U, "KEYCODE_U");
6996f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_V, "KEYCODE_V");
7006f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_W, "KEYCODE_W");
7016f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_X, "KEYCODE_X");
7026f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_Y, "KEYCODE_Y");
7036f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_Z, "KEYCODE_Z");
7046f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_COMMA, "KEYCODE_COMMA");
7056f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_PERIOD, "KEYCODE_PERIOD");
7066f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_ALT_LEFT, "KEYCODE_ALT_LEFT");
7076f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_ALT_RIGHT, "KEYCODE_ALT_RIGHT");
7086f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_SHIFT_LEFT, "KEYCODE_SHIFT_LEFT");
7096f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_SHIFT_RIGHT, "KEYCODE_SHIFT_RIGHT");
7106f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_TAB, "KEYCODE_TAB");
7116f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_SPACE, "KEYCODE_SPACE");
7126f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_SYM, "KEYCODE_SYM");
7136f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_EXPLORER, "KEYCODE_EXPLORER");
7146f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_ENVELOPE, "KEYCODE_ENVELOPE");
7156f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_ENTER, "KEYCODE_ENTER");
7166f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_DEL, "KEYCODE_DEL");
7176f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_GRAVE, "KEYCODE_GRAVE");
7186f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_MINUS, "KEYCODE_MINUS");
7196f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_EQUALS, "KEYCODE_EQUALS");
7206f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_LEFT_BRACKET, "KEYCODE_LEFT_BRACKET");
7216f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_RIGHT_BRACKET, "KEYCODE_RIGHT_BRACKET");
7226f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BACKSLASH, "KEYCODE_BACKSLASH");
7236f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_SEMICOLON, "KEYCODE_SEMICOLON");
7246f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_APOSTROPHE, "KEYCODE_APOSTROPHE");
7256f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_SLASH, "KEYCODE_SLASH");
7266f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_AT, "KEYCODE_AT");
7276f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_NUM, "KEYCODE_NUM");
7286f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_HEADSETHOOK, "KEYCODE_HEADSETHOOK");
7296f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_FOCUS, "KEYCODE_FOCUS");
7306f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_PLUS, "KEYCODE_PLUS");
7316f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_MENU, "KEYCODE_MENU");
7326f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_NOTIFICATION, "KEYCODE_NOTIFICATION");
7336f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_SEARCH, "KEYCODE_SEARCH");
7346f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_MEDIA_PLAY_PAUSE, "KEYCODE_MEDIA_PLAY_PAUSE");
7356f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_MEDIA_STOP, "KEYCODE_MEDIA_STOP");
7366f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_MEDIA_NEXT, "KEYCODE_MEDIA_NEXT");
7376f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_MEDIA_PREVIOUS, "KEYCODE_MEDIA_PREVIOUS");
7386f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_MEDIA_REWIND, "KEYCODE_MEDIA_REWIND");
7396f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_MEDIA_FAST_FORWARD, "KEYCODE_MEDIA_FAST_FORWARD");
7406f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_MUTE, "KEYCODE_MUTE");
7416f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_PAGE_UP, "KEYCODE_PAGE_UP");
7426f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_PAGE_DOWN, "KEYCODE_PAGE_DOWN");
7436f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_PICTSYMBOLS, "KEYCODE_PICTSYMBOLS");
7446f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_SWITCH_CHARSET, "KEYCODE_SWITCH_CHARSET");
7456f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_A, "KEYCODE_BUTTON_A");
7466f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_B, "KEYCODE_BUTTON_B");
7476f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_C, "KEYCODE_BUTTON_C");
7486f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_X, "KEYCODE_BUTTON_X");
7496f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_Y, "KEYCODE_BUTTON_Y");
7506f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_Z, "KEYCODE_BUTTON_Z");
7516f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_L1, "KEYCODE_BUTTON_L1");
7526f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_R1, "KEYCODE_BUTTON_R1");
7536f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_L2, "KEYCODE_BUTTON_L2");
7546f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_R2, "KEYCODE_BUTTON_R2");
7556f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_THUMBL, "KEYCODE_BUTTON_THUMBL");
7566f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_THUMBR, "KEYCODE_BUTTON_THUMBR");
7576f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_START, "KEYCODE_BUTTON_START");
7586f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_SELECT, "KEYCODE_BUTTON_SELECT");
7596f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_MODE, "KEYCODE_BUTTON_MODE");
7606f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_ESCAPE, "KEYCODE_ESCAPE");
7616f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_FORWARD_DEL, "KEYCODE_FORWARD_DEL");
7626f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_CTRL_LEFT, "KEYCODE_CTRL_LEFT");
7636f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_CTRL_RIGHT, "KEYCODE_CTRL_RIGHT");
7646f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_CAPS_LOCK, "KEYCODE_CAPS_LOCK");
7656f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_SCROLL_LOCK, "KEYCODE_SCROLL_LOCK");
7666f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_META_LEFT, "KEYCODE_META_LEFT");
7676f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_META_RIGHT, "KEYCODE_META_RIGHT");
7686f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_FUNCTION, "KEYCODE_FUNCTION");
7696f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_SYSRQ, "KEYCODE_SYSRQ");
7706f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BREAK, "KEYCODE_BREAK");
7716f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_MOVE_HOME, "KEYCODE_MOVE_HOME");
7726f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_MOVE_END, "KEYCODE_MOVE_END");
7736f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_INSERT, "KEYCODE_INSERT");
7746f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_FORWARD, "KEYCODE_FORWARD");
7756f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_MEDIA_PLAY, "KEYCODE_MEDIA_PLAY");
7766f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_MEDIA_PAUSE, "KEYCODE_MEDIA_PAUSE");
7776f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_MEDIA_CLOSE, "KEYCODE_MEDIA_CLOSE");
7786f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_MEDIA_EJECT, "KEYCODE_MEDIA_EJECT");
7796f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_MEDIA_RECORD, "KEYCODE_MEDIA_RECORD");
7806f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_F1, "KEYCODE_F1");
7816f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_F2, "KEYCODE_F2");
7826f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_F3, "KEYCODE_F3");
7836f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_F4, "KEYCODE_F4");
7846f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_F5, "KEYCODE_F5");
7856f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_F6, "KEYCODE_F6");
7866f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_F7, "KEYCODE_F7");
7876f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_F8, "KEYCODE_F8");
7886f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_F9, "KEYCODE_F9");
7896f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_F10, "KEYCODE_F10");
7906f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_F11, "KEYCODE_F11");
7916f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_F12, "KEYCODE_F12");
7926f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_NUM_LOCK, "KEYCODE_NUM_LOCK");
7936f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_NUMPAD_0, "KEYCODE_NUMPAD_0");
7946f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_NUMPAD_1, "KEYCODE_NUMPAD_1");
7956f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_NUMPAD_2, "KEYCODE_NUMPAD_2");
7966f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_NUMPAD_3, "KEYCODE_NUMPAD_3");
7976f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_NUMPAD_4, "KEYCODE_NUMPAD_4");
7986f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_NUMPAD_5, "KEYCODE_NUMPAD_5");
7996f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_NUMPAD_6, "KEYCODE_NUMPAD_6");
8006f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_NUMPAD_7, "KEYCODE_NUMPAD_7");
8016f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_NUMPAD_8, "KEYCODE_NUMPAD_8");
8026f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_NUMPAD_9, "KEYCODE_NUMPAD_9");
8036f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_NUMPAD_DIVIDE, "KEYCODE_NUMPAD_DIVIDE");
8046f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_NUMPAD_MULTIPLY, "KEYCODE_NUMPAD_MULTIPLY");
8056f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_NUMPAD_SUBTRACT, "KEYCODE_NUMPAD_SUBTRACT");
8066f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_NUMPAD_ADD, "KEYCODE_NUMPAD_ADD");
8076f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_NUMPAD_DOT, "KEYCODE_NUMPAD_DOT");
8086f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_NUMPAD_COMMA, "KEYCODE_NUMPAD_COMMA");
8096f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_NUMPAD_ENTER, "KEYCODE_NUMPAD_ENTER");
8106f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_NUMPAD_EQUALS, "KEYCODE_NUMPAD_EQUALS");
8116f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_NUMPAD_LEFT_PAREN, "KEYCODE_NUMPAD_LEFT_PAREN");
8126f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_NUMPAD_RIGHT_PAREN, "KEYCODE_NUMPAD_RIGHT_PAREN");
8136f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_VOLUME_MUTE, "KEYCODE_VOLUME_MUTE");
8146f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_INFO, "KEYCODE_INFO");
8156f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_CHANNEL_UP, "KEYCODE_CHANNEL_UP");
8166f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_CHANNEL_DOWN, "KEYCODE_CHANNEL_DOWN");
8176f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_ZOOM_IN, "KEYCODE_ZOOM_IN");
8186f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_ZOOM_OUT, "KEYCODE_ZOOM_OUT");
8196f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_TV, "KEYCODE_TV");
8206f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_WINDOW, "KEYCODE_WINDOW");
8216f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_GUIDE, "KEYCODE_GUIDE");
8226f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_DVR, "KEYCODE_DVR");
8236f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BOOKMARK, "KEYCODE_BOOKMARK");
8246f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_CAPTIONS, "KEYCODE_CAPTIONS");
8256f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_SETTINGS, "KEYCODE_SETTINGS");
8266f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_TV_POWER, "KEYCODE_TV_POWER");
8276f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_TV_INPUT, "KEYCODE_TV_INPUT");
8286f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_STB_INPUT, "KEYCODE_STB_INPUT");
8296f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_STB_POWER, "KEYCODE_STB_POWER");
8306f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_AVR_POWER, "KEYCODE_AVR_POWER");
8316f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_AVR_INPUT, "KEYCODE_AVR_INPUT");
8326f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_PROG_RED, "KEYCODE_PROG_RED");
8336f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_PROG_GREEN, "KEYCODE_PROG_GREEN");
8346f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_PROG_YELLOW, "KEYCODE_PROG_YELLOW");
8356f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_PROG_BLUE, "KEYCODE_PROG_BLUE");
8366f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_APP_SWITCH, "KEYCODE_APP_SWITCH");
8376f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_1, "KEYCODE_BUTTON_1");
8386f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_2, "KEYCODE_BUTTON_2");
8396f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_3, "KEYCODE_BUTTON_3");
8406f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_4, "KEYCODE_BUTTON_4");
8416f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_5, "KEYCODE_BUTTON_5");
8426f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_6, "KEYCODE_BUTTON_6");
8436f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_7, "KEYCODE_BUTTON_7");
8446f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_8, "KEYCODE_BUTTON_8");
8456f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_9, "KEYCODE_BUTTON_9");
8466f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_10, "KEYCODE_BUTTON_10");
8476f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_11, "KEYCODE_BUTTON_11");
8486f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_12, "KEYCODE_BUTTON_12");
8496f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_13, "KEYCODE_BUTTON_13");
8506f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_14, "KEYCODE_BUTTON_14");
8516f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_15, "KEYCODE_BUTTON_15");
8526f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        names.append(KEYCODE_BUTTON_16, "KEYCODE_BUTTON_16");
8539812aed2765c671e6c3f5255ac1b8a2fe0e72ef6Jeff Brown        names.append(KEYCODE_LANGUAGE_SWITCH, "KEYCODE_LANGUAGE_SWITCH");
8549812aed2765c671e6c3f5255ac1b8a2fe0e72ef6Jeff Brown        names.append(KEYCODE_MANNER_MODE, "KEYCODE_MANNER_MODE");
8559812aed2765c671e6c3f5255ac1b8a2fe0e72ef6Jeff Brown        names.append(KEYCODE_3D_MODE, "KEYCODE_3D_MODE");
8566651a638348c15e89e265b0a53c775cac9beafa2Jeff Brown        names.append(KEYCODE_CONTACTS, "KEYCODE_CONTACTS");
8576651a638348c15e89e265b0a53c775cac9beafa2Jeff Brown        names.append(KEYCODE_CALENDAR, "KEYCODE_CALENDAR");
8586651a638348c15e89e265b0a53c775cac9beafa2Jeff Brown        names.append(KEYCODE_MUSIC, "KEYCODE_MUSIC");
8596651a638348c15e89e265b0a53c775cac9beafa2Jeff Brown        names.append(KEYCODE_CALCULATOR, "KEYCODE_CALCULATOR");
8607511f9cd2ff39075ff56c2558c785caffc8b4383Yang Chuang        names.append(KEYCODE_ZENKAKU_HANKAKU, "KEYCODE_ZENKAKU_HANKAKU");
8617511f9cd2ff39075ff56c2558c785caffc8b4383Yang Chuang        names.append(KEYCODE_EISU, "KEYCODE_EISU");
8627511f9cd2ff39075ff56c2558c785caffc8b4383Yang Chuang        names.append(KEYCODE_MUHENKAN, "KEYCODE_MUHENKAN");
8637511f9cd2ff39075ff56c2558c785caffc8b4383Yang Chuang        names.append(KEYCODE_HENKAN, "KEYCODE_HENKAN");
8647511f9cd2ff39075ff56c2558c785caffc8b4383Yang Chuang        names.append(KEYCODE_KATAKANA_HIRAGANA, "KEYCODE_KATAKANA_HIRAGANA");
8657511f9cd2ff39075ff56c2558c785caffc8b4383Yang Chuang        names.append(KEYCODE_YEN, "KEYCODE_YEN");
8667511f9cd2ff39075ff56c2558c785caffc8b4383Yang Chuang        names.append(KEYCODE_RO, "KEYCODE_RO");
8677511f9cd2ff39075ff56c2558c785caffc8b4383Yang Chuang        names.append(KEYCODE_KANA, "KEYCODE_KANA");
868de7a8ead2467a4a152a5a9b2416c8048f1b48bbbJeff Brown        names.append(KEYCODE_ASSIST, "KEYCODE_ASSIST");
869497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    };
870497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
871497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    // Symbolic names of all metakeys in bit order from least significant to most significant.
872497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    // Accordingly there are exactly 32 values in this table.
873497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    private static final String[] META_SYMBOLIC_NAMES = new String[] {
874497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "META_SHIFT_ON",
875497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "META_ALT_ON",
876497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "META_SYM_ON",
877497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "META_FUNCTION_ON",
878497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "META_ALT_LEFT_ON",
879497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "META_ALT_RIGHT_ON",
880497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "META_SHIFT_LEFT_ON",
881497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "META_SHIFT_RIGHT_ON",
882497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "META_CAP_LOCKED",
883497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "META_ALT_LOCKED",
884497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "META_SYM_LOCKED",
885497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "0x00000800",
886497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "META_CTRL_ON",
887497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "META_CTRL_LEFT_ON",
888497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "META_CTRL_RIGHT_ON",
889497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "0x00008000",
890497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "META_META_ON",
891497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "META_META_LEFT_ON",
892497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "META_META_RIGHT_ON",
893497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "0x00080000",
89451e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown        "META_CAPS_LOCK_ON",
89551e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown        "META_NUM_LOCK_ON",
89651e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown        "META_SCROLL_LOCK_ON",
897497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "0x00800000",
898497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "0x01000000",
899497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "0x02000000",
900497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "0x04000000",
901497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "0x08000000",
902497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "0x10000000",
903497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "0x20000000",
904497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "0x40000000",
905497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        "0x80000000",
906497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    };
907497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @deprecated There are now more than MAX_KEYCODE keycodes.
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use {@link #getMaxKeyCode()} instead.
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Deprecated
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int MAX_KEYCODE             = 84;
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getAction} value: the key has been pressed down.
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ACTION_DOWN             = 0;
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getAction} value: the key has been released.
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ACTION_UP               = 1;
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getAction} value: multiple duplicate key events have
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * occurred in a row, or a complex string is being delivered.  If the
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * key code is not {#link {@link #KEYCODE_UNKNOWN} then the
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {#link {@link #getRepeatCount()} method returns the number of times
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the given key code should be executed.
92946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown     * Otherwise, if the key code is {@link #KEYCODE_UNKNOWN}, then
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this is a sequence of characters as returned by {@link #getCharacters}.
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ACTION_MULTIPLE         = 2;
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
935497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * SHIFT key locked in CAPS mode.
936497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * Reserved for use by {@link MetaKeyKeyListener} for a published constant in its API.
937497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @hide
938497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     */
939497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int META_CAP_LOCKED = 0x100;
940497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
941497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /**
942497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * ALT key locked.
943497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * Reserved for use by {@link MetaKeyKeyListener} for a published constant in its API.
944497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @hide
945497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     */
946497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int META_ALT_LOCKED = 0x200;
947497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
948497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /**
949497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * SYM key locked.
950497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * Reserved for use by {@link MetaKeyKeyListener} for a published constant in its API.
951497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @hide
952497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     */
953497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int META_SYM_LOCKED = 0x400;
954497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
955497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /**
956497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * Text is in selection mode.
957497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * Reserved for use by {@link MetaKeyKeyListener} for a private unpublished constant
958497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * in its API that is currently being retained for legacy reasons.
959497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @hide
960497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     */
961497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int META_SELECTING = 0x800;
962497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
963497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /**
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This mask is used to check whether one of the ALT meta keys is pressed.</p>
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isAltPressed()
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getMetaState()
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_ALT_LEFT
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_ALT_RIGHT
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int META_ALT_ON = 0x02;
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This mask is used to check whether the left ALT meta key is pressed.</p>
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isAltPressed()
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getMetaState()
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_ALT_LEFT
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int META_ALT_LEFT_ON = 0x10;
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This mask is used to check whether the right the ALT meta key is pressed.</p>
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isAltPressed()
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getMetaState()
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_ALT_RIGHT
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int META_ALT_RIGHT_ON = 0x20;
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This mask is used to check whether one of the SHIFT meta keys is pressed.</p>
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isShiftPressed()
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getMetaState()
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_SHIFT_LEFT
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_SHIFT_RIGHT
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int META_SHIFT_ON = 0x1;
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This mask is used to check whether the left SHIFT meta key is pressed.</p>
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isShiftPressed()
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getMetaState()
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_SHIFT_LEFT
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int META_SHIFT_LEFT_ON = 0x40;
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This mask is used to check whether the right SHIFT meta key is pressed.</p>
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isShiftPressed()
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getMetaState()
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_SHIFT_RIGHT
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int META_SHIFT_RIGHT_ON = 0x80;
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This mask is used to check whether the SYM meta key is pressed.</p>
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isSymPressed()
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getMetaState()
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int META_SYM_ON = 0x4;
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1028497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * <p>This mask is used to check whether the FUNCTION meta key is pressed.</p>
1029497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
1030497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #isFunctionPressed()
1031497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #getMetaState()
1032497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     */
1033497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int META_FUNCTION_ON = 0x8;
1034497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
1035497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /**
1036497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * <p>This mask is used to check whether one of the CTRL meta keys is pressed.</p>
1037497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
1038497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #isCtrlPressed()
1039497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #getMetaState()
1040497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #KEYCODE_CTRL_LEFT
1041497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #KEYCODE_CTRL_RIGHT
1042497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     */
1043497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int META_CTRL_ON = 0x1000;
1044497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
1045497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /**
1046497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * <p>This mask is used to check whether the left CTRL meta key is pressed.</p>
1047497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
1048497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #isCtrlPressed()
1049497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #getMetaState()
1050497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #KEYCODE_CTRL_LEFT
1051497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     */
1052497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int META_CTRL_LEFT_ON = 0x2000;
1053497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
1054497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /**
1055497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * <p>This mask is used to check whether the right CTRL meta key is pressed.</p>
1056497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
1057497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #isCtrlPressed()
1058497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #getMetaState()
1059497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #KEYCODE_CTRL_RIGHT
1060497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     */
1061497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int META_CTRL_RIGHT_ON = 0x4000;
1062497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
1063497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /**
1064497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * <p>This mask is used to check whether one of the META meta keys is pressed.</p>
1065497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
1066497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #isMetaPressed()
1067497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #getMetaState()
1068497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #KEYCODE_META_LEFT
1069497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #KEYCODE_META_RIGHT
1070497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     */
1071497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int META_META_ON = 0x10000;
1072497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
1073497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /**
1074497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * <p>This mask is used to check whether the left META meta key is pressed.</p>
1075497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
1076497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #isMetaPressed()
1077497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #getMetaState()
1078497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #KEYCODE_META_LEFT
1079497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     */
1080497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int META_META_LEFT_ON = 0x20000;
1081497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
1082497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /**
1083497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * <p>This mask is used to check whether the right META meta key is pressed.</p>
1084497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
1085497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #isMetaPressed()
1086497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #getMetaState()
1087497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #KEYCODE_META_RIGHT
1088497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     */
1089497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static final int META_META_RIGHT_ON = 0x40000;
1090497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
1091497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /**
109251e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown     * <p>This mask is used to check whether the CAPS LOCK meta key is on.</p>
1093497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
109451e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown     * @see #isCapsLockOn()
1095497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #getMetaState()
1096497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #KEYCODE_CAPS_LOCK
1097497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     */
109851e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    public static final int META_CAPS_LOCK_ON = 0x100000;
1099497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
1100497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /**
110151e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown     * <p>This mask is used to check whether the NUM LOCK meta key is on.</p>
1102497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
110351e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown     * @see #isNumLockOn()
1104497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #getMetaState()
1105497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #KEYCODE_NUM_LOCK
1106497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     */
110751e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    public static final int META_NUM_LOCK_ON = 0x200000;
1108497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
1109497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /**
111051e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown     * <p>This mask is used to check whether the SCROLL LOCK meta key is on.</p>
1111497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
111251e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown     * @see #isScrollLockOn()
1113497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #getMetaState()
1114497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #KEYCODE_SCROLL_LOCK
1115497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     */
111651e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    public static final int META_SCROLL_LOCK_ON = 0x400000;
1117497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
111864da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown    /**
111964da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     * This mask is a combination of {@link #META_SHIFT_ON}, {@link #META_SHIFT_LEFT_ON}
112064da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     * and {@link #META_SHIFT_RIGHT_ON}.
112164da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     */
1122c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown    public static final int META_SHIFT_MASK = META_SHIFT_ON
1123c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown            | META_SHIFT_LEFT_ON | META_SHIFT_RIGHT_ON;
1124c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown
112564da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown    /**
112664da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     * This mask is a combination of {@link #META_ALT_ON}, {@link #META_ALT_LEFT_ON}
112764da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     * and {@link #META_ALT_RIGHT_ON}.
112864da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     */
1129c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown    public static final int META_ALT_MASK = META_ALT_ON
1130c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown            | META_ALT_LEFT_ON | META_ALT_RIGHT_ON;
1131c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown
113264da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown    /**
113364da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     * This mask is a combination of {@link #META_CTRL_ON}, {@link #META_CTRL_LEFT_ON}
113464da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     * and {@link #META_CTRL_RIGHT_ON}.
113564da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     */
1136c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown    public static final int META_CTRL_MASK = META_CTRL_ON
1137c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown            | META_CTRL_LEFT_ON | META_CTRL_RIGHT_ON;
1138c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown
113964da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown    /**
114064da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     * This mask is a combination of {@link #META_META_ON}, {@link #META_META_LEFT_ON}
114164da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     * and {@link #META_META_RIGHT_ON}.
114264da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown     */
114364da12ab1f472e01325b6c6d094153ac110eaf7bJeff Brown    public static final int META_META_MASK = META_META_ON
1144c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown            | META_META_LEFT_ON | META_META_RIGHT_ON;
1145c1df907e3950fd8d2efac110edd72ea07b3b441eJeff Brown
1146497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /**
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This mask is set if the device woke because of this key event.
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FLAG_WOKE_HERE = 0x1;
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This mask is set if the key event was generated by a software keyboard.
11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FLAG_SOFT_KEYBOARD = 0x2;
11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This mask is set if we don't want the key event to cause us to leave
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * touch mode.
11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FLAG_KEEP_TOUCH_MODE = 0x4;
11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1163105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * This mask is set if an event was known to come from a trusted part
1164105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * of the system.  That is, the event is known to come from the user,
1165105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * and could not have been spoofed by a third party component.
1166105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
1167105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public static final int FLAG_FROM_SYSTEM = 0x8;
1168105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1169105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
1170105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * This mask is used for compatibility, to identify enter keys that are
1171105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * coming from an IME whose enter key has been auto-labelled "next" or
1172105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * "done".  This allows TextView to dispatch these as normal enter keys
1173105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * for old applications, but still do the appropriate action when
1174105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * receiving them.
1175105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
1176105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public static final int FLAG_EDITOR_ACTION = 0x10;
1177105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1178105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
1179ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * When associated with up key events, this indicates that the key press
1180ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * has been canceled.  Typically this is used with virtual touch screen
1181ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * keys, where the user can slide from the virtual key area on to the
1182ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * display: in that case, the application will receive a canceled up
1183ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * event and should not perform the action normally associated with the
1184ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * key.  Note that for this to work, the application can not perform an
1185ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * action for a key until it receives an up or the long press timeout has
1186ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * expired.
1187ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     */
1188ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn    public static final int FLAG_CANCELED = 0x20;
1189ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn
1190ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn    /**
1191ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * This key event was generated by a virtual (on-screen) hard key area.
1192ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * Typically this is an area of the touchscreen, outside of the regular
1193ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * display, dedicated to "hardware" buttons.
1194ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     */
1195ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn    public static final int FLAG_VIRTUAL_HARD_KEY = 0x40;
1196ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn
1197ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn    /**
119883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * This flag is set for the first key repeat that occurs after the
119983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * long press timeout.
120083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     */
120183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public static final int FLAG_LONG_PRESS = 0x80;
120283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
120383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    /**
120483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * Set when a key event has {@link #FLAG_CANCELED} set because a long
120583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * press action was executed while it was down.
120683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     */
120783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public static final int FLAG_CANCELED_LONG_PRESS = 0x100;
120883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
120983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    /**
121083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * Set for {@link #ACTION_UP} when this event's key code is still being
121183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * tracked from its initial down.  That is, somebody requested that tracking
121283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * started on the key down and a long press has not caused
121383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * the tracking to be canceled.
121483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     */
121583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public static final int FLAG_TRACKING = 0x200;
121649ed71db425c5054e3ad9526496a7e116c89556bJeff Brown
121749ed71db425c5054e3ad9526496a7e116c89556bJeff Brown    /**
121849ed71db425c5054e3ad9526496a7e116c89556bJeff Brown     * Set when a key event has been synthesized to implement default behavior
121949ed71db425c5054e3ad9526496a7e116c89556bJeff Brown     * for an event that the application did not handle.
122049ed71db425c5054e3ad9526496a7e116c89556bJeff Brown     * Fallback key events are generated by unhandled trackball motions
122149ed71db425c5054e3ad9526496a7e116c89556bJeff Brown     * (to emulate a directional keypad) and by certain unhandled key presses
122249ed71db425c5054e3ad9526496a7e116c89556bJeff Brown     * that are declared in the key map (such as special function numeric keypad
122349ed71db425c5054e3ad9526496a7e116c89556bJeff Brown     * keys when numlock is off).
122449ed71db425c5054e3ad9526496a7e116c89556bJeff Brown     */
122549ed71db425c5054e3ad9526496a7e116c89556bJeff Brown    public static final int FLAG_FALLBACK = 0x400;
122649ed71db425c5054e3ad9526496a7e116c89556bJeff Brown
122783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    /**
122883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * Private control to determine when an app is tracking a key sequence.
122983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * @hide
123083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     */
123183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public static final int FLAG_START_TRACKING = 0x40000000;
123221bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown
123321bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    /**
123421bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown     * Private flag that indicates when the system has detected that this key event
123521bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown     * may be inconsistent with respect to the sequence of previously delivered key events,
123621bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown     * such as when a key up event is sent but the key was not down.
123721bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown     *
123821bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown     * @hide
123921bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown     * @see #isTainted
124021bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown     * @see #setTainted
124121bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown     */
124221bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    public static final int FLAG_TAINTED = 0x80000000;
124321bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown
124483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    /**
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the maximum keycode.
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static int getMaxKeyCode() {
12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return LAST_KEYCODE;
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Get the character that is produced by putting accent on the character
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * c.
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * For example, getDeadChar('`', 'e') returns &egrave;.
12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static int getDeadChar(int accent, int c) {
12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return KeyCharacterMap.getDeadChar(accent, c);
12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12608d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn    static final boolean DEBUG = false;
12618d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn    static final String TAG = "KeyEvent";
12621f2451007c660091b7b090c1ea332f9044515d2dJeff Brown
12631f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    private static final int MAX_RECYCLED = 10;
12641f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    private static final Object gRecyclerLock = new Object();
12651f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    private static int gRecyclerUsed;
12661f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    private static KeyEvent gRecyclerTop;
12671f2451007c660091b7b090c1ea332f9044515d2dJeff Brown
12681f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    private KeyEvent mNext;
12691f2451007c660091b7b090c1ea332f9044515d2dJeff Brown
127091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    private int mDeviceId;
127191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    private int mSource;
12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mMetaState;
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mAction;
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mKeyCode;
127546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    private int mScanCode;
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mRepeatCount;
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mFlags;
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private long mDownTime;
12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private long mEventTime;
12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String mCharacters;
12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public interface Callback {
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
128483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * Called when a key down event has occurred.  If you return true,
128583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * you can first call {@link KeyEvent#startTracking()
128683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * KeyEvent.startTracking()} to have the framework track the event
128783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * through its {@link #onKeyUp(int, KeyEvent)} and also call your
128883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * {@link #onKeyLongPress(int, KeyEvent)} if it occurs.
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param keyCode The value in event.getKeyCode().
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param event Description of the key event.
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return If you handled the event, return true.  If you want to allow
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *         the event to be handled by the next receiver, return false.
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean onKeyDown(int keyCode, KeyEvent event);
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
129983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * Called when a long press has occurred.  If you return true,
130083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * the final key up will have {@link KeyEvent#FLAG_CANCELED} and
130183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * {@link KeyEvent#FLAG_CANCELED_LONG_PRESS} set.  Note that in
130283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * order to receive this callback, someone in the event change
130383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * <em>must</em> return true from {@link #onKeyDown} <em>and</em>
130483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * call {@link KeyEvent#startTracking()} on the event.
130583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         *
130683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * @param keyCode The value in event.getKeyCode().
130783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * @param event Description of the key event.
130883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         *
130983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * @return If you handled the event, return true.  If you want to allow
131083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         *         the event to be handled by the next receiver, return false.
131183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         */
131283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        boolean onKeyLongPress(int keyCode, KeyEvent event);
131383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
131483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        /**
13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Called when a key up event has occurred.
13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param keyCode The value in event.getKeyCode().
13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param event Description of the key event.
13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return If you handled the event, return true.  If you want to allow
13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *         the event to be handled by the next receiver, return false.
13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean onKeyUp(int keyCode, KeyEvent event);
13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Called when multiple down/up pairs of the same key have occurred
13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * in a row.
13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param keyCode The value in event.getKeyCode().
13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param count Number of pairs as returned by event.getRepeatCount().
13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param event Description of the key event.
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return If you handled the event, return true.  If you want to allow
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *         the event to be handled by the next receiver, return false.
13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean onKeyMultiple(int keyCode, int count, KeyEvent event);
13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1339497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    static {
13406f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        populateKeycodeSymbolicNames();
1341497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    }
1342497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
13431f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    private KeyEvent() {
13441f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    }
13451f2451007c660091b7b090c1ea332f9044515d2dJeff Brown
13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new key event.
13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param action Action code: either {@link #ACTION_DOWN},
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param code The key code.
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public KeyEvent(int action, int code) {
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAction = action;
13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mKeyCode = code;
13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRepeatCount = 0;
13576b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        mDeviceId = KeyCharacterMap.VIRTUAL_KEYBOARD;
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new key event.
13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param downTime The time (in {@link android.os.SystemClock#uptimeMillis})
13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * at which this key code originally went down.
13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param eventTime The time (in {@link android.os.SystemClock#uptimeMillis})
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * at which this event happened.
13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param action Action code: either {@link #ACTION_DOWN},
13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param code The key code.
13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param repeat A repeat count for down events (> 0 if this is after the
13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * initial down) or event count for multiple events.
13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public KeyEvent(long downTime, long eventTime, int action,
13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int code, int repeat) {
13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDownTime = downTime;
13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mEventTime = eventTime;
13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAction = action;
13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mKeyCode = code;
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRepeatCount = repeat;
13806b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        mDeviceId = KeyCharacterMap.VIRTUAL_KEYBOARD;
13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new key event.
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param downTime The time (in {@link android.os.SystemClock#uptimeMillis})
13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * at which this key code originally went down.
13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param eventTime The time (in {@link android.os.SystemClock#uptimeMillis})
13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * at which this event happened.
13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param action Action code: either {@link #ACTION_DOWN},
13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.
13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param code The key code.
13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param repeat A repeat count for down events (> 0 if this is after the
13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * initial down) or event count for multiple events.
13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param metaState Flags indicating which meta keys are currently pressed.
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public KeyEvent(long downTime, long eventTime, int action,
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int code, int repeat, int metaState) {
13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDownTime = downTime;
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mEventTime = eventTime;
14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAction = action;
14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mKeyCode = code;
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRepeatCount = repeat;
14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMetaState = metaState;
14056b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        mDeviceId = KeyCharacterMap.VIRTUAL_KEYBOARD;
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new key event.
14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param downTime The time (in {@link android.os.SystemClock#uptimeMillis})
14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * at which this key code originally went down.
14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param eventTime The time (in {@link android.os.SystemClock#uptimeMillis})
14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * at which this event happened.
14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param action Action code: either {@link #ACTION_DOWN},
14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.
14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param code The key code.
14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param repeat A repeat count for down events (> 0 if this is after the
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * initial down) or event count for multiple events.
14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param metaState Flags indicating which meta keys are currently pressed.
1421c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param deviceId The device ID that generated the key event.
14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param scancode Raw device scan code of the event.
14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public KeyEvent(long downTime, long eventTime, int action,
14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int code, int repeat, int metaState,
1426c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown                    int deviceId, int scancode) {
14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDownTime = downTime;
14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mEventTime = eventTime;
14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAction = action;
14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mKeyCode = code;
14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRepeatCount = repeat;
14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMetaState = metaState;
1433c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mDeviceId = deviceId;
143446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        mScanCode = scancode;
14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new key event.
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param downTime The time (in {@link android.os.SystemClock#uptimeMillis})
14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * at which this key code originally went down.
14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param eventTime The time (in {@link android.os.SystemClock#uptimeMillis})
14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * at which this event happened.
14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param action Action code: either {@link #ACTION_DOWN},
14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.
14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param code The key code.
14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param repeat A repeat count for down events (> 0 if this is after the
14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * initial down) or event count for multiple events.
14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param metaState Flags indicating which meta keys are currently pressed.
1450c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param deviceId The device ID that generated the key event.
14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param scancode Raw device scan code of the event.
14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param flags The flags for this key event
14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public KeyEvent(long downTime, long eventTime, int action,
14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int code, int repeat, int metaState,
1456c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown                    int deviceId, int scancode, int flags) {
14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDownTime = downTime;
14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mEventTime = eventTime;
14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAction = action;
14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mKeyCode = code;
14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRepeatCount = repeat;
14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMetaState = metaState;
1463c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mDeviceId = deviceId;
146446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        mScanCode = scancode;
14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFlags = flags;
14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1469c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Create a new key event.
1470c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
1471c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param downTime The time (in {@link android.os.SystemClock#uptimeMillis})
1472c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * at which this key code originally went down.
1473c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param eventTime The time (in {@link android.os.SystemClock#uptimeMillis})
1474c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * at which this event happened.
1475c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param action Action code: either {@link #ACTION_DOWN},
1476c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.
1477c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param code The key code.
1478c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param repeat A repeat count for down events (> 0 if this is after the
1479c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * initial down) or event count for multiple events.
1480c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param metaState Flags indicating which meta keys are currently pressed.
1481c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param deviceId The device ID that generated the key event.
1482c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param scancode Raw device scan code of the event.
1483c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param flags The flags for this key event
1484c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param source The input source such as {@link InputDevice#SOURCE_KEYBOARD}.
1485c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
1486c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public KeyEvent(long downTime, long eventTime, int action,
1487c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown                    int code, int repeat, int metaState,
1488c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown                    int deviceId, int scancode, int flags, int source) {
1489c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mDownTime = downTime;
1490c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mEventTime = eventTime;
1491c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mAction = action;
1492c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mKeyCode = code;
1493c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mRepeatCount = repeat;
1494c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mMetaState = metaState;
1495c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mDeviceId = deviceId;
1496c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mScanCode = scancode;
1497c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mFlags = flags;
1498c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mSource = source;
1499c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
1500c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
1501c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new key event for a string of characters.  The key code,
1503c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * action, repeat count and source will automatically be set to
1504c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * {@link #KEYCODE_UNKNOWN}, {@link #ACTION_MULTIPLE}, 0, and
1505c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * {@link InputDevice#SOURCE_KEYBOARD} for you.
15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param time The time (in {@link android.os.SystemClock#uptimeMillis})
15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * at which this event occured.
15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param characters The string of characters.
1510c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param deviceId The device ID that generated the key event.
15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param flags The flags for this key event
15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1513c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public KeyEvent(long time, String characters, int deviceId, int flags) {
15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDownTime = time;
15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mEventTime = time;
15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCharacters = characters;
15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAction = ACTION_MULTIPLE;
15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mKeyCode = KEYCODE_UNKNOWN;
15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRepeatCount = 0;
1520c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mDeviceId = deviceId;
15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFlags = flags;
1522c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mSource = InputDevice.SOURCE_KEYBOARD;
15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1526105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * Make an exact copy of an existing key event.
1527105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
1528105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public KeyEvent(KeyEvent origEvent) {
1529105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mDownTime = origEvent.mDownTime;
1530105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mEventTime = origEvent.mEventTime;
1531105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mAction = origEvent.mAction;
1532105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mKeyCode = origEvent.mKeyCode;
1533105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mRepeatCount = origEvent.mRepeatCount;
1534105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mMetaState = origEvent.mMetaState;
1535105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mDeviceId = origEvent.mDeviceId;
1536c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mSource = origEvent.mSource;
153746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        mScanCode = origEvent.mScanCode;
1538105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mFlags = origEvent.mFlags;
1539105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mCharacters = origEvent.mCharacters;
1540105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1541105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1542105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Copy an existing key event, modifying its time and repeat count.
15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
154583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * @deprecated Use {@link #changeTimeRepeat(KeyEvent, long, int)}
154683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * instead.
154783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     *
15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param origEvent The existing event to be copied.
15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param eventTime The new event time
15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * (in {@link android.os.SystemClock#uptimeMillis}) of the event.
15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param newRepeat The new repeat count of the event.
15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
155383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    @Deprecated
15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public KeyEvent(KeyEvent origEvent, long eventTime, int newRepeat) {
15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDownTime = origEvent.mDownTime;
15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mEventTime = eventTime;
15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAction = origEvent.mAction;
15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mKeyCode = origEvent.mKeyCode;
15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRepeatCount = newRepeat;
15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMetaState = origEvent.mMetaState;
15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDeviceId = origEvent.mDeviceId;
1562c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mSource = origEvent.mSource;
156346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        mScanCode = origEvent.mScanCode;
15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFlags = origEvent.mFlags;
15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCharacters = origEvent.mCharacters;
15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15681f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    private static KeyEvent obtain() {
15691f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        final KeyEvent ev;
15701f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        synchronized (gRecyclerLock) {
15711f2451007c660091b7b090c1ea332f9044515d2dJeff Brown            ev = gRecyclerTop;
15721f2451007c660091b7b090c1ea332f9044515d2dJeff Brown            if (ev == null) {
15731f2451007c660091b7b090c1ea332f9044515d2dJeff Brown                return new KeyEvent();
15741f2451007c660091b7b090c1ea332f9044515d2dJeff Brown            }
15751f2451007c660091b7b090c1ea332f9044515d2dJeff Brown            gRecyclerTop = ev.mNext;
15761f2451007c660091b7b090c1ea332f9044515d2dJeff Brown            gRecyclerUsed -= 1;
15771f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        }
15781f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        ev.mNext = null;
157932cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown        ev.prepareForReuse();
15801f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        return ev;
15811f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    }
15821f2451007c660091b7b090c1ea332f9044515d2dJeff Brown
15831f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    /**
15841f2451007c660091b7b090c1ea332f9044515d2dJeff Brown     * Obtains a (potentially recycled) key event.
15851f2451007c660091b7b090c1ea332f9044515d2dJeff Brown     *
15861f2451007c660091b7b090c1ea332f9044515d2dJeff Brown     * @hide
15871f2451007c660091b7b090c1ea332f9044515d2dJeff Brown     */
15881f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    public static KeyEvent obtain(long downTime, long eventTime, int action,
15891f2451007c660091b7b090c1ea332f9044515d2dJeff Brown                    int code, int repeat, int metaState,
15901f2451007c660091b7b090c1ea332f9044515d2dJeff Brown                    int deviceId, int scancode, int flags, int source, String characters) {
15911f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        KeyEvent ev = obtain();
15921f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        ev.mDownTime = downTime;
15931f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        ev.mEventTime = eventTime;
15941f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        ev.mAction = action;
15951f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        ev.mKeyCode = code;
15961f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        ev.mRepeatCount = repeat;
15971f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        ev.mMetaState = metaState;
15981f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        ev.mDeviceId = deviceId;
15991f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        ev.mScanCode = scancode;
16001f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        ev.mFlags = flags;
16011f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        ev.mSource = source;
16021f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        ev.mCharacters = characters;
16031f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        return ev;
16041f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    }
16051f2451007c660091b7b090c1ea332f9044515d2dJeff Brown
16061f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    /**
160721bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown     * Obtains a (potentially recycled) copy of another key event.
160821bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown     *
160921bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown     * @hide
161021bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown     */
161121bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    public static KeyEvent obtain(KeyEvent other) {
161221bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        KeyEvent ev = obtain();
161321bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        ev.mDownTime = other.mDownTime;
161421bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        ev.mEventTime = other.mEventTime;
161521bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        ev.mAction = other.mAction;
161621bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        ev.mKeyCode = other.mKeyCode;
161721bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        ev.mRepeatCount = other.mRepeatCount;
161821bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        ev.mMetaState = other.mMetaState;
161921bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        ev.mDeviceId = other.mDeviceId;
162021bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        ev.mScanCode = other.mScanCode;
162121bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        ev.mFlags = other.mFlags;
162221bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        ev.mSource = other.mSource;
162321bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        ev.mCharacters = other.mCharacters;
162421bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        return ev;
162521bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    }
162621bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown
162721bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    /** @hide */
162821bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    @Override
162921bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    public KeyEvent copy() {
163021bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        return obtain(this);
163121bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    }
163221bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown
163321bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    /**
16341f2451007c660091b7b090c1ea332f9044515d2dJeff Brown     * Recycles a key event.
16351f2451007c660091b7b090c1ea332f9044515d2dJeff Brown     * Key events should only be recycled if they are owned by the system since user
16361f2451007c660091b7b090c1ea332f9044515d2dJeff Brown     * code expects them to be essentially immutable, "tracking" notwithstanding.
16371f2451007c660091b7b090c1ea332f9044515d2dJeff Brown     *
16381f2451007c660091b7b090c1ea332f9044515d2dJeff Brown     * @hide
16391f2451007c660091b7b090c1ea332f9044515d2dJeff Brown     */
164092cc2d8dc35f2bdd1bb95ab24787066371064899Jeff Brown    @Override
16411f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    public final void recycle() {
164232cbc3855c2a971aa5a801fd339fb6a37db91a1aJeff Brown        super.recycle();
16431f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        mCharacters = null;
16441f2451007c660091b7b090c1ea332f9044515d2dJeff Brown
16451f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        synchronized (gRecyclerLock) {
16461f2451007c660091b7b090c1ea332f9044515d2dJeff Brown            if (gRecyclerUsed < MAX_RECYCLED) {
16471f2451007c660091b7b090c1ea332f9044515d2dJeff Brown                gRecyclerUsed++;
16481f2451007c660091b7b090c1ea332f9044515d2dJeff Brown                mNext = gRecyclerTop;
16491f2451007c660091b7b090c1ea332f9044515d2dJeff Brown                gRecyclerTop = this;
16501f2451007c660091b7b090c1ea332f9044515d2dJeff Brown            }
16511f2451007c660091b7b090c1ea332f9044515d2dJeff Brown        }
16521f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    }
16531f2451007c660091b7b090c1ea332f9044515d2dJeff Brown
165492cc2d8dc35f2bdd1bb95ab24787066371064899Jeff Brown    /** @hide */
165592cc2d8dc35f2bdd1bb95ab24787066371064899Jeff Brown    @Override
165692cc2d8dc35f2bdd1bb95ab24787066371064899Jeff Brown    public final void recycleIfNeededAfterDispatch() {
165792cc2d8dc35f2bdd1bb95ab24787066371064899Jeff Brown        // Do nothing.
165892cc2d8dc35f2bdd1bb95ab24787066371064899Jeff Brown    }
165992cc2d8dc35f2bdd1bb95ab24787066371064899Jeff Brown
16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1661105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * Create a new key event that is the same as the given one, but whose
1662105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * event time and repeat count are replaced with the given value.
1663105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     *
1664105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * @param event The existing event to be copied.  This is not modified.
1665105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * @param eventTime The new event time
1666105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * (in {@link android.os.SystemClock#uptimeMillis}) of the event.
1667105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * @param newRepeat The new repeat count of the event.
1668105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
1669105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public static KeyEvent changeTimeRepeat(KeyEvent event, long eventTime,
1670105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            int newRepeat) {
1671105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        return new KeyEvent(event, eventTime, newRepeat);
1672105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1673105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1674105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
167583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * Create a new key event that is the same as the given one, but whose
167683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * event time and repeat count are replaced with the given value.
167783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     *
167883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * @param event The existing event to be copied.  This is not modified.
167983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * @param eventTime The new event time
168083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * (in {@link android.os.SystemClock#uptimeMillis}) of the event.
168183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * @param newRepeat The new repeat count of the event.
168283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * @param newFlags New flags for the event, replacing the entire value
168383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * in the original event.
168483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     */
168583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public static KeyEvent changeTimeRepeat(KeyEvent event, long eventTime,
168683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            int newRepeat, int newFlags) {
168783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        KeyEvent ret = new KeyEvent(event);
168883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        ret.mEventTime = eventTime;
168983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        ret.mRepeatCount = newRepeat;
169083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        ret.mFlags = newFlags;
169183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        return ret;
169283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    }
169383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
169483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    /**
16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Copy an existing key event, modifying its action.
16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param origEvent The existing event to be copied.
16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param action The new action code of the event.
16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1700105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    private KeyEvent(KeyEvent origEvent, int action) {
17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDownTime = origEvent.mDownTime;
17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mEventTime = origEvent.mEventTime;
17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAction = action;
17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mKeyCode = origEvent.mKeyCode;
17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRepeatCount = origEvent.mRepeatCount;
17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMetaState = origEvent.mMetaState;
17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDeviceId = origEvent.mDeviceId;
1708c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mSource = origEvent.mSource;
170946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        mScanCode = origEvent.mScanCode;
17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFlags = origEvent.mFlags;
17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Don't copy mCharacters, since one way or the other we'll lose it
17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // when changing the action.
17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1716105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * Create a new key event that is the same as the given one, but whose
1717105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * action is replaced with the given value.
1718105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     *
1719105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * @param event The existing event to be copied.  This is not modified.
1720105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * @param action The new action code of the event.
1721105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
1722105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public static KeyEvent changeAction(KeyEvent event, int action) {
1723105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        return new KeyEvent(event, action);
1724105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1725105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1726105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
1727105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * Create a new key event that is the same as the given one, but whose
1728105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * flags are replaced with the given value.
1729105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     *
1730105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * @param event The existing event to be copied.  This is not modified.
1731105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * @param flags The new flags constant.
1732105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
1733105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public static KeyEvent changeFlags(KeyEvent event, int flags) {
1734105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        event = new KeyEvent(event);
1735105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        event.mFlags = flags;
1736105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        return event;
1737105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
173821bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown
173921bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    /** @hide */
174021bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    @Override
174121bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    public final boolean isTainted() {
174221bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        return (mFlags & FLAG_TAINTED) != 0;
174321bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    }
174421bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown
174521bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    /** @hide */
174621bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    @Override
174721bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    public final void setTainted(boolean tainted) {
174821bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown        mFlags = tainted ? mFlags | FLAG_TAINTED : mFlags & ~FLAG_TAINTED;
174921bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown    }
175021bc5c917d4ee2a9b2b8173091e6bba85eaff899Jeff Brown
1751105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Don't use in new code, instead explicitly check
17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getAction()}.
17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return If the action is ACTION_DOWN, returns true; else false.
17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @deprecated
17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Deprecated public final boolean isDown() {
17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mAction == ACTION_DOWN;
17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Is this a system key?  System keys can not be used for menu shortcuts.
17669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * TODO: this information should come from a table somewhere.
17689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * TODO: should the dpad keys be here?  arguably, because they also shouldn't be menu shortcuts
17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final boolean isSystem() {
17713c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn        return native_isSystemKey(mKeyCode);
17723c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn    }
17733c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn
17743c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn    /** @hide */
17753c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn    public final boolean hasDefaultAction() {
17763c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn        return native_hasDefaultAction(mKeyCode);
17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17796f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    /**
17806f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown     * Returns true if the specified keycode is a gamepad button.
17816f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown     * @return True if the keycode is a gamepad button, such as {@link #KEYCODE_BUTTON_A}.
17826f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown     */
17836f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    public static final boolean isGamepadButton(int keyCode) {
17846f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        switch (keyCode) {
17856f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_A:
17866f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_B:
17876f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_C:
17886f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_X:
17896f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_Y:
17906f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_Z:
17916f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_L1:
17926f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_R1:
17936f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_L2:
17946f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_R2:
17956f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_THUMBL:
17966f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_THUMBR:
17976f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_START:
17986f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_SELECT:
17996f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_MODE:
18006f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_1:
18016f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_2:
18026f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_3:
18036f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_4:
18046f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_5:
18056f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_6:
18066f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_7:
18076f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_8:
18086f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_9:
18096f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_10:
18106f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_11:
18116f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_12:
18126f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_13:
18136f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_14:
18146f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_15:
18156f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            case KeyEvent.KEYCODE_BUTTON_16:
18166f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown                return true;
18176f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            default:
18186f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown                return false;
18196f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        }
18206f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown    }
18216f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown
182291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    /** {@inheritDoc} */
182391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Override
182491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public final int getDeviceId() {
182591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return mDeviceId;
182691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
182791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
182891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    /** {@inheritDoc} */
182991c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Override
183091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public final int getSource() {
183191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        return mSource;
183291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
183391c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
183491c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    /** {@inheritDoc} */
183591c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    @Override
183691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    public final void setSource(int source) {
183791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        mSource = source;
183891c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown    }
18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Returns the state of the meta keys.</p>
18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return an integer in which each bit set to 1 represents a pressed
18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         meta key
18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isAltPressed()
18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isShiftPressed()
18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isSymPressed()
1849497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #isCtrlPressed()
1850497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #isMetaPressed()
1851497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #isFunctionPressed()
185251e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown     * @see #isCapsLockOn()
185351e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown     * @see #isNumLockOn()
185451e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown     * @see #isScrollLockOn()
18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #META_ALT_ON
1856497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #META_ALT_LEFT_ON
1857497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #META_ALT_RIGHT_ON
18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #META_SHIFT_ON
1859497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #META_SHIFT_LEFT_ON
1860497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #META_SHIFT_RIGHT_ON
18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #META_SYM_ON
1862497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #META_FUNCTION_ON
1863497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #META_CTRL_ON
1864497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #META_CTRL_LEFT_ON
1865497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #META_CTRL_RIGHT_ON
1866497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #META_META_ON
1867497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #META_META_LEFT_ON
1868497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #META_META_RIGHT_ON
186951e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown     * @see #META_CAPS_LOCK_ON
187051e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown     * @see #META_NUM_LOCK_ON
187151e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown     * @see #META_SCROLL_LOCK_ON
18725487500cf3d9f6d7703ce0704cb91837aa95d716Jeff Brown     * @see #getModifiers
18739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
18749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getMetaState() {
18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mMetaState;
18769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
18795487500cf3d9f6d7703ce0704cb91837aa95d716Jeff Brown     * Returns the state of the modifier keys.
18805487500cf3d9f6d7703ce0704cb91837aa95d716Jeff Brown     * <p>
18815487500cf3d9f6d7703ce0704cb91837aa95d716Jeff Brown     * For the purposes of this function, {@link #KEYCODE_CAPS_LOCK},
18825487500cf3d9f6d7703ce0704cb91837aa95d716Jeff Brown     * {@link #KEYCODE_SCROLL_LOCK}, and {@link #KEYCODE_NUM_LOCK} are
18835487500cf3d9f6d7703ce0704cb91837aa95d716Jeff Brown     * not considered modifier keys.  Consequently, this function specifically masks out
18845487500cf3d9f6d7703ce0704cb91837aa95d716Jeff Brown     * {@link #META_CAPS_LOCK_ON}, {@link #META_SCROLL_LOCK_ON} and {@link #META_NUM_LOCK_ON}.
18855487500cf3d9f6d7703ce0704cb91837aa95d716Jeff Brown     * </p><p>
18865487500cf3d9f6d7703ce0704cb91837aa95d716Jeff Brown     * The value returned consists of the meta state (from {@link #getMetaState})
18875487500cf3d9f6d7703ce0704cb91837aa95d716Jeff Brown     * normalized using {@link #normalizeMetaState(int)} and then masked with
18885487500cf3d9f6d7703ce0704cb91837aa95d716Jeff Brown     * {@link #getModifierMetaStateMask} so that only valid modifier bits are retained.
18895487500cf3d9f6d7703ce0704cb91837aa95d716Jeff Brown     * </p>
18905487500cf3d9f6d7703ce0704cb91837aa95d716Jeff Brown     *
18915487500cf3d9f6d7703ce0704cb91837aa95d716Jeff Brown     * @return An integer in which each bit set to 1 represents a pressed modifier key.
18925487500cf3d9f6d7703ce0704cb91837aa95d716Jeff Brown     * @see #getMetaState
18935487500cf3d9f6d7703ce0704cb91837aa95d716Jeff Brown     */
18945487500cf3d9f6d7703ce0704cb91837aa95d716Jeff Brown    public final int getModifiers() {
18955487500cf3d9f6d7703ce0704cb91837aa95d716Jeff Brown        return normalizeMetaState(mMetaState) & META_MODIFIER_MASK;
18965487500cf3d9f6d7703ce0704cb91837aa95d716Jeff Brown    }
18975487500cf3d9f6d7703ce0704cb91837aa95d716Jeff Brown
18985487500cf3d9f6d7703ce0704cb91837aa95d716Jeff Brown    /**
18999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the flags for this key event.
19009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
19019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #FLAG_WOKE_HERE
19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
19039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getFlags() {
19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mFlags;
19059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
190728cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    // Mask of all modifier key meta states.  Specifically excludes locked keys like caps lock.
190828cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    private static final int META_MODIFIER_MASK =
190928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown            META_SHIFT_ON | META_SHIFT_LEFT_ON | META_SHIFT_RIGHT_ON
191028cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown            | META_ALT_ON | META_ALT_LEFT_ON | META_ALT_RIGHT_ON
191128cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown            | META_CTRL_ON | META_CTRL_LEFT_ON | META_CTRL_RIGHT_ON
191228cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown            | META_META_ON | META_META_LEFT_ON | META_META_RIGHT_ON
191328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown            | META_SYM_ON | META_FUNCTION_ON;
191428cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown
191528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    // Mask of all lock key meta states.
191628cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    private static final int META_LOCK_MASK =
191728cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown            META_CAPS_LOCK_ON | META_NUM_LOCK_ON | META_SCROLL_LOCK_ON;
191828cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown
191928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    // Mask of all valid meta states.
192028cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    private static final int META_ALL_MASK = META_MODIFIER_MASK | META_LOCK_MASK;
192128cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown
192228cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    // Mask of all synthetic meta states that are reserved for API compatibility with
192328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    // historical uses in MetaKeyKeyListener.
192428cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    private static final int META_SYNTHETIC_MASK =
192528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown            META_CAP_LOCKED | META_ALT_LOCKED | META_SYM_LOCKED | META_SELECTING;
192628cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown
192728cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    // Mask of all meta states that are not valid use in specifying a modifier key.
192828cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    // These bits are known to be used for purposes other than specifying modifiers.
192928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    private static final int META_INVALID_MODIFIER_MASK =
193028cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown            META_LOCK_MASK | META_SYNTHETIC_MASK;
193128cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown
193228cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    /**
193328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * Gets a mask that includes all valid modifier key meta state bits.
193428cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * <p>
193528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * For the purposes of this function, {@link #KEYCODE_CAPS_LOCK},
193628cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link #KEYCODE_SCROLL_LOCK}, and {@link #KEYCODE_NUM_LOCK} are
193728cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * not considered modifier keys.  Consequently, the mask specifically excludes
193828cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link #META_CAPS_LOCK_ON}, {@link #META_SCROLL_LOCK_ON} and {@link #META_NUM_LOCK_ON}.
193928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * </p>
194028cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     *
194128cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * @return The modifier meta state mask which is a combination of
194228cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link #META_SHIFT_ON}, {@link #META_SHIFT_LEFT_ON}, {@link #META_SHIFT_RIGHT_ON},
194328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link #META_ALT_ON}, {@link #META_ALT_LEFT_ON}, {@link #META_ALT_RIGHT_ON},
194428cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link #META_CTRL_ON}, {@link #META_CTRL_LEFT_ON}, {@link #META_CTRL_RIGHT_ON},
194528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link #META_META_ON}, {@link #META_META_LEFT_ON}, {@link #META_META_RIGHT_ON},
194628cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link #META_SYM_ON}, {@link #META_FUNCTION_ON}.
194728cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     */
194828cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    public static int getModifierMetaStateMask() {
194928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        return META_MODIFIER_MASK;
195028cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    }
195128cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown
19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
19539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns true if this key code is a modifier key.
195428cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * <p>
195528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * For the purposes of this function, {@link #KEYCODE_CAPS_LOCK},
195628cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link #KEYCODE_SCROLL_LOCK}, and {@link #KEYCODE_NUM_LOCK} are
195728cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * not considered modifier keys.  Consequently, this function return false
195828cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * for those keys.
195928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * </p>
19609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
196128cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * @return True if the key code is one of
19629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #KEYCODE_SHIFT_LEFT} {@link #KEYCODE_SHIFT_RIGHT},
1963497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * {@link #KEYCODE_ALT_LEFT}, {@link #KEYCODE_ALT_RIGHT},
1964497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * {@link #KEYCODE_CTRL_LEFT}, {@link #KEYCODE_CTRL_RIGHT},
196528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link #KEYCODE_META_LEFT}, or {@link #KEYCODE_META_RIGHT},
196628cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link #KEYCODE_SYM}, {@link #KEYCODE_NUM}, {@link #KEYCODE_FUNCTION}.
19679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
19689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static boolean isModifierKey(int keyCode) {
1969497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        switch (keyCode) {
1970497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown            case KEYCODE_SHIFT_LEFT:
1971497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown            case KEYCODE_SHIFT_RIGHT:
1972497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown            case KEYCODE_ALT_LEFT:
1973497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown            case KEYCODE_ALT_RIGHT:
1974497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown            case KEYCODE_CTRL_LEFT:
1975497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown            case KEYCODE_CTRL_RIGHT:
1976497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown            case KEYCODE_META_LEFT:
1977497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown            case KEYCODE_META_RIGHT:
197828cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown            case KEYCODE_SYM:
197928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown            case KEYCODE_NUM:
198028cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown            case KEYCODE_FUNCTION:
1981497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown                return true;
1982497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown            default:
1983497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown                return false;
1984497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        }
19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
198828cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * Normalizes the specified meta state.
198928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * <p>
199028cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * The meta state is normalized such that if either the left or right modifier meta state
199128cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * bits are set then the result will also include the universal bit for that modifier.
199228cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * </p><p>
199328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * If the specified meta state contains {@link #META_ALT_LEFT_ON} then
199428cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * the result will also contain {@link #META_ALT_ON} in addition to {@link #META_ALT_LEFT_ON}
199528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * and the other bits that were specified in the input.  The same is process is
199628cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * performed for shift, control and meta.
199728cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * </p><p>
199828cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * If the specified meta state contains synthetic meta states defined by
199928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link MetaKeyKeyListener}, then those states are translated here and the original
200028cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * synthetic meta states are removed from the result.
200128cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link MetaKeyKeyListener#META_CAP_LOCKED} is translated to {@link #META_CAPS_LOCK_ON}.
200228cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link MetaKeyKeyListener#META_ALT_LOCKED} is translated to {@link #META_ALT_ON}.
200328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link MetaKeyKeyListener#META_SYM_LOCKED} is translated to {@link #META_SYM_ON}.
200428cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * </p><p>
200528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * Undefined meta state bits are removed.
200628cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * </p>
200728cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     *
200828cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * @param metaState The meta state.
200928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * @return The normalized meta state.
201028cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     */
201128cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    public static int normalizeMetaState(int metaState) {
201228cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        if ((metaState & (META_SHIFT_LEFT_ON | META_SHIFT_RIGHT_ON)) != 0) {
201328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown            metaState |= META_SHIFT_ON;
201428cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        }
201528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        if ((metaState & (META_ALT_LEFT_ON | META_ALT_RIGHT_ON)) != 0) {
201628cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown            metaState |= META_ALT_ON;
201728cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        }
201828cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        if ((metaState & (META_CTRL_LEFT_ON | META_CTRL_RIGHT_ON)) != 0) {
201928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown            metaState |= META_CTRL_ON;
202028cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        }
202128cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        if ((metaState & (META_META_LEFT_ON | META_META_RIGHT_ON)) != 0) {
202228cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown            metaState |= META_META_ON;
202328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        }
202428cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        if ((metaState & MetaKeyKeyListener.META_CAP_LOCKED) != 0) {
202528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown            metaState |= META_CAPS_LOCK_ON;
202628cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        }
202728cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        if ((metaState & MetaKeyKeyListener.META_ALT_LOCKED) != 0) {
202828cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown            metaState |= META_ALT_ON;
202928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        }
203028cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        if ((metaState & MetaKeyKeyListener.META_SYM_LOCKED) != 0) {
203128cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown            metaState |= META_SYM_ON;
203228cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        }
203328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        return metaState & META_ALL_MASK;
203428cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    }
203528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown
203628cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    /**
203728cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * Returns true if no modifiers keys are pressed according to the specified meta state.
203828cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * <p>
203928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * For the purposes of this function, {@link #KEYCODE_CAPS_LOCK},
204028cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link #KEYCODE_SCROLL_LOCK}, and {@link #KEYCODE_NUM_LOCK} are
204128cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * not considered modifier keys.  Consequently, this function ignores
204228cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link #META_CAPS_LOCK_ON}, {@link #META_SCROLL_LOCK_ON} and {@link #META_NUM_LOCK_ON}.
204328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * </p><p>
204428cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * The meta state is normalized prior to comparison using {@link #normalizeMetaState(int)}.
204528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * </p>
204628cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     *
204728cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * @param metaState The meta state to consider.
204828cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * @return True if no modifier keys are pressed.
204928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * @see #hasNoModifiers()
205028cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     */
205128cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    public static boolean metaStateHasNoModifiers(int metaState) {
205228cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        return (normalizeMetaState(metaState) & META_MODIFIER_MASK) == 0;
205328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    }
205428cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown
205528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    /**
205628cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * Returns true if only the specified modifier keys are pressed according to
205728cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * the specified meta state.  Returns false if a different combination of modifier
205828cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * keys are pressed.
205928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * <p>
206028cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * For the purposes of this function, {@link #KEYCODE_CAPS_LOCK},
206128cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link #KEYCODE_SCROLL_LOCK}, and {@link #KEYCODE_NUM_LOCK} are
206228cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * not considered modifier keys.  Consequently, this function ignores
206328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link #META_CAPS_LOCK_ON}, {@link #META_SCROLL_LOCK_ON} and {@link #META_NUM_LOCK_ON}.
206428cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * </p><p>
206528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * If the specified modifier mask includes directional modifiers, such as
206628cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link #META_SHIFT_LEFT_ON}, then this method ensures that the
206728cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * modifier is pressed on that side.
206828cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * If the specified modifier mask includes non-directional modifiers, such as
206928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link #META_SHIFT_ON}, then this method ensures that the modifier
207028cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * is pressed on either side.
207128cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * If the specified modifier mask includes both directional and non-directional modifiers
207228cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * for the same type of key, such as {@link #META_SHIFT_ON} and {@link #META_SHIFT_LEFT_ON},
207328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * then this method throws an illegal argument exception.
207428cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * </p>
207528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     *
207628cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * @param metaState The meta state to consider.
207728cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * @param modifiers The meta state of the modifier keys to check.  May be a combination
207828cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * of modifier meta states as defined by {@link #getModifierMetaStateMask()}.  May be 0 to
207928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * ensure that no modifier keys are pressed.
208028cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * @return True if only the specified modifier keys are pressed.
208128cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * @throws IllegalArgumentException if the modifiers parameter contains invalid modifiers
208228cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * @see #hasModifiers
208328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     */
208428cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    public static boolean metaStateHasModifiers(int metaState, int modifiers) {
208528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        // Note: For forward compatibility, we allow the parameter to contain meta states
208628cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        //       that we do not recognize but we explicitly disallow meta states that
208728cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        //       are not valid modifiers.
208828cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        if ((modifiers & META_INVALID_MODIFIER_MASK) != 0) {
208928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown            throw new IllegalArgumentException("modifiers must not contain "
209028cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown                    + "META_CAPS_LOCK_ON, META_NUM_LOCK_ON, META_SCROLL_LOCK_ON, "
209128cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown                    + "META_CAP_LOCKED, META_ALT_LOCKED, META_SYM_LOCKED, "
209228cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown                    + "or META_SELECTING");
209328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        }
209428cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown
209528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        metaState = normalizeMetaState(metaState) & META_MODIFIER_MASK;
209628cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        metaState = metaStateFilterDirectionalModifiers(metaState, modifiers,
209728cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown                META_SHIFT_ON, META_SHIFT_LEFT_ON, META_SHIFT_RIGHT_ON);
209828cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        metaState = metaStateFilterDirectionalModifiers(metaState, modifiers,
209928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown                META_ALT_ON, META_ALT_LEFT_ON, META_ALT_RIGHT_ON);
210028cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        metaState = metaStateFilterDirectionalModifiers(metaState, modifiers,
210128cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown                META_CTRL_ON, META_CTRL_LEFT_ON, META_CTRL_RIGHT_ON);
210228cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        metaState = metaStateFilterDirectionalModifiers(metaState, modifiers,
210328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown                META_META_ON, META_META_LEFT_ON, META_META_RIGHT_ON);
210428cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        return metaState == modifiers;
210528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    }
210628cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown
210728cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    private static int metaStateFilterDirectionalModifiers(int metaState,
210828cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown            int modifiers, int basic, int left, int right) {
210928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        final boolean wantBasic = (modifiers & basic) != 0;
211028cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        final int directional = left | right;
211128cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        final boolean wantLeftOrRight = (modifiers & directional) != 0;
211228cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown
211328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        if (wantBasic) {
211428cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown            if (wantLeftOrRight) {
211528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown                throw new IllegalArgumentException("modifiers must not contain "
211628cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown                        + metaStateToString(basic) + " combined with "
211728cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown                        + metaStateToString(left) + " or " + metaStateToString(right));
211828cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown            }
211928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown            return metaState & ~directional;
212028cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        } else if (wantLeftOrRight) {
212128cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown            return metaState & ~basic;
212228cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        } else {
212328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown            return metaState;
212428cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        }
212528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    }
212628cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown
212728cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    /**
212828cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * Returns true if no modifier keys are pressed.
212928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * <p>
213028cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * For the purposes of this function, {@link #KEYCODE_CAPS_LOCK},
213128cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link #KEYCODE_SCROLL_LOCK}, and {@link #KEYCODE_NUM_LOCK} are
213228cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * not considered modifier keys.  Consequently, this function ignores
213328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link #META_CAPS_LOCK_ON}, {@link #META_SCROLL_LOCK_ON} and {@link #META_NUM_LOCK_ON}.
213428cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * </p><p>
213528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * The meta state is normalized prior to comparison using {@link #normalizeMetaState(int)}.
213628cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * </p>
213728cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     *
213828cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * @return True if no modifier keys are pressed.
213928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * @see #metaStateHasNoModifiers
214028cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     */
214128cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    public final boolean hasNoModifiers() {
214228cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        return metaStateHasNoModifiers(mMetaState);
214328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    }
214428cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown
214528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    /**
214628cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * Returns true if only the specified modifiers keys are pressed.
214728cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * Returns false if a different combination of modifier keys are pressed.
214828cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * <p>
214928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * For the purposes of this function, {@link #KEYCODE_CAPS_LOCK},
215028cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link #KEYCODE_SCROLL_LOCK}, and {@link #KEYCODE_NUM_LOCK} are
215128cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * not considered modifier keys.  Consequently, this function ignores
215228cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link #META_CAPS_LOCK_ON}, {@link #META_SCROLL_LOCK_ON} and {@link #META_NUM_LOCK_ON}.
215328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * </p><p>
215428cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * If the specified modifier mask includes directional modifiers, such as
215528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link #META_SHIFT_LEFT_ON}, then this method ensures that the
215628cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * modifier is pressed on that side.
215728cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * If the specified modifier mask includes non-directional modifiers, such as
215828cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * {@link #META_SHIFT_ON}, then this method ensures that the modifier
215928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * is pressed on either side.
216028cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * If the specified modifier mask includes both directional and non-directional modifiers
216128cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * for the same type of key, such as {@link #META_SHIFT_ON} and {@link #META_SHIFT_LEFT_ON},
216228cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * then this method throws an illegal argument exception.
216328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * </p>
216428cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     *
216528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * @param modifiers The meta state of the modifier keys to check.  May be a combination
216628cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * of modifier meta states as defined by {@link #getModifierMetaStateMask()}.  May be 0 to
216728cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * ensure that no modifier keys are pressed.
216828cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * @return True if only the specified modifier keys are pressed.
216928cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * @throws IllegalArgumentException if the modifiers parameter contains invalid modifiers
217028cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     * @see #metaStateHasModifiers
217128cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown     */
217228cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    public final boolean hasModifiers(int modifiers) {
217328cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown        return metaStateHasModifiers(mMetaState, modifiers);
217428cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    }
217528cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown
217628cbf4bd5c204f0493a6fa448a259ec056dcc29eJeff Brown    /**
21779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Returns the pressed state of the ALT meta key.</p>
21789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the ALT key is pressed, false otherwise
21809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
21819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_ALT_LEFT
21829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_ALT_RIGHT
21839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #META_ALT_ON
21849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
21859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final boolean isAltPressed() {
21869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (mMetaState & META_ALT_ON) != 0;
21879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
21909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Returns the pressed state of the SHIFT meta key.</p>
21919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
21929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the SHIFT key is pressed, false otherwise
21939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
21949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_SHIFT_LEFT
21959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_SHIFT_RIGHT
21969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #META_SHIFT_ON
21979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
21989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final boolean isShiftPressed() {
21999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (mMetaState & META_SHIFT_ON) != 0;
22009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
22039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Returns the pressed state of the SYM meta key.</p>
22049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the SYM key is pressed, false otherwise
22069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_SYM
22089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #META_SYM_ON
22099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
22109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final boolean isSymPressed() {
22119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (mMetaState & META_SYM_ON) != 0;
22129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2215497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * <p>Returns the pressed state of the CTRL meta key.</p>
2216497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
2217497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @return true if the CTRL key is pressed, false otherwise
2218497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
2219497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #KEYCODE_CTRL_LEFT
2220497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #KEYCODE_CTRL_RIGHT
2221497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #META_CTRL_ON
2222497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     */
2223497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public final boolean isCtrlPressed() {
2224497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        return (mMetaState & META_CTRL_ON) != 0;
2225497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    }
2226497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
2227497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /**
2228497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * <p>Returns the pressed state of the META meta key.</p>
2229497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
2230497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @return true if the META key is pressed, false otherwise
2231497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
2232497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #KEYCODE_META_LEFT
2233497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #KEYCODE_META_RIGHT
2234497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #META_META_ON
2235497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     */
2236497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public final boolean isMetaPressed() {
2237497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        return (mMetaState & META_META_ON) != 0;
2238497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    }
2239497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
2240497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /**
2241497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * <p>Returns the pressed state of the FUNCTION meta key.</p>
2242497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
2243497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @return true if the FUNCTION key is pressed, false otherwise
2244497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
2245497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #KEYCODE_FUNCTION
2246497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #META_FUNCTION_ON
2247497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     */
2248497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public final boolean isFunctionPressed() {
2249497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        return (mMetaState & META_FUNCTION_ON) != 0;
2250497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    }
2251497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
2252497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /**
225351e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown     * <p>Returns the locked state of the CAPS LOCK meta key.</p>
2254497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
225551e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown     * @return true if the CAPS LOCK key is on, false otherwise
2256497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
2257497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #KEYCODE_CAPS_LOCK
225851e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown     * @see #META_CAPS_LOCK_ON
2259497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     */
226051e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    public final boolean isCapsLockOn() {
226151e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown        return (mMetaState & META_CAPS_LOCK_ON) != 0;
2262497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    }
2263497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
2264497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /**
226551e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown     * <p>Returns the locked state of the NUM LOCK meta key.</p>
2266497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
226751e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown     * @return true if the NUM LOCK key is on, false otherwise
2268497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
2269497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #KEYCODE_NUM_LOCK
227051e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown     * @see #META_NUM_LOCK_ON
2271497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     */
227251e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    public final boolean isNumLockOn() {
227351e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown        return (mMetaState & META_NUM_LOCK_ON) != 0;
2274497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    }
2275497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
2276497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /**
227751e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown     * <p>Returns the locked state of the SCROLL LOCK meta key.</p>
2278497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
227951e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown     * @return true if the SCROLL LOCK key is on, false otherwise
2280497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
2281497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #KEYCODE_SCROLL_LOCK
228251e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown     * @see #META_SCROLL_LOCK_ON
2283497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     */
228451e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown    public final boolean isScrollLockOn() {
228551e7fe7545e3509ebb5c31c10440acd31cec89a2Jeff Brown        return (mMetaState & META_SCROLL_LOCK_ON) != 0;
2286497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    }
2287497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
2288497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /**
22899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the action of this key event.  May be either
22909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #ACTION_DOWN}, {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.
22919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
22929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The event action: ACTION_DOWN, ACTION_UP, or ACTION_MULTIPLE.
22939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
22949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getAction() {
22959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mAction;
22969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2299ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * For {@link #ACTION_UP} events, indicates that the event has been
2300ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * canceled as per {@link #FLAG_CANCELED}.
2301ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     */
2302ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn    public final boolean isCanceled() {
2303ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn        return (mFlags&FLAG_CANCELED) != 0;
2304ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn    }
2305ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn
2306ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn    /**
230783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * Call this during {@link Callback#onKeyDown} to have the system track
230883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * the key through its final up (possibly including a long press).  Note
230983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * that only one key can be tracked at a time -- if another key down
231083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * event is received while a previous one is being tracked, tracking is
231183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * stopped on the previous event.
231283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     */
231383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public final void startTracking() {
231483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        mFlags |= FLAG_START_TRACKING;
231583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    }
231683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
231783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    /**
231883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * For {@link #ACTION_UP} events, indicates that the event is still being
231983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * tracked from its initial down event as per
232083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * {@link #FLAG_TRACKING}.
232183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     */
232283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public final boolean isTracking() {
232383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        return (mFlags&FLAG_TRACKING) != 0;
232483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    }
232583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
232683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    /**
232783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * For {@link #ACTION_DOWN} events, indicates that the event has been
232883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * canceled as per {@link #FLAG_LONG_PRESS}.
232983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     */
233083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public final boolean isLongPress() {
233183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        return (mFlags&FLAG_LONG_PRESS) != 0;
233283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    }
233383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
233483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    /**
23359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the key code of the key event.  This is the physical key that
23369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * was pressed, <em>not</em> the Unicode character.
23379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The key code of the event.
23399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
23409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getKeyCode() {
23419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mKeyCode;
23429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
23459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * For the special case of a {@link #ACTION_MULTIPLE} event with key
23469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * code of {@link #KEYCODE_UNKNOWN}, this is a raw string of characters
23479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * associated with the event.  In all other cases it is null.
23489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns a String of 1 or more characters associated with
23509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the event.
23519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
23529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final String getCharacters() {
23539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mCharacters;
23549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
23579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the hardware key id of this key event.  These values are not
23589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * reliable and vary from device to device.
23599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@more}
23619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Mostly this is here for debugging purposes.
23629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
23639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getScanCode() {
236446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        return mScanCode;
23659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
23689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the repeat count of the event.  For both key up and key down
23699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * events, this is the number of times the key has repeated with the first
23709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * down starting at 0 and counting up from there.  For multiple key
23719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * events, this is the number of down/up pairs that have occurred.
23729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The number of times the key has repeated.
23749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
23759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getRepeatCount() {
23769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mRepeatCount;
23779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
23809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the time of the most recent key down event,
23819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in the {@link android.os.SystemClock#uptimeMillis} time base.  If this
23829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is a down event, this will be the same as {@link #getEventTime()}.
23839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Note that when chording keys, this value is the down time of the
23849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * most recently pressed key, which may <em>not</em> be the same physical
23859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * key of this event.
23869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the most recent key down time, in the
23889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.os.SystemClock#uptimeMillis} time base
23899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
23909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final long getDownTime() {
23919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mDownTime;
23929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2395b11499d2db0ba9782363ec6bf714b583e8585212Jeff Brown     * Retrieve the time this event occurred,
23969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in the {@link android.os.SystemClock#uptimeMillis} time base.
2397b11499d2db0ba9782363ec6bf714b583e8585212Jeff Brown     *
23989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the time this event occurred,
23999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in the {@link android.os.SystemClock#uptimeMillis} time base.
24009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2401b11499d2db0ba9782363ec6bf714b583e8585212Jeff Brown    @Override
24029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final long getEventTime() {
24039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mEventTime;
24049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2406b11499d2db0ba9782363ec6bf714b583e8585212Jeff Brown    /**
2407b11499d2db0ba9782363ec6bf714b583e8585212Jeff Brown     * Retrieve the time this event occurred,
2408b11499d2db0ba9782363ec6bf714b583e8585212Jeff Brown     * in the {@link android.os.SystemClock#uptimeMillis} time base but with
2409b11499d2db0ba9782363ec6bf714b583e8585212Jeff Brown     * nanosecond (instead of millisecond) precision.
2410b11499d2db0ba9782363ec6bf714b583e8585212Jeff Brown     * <p>
2411b11499d2db0ba9782363ec6bf714b583e8585212Jeff Brown     * The value is in nanosecond precision but it may not have nanosecond accuracy.
2412b11499d2db0ba9782363ec6bf714b583e8585212Jeff Brown     * </p>
2413b11499d2db0ba9782363ec6bf714b583e8585212Jeff Brown     *
2414b11499d2db0ba9782363ec6bf714b583e8585212Jeff Brown     * @return Returns the time this event occurred,
2415b11499d2db0ba9782363ec6bf714b583e8585212Jeff Brown     * in the {@link android.os.SystemClock#uptimeMillis} time base but with
2416b11499d2db0ba9782363ec6bf714b583e8585212Jeff Brown     * nanosecond (instead of millisecond) precision.
2417b11499d2db0ba9782363ec6bf714b583e8585212Jeff Brown     *
2418b11499d2db0ba9782363ec6bf714b583e8585212Jeff Brown     * @hide
2419b11499d2db0ba9782363ec6bf714b583e8585212Jeff Brown     */
24204e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown    @Override
24214e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown    public final long getEventTimeNano() {
24224e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown        return mEventTime * 1000000L;
24234e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown    }
24244e91a180be46c0c7c3bf398d4df4cbe2404216b5Jeff Brown
24259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
24269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Renamed to {@link #getDeviceId}.
24279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
24289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
24296b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * @deprecated use {@link #getDeviceId()} instead.
24309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
24316b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    @Deprecated
24329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getKeyboardDevice() {
24339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mDeviceId;
24349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
24376b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * Gets the {@link KeyCharacterMap} associated with the keyboard device.
24386b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     *
24396b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * @return The associated key character map.
24408ab3dc7a3e430cc69975091b962758f49bc84ef2Andrew Sapperstein     * @throws {@link KeyCharacterMap.UnavailableException} if the key character map
24416b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * could not be loaded because it was malformed or the default key character map
24426b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * is missing from the system.
24436b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     *
24448ab3dc7a3e430cc69975091b962758f49bc84ef2Andrew Sapperstein     * @see KeyCharacterMap#load
24456b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     */
24466b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    public final KeyCharacterMap getKeyCharacterMap() {
24476b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        return KeyCharacterMap.load(mDeviceId);
24486b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    }
24496b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown
24506b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    /**
24516b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * Gets the primary character for this key.
24526b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * In other words, the label that is physically printed on it.
24536b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     *
24546b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * @return The display label character, or 0 if none (eg. for non-printing keys).
24559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
24569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public char getDisplayLabel() {
24576b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        return getKeyCharacterMap().getDisplayLabel(mKeyCode);
24589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
24616b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * Gets the Unicode character generated by the specified key and meta
24626b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * key state combination.
24639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
24646b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * Returns the Unicode character that the specified key would produce
24656b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * when the specified meta bits (see {@link MetaKeyKeyListener})
24666b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * were active.
24679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </p><p>
24689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns 0 if the key is not one that is used to type Unicode
24699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * characters.
24709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </p><p>
24716b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * If the return value has bit {@link KeyCharacterMap#COMBINING_ACCENT} set, the
24726b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * key is a "dead key" that should be combined with another to
24736b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * actually produce a character -- see {@link KeyCharacterMap#getDeadChar} --
24746b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * after masking with {@link KeyCharacterMap#COMBINING_ACCENT_MASK}.
24759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </p>
24766b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     *
24776b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * @return The associated character or combining accent, or 0 if none.
24789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
24799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getUnicodeChar() {
24809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getUnicodeChar(mMetaState);
24819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
24846b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * Gets the Unicode character generated by the specified key and meta
24856b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * key state combination.
24869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
24876b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * Returns the Unicode character that the specified key would produce
24886b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * when the specified meta bits (see {@link MetaKeyKeyListener})
24896b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * were active.
24909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </p><p>
24919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns 0 if the key is not one that is used to type Unicode
24929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * characters.
24939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </p><p>
24946b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * If the return value has bit {@link KeyCharacterMap#COMBINING_ACCENT} set, the
24956b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * key is a "dead key" that should be combined with another to
24966b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * actually produce a character -- see {@link KeyCharacterMap#getDeadChar} --
24976b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * after masking with {@link KeyCharacterMap#COMBINING_ACCENT_MASK}.
24989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </p>
24996b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     *
25006b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * @param metaState The meta key modifier state.
25016b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * @return The associated character or combining accent, or 0 if none.
25029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
25036b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    public int getUnicodeChar(int metaState) {
25046b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        return getKeyCharacterMap().get(mKeyCode, metaState);
25059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
25086b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * Get the character conversion data for a given key code.
25099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
25106b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * @param results A {@link KeyCharacterMap.KeyData} instance that will be
25116b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * filled with the results.
25126b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * @return True if the key was mapped.  If the key was not mapped, results is not modified.
25139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
25146b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * @deprecated instead use {@link #getDisplayLabel()},
25156b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * {@link #getNumber()} or {@link #getUnicodeChar(int)}.
25169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
25176b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    @Deprecated
25189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean getKeyData(KeyData results) {
25196b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        return getKeyCharacterMap().getKeyData(mKeyCode, results);
25209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
25236b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * Gets the first character in the character array that can be generated
25246b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * by the specified key code.
25256b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * <p>
25266b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * This is a convenience function that returns the same value as
25276b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * {@link #getMatch(char[],int) getMatch(chars, 0)}.
25286b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * </p>
25296b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     *
25306b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * @param chars The array of matching characters to consider.
25316b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * @return The matching associated character, or 0 if none.
25329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
25339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public char getMatch(char[] chars) {
25349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getMatch(chars, 0);
25359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
25386b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * Gets the first character in the character array that can be generated
25396b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * by the specified key code.  If there are multiple choices, prefers
25406b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * the one that would be generated with the specified meta key modifier state.
25416b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     *
25426b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * @param chars The array of matching characters to consider.
25436b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * @param metaState The preferred meta key modifier state.
25446b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * @return The matching associated character, or 0 if none.
25459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
25466b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown    public char getMatch(char[] chars, int metaState) {
25476b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        return getKeyCharacterMap().getMatch(mKeyCode, chars, metaState);
25489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
25516b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * Gets the number or symbol associated with the key.
25526b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * <p>
25536b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * The character value is returned, not the numeric value.
25546b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * If the key is not a number, but is a symbol, the symbol is retuned.
25556b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * </p><p>
25566b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * This method is intended to to support dial pads and other numeric or
25576b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * symbolic entry on keyboards where certain keys serve dual function
25586b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * as alphabetic and symbolic keys.  This method returns the number
25596b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * or symbol associated with the key independent of whether the user
25606b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * has pressed the required modifier.
25616b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * </p><p>
25626b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * For example, on one particular keyboard the keys on the top QWERTY row generate
25636b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * numbers when ALT is pressed such that ALT-Q maps to '1'.  So for that keyboard
25646b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * when {@link #getNumber} is called with {@link KeyEvent#KEYCODE_Q} it returns '1'
25656b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * so that the user can type numbers without pressing ALT when it makes sense.
25666b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * </p>
25676b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     *
25686b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * @return The associated numeric or symbolic character, or 0 if none.
25699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
25709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public char getNumber() {
25716b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        return getKeyCharacterMap().getNumber(mKeyCode);
25729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
25756b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * Returns true if this key produces a glyph.
25766b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     *
25776b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown     * @return True if the key is a printing key.
25789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
25799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isPrintingKey() {
25806b53e8daa69cba1a2a5a7c95a01e37ce9c53226cJeff Brown        return getKeyCharacterMap().isPrintingKey(mKeyCode);
25819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
258483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * @deprecated Use {@link #dispatch(Callback, DispatcherState, Object)} instead.
258583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     */
258683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    @Deprecated
258783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public final boolean dispatch(Callback receiver) {
258883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        return dispatch(receiver, null, null);
258983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    }
259083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
259183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    /**
25929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Deliver this key event to a {@link Callback} interface.  If this is
25939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * an ACTION_MULTIPLE event and it is not handled, then an attempt will
25949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be made to deliver a single normal event.
25959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
25969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param receiver The Callback that will be given the event.
259783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * @param state State information retained across events.
259883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * @param target The target of the dispatch, for use in tracking.
25999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The return value from the Callback method that was called.
26019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
260283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public final boolean dispatch(Callback receiver, DispatcherState state,
260383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            Object target) {
26049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (mAction) {
260583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            case ACTION_DOWN: {
260683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                mFlags &= ~FLAG_START_TRACKING;
26078d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                if (DEBUG) Log.v(TAG, "Key down to " + target + " in " + state
26088d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                        + ": " + this);
260983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                boolean res = receiver.onKeyDown(mKeyCode, this);
261083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                if (state != null) {
261183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                    if (res && mRepeatCount == 0 && (mFlags&FLAG_START_TRACKING) != 0) {
26128d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                        if (DEBUG) Log.v(TAG, "  Start tracking!");
261383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                        state.startTracking(this, target);
261483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                    } else if (isLongPress() && state.isTracking(this)) {
261583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                        try {
261683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                            if (receiver.onKeyLongPress(mKeyCode, this)) {
26178d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                                if (DEBUG) Log.v(TAG, "  Clear from long press!");
261883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                                state.performedLongPress(this);
261983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                                res = true;
262083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                            }
262183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                        } catch (AbstractMethodError e) {
262283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                        }
262383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                    }
262483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                }
262583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                return res;
262683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            }
26279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case ACTION_UP:
26288d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                if (DEBUG) Log.v(TAG, "Key up to " + target + " in " + state
26298d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                        + ": " + this);
263083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                if (state != null) {
263183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                    state.handleUpEvent(this);
263283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                }
26339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return receiver.onKeyUp(mKeyCode, this);
26349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case ACTION_MULTIPLE:
26359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int count = mRepeatCount;
26369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int code = mKeyCode;
26379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (receiver.onKeyMultiple(code, count, this)) {
26389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return true;
26399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
26409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (code != KeyEvent.KEYCODE_UNKNOWN) {
26419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAction = ACTION_DOWN;
26429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mRepeatCount = 0;
26439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    boolean handled = receiver.onKeyDown(code, this);
26449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (handled) {
26459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mAction = ACTION_UP;
26469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        receiver.onKeyUp(code, this);
26479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
26489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAction = ACTION_MULTIPLE;
26499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mRepeatCount = count;
26509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return handled;
26519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
265283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                return false;
26539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
26559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
265783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    /**
265883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * Use with {@link KeyEvent#dispatch(Callback, DispatcherState, Object)}
265983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * for more advanced key dispatching, such as long presses.
266083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     */
266183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public static class DispatcherState {
266283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        int mDownKeyCode;
266383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        Object mDownTarget;
266483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        SparseIntArray mActiveLongPresses = new SparseIntArray();
266583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
266683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        /**
266783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * Reset back to initial state.
266883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         */
266983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        public void reset() {
26708d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn            if (DEBUG) Log.v(TAG, "Reset: " + this);
267183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            mDownKeyCode = 0;
267283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            mDownTarget = null;
267383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            mActiveLongPresses.clear();
267483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        }
267583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
267683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        /**
267783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * Stop any tracking associated with this target.
267883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         */
267983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        public void reset(Object target) {
268083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            if (mDownTarget == target) {
26818d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                if (DEBUG) Log.v(TAG, "Reset in " + target + ": " + this);
268283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                mDownKeyCode = 0;
268383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                mDownTarget = null;
268483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            }
268583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        }
268683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
268783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        /**
268883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * Start tracking the key code associated with the given event.  This
268983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * can only be called on a key down.  It will allow you to see any
269083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * long press associated with the key, and will result in
269183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * {@link KeyEvent#isTracking} return true on the long press and up
269283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * events.
269383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         *
269483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * <p>This is only needed if you are directly dispatching events, rather
269583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * than handling them in {@link Callback#onKeyDown}.
269683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         */
269783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        public void startTracking(KeyEvent event, Object target) {
269883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            if (event.getAction() != ACTION_DOWN) {
269983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                throw new IllegalArgumentException(
270083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                        "Can only start tracking on a down event");
270183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            }
27028d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn            if (DEBUG) Log.v(TAG, "Start trackingt in " + target + ": " + this);
270383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            mDownKeyCode = event.getKeyCode();
270483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            mDownTarget = target;
270583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        }
270683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
270783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        /**
270883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * Return true if the key event is for a key code that is currently
270983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * being tracked by the dispatcher.
271083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         */
271183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        public boolean isTracking(KeyEvent event) {
271283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            return mDownKeyCode == event.getKeyCode();
271383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        }
271483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
271583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        /**
271683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * Keep track of the given event's key code as having performed an
271783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * action with a long press, so no action should occur on the up.
271883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * <p>This is only needed if you are directly dispatching events, rather
271983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * than handling them in {@link Callback#onKeyLongPress}.
272083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         */
272183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        public void performedLongPress(KeyEvent event) {
272283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            mActiveLongPresses.put(event.getKeyCode(), 1);
272383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        }
272483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
272583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        /**
272683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * Handle key up event to stop tracking.  This resets the dispatcher state,
272783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * and updates the key event state based on it.
272883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * <p>This is only needed if you are directly dispatching events, rather
272983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * than handling them in {@link Callback#onKeyUp}.
273083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         */
273183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        public void handleUpEvent(KeyEvent event) {
273283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            final int keyCode = event.getKeyCode();
27338d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn            if (DEBUG) Log.v(TAG, "Handle key up " + event + ": " + this);
273483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            int index = mActiveLongPresses.indexOfKey(keyCode);
273583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            if (index >= 0) {
27368d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                if (DEBUG) Log.v(TAG, "  Index: " + index);
273783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                event.mFlags |= FLAG_CANCELED | FLAG_CANCELED_LONG_PRESS;
273883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                mActiveLongPresses.removeAt(index);
273983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            }
274083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            if (mDownKeyCode == keyCode) {
27418d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                if (DEBUG) Log.v(TAG, "  Tracking!");
274283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                event.mFlags |= FLAG_TRACKING;
274383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                mDownKeyCode = 0;
274483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                mDownTarget = null;
274583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            }
274683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        }
274783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    }
2748497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
2749497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    @Override
27509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String toString() {
2751fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        StringBuilder msg = new StringBuilder();
2752fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        msg.append("KeyEvent { action=").append(actionToString(mAction));
2753fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        msg.append(", keyCode=").append(keyCodeToString(mKeyCode));
2754fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        msg.append(", scanCode=").append(mScanCode);
2755fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        if (mCharacters != null) {
2756fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            msg.append(", characters=\"").append(mCharacters).append("\"");
2757fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        }
2758fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        msg.append(", metaState=").append(metaStateToString(mMetaState));
2759fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        msg.append(", flags=0x").append(Integer.toHexString(mFlags));
2760fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        msg.append(", repeatCount=").append(mRepeatCount);
2761fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        msg.append(", eventTime=").append(mEventTime);
2762fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        msg.append(", downTime=").append(mDownTime);
2763fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        msg.append(", deviceId=").append(mDeviceId);
2764fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        msg.append(", source=0x").append(Integer.toHexString(mSource));
2765fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        msg.append(" }");
2766fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        return msg.toString();
2767497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    }
2768497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
2769497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /**
2770497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * Returns a string that represents the symbolic name of the specified action
27716f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown     * such as "ACTION_DOWN", or an equivalent numeric constant such as "35" if unknown.
2772497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
2773497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @param action The action.
2774497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @return The symbolic name of the specified action.
2775497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @hide
2776497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     */
2777497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static String actionToString(int action) {
2778497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        switch (action) {
2779497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown            case ACTION_DOWN:
2780497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown                return "ACTION_DOWN";
2781497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown            case ACTION_UP:
2782497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown                return "ACTION_UP";
2783497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown            case ACTION_MULTIPLE:
2784497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown                return "ACTION_MULTIPLE";
2785497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown            default:
2786497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown                return Integer.toString(action);
2787497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        }
2788497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    }
2789497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
2790497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /**
2791497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * Returns a string that represents the symbolic name of the specified keycode
27926f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown     * such as "KEYCODE_A", "KEYCODE_DPAD_UP", or an equivalent numeric constant
27936f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown     * such as "1001" if unknown.
2794497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
2795497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @param keyCode The key code.
2796497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @return The symbolic name of the specified keycode.
2797497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
2798497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see KeyCharacterMap#getDisplayLabel
2799497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     */
2800497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static String keyCodeToString(int keyCode) {
28016f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        String symbolicName = KEYCODE_SYMBOLIC_NAMES.get(keyCode);
28026f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        return symbolicName != null ? symbolicName : Integer.toString(keyCode);
2803497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    }
2804497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
2805497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /**
28066f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown     * Gets a keycode by its symbolic name such as "KEYCODE_A" or an equivalent
28076f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown     * numeric constant such as "1001".
2808497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
2809497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @param symbolicName The symbolic name of the keycode.
28106f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown     * @return The keycode or {@link #KEYCODE_UNKNOWN} if not found.
2811497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @see #keycodeToString
2812497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     */
2813497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static int keyCodeFromString(String symbolicName) {
2814497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        if (symbolicName == null) {
2815497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown            throw new IllegalArgumentException("symbolicName must not be null");
2816497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        }
2817497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
28186f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown        final int count = KEYCODE_SYMBOLIC_NAMES.size();
2819497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        for (int i = 0; i < count; i++) {
28206f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            if (symbolicName.equals(KEYCODE_SYMBOLIC_NAMES.valueAt(i))) {
2821497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown                return i;
2822497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown            }
2823497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        }
2824497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
2825497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        try {
28266f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            return Integer.parseInt(symbolicName, 10);
2827497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        } catch (NumberFormatException ex) {
28286f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown            return KEYCODE_UNKNOWN;
2829497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        }
2830497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    }
2831497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown
2832497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    /**
2833497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * Returns a string that represents the symbolic name of the specified combined meta
2834497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * key modifier state flags such as "0", "META_SHIFT_ON",
28356f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown     * "META_ALT_ON|META_SHIFT_ON" or an equivalent numeric constant such as "0x10000000"
28366f2fba428ca5e77a26d991ad728e346cc47609eeJeff Brown     * if unknown.
2837497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     *
2838497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @param metaState The meta state.
2839497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @return The symbolic name of the specified combined meta state flags.
2840497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     * @hide
2841497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown     */
2842497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown    public static String metaStateToString(int metaState) {
2843497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        if (metaState == 0) {
2844497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown            return "0";
2845497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        }
2846497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        StringBuilder result = null;
2847497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        int i = 0;
2848497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        while (metaState != 0) {
2849497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown            final boolean isSet = (metaState & 1) != 0;
2850497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown            metaState >>>= 1; // unsigned shift!
2851497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown            if (isSet) {
2852497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown                final String name = META_SYMBOLIC_NAMES[i];
2853497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown                if (result == null) {
2854497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown                    if (metaState == 0) {
2855497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown                        return name;
2856497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown                    }
2857497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown                    result = new StringBuilder(name);
2858497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown                } else {
2859497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown                    result.append('|');
2860497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown                    result.append(name);
2861497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown                }
2862497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown            }
2863497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown            i += 1;
2864497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        }
2865497a92cc5ba2176b8a8484b0a7da040eac0e887bJeff Brown        return result.toString();
28669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final Parcelable.Creator<KeyEvent> CREATOR
28699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            = new Parcelable.Creator<KeyEvent>() {
28709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public KeyEvent createFromParcel(Parcel in) {
28716ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown            in.readInt(); // skip token, we already know this is a KeyEvent
28726ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown            return KeyEvent.createFromParcelBody(in);
28739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public KeyEvent[] newArray(int size) {
28769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new KeyEvent[size];
28779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
28796ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown
28806ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown    /** @hide */
28816ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown    public static KeyEvent createFromParcelBody(Parcel in) {
28826ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        return new KeyEvent(in);
28836ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown    }
28846ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown
28856ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown    private KeyEvent(Parcel in) {
288691c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        mDeviceId = in.readInt();
288791c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        mSource = in.readInt();
28886ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        mAction = in.readInt();
28896ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        mKeyCode = in.readInt();
28906ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        mRepeatCount = in.readInt();
28916ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        mMetaState = in.readInt();
28926ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        mScanCode = in.readInt();
28936ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        mFlags = in.readInt();
28946ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        mDownTime = in.readLong();
28956ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        mEventTime = in.readLong();
28969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeToParcel(Parcel out, int flags) {
28996ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        out.writeInt(PARCEL_TOKEN_KEY_EVENT);
290091c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown
290191c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        out.writeInt(mDeviceId);
290291c69ab01539f7ba28708f41ec1835cc2920d0a0Jeff Brown        out.writeInt(mSource);
29039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mAction);
29049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mKeyCode);
29059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mRepeatCount);
29069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mMetaState);
290746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        out.writeInt(mScanCode);
29089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mFlags);
29099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mDownTime);
29109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mEventTime);
29119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29133c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn    private native boolean native_isSystemKey(int keyCode);
29143c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn    private native boolean native_hasDefaultAction(int keyCode);
29159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2916