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;
218d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackbornimport android.util.Log;
2283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackbornimport android.util.SparseIntArray;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyCharacterMap;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyCharacterMap.KeyData;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
27dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * Object used to report key and button events.
28dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * <p>
29dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * Each key press is described by a sequence of key events.  A key press
30dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * starts with a key event with {@link #ACTION_DOWN}.  If the key is held
31dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * sufficiently long that it repeats, then the initial down is followed
32dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * additional key events with {@link #ACTION_DOWN} and a non-zero value for
33dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * {@link #getRepeatCount()}.  The last key event is a {@link #ACTION_UP}
34dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * for the key up.  If the key press is canceled, the key up event will have the
35dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * {@link #FLAG_CANCELED} flag set.
36dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * </p><p>
37dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * Key events are generally accompanied by a key code ({@link #getKeyCode()}),
38dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * scan code ({@link #getScanCode()}) and meta state ({@link #getMetaState()}).
39dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * Key code constants are defined in this class.  Scan code constants are raw
40dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * device-specific codes obtained from the OS and so are not generally meaningful
41dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * to applications unless interpreted using the {@link KeyCharacterMap}.
42dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * Meta states describe the pressed state of key modifiers
43dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * such as {@link #META_SHIFT_ON} or {@link #META_ALT_ON}.
44dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * </p><p>
45dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * When interacting with an IME, the framework may deliver key events
46dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * with the special action {@link #ACTION_MULTIPLE} that either specifies
47dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * that single repeated key code or a sequence of characters to insert.
48dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * </p><p>
49b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown * In general, the framework cannot guarantee that the key events it delivers
50b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown * to a view always constitute complete key sequences since some events may be dropped
51b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown * or modified by containing views before they are delivered.  The view implementation
52b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown * should be prepared to handle {@link #FLAG_CANCELED} and should tolerate anomalous
53b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown * situations such as receiving a new {@link #ACTION_DOWN} without first having
54b699726018a0049665d8ad6b90dbc5af0e18f135Jeff Brown * received an {@link #ACTION_UP} for the prior key press.
55dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * </p><p>
56dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * Refer to {@link InputDevice} for more information about how different kinds of
57dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * input devices and sources represent keys and buttons.
58dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown * </p>
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
60c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brownpublic class KeyEvent extends InputEvent implements Parcelable {
61dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Unknown key code. */
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_UNKNOWN         = 0;
63dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Soft Left key.
64dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * Usually situated below the display on phones and used as a multi-function
65dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * feature key for selecting a software defined function shown on the bottom left
66dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * of the display. */
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_SOFT_LEFT       = 1;
68dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Soft Right key.
69dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * Usually situated below the display on phones and used as a multi-function
70dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * feature key for selecting a software defined function shown on the bottom right
71dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * of the display. */
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_SOFT_RIGHT      = 2;
73dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Home key.
74dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * This key is handled by the framework and is never delivered to applications. */
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_HOME            = 3;
76dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Back key. */
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_BACK            = 4;
78dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Call key. */
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_CALL            = 5;
80dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: End Call key. */
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_ENDCALL         = 6;
82dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: '0' key. */
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_0               = 7;
84dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: '1' key. */
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_1               = 8;
86dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: '2' key. */
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_2               = 9;
88dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: '3' key. */
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_3               = 10;
90dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: '4' key. */
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_4               = 11;
92dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: '5' key. */
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_5               = 12;
94dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: '6' key. */
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_6               = 13;
96dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: '7' key. */
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_7               = 14;
98dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: '8' key. */
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_8               = 15;
100dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: '9' key. */
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_9               = 16;
102dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: '*' key. */
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_STAR            = 17;
104dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: '#' key. */
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_POUND           = 18;
106dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Directional Pad Up key.
107dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * May also be synthesized from trackball motions. */
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_DPAD_UP         = 19;
109dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Directional Pad Down key.
110dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * May also be synthesized from trackball motions. */
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_DPAD_DOWN       = 20;
112dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Directional Pad Left key.
113dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * May also be synthesized from trackball motions. */
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_DPAD_LEFT       = 21;
115dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Directional Pad Right key.
116dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * May also be synthesized from trackball motions. */
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_DPAD_RIGHT      = 22;
118dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Directional Pad Center key.
119dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * May also be synthesized from trackball motions. */
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_DPAD_CENTER     = 23;
121dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Volume Up key. */
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_VOLUME_UP       = 24;
123dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Volume Down key. */
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_VOLUME_DOWN     = 25;
125dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Power key. */
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_POWER           = 26;
127dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Camera key.
128dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * Used to launch a camera application or take pictures. */
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_CAMERA          = 27;
130dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Clear key. */
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_CLEAR           = 28;
132dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'A' key. */
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_A               = 29;
134dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'B' key. */
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_B               = 30;
136dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'C' key. */
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_C               = 31;
138dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'D' key. */
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_D               = 32;
140dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'E' key. */
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_E               = 33;
142dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'F' key. */
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_F               = 34;
144dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'G' key. */
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_G               = 35;
146dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'H' key. */
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_H               = 36;
148dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'I' key. */
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_I               = 37;
150dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'J' key. */
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_J               = 38;
152dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'K' key. */
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_K               = 39;
154dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'L' key. */
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_L               = 40;
156dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'M' key. */
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_M               = 41;
158dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'N' key. */
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_N               = 42;
160dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'O' key. */
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_O               = 43;
162dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'P' key. */
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_P               = 44;
164dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'Q' key. */
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_Q               = 45;
166dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'R' key. */
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_R               = 46;
168dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'S' key. */
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_S               = 47;
170dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'T' key. */
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_T               = 48;
172dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'U' key. */
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_U               = 49;
174dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'V' key. */
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_V               = 50;
176dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'W' key. */
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_W               = 51;
178dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'X' key. */
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_X               = 52;
180dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'Y' key. */
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_Y               = 53;
182dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: 'Z' key. */
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_Z               = 54;
184dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: ',' key. */
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_COMMA           = 55;
186dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: '.' key. */
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_PERIOD          = 56;
188dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Left Alt modifier key. */
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_ALT_LEFT        = 57;
190dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Right Alt modifier key. */
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_ALT_RIGHT       = 58;
192dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Left Shift modifier key. */
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_SHIFT_LEFT      = 59;
194dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Right Shift modifier key. */
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_SHIFT_RIGHT     = 60;
196dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Tab key. */
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_TAB             = 61;
198dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Space key. */
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_SPACE           = 62;
200224d4a15353656182939aaf4be8cbbf5ab7c63c5Jeff Brown    /** Key code constant: Symbol modifier key.
201224d4a15353656182939aaf4be8cbbf5ab7c63c5Jeff Brown     * Used to enter alternate symbols. */
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_SYM             = 63;
203dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Explorer special function key.
204dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * Used to launch a browser application. */
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_EXPLORER        = 64;
206dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Envelope special function key.
207dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * Used to launch a mail application. */
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_ENVELOPE        = 65;
209dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Enter key. */
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_ENTER           = 66;
211224d4a15353656182939aaf4be8cbbf5ab7c63c5Jeff Brown    /** Key code constant: Backspace key.
212224d4a15353656182939aaf4be8cbbf5ab7c63c5Jeff Brown     * Deletes characters before the insertion point. */
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_DEL             = 67;
214dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: '`' (backtick) key. */
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_GRAVE           = 68;
216dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: '-'. */
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_MINUS           = 69;
218dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: '=' key. */
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_EQUALS          = 70;
220dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: '[' key. */
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_LEFT_BRACKET    = 71;
222dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: ']' key. */
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_RIGHT_BRACKET   = 72;
224dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: '\' key. */
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_BACKSLASH       = 73;
226dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: ';' key. */
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_SEMICOLON       = 74;
228dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: ''' (apostrophe) key. */
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_APOSTROPHE      = 75;
230dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: '/' key. */
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_SLASH           = 76;
232dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: '@' key. */
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_AT              = 77;
234224d4a15353656182939aaf4be8cbbf5ab7c63c5Jeff Brown    /** Key code constant: Number modifier key.
235224d4a15353656182939aaf4be8cbbf5ab7c63c5Jeff Brown     * Used to enter numeric symbols.
236224d4a15353656182939aaf4be8cbbf5ab7c63c5Jeff Brown     * This key is not Num Lock; it is more like {@link #KEYCODE_ALT_LEFT} and is
237224d4a15353656182939aaf4be8cbbf5ab7c63c5Jeff Brown     * interpreted as an ALT key by {@link android.text.method.MetaKeyKeyListener}. */
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_NUM             = 78;
239dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Headset Hook key.
240dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * Used to hang up calls and stop media. */
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_HEADSETHOOK     = 79;
242dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Camera Focus key.
243dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * Used to focus the camera. */
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_FOCUS           = 80;   // *Camera* focus
245dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: '+' key. */
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_PLUS            = 81;
247dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Menu key. */
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_MENU            = 82;
249dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Notification key. */
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_NOTIFICATION    = 83;
251dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Search key. */
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_SEARCH          = 84;
253dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Play/Pause media key. */
254935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn    public static final int KEYCODE_MEDIA_PLAY_PAUSE= 85;
255dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Stop media key. */
256935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn    public static final int KEYCODE_MEDIA_STOP      = 86;
257dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Play Next media key. */
258935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn    public static final int KEYCODE_MEDIA_NEXT      = 87;
259dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Play Previous media key. */
260935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn    public static final int KEYCODE_MEDIA_PREVIOUS  = 88;
261dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Rewind media key. */
262935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn    public static final int KEYCODE_MEDIA_REWIND    = 89;
263dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Fast Forward media key. */
264935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn    public static final int KEYCODE_MEDIA_FAST_FORWARD = 90;
265dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Mute key. */
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_MUTE            = 91;
267dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Page Up key. */
2684fedd80c1d3997d62073518973b1fe09862ebaa5Chih-Wei Huang    public static final int KEYCODE_PAGE_UP         = 92;
269dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Page Down key. */
2704fedd80c1d3997d62073518973b1fe09862ebaa5Chih-Wei Huang    public static final int KEYCODE_PAGE_DOWN       = 93;
271dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Picture Symbols modifier key.
272dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * Used to switch symbol sets (Emoji, Kao-moji). */
273b032bc037399110f41cfdb838a792b3c65756323mogimo    public static final int KEYCODE_PICTSYMBOLS     = 94;   // switch symbol-sets (Emoji,Kao-moji)
274dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Switch Charset modifier key.
275dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * Used to switch character sets (Kanji, Katakana). */
276b032bc037399110f41cfdb838a792b3c65756323mogimo    public static final int KEYCODE_SWITCH_CHARSET  = 95;   // switch char-sets (Kanji,Katakana)
277dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: A Button key.
278dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * On a game controller, the A button should be either the button labeled A
279dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * or the first button on the upper row of controller buttons. */
280fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown    public static final int KEYCODE_BUTTON_A        = 96;
281dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: B Button key.
282dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * On a game controller, the B button should be either the button labeled B
283dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * or the second button on the upper row of controller buttons. */
284fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown    public static final int KEYCODE_BUTTON_B        = 97;
285dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: C Button key.
286dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * On a game controller, the C button should be either the button labeled C
287dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * or the third button on the upper row of controller buttons. */
288fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown    public static final int KEYCODE_BUTTON_C        = 98;
289dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: X Button key.
290dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * On a game controller, the X button should be either the button labeled X
291dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * or the first button on the lower row of controller buttons. */
292fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown    public static final int KEYCODE_BUTTON_X        = 99;
293dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Y Button key.
294dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * On a game controller, the Y button should be either the button labeled Y
295dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * or the second button on the lower row of controller buttons. */
296fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown    public static final int KEYCODE_BUTTON_Y        = 100;
297dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Z Button key.
298dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * On a game controller, the Z button should be either the button labeled Z
299dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * or the third button on the lower row of controller buttons. */
300fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown    public static final int KEYCODE_BUTTON_Z        = 101;
301dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: L1 Button key.
302dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * On a game controller, the L1 button should be either the button labeled L1 (or L)
303dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * or the top left trigger button. */
304fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown    public static final int KEYCODE_BUTTON_L1       = 102;
305dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: R1 Button key.
306dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * On a game controller, the R1 button should be either the button labeled R1 (or R)
307dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * or the top right trigger button. */
308fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown    public static final int KEYCODE_BUTTON_R1       = 103;
309dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: L2 Button key.
310dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * On a game controller, the L2 button should be either the button labeled L2
311dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * or the bottom left trigger button. */
312fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown    public static final int KEYCODE_BUTTON_L2       = 104;
313dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: R2 Button key.
314dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * On a game controller, the R2 button should be either the button labeled R2
315dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * or the bottom right trigger button. */
316fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown    public static final int KEYCODE_BUTTON_R2       = 105;
317dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Left Thumb Button key.
318dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * On a game controller, the left thumb button indicates that the left (or only)
319dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * joystick is pressed. */
320fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown    public static final int KEYCODE_BUTTON_THUMBL   = 106;
321dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Right Thumb Button key.
322dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * On a game controller, the right thumb button indicates that the right
323dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * joystick is pressed. */
324fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown    public static final int KEYCODE_BUTTON_THUMBR   = 107;
325dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Start Button key.
326dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * On a game controller, the button labeled Start. */
327fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown    public static final int KEYCODE_BUTTON_START    = 108;
328dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Select Button key.
329dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * On a game controller, the button labeled Select. */
330fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown    public static final int KEYCODE_BUTTON_SELECT   = 109;
331dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown    /** Key code constant: Mode Button key.
332dc1ab4b5cc274b7d744c11a939bb5910becec5e0Jeff Brown     * On a game controller, the button labeled Mode. */
333fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown    public static final int KEYCODE_BUTTON_MODE     = 110;
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // NOTE: If you add a new keycode here you must also add it to:
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //  isSystem()
33746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    //  native/include/android/keycodes.h
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //  frameworks/base/include/ui/KeycodeLabels.h
339fd03582995e0fce963dd0fa0669e3211b74c0dd7Jeff Brown    //  external/webkit/WebKit/android/plugins/ANPKeyCodes.h
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //  tools/puppet_master/PuppetMaster/nav_keys.py
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //  frameworks/base/core/res/res/values/attrs.xml
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //  commands/monkey/Monkey.java
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //  emulator?
344935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn    //
345935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn    //  Also Android currently does not reserve code ranges for vendor-
346935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn    //  specific key codes.  If you have new key codes to have, you
347935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn    //  MUST contribute a patch to the open source project to define
348935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn    //  those new codes.  This is intended to maintain a consistent
349935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn    //  set of key code definitions across all Android devices.
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
351c3fc2d03d58a258c53c9265a70143d4af076b764Jeff Brown    private static final int LAST_KEYCODE           = KEYCODE_BUTTON_MODE;
352935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @deprecated There are now more than MAX_KEYCODE keycodes.
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use {@link #getMaxKeyCode()} instead.
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Deprecated
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int MAX_KEYCODE             = 84;
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getAction} value: the key has been pressed down.
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ACTION_DOWN             = 0;
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getAction} value: the key has been released.
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ACTION_UP               = 1;
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getAction} value: multiple duplicate key events have
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * occurred in a row, or a complex string is being delivered.  If the
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * key code is not {#link {@link #KEYCODE_UNKNOWN} then the
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {#link {@link #getRepeatCount()} method returns the number of times
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the given key code should be executed.
37446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown     * Otherwise, if the key code is {@link #KEYCODE_UNKNOWN}, then
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this is a sequence of characters as returned by {@link #getCharacters}.
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ACTION_MULTIPLE         = 2;
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This mask is used to check whether one of the ALT meta keys is pressed.</p>
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isAltPressed()
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getMetaState()
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_ALT_LEFT
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_ALT_RIGHT
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int META_ALT_ON = 0x02;
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This mask is used to check whether the left ALT meta key is pressed.</p>
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isAltPressed()
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getMetaState()
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_ALT_LEFT
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int META_ALT_LEFT_ON = 0x10;
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This mask is used to check whether the right the ALT meta key is pressed.</p>
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isAltPressed()
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getMetaState()
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_ALT_RIGHT
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int META_ALT_RIGHT_ON = 0x20;
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This mask is used to check whether one of the SHIFT meta keys is pressed.</p>
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isShiftPressed()
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getMetaState()
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_SHIFT_LEFT
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_SHIFT_RIGHT
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int META_SHIFT_ON = 0x1;
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This mask is used to check whether the left SHIFT meta key is pressed.</p>
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isShiftPressed()
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getMetaState()
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_SHIFT_LEFT
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int META_SHIFT_LEFT_ON = 0x40;
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This mask is used to check whether the right SHIFT meta key is pressed.</p>
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isShiftPressed()
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getMetaState()
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_SHIFT_RIGHT
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int META_SHIFT_RIGHT_ON = 0x80;
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This mask is used to check whether the SYM meta key is pressed.</p>
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isSymPressed()
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getMetaState()
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int META_SYM_ON = 0x4;
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This mask is set if the device woke because of this key event.
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FLAG_WOKE_HERE = 0x1;
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This mask is set if the key event was generated by a software keyboard.
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FLAG_SOFT_KEYBOARD = 0x2;
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This mask is set if we don't want the key event to cause us to leave
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * touch mode.
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FLAG_KEEP_TOUCH_MODE = 0x4;
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
460105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * This mask is set if an event was known to come from a trusted part
461105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * of the system.  That is, the event is known to come from the user,
462105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * and could not have been spoofed by a third party component.
463105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
464105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public static final int FLAG_FROM_SYSTEM = 0x8;
465105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
466105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
467105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * This mask is used for compatibility, to identify enter keys that are
468105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * coming from an IME whose enter key has been auto-labelled "next" or
469105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * "done".  This allows TextView to dispatch these as normal enter keys
470105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * for old applications, but still do the appropriate action when
471105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * receiving them.
472105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
473105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public static final int FLAG_EDITOR_ACTION = 0x10;
474105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
475105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
476ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * When associated with up key events, this indicates that the key press
477ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * has been canceled.  Typically this is used with virtual touch screen
478ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * keys, where the user can slide from the virtual key area on to the
479ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * display: in that case, the application will receive a canceled up
480ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * event and should not perform the action normally associated with the
481ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * key.  Note that for this to work, the application can not perform an
482ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * action for a key until it receives an up or the long press timeout has
483ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * expired.
484ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     */
485ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn    public static final int FLAG_CANCELED = 0x20;
486ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn
487ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn    /**
488ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * This key event was generated by a virtual (on-screen) hard key area.
489ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * Typically this is an area of the touchscreen, outside of the regular
490ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * display, dedicated to "hardware" buttons.
491ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     */
492ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn    public static final int FLAG_VIRTUAL_HARD_KEY = 0x40;
493ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn
494ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn    /**
49583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * This flag is set for the first key repeat that occurs after the
49683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * long press timeout.
49783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     */
49883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public static final int FLAG_LONG_PRESS = 0x80;
49983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
50083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    /**
50183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * Set when a key event has {@link #FLAG_CANCELED} set because a long
50283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * press action was executed while it was down.
50383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     */
50483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public static final int FLAG_CANCELED_LONG_PRESS = 0x100;
50583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
50683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    /**
50783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * Set for {@link #ACTION_UP} when this event's key code is still being
50883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * tracked from its initial down.  That is, somebody requested that tracking
50983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * started on the key down and a long press has not caused
51083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * the tracking to be canceled.
51183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     */
51283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public static final int FLAG_TRACKING = 0x200;
51383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
51483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    /**
51583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * Private control to determine when an app is tracking a key sequence.
51683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * @hide
51783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     */
51883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public static final int FLAG_START_TRACKING = 0x40000000;
51983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
52083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    /**
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the maximum keycode.
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static int getMaxKeyCode() {
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return LAST_KEYCODE;
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Get the character that is produced by putting accent on the character
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * c.
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * For example, getDeadChar('`', 'e') returns &egrave;.
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static int getDeadChar(int accent, int c) {
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return KeyCharacterMap.getDeadChar(accent, c);
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5368d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn    static final boolean DEBUG = false;
5378d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn    static final String TAG = "KeyEvent";
5388d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mMetaState;
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mAction;
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mKeyCode;
54246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    private int mScanCode;
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mRepeatCount;
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mFlags;
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private long mDownTime;
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private long mEventTime;
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String mCharacters;
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public interface Callback {
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
55183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * Called when a key down event has occurred.  If you return true,
55283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * you can first call {@link KeyEvent#startTracking()
55383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * KeyEvent.startTracking()} to have the framework track the event
55483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * through its {@link #onKeyUp(int, KeyEvent)} and also call your
55583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * {@link #onKeyLongPress(int, KeyEvent)} if it occurs.
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param keyCode The value in event.getKeyCode().
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param event Description of the key event.
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return If you handled the event, return true.  If you want to allow
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *         the event to be handled by the next receiver, return false.
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean onKeyDown(int keyCode, KeyEvent event);
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
56683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * Called when a long press has occurred.  If you return true,
56783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * the final key up will have {@link KeyEvent#FLAG_CANCELED} and
56883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * {@link KeyEvent#FLAG_CANCELED_LONG_PRESS} set.  Note that in
56983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * order to receive this callback, someone in the event change
57083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * <em>must</em> return true from {@link #onKeyDown} <em>and</em>
57183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * call {@link KeyEvent#startTracking()} on the event.
57283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         *
57383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * @param keyCode The value in event.getKeyCode().
57483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * @param event Description of the key event.
57583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         *
57683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * @return If you handled the event, return true.  If you want to allow
57783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         *         the event to be handled by the next receiver, return false.
57883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         */
57983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        boolean onKeyLongPress(int keyCode, KeyEvent event);
58083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
58183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        /**
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Called when a key up event has occurred.
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param keyCode The value in event.getKeyCode().
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param event Description of the key event.
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return If you handled the event, return true.  If you want to allow
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *         the event to be handled by the next receiver, return false.
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean onKeyUp(int keyCode, KeyEvent event);
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Called when multiple down/up pairs of the same key have occurred
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * in a row.
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param keyCode The value in event.getKeyCode().
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param count Number of pairs as returned by event.getRepeatCount().
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param event Description of the key event.
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return If you handled the event, return true.  If you want to allow
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *         the event to be handled by the next receiver, return false.
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean onKeyMultiple(int keyCode, int count, KeyEvent event);
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new key event.
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param action Action code: either {@link #ACTION_DOWN},
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param code The key code.
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public KeyEvent(int action, int code) {
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAction = action;
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mKeyCode = code;
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRepeatCount = 0;
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new key event.
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param downTime The time (in {@link android.os.SystemClock#uptimeMillis})
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * at which this key code originally went down.
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param eventTime The time (in {@link android.os.SystemClock#uptimeMillis})
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * at which this event happened.
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param action Action code: either {@link #ACTION_DOWN},
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param code The key code.
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param repeat A repeat count for down events (> 0 if this is after the
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * initial down) or event count for multiple events.
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public KeyEvent(long downTime, long eventTime, int action,
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int code, int repeat) {
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDownTime = downTime;
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mEventTime = eventTime;
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAction = action;
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mKeyCode = code;
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRepeatCount = repeat;
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new key event.
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param downTime The time (in {@link android.os.SystemClock#uptimeMillis})
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * at which this key code originally went down.
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param eventTime The time (in {@link android.os.SystemClock#uptimeMillis})
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * at which this event happened.
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param action Action code: either {@link #ACTION_DOWN},
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param code The key code.
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param repeat A repeat count for down events (> 0 if this is after the
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * initial down) or event count for multiple events.
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param metaState Flags indicating which meta keys are currently pressed.
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public KeyEvent(long downTime, long eventTime, int action,
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int code, int repeat, int metaState) {
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDownTime = downTime;
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mEventTime = eventTime;
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAction = action;
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mKeyCode = code;
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRepeatCount = repeat;
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMetaState = metaState;
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new key event.
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param downTime The time (in {@link android.os.SystemClock#uptimeMillis})
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * at which this key code originally went down.
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param eventTime The time (in {@link android.os.SystemClock#uptimeMillis})
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * at which this event happened.
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param action Action code: either {@link #ACTION_DOWN},
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param code The key code.
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param repeat A repeat count for down events (> 0 if this is after the
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * initial down) or event count for multiple events.
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param metaState Flags indicating which meta keys are currently pressed.
678c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param deviceId The device ID that generated the key event.
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param scancode Raw device scan code of the event.
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public KeyEvent(long downTime, long eventTime, int action,
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int code, int repeat, int metaState,
683c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown                    int deviceId, int scancode) {
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDownTime = downTime;
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mEventTime = eventTime;
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAction = action;
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mKeyCode = code;
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRepeatCount = repeat;
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMetaState = metaState;
690c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mDeviceId = deviceId;
69146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        mScanCode = scancode;
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new key event.
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param downTime The time (in {@link android.os.SystemClock#uptimeMillis})
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * at which this key code originally went down.
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param eventTime The time (in {@link android.os.SystemClock#uptimeMillis})
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * at which this event happened.
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param action Action code: either {@link #ACTION_DOWN},
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param code The key code.
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param repeat A repeat count for down events (> 0 if this is after the
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * initial down) or event count for multiple events.
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param metaState Flags indicating which meta keys are currently pressed.
707c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param deviceId The device ID that generated the key event.
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param scancode Raw device scan code of the event.
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param flags The flags for this key event
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public KeyEvent(long downTime, long eventTime, int action,
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int code, int repeat, int metaState,
713c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown                    int deviceId, int scancode, int flags) {
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDownTime = downTime;
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mEventTime = eventTime;
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAction = action;
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mKeyCode = code;
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRepeatCount = repeat;
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMetaState = metaState;
720c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mDeviceId = deviceId;
72146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        mScanCode = scancode;
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFlags = flags;
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
726c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * Create a new key event.
727c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     *
728c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param downTime The time (in {@link android.os.SystemClock#uptimeMillis})
729c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * at which this key code originally went down.
730c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param eventTime The time (in {@link android.os.SystemClock#uptimeMillis})
731c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * at which this event happened.
732c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param action Action code: either {@link #ACTION_DOWN},
733c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.
734c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param code The key code.
735c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param repeat A repeat count for down events (> 0 if this is after the
736c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * initial down) or event count for multiple events.
737c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param metaState Flags indicating which meta keys are currently pressed.
738c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param deviceId The device ID that generated the key event.
739c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param scancode Raw device scan code of the event.
740c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param flags The flags for this key event
741c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param source The input source such as {@link InputDevice#SOURCE_KEYBOARD}.
742c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     */
743c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public KeyEvent(long downTime, long eventTime, int action,
744c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown                    int code, int repeat, int metaState,
745c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown                    int deviceId, int scancode, int flags, int source) {
746c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mDownTime = downTime;
747c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mEventTime = eventTime;
748c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mAction = action;
749c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mKeyCode = code;
750c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mRepeatCount = repeat;
751c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mMetaState = metaState;
752c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mDeviceId = deviceId;
753c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mScanCode = scancode;
754c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mFlags = flags;
755c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mSource = source;
756c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    }
757c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown
758c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    /**
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new key event for a string of characters.  The key code,
760c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * action, repeat count and source will automatically be set to
761c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * {@link #KEYCODE_UNKNOWN}, {@link #ACTION_MULTIPLE}, 0, and
762c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * {@link InputDevice#SOURCE_KEYBOARD} for you.
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param time The time (in {@link android.os.SystemClock#uptimeMillis})
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * at which this event occured.
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param characters The string of characters.
767c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown     * @param deviceId The device ID that generated the key event.
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param flags The flags for this key event
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
770c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown    public KeyEvent(long time, String characters, int deviceId, int flags) {
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDownTime = time;
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mEventTime = time;
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCharacters = characters;
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAction = ACTION_MULTIPLE;
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mKeyCode = KEYCODE_UNKNOWN;
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRepeatCount = 0;
777c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mDeviceId = deviceId;
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFlags = flags;
779c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mSource = InputDevice.SOURCE_KEYBOARD;
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
783105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * Make an exact copy of an existing key event.
784105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
785105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public KeyEvent(KeyEvent origEvent) {
786105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mDownTime = origEvent.mDownTime;
787105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mEventTime = origEvent.mEventTime;
788105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mAction = origEvent.mAction;
789105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mKeyCode = origEvent.mKeyCode;
790105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mRepeatCount = origEvent.mRepeatCount;
791105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mMetaState = origEvent.mMetaState;
792105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mDeviceId = origEvent.mDeviceId;
793c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mSource = origEvent.mSource;
79446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        mScanCode = origEvent.mScanCode;
795105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mFlags = origEvent.mFlags;
796105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mCharacters = origEvent.mCharacters;
797105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
798105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
799105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Copy an existing key event, modifying its time and repeat count.
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
80283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * @deprecated Use {@link #changeTimeRepeat(KeyEvent, long, int)}
80383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * instead.
80483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     *
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param origEvent The existing event to be copied.
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param eventTime The new event time
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * (in {@link android.os.SystemClock#uptimeMillis}) of the event.
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param newRepeat The new repeat count of the event.
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
81083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    @Deprecated
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public KeyEvent(KeyEvent origEvent, long eventTime, int newRepeat) {
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDownTime = origEvent.mDownTime;
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mEventTime = eventTime;
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAction = origEvent.mAction;
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mKeyCode = origEvent.mKeyCode;
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRepeatCount = newRepeat;
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMetaState = origEvent.mMetaState;
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDeviceId = origEvent.mDeviceId;
819c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mSource = origEvent.mSource;
82046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        mScanCode = origEvent.mScanCode;
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFlags = origEvent.mFlags;
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCharacters = origEvent.mCharacters;
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
826105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * Create a new key event that is the same as the given one, but whose
827105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * event time and repeat count are replaced with the given value.
828105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     *
829105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * @param event The existing event to be copied.  This is not modified.
830105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * @param eventTime The new event time
831105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * (in {@link android.os.SystemClock#uptimeMillis}) of the event.
832105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * @param newRepeat The new repeat count of the event.
833105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
834105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public static KeyEvent changeTimeRepeat(KeyEvent event, long eventTime,
835105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            int newRepeat) {
836105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        return new KeyEvent(event, eventTime, newRepeat);
837105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
838105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
839105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
84083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * Create a new key event that is the same as the given one, but whose
84183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * event time and repeat count are replaced with the given value.
84283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     *
84383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * @param event The existing event to be copied.  This is not modified.
84483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * @param eventTime The new event time
84583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * (in {@link android.os.SystemClock#uptimeMillis}) of the event.
84683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * @param newRepeat The new repeat count of the event.
84783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * @param newFlags New flags for the event, replacing the entire value
84883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * in the original event.
84983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     */
85083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public static KeyEvent changeTimeRepeat(KeyEvent event, long eventTime,
85183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            int newRepeat, int newFlags) {
85283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        KeyEvent ret = new KeyEvent(event);
85383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        ret.mEventTime = eventTime;
85483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        ret.mRepeatCount = newRepeat;
85583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        ret.mFlags = newFlags;
85683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        return ret;
85783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    }
85883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
85983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    /**
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Copy an existing key event, modifying its action.
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param origEvent The existing event to be copied.
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param action The new action code of the event.
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
865105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    private KeyEvent(KeyEvent origEvent, int action) {
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDownTime = origEvent.mDownTime;
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mEventTime = origEvent.mEventTime;
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAction = action;
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mKeyCode = origEvent.mKeyCode;
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRepeatCount = origEvent.mRepeatCount;
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMetaState = origEvent.mMetaState;
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDeviceId = origEvent.mDeviceId;
873c5ed5910c9ef066cec6a13bbb404ec57b1e92637Jeff Brown        mSource = origEvent.mSource;
87446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        mScanCode = origEvent.mScanCode;
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFlags = origEvent.mFlags;
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Don't copy mCharacters, since one way or the other we'll lose it
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // when changing the action.
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
881105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * Create a new key event that is the same as the given one, but whose
882105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * action is replaced with the given value.
883105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     *
884105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * @param event The existing event to be copied.  This is not modified.
885105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * @param action The new action code of the event.
886105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
887105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public static KeyEvent changeAction(KeyEvent event, int action) {
888105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        return new KeyEvent(event, action);
889105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
890105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
891105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
892105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * Create a new key event that is the same as the given one, but whose
893105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * flags are replaced with the given value.
894105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     *
895105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * @param event The existing event to be copied.  This is not modified.
896105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * @param flags The new flags constant.
897105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
898105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public static KeyEvent changeFlags(KeyEvent event, int flags) {
899105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        event = new KeyEvent(event);
900105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        event.mFlags = flags;
901105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        return event;
902105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
903105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
904105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Don't use in new code, instead explicitly check
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getAction()}.
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return If the action is ACTION_DOWN, returns true; else false.
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @deprecated
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Deprecated public final boolean isDown() {
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mAction == ACTION_DOWN;
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Is this a system key?  System keys can not be used for menu shortcuts.
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * TODO: this information should come from a table somewhere.
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * TODO: should the dpad keys be here?  arguably, because they also shouldn't be menu shortcuts
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final boolean isSystem() {
9243c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn        return native_isSystemKey(mKeyCode);
9253c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn    }
9263c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn
9273c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn    /** @hide */
9283c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn    public final boolean hasDefaultAction() {
9293c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn        return native_hasDefaultAction(mKeyCode);
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Returns the state of the meta keys.</p>
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return an integer in which each bit set to 1 represents a pressed
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         meta key
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isAltPressed()
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isShiftPressed()
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isSymPressed()
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #META_ALT_ON
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #META_SHIFT_ON
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #META_SYM_ON
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getMetaState() {
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mMetaState;
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the flags for this key event.
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #FLAG_WOKE_HERE
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getFlags() {
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mFlags;
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns true if this key code is a modifier key.
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return whether the provided keyCode is one of
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #KEYCODE_SHIFT_LEFT} {@link #KEYCODE_SHIFT_RIGHT},
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #KEYCODE_ALT_LEFT}, {@link #KEYCODE_ALT_RIGHT}
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * or {@link #KEYCODE_SYM}.
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static boolean isModifierKey(int keyCode) {
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return keyCode == KEYCODE_SHIFT_LEFT || keyCode == KEYCODE_SHIFT_RIGHT
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                || keyCode == KEYCODE_ALT_LEFT || keyCode == KEYCODE_ALT_RIGHT
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                || keyCode == KEYCODE_SYM;
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Returns the pressed state of the ALT meta key.</p>
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the ALT key is pressed, false otherwise
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_ALT_LEFT
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_ALT_RIGHT
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #META_ALT_ON
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final boolean isAltPressed() {
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (mMetaState & META_ALT_ON) != 0;
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Returns the pressed state of the SHIFT meta key.</p>
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the SHIFT key is pressed, false otherwise
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_SHIFT_LEFT
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_SHIFT_RIGHT
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #META_SHIFT_ON
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final boolean isShiftPressed() {
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (mMetaState & META_SHIFT_ON) != 0;
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Returns the pressed state of the SYM meta key.</p>
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the SYM key is pressed, false otherwise
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_SYM
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #META_SYM_ON
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final boolean isSymPressed() {
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (mMetaState & META_SYM_ON) != 0;
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the action of this key event.  May be either
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #ACTION_DOWN}, {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The event action: ACTION_DOWN, ACTION_UP, or ACTION_MULTIPLE.
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getAction() {
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mAction;
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1022ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * For {@link #ACTION_UP} events, indicates that the event has been
1023ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * canceled as per {@link #FLAG_CANCELED}.
1024ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     */
1025ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn    public final boolean isCanceled() {
1026ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn        return (mFlags&FLAG_CANCELED) != 0;
1027ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn    }
1028ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn
1029ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn    /**
103083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * Call this during {@link Callback#onKeyDown} to have the system track
103183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * the key through its final up (possibly including a long press).  Note
103283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * that only one key can be tracked at a time -- if another key down
103383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * event is received while a previous one is being tracked, tracking is
103483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * stopped on the previous event.
103583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     */
103683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public final void startTracking() {
103783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        mFlags |= FLAG_START_TRACKING;
103883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    }
103983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
104083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    /**
104183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * For {@link #ACTION_UP} events, indicates that the event is still being
104283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * tracked from its initial down event as per
104383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * {@link #FLAG_TRACKING}.
104483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     */
104583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public final boolean isTracking() {
104683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        return (mFlags&FLAG_TRACKING) != 0;
104783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    }
104883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
104983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    /**
105083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * For {@link #ACTION_DOWN} events, indicates that the event has been
105183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * canceled as per {@link #FLAG_LONG_PRESS}.
105283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     */
105383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public final boolean isLongPress() {
105483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        return (mFlags&FLAG_LONG_PRESS) != 0;
105583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    }
105683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
105783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    /**
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the key code of the key event.  This is the physical key that
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * was pressed, <em>not</em> the Unicode character.
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The key code of the event.
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getKeyCode() {
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mKeyCode;
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * For the special case of a {@link #ACTION_MULTIPLE} event with key
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * code of {@link #KEYCODE_UNKNOWN}, this is a raw string of characters
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * associated with the event.  In all other cases it is null.
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns a String of 1 or more characters associated with
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the event.
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final String getCharacters() {
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mCharacters;
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the hardware key id of this key event.  These values are not
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * reliable and vary from device to device.
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@more}
10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Mostly this is here for debugging purposes.
10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getScanCode() {
108746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        return mScanCode;
10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the repeat count of the event.  For both key up and key down
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * events, this is the number of times the key has repeated with the first
10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * down starting at 0 and counting up from there.  For multiple key
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * events, this is the number of down/up pairs that have occurred.
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The number of times the key has repeated.
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getRepeatCount() {
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mRepeatCount;
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the time of the most recent key down event,
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in the {@link android.os.SystemClock#uptimeMillis} time base.  If this
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is a down event, this will be the same as {@link #getEventTime()}.
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Note that when chording keys, this value is the down time of the
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * most recently pressed key, which may <em>not</em> be the same physical
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * key of this event.
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the most recent key down time, in the
11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.os.SystemClock#uptimeMillis} time base
11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final long getDownTime() {
11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mDownTime;
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the time this event occurred,
11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in the {@link android.os.SystemClock#uptimeMillis} time base.
11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the time this event occurred,
11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in the {@link android.os.SystemClock#uptimeMillis} time base.
11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final long getEventTime() {
11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mEventTime;
11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Renamed to {@link #getDeviceId}.
11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @deprecated
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getKeyboardDevice() {
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mDeviceId;
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Get the primary character for this key.  In other words, the label
11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that is physically printed on it.
11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public char getDisplayLabel() {
11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return KeyCharacterMap.load(mDeviceId).getDisplayLabel(mKeyCode);
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the Unicode character that the key would produce.
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </p><p>
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns 0 if the key is not one that is used to type Unicode
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * characters.
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </p><p>
11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If the return value has bit
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link KeyCharacterMap#COMBINING_ACCENT}
11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * set, the key is a "dead key" that should be combined with another to
11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * actually produce a character -- see {@link #getDeadChar} --
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * after masking with
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link KeyCharacterMap#COMBINING_ACCENT_MASK}.
11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </p>
11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getUnicodeChar() {
11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getUnicodeChar(mMetaState);
11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the Unicode character that the key would produce.
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </p><p>
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns 0 if the key is not one that is used to type Unicode
11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * characters.
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </p><p>
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If the return value has bit
11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link KeyCharacterMap#COMBINING_ACCENT}
11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * set, the key is a "dead key" that should be combined with another to
11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * actually produce a character -- see {@link #getDeadChar} -- after masking
11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * with {@link KeyCharacterMap#COMBINING_ACCENT_MASK}.
11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </p>
11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getUnicodeChar(int meta) {
11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return KeyCharacterMap.load(mDeviceId).get(mKeyCode, meta);
11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Get the characters conversion data for the key event..
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param results a {@link KeyData} that will be filled with the results.
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return whether the key was mapped or not.  If the key was not mapped,
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         results is not modified.
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean getKeyData(KeyData results) {
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return KeyCharacterMap.load(mDeviceId).getKeyData(mKeyCode, results);
11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The same as {@link #getMatch(char[],int) getMatch(chars, 0)}.
11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public char getMatch(char[] chars) {
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getMatch(chars, 0);
12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If one of the chars in the array can be generated by the keyCode of this
12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * key event, return the char; otherwise return '\0'.
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param chars the characters to try to find
12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param modifiers the modifier bits to prefer.  If any of these bits
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                  are set, if there are multiple choices, that could
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                  work, the one for this modifier will be set.
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public char getMatch(char[] chars, int modifiers) {
12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return KeyCharacterMap.load(mDeviceId).getMatch(mKeyCode, chars, modifiers);
12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the number or symbol associated with the key.  The character value
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is returned, not the numeric value.  If the key is not a number, but is
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a symbol, the symbol is retuned.
12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public char getNumber() {
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return KeyCharacterMap.load(mDeviceId).getNumber(mKeyCode);
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Does the key code of this key produce a glyph?
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isPrintingKey() {
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return KeyCharacterMap.load(mDeviceId).isPrintingKey(mKeyCode);
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
123183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * @deprecated Use {@link #dispatch(Callback, DispatcherState, Object)} instead.
123283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     */
123383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    @Deprecated
123483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public final boolean dispatch(Callback receiver) {
123583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        return dispatch(receiver, null, null);
123683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    }
123783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
123883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    /**
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Deliver this key event to a {@link Callback} interface.  If this is
12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * an ACTION_MULTIPLE event and it is not handled, then an attempt will
12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be made to deliver a single normal event.
12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param receiver The Callback that will be given the event.
124483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * @param state State information retained across events.
124583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * @param target The target of the dispatch, for use in tracking.
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The return value from the Callback method that was called.
12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
124983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public final boolean dispatch(Callback receiver, DispatcherState state,
125083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            Object target) {
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (mAction) {
125283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            case ACTION_DOWN: {
125383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                mFlags &= ~FLAG_START_TRACKING;
12548d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                if (DEBUG) Log.v(TAG, "Key down to " + target + " in " + state
12558d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                        + ": " + this);
125683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                boolean res = receiver.onKeyDown(mKeyCode, this);
125783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                if (state != null) {
125883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                    if (res && mRepeatCount == 0 && (mFlags&FLAG_START_TRACKING) != 0) {
12598d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                        if (DEBUG) Log.v(TAG, "  Start tracking!");
126083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                        state.startTracking(this, target);
126183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                    } else if (isLongPress() && state.isTracking(this)) {
126283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                        try {
126383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                            if (receiver.onKeyLongPress(mKeyCode, this)) {
12648d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                                if (DEBUG) Log.v(TAG, "  Clear from long press!");
126583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                                state.performedLongPress(this);
126683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                                res = true;
126783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                            }
126883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                        } catch (AbstractMethodError e) {
126983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                        }
127083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                    }
127183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                }
127283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                return res;
127383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            }
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case ACTION_UP:
12758d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                if (DEBUG) Log.v(TAG, "Key up to " + target + " in " + state
12768d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                        + ": " + this);
127783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                if (state != null) {
127883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                    state.handleUpEvent(this);
127983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                }
12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return receiver.onKeyUp(mKeyCode, this);
12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case ACTION_MULTIPLE:
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int count = mRepeatCount;
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int code = mKeyCode;
12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (receiver.onKeyMultiple(code, count, this)) {
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return true;
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (code != KeyEvent.KEYCODE_UNKNOWN) {
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAction = ACTION_DOWN;
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mRepeatCount = 0;
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    boolean handled = receiver.onKeyDown(code, this);
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (handled) {
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mAction = ACTION_UP;
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        receiver.onKeyUp(code, this);
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAction = ACTION_MULTIPLE;
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mRepeatCount = count;
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return handled;
12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
129983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                return false;
13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
130483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    /**
130583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * Use with {@link KeyEvent#dispatch(Callback, DispatcherState, Object)}
130683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * for more advanced key dispatching, such as long presses.
130783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     */
130883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public static class DispatcherState {
130983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        int mDownKeyCode;
131083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        Object mDownTarget;
131183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        SparseIntArray mActiveLongPresses = new SparseIntArray();
131283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
131383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        /**
131483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * Reset back to initial state.
131583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         */
131683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        public void reset() {
13178d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn            if (DEBUG) Log.v(TAG, "Reset: " + this);
131883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            mDownKeyCode = 0;
131983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            mDownTarget = null;
132083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            mActiveLongPresses.clear();
132183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        }
132283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
132383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        /**
132483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * Stop any tracking associated with this target.
132583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         */
132683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        public void reset(Object target) {
132783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            if (mDownTarget == target) {
13288d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                if (DEBUG) Log.v(TAG, "Reset in " + target + ": " + this);
132983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                mDownKeyCode = 0;
133083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                mDownTarget = null;
133183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            }
133283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        }
133383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
133483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        /**
133583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * Start tracking the key code associated with the given event.  This
133683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * can only be called on a key down.  It will allow you to see any
133783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * long press associated with the key, and will result in
133883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * {@link KeyEvent#isTracking} return true on the long press and up
133983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * events.
134083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         *
134183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * <p>This is only needed if you are directly dispatching events, rather
134283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * than handling them in {@link Callback#onKeyDown}.
134383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         */
134483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        public void startTracking(KeyEvent event, Object target) {
134583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            if (event.getAction() != ACTION_DOWN) {
134683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                throw new IllegalArgumentException(
134783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                        "Can only start tracking on a down event");
134883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            }
13498d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn            if (DEBUG) Log.v(TAG, "Start trackingt in " + target + ": " + this);
135083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            mDownKeyCode = event.getKeyCode();
135183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            mDownTarget = target;
135283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        }
135383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
135483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        /**
135583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * Return true if the key event is for a key code that is currently
135683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * being tracked by the dispatcher.
135783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         */
135883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        public boolean isTracking(KeyEvent event) {
135983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            return mDownKeyCode == event.getKeyCode();
136083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        }
136183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
136283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        /**
136383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * Keep track of the given event's key code as having performed an
136483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * action with a long press, so no action should occur on the up.
136583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * <p>This is only needed if you are directly dispatching events, rather
136683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * than handling them in {@link Callback#onKeyLongPress}.
136783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         */
136883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        public void performedLongPress(KeyEvent event) {
136983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            mActiveLongPresses.put(event.getKeyCode(), 1);
137083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        }
137183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
137283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        /**
137383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * Handle key up event to stop tracking.  This resets the dispatcher state,
137483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * and updates the key event state based on it.
137583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * <p>This is only needed if you are directly dispatching events, rather
137683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * than handling them in {@link Callback#onKeyUp}.
137783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         */
137883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        public void handleUpEvent(KeyEvent event) {
137983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            final int keyCode = event.getKeyCode();
13808d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn            if (DEBUG) Log.v(TAG, "Handle key up " + event + ": " + this);
138183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            int index = mActiveLongPresses.indexOfKey(keyCode);
138283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            if (index >= 0) {
13838d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                if (DEBUG) Log.v(TAG, "  Index: " + index);
138483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                event.mFlags |= FLAG_CANCELED | FLAG_CANCELED_LONG_PRESS;
138583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                mActiveLongPresses.removeAt(index);
138683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            }
138783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            if (mDownKeyCode == keyCode) {
13888d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                if (DEBUG) Log.v(TAG, "  Tracking!");
138983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                event.mFlags |= FLAG_TRACKING;
139083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                mDownKeyCode = 0;
139183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                mDownTarget = null;
139283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            }
139383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        }
139483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    }
139583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String toString() {
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return "KeyEvent{action=" + mAction + " code=" + mKeyCode
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            + " repeat=" + mRepeatCount
139946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            + " meta=" + mMetaState + " scancode=" + mScanCode
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            + " mFlags=" + mFlags + "}";
14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final Parcelable.Creator<KeyEvent> CREATOR
14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            = new Parcelable.Creator<KeyEvent>() {
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public KeyEvent createFromParcel(Parcel in) {
14066ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown            in.readInt(); // skip token, we already know this is a KeyEvent
14076ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown            return KeyEvent.createFromParcelBody(in);
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public KeyEvent[] newArray(int size) {
14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new KeyEvent[size];
14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
14146ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown
14156ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown    /** @hide */
14166ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown    public static KeyEvent createFromParcelBody(Parcel in) {
14176ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        return new KeyEvent(in);
14186ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown    }
14196ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown
14206ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown    private KeyEvent(Parcel in) {
14216ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        readBaseFromParcel(in);
14226ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown
14236ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        mAction = in.readInt();
14246ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        mKeyCode = in.readInt();
14256ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        mRepeatCount = in.readInt();
14266ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        mMetaState = in.readInt();
14276ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        mScanCode = in.readInt();
14286ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        mFlags = in.readInt();
14296ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        mDownTime = in.readLong();
14306ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        mEventTime = in.readLong();
14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeToParcel(Parcel out, int flags) {
14346ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        out.writeInt(PARCEL_TOKEN_KEY_EVENT);
14356ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown
14366ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown        writeBaseToParcel(out);
14376ec402b5ae33c8927694d8522b4cc6a5c8ba974eJeff Brown
14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mAction);
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mKeyCode);
14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mRepeatCount);
14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mMetaState);
144246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        out.writeInt(mScanCode);
14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mFlags);
14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mDownTime);
14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mEventTime);
14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14483c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn    private native boolean native_isSystemKey(int keyCode);
14493c80a4a044865bdf1289c7896baffa1c082d835cDianne Hackborn    private native boolean native_hasDefaultAction(int keyCode);
14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1451