源码位置:frameworks\base\core\java\android\view\KeyEvent.java
对应JNI映射源码定义:\frameworks\native\include\input\KeycodeLabels.hpackage android.view;import android.os.Parcel;
import android.os.Parcelable;
import android.text.method.MetaKeyKeyListener;
import android.util.Log;
import android.util.Slog;
import android.util.SparseArray;
import android.util.SparseIntArray;
import android.view.KeyCharacterMap;
import android.view.KeyCharacterMap.KeyData;public class KeyEvent extends InputEvent implements Parcelable {/** Key code constant: Unknown key code. */public static final int KEYCODE_UNKNOWN         = 0;/** Key code constant: Soft Left key.* Usually situated below the display on phones and used as a multi-function* feature key for selecting a software defined function shown on the bottom left* of the display. */public static final int KEYCODE_SOFT_LEFT       = 1;/** Key code constant: Soft Right key.* Usually situated below the display on phones and used as a multi-function* feature key for selecting a software defined function shown on the bottom right* of the display. */public static final int KEYCODE_SOFT_RIGHT      = 2;/** Key code constant: Home key.* This key is handled by the framework and is never delivered to applications. */public static final int KEYCODE_HOME            = 3;/** Key code constant: Back key. */public static final int KEYCODE_BACK            = 4;/** Key code constant: Call key. */public static final int KEYCODE_CALL            = 5;/** Key code constant: End Call key. */public static final int KEYCODE_ENDCALL         = 6;/** Key code constant: '0' key. */public static final int KEYCODE_0               = 7;/** Key code constant: '1' key. */public static final int KEYCODE_1               = 8;/** Key code constant: '2' key. */public static final int KEYCODE_2               = 9;/** Key code constant: '3' key. */public static final int KEYCODE_3               = 10;/** Key code constant: '4' key. */public static final int KEYCODE_4               = 11;/** Key code constant: '5' key. */public static final int KEYCODE_5               = 12;/** Key code constant: '6' key. */public static final int KEYCODE_6               = 13;/** Key code constant: '7' key. */public static final int KEYCODE_7               = 14;/** Key code constant: '8' key. */public static final int KEYCODE_8               = 15;/** Key code constant: '9' key. */public static final int KEYCODE_9               = 16;/** Key code constant: '*' key. */public static final int KEYCODE_STAR            = 17;/** Key code constant: '#' key. */public static final int KEYCODE_POUND           = 18;/** Key code constant: Directional Pad Up key.* May also be synthesized from trackball motions. */public static final int KEYCODE_DPAD_UP         = 19;/** Key code constant: Directional Pad Down key.* May also be synthesized from trackball motions. */public static final int KEYCODE_DPAD_DOWN       = 20;/** Key code constant: Directional Pad Left key.* May also be synthesized from trackball motions. */public static final int KEYCODE_DPAD_LEFT       = 21;/** Key code constant: Directional Pad Right key.* May also be synthesized from trackball motions. */public static final int KEYCODE_DPAD_RIGHT      = 22;/** Key code constant: Directional Pad Center key.* May also be synthesized from trackball motions. */public static final int KEYCODE_DPAD_CENTER     = 23;/** Key code constant: Volume Up key.* Adjusts the speaker volume up. */public static final int KEYCODE_VOLUME_UP       = 24;/** Key code constant: Volume Down key.* Adjusts the speaker volume down. */public static final int KEYCODE_VOLUME_DOWN     = 25;/** Key code constant: Power key. */public static final int KEYCODE_POWER           = 26;/** Key code constant: Camera key.* Used to launch a camera application or take pictures. */public static final int KEYCODE_CAMERA          = 27;/** Key code constant: Clear key. */public static final int KEYCODE_CLEAR           = 28;/** Key code constant: 'A' key. */public static final int KEYCODE_A               = 29;/** Key code constant: 'B' key. */public static final int KEYCODE_B               = 30;/** Key code constant: 'C' key. */public static final int KEYCODE_C               = 31;/** Key code constant: 'D' key. */public static final int KEYCODE_D               = 32;/** Key code constant: 'E' key. */public static final int KEYCODE_E               = 33;/** Key code constant: 'F' key. */public static final int KEYCODE_F               = 34;/** Key code constant: 'G' key. */public static final int KEYCODE_G               = 35;/** Key code constant: 'H' key. */public static final int KEYCODE_H               = 36;/** Key code constant: 'I' key. */public static final int KEYCODE_I               = 37;/** Key code constant: 'J' key. */public static final int KEYCODE_J               = 38;/** Key code constant: 'K' key. */public static final int KEYCODE_K               = 39;/** Key code constant: 'L' key. */public static final int KEYCODE_L               = 40;/** Key code constant: 'M' key. */public static final int KEYCODE_M               = 41;/** Key code constant: 'N' key. */public static final int KEYCODE_N               = 42;/** Key code constant: 'O' key. */public static final int KEYCODE_O               = 43;/** Key code constant: 'P' key. */public static final int KEYCODE_P               = 44;/** Key code constant: 'Q' key. */public static final int KEYCODE_Q               = 45;/** Key code constant: 'R' key. */public static final int KEYCODE_R               = 46;/** Key code constant: 'S' key. */public static final int KEYCODE_S               = 47;/** Key code constant: 'T' key. */public static final int KEYCODE_T               = 48;/** Key code constant: 'U' key. */public static final int KEYCODE_U               = 49;/** Key code constant: 'V' key. */public static final int KEYCODE_V               = 50;/** Key code constant: 'W' key. */public static final int KEYCODE_W               = 51;/** Key code constant: 'X' key. */public static final int KEYCODE_X               = 52;/** Key code constant: 'Y' key. */public static final int KEYCODE_Y               = 53;/** Key code constant: 'Z' key. */public static final int KEYCODE_Z               = 54;/** Key code constant: ',' key. */public static final int KEYCODE_COMMA           = 55;/** Key code constant: '.' key. */public static final int KEYCODE_PERIOD          = 56;/** Key code constant: Left Alt modifier key. */public static final int KEYCODE_ALT_LEFT        = 57;/** Key code constant: Right Alt modifier key. */public static final int KEYCODE_ALT_RIGHT       = 58;/** Key code constant: Left Shift modifier key. */public static final int KEYCODE_SHIFT_LEFT      = 59;/** Key code constant: Right Shift modifier key. */public static final int KEYCODE_SHIFT_RIGHT     = 60;/** Key code constant: Tab key. */public static final int KEYCODE_TAB             = 61;/** Key code constant: Space key. */public static final int KEYCODE_SPACE           = 62;/** Key code constant: Symbol modifier key.* Used to enter alternate symbols. */public static final int KEYCODE_SYM             = 63;/** Key code constant: Explorer special function key.* Used to launch a browser application. */public static final int KEYCODE_EXPLORER        = 64;/** Key code constant: Envelope special function key.* Used to launch a mail application. */public static final int KEYCODE_ENVELOPE        = 65;/** Key code constant: Enter key. */public static final int KEYCODE_ENTER           = 66;/** Key code constant: Backspace key.* Deletes characters before the insertion point, unlike {@link #KEYCODE_FORWARD_DEL}. */public static final int KEYCODE_DEL             = 67;/** Key code constant: '`' (backtick) key. */public static final int KEYCODE_GRAVE           = 68;/** Key code constant: '-'. */public static final int KEYCODE_MINUS           = 69;/** Key code constant: '=' key. */public static final int KEYCODE_EQUALS          = 70;/** Key code constant: '[' key. */public static final int KEYCODE_LEFT_BRACKET    = 71;/** Key code constant: ']' key. */public static final int KEYCODE_RIGHT_BRACKET   = 72;/** Key code constant: '\' key. */public static final int KEYCODE_BACKSLASH       = 73;/** Key code constant: ';' key. */public static final int KEYCODE_SEMICOLON       = 74;/** Key code constant: ''' (apostrophe) key. */public static final int KEYCODE_APOSTROPHE      = 75;/** Key code constant: '/' key. */public static final int KEYCODE_SLASH           = 76;/** Key code constant: '@' key. */public static final int KEYCODE_AT              = 77;/** Key code constant: Number modifier key.* Used to enter numeric symbols.* This key is not Num Lock; it is more like {@link #KEYCODE_ALT_LEFT} and is* interpreted as an ALT key by {@link android.text.method.MetaKeyKeyListener}. */public static final int KEYCODE_NUM             = 78;/** Key code constant: Headset Hook key.* Used to hang up calls and stop media. */public static final int KEYCODE_HEADSETHOOK     = 79;/** Key code constant: Camera Focus key.* Used to focus the camera. */public static final int KEYCODE_FOCUS           = 80;   // *Camera* focus/** Key code constant: '+' key. */public static final int KEYCODE_PLUS            = 81;/** Key code constant: Menu key. */public static final int KEYCODE_MENU            = 82;/** Key code constant: Notification key. */public static final int KEYCODE_NOTIFICATION    = 83;/** Key code constant: Search key. */public static final int KEYCODE_SEARCH          = 84;/** Key code constant: Play/Pause media key. */public static final int KEYCODE_MEDIA_PLAY_PAUSE= 85;/** Key code constant: Stop media key. */public static final int KEYCODE_MEDIA_STOP      = 86;/** Key code constant: Play Next media key. */public static final int KEYCODE_MEDIA_NEXT      = 87;/** Key code constant: Play Previous media key. */public static final int KEYCODE_MEDIA_PREVIOUS  = 88;/** Key code constant: Rewind media key. */public static final int KEYCODE_MEDIA_REWIND    = 89;/** Key code constant: Fast Forward media key. */public static final int KEYCODE_MEDIA_FAST_FORWARD = 90;/** Key code constant: Mute key.* Mutes the microphone, unlike {@link #KEYCODE_VOLUME_MUTE}. */public static final int KEYCODE_MUTE            = 91;/** Key code constant: Page Up key. */public static final int KEYCODE_PAGE_UP         = 92;/** Key code constant: Page Down key. */public static final int KEYCODE_PAGE_DOWN       = 93;/** Key code constant: Picture Symbols modifier key.* Used to switch symbol sets (Emoji, Kao-moji). */public static final int KEYCODE_PICTSYMBOLS     = 94;   // switch symbol-sets (Emoji,Kao-moji)/** Key code constant: Switch Charset modifier key.* Used to switch character sets (Kanji, Katakana). */public static final int KEYCODE_SWITCH_CHARSET  = 95;   // switch char-sets (Kanji,Katakana)/** Key code constant: A Button key.* On a game controller, the A button should be either the button labeled A* or the first button on the bottom row of controller buttons. */public static final int KEYCODE_BUTTON_A        = 96;/** Key code constant: B Button key.* On a game controller, the B button should be either the button labeled B* or the second button on the bottom row of controller buttons. */public static final int KEYCODE_BUTTON_B        = 97;/** Key code constant: C Button key.* On a game controller, the C button should be either the button labeled C* or the third button on the bottom row of controller buttons. */public static final int KEYCODE_BUTTON_C        = 98;/** Key code constant: X Button key.* On a game controller, the X button should be either the button labeled X* or the first button on the upper row of controller buttons. */public static final int KEYCODE_BUTTON_X        = 99;/** Key code constant: Y Button key.* On a game controller, the Y button should be either the button labeled Y* or the second button on the upper row of controller buttons. */public static final int KEYCODE_BUTTON_Y        = 100;/** Key code constant: Z Button key.* On a game controller, the Z button should be either the button labeled Z* or the third button on the upper row of controller buttons. */public static final int KEYCODE_BUTTON_Z        = 101;/** Key code constant: L1 Button key.* On a game controller, the L1 button should be either the button labeled L1 (or L)* or the top left trigger button. */public static final int KEYCODE_BUTTON_L1       = 102;/** Key code constant: R1 Button key.* On a game controller, the R1 button should be either the button labeled R1 (or R)* or the top right trigger button. */public static final int KEYCODE_BUTTON_R1       = 103;/** Key code constant: L2 Button key.* On a game controller, the L2 button should be either the button labeled L2* or the bottom left trigger button. */public static final int KEYCODE_BUTTON_L2       = 104;/** Key code constant: R2 Button key.* On a game controller, the R2 button should be either the button labeled R2* or the bottom right trigger button. */public static final int KEYCODE_BUTTON_R2       = 105;/** Key code constant: Left Thumb Button key.* On a game controller, the left thumb button indicates that the left (or only)* joystick is pressed. */public static final int KEYCODE_BUTTON_THUMBL   = 106;/** Key code constant: Right Thumb Button key.* On a game controller, the right thumb button indicates that the right* joystick is pressed. */public static final int KEYCODE_BUTTON_THUMBR   = 107;/** Key code constant: Start Button key.* On a game controller, the button labeled Start. */public static final int KEYCODE_BUTTON_START    = 108;/** Key code constant: Select Button key.* On a game controller, the button labeled Select. */public static final int KEYCODE_BUTTON_SELECT   = 109;/** Key code constant: Mode Button key.* On a game controller, the button labeled Mode. */public static final int KEYCODE_BUTTON_MODE     = 110;/** Key code constant: Escape key. */public static final int KEYCODE_ESCAPE          = 111;/** Key code constant: Forward Delete key.* Deletes characters ahead of the insertion point, unlike {@link #KEYCODE_DEL}. */public static final int KEYCODE_FORWARD_DEL     = 112;/** Key code constant: Left Control modifier key. */public static final int KEYCODE_CTRL_LEFT       = 113;/** Key code constant: Right Control modifier key. */public static final int KEYCODE_CTRL_RIGHT      = 114;/** Key code constant: Caps Lock key. */public static final int KEYCODE_CAPS_LOCK       = 115;/** Key code constant: Scroll Lock key. */public static final int KEYCODE_SCROLL_LOCK     = 116;/** Key code constant: Left Meta modifier key. */public static final int KEYCODE_META_LEFT       = 117;/** Key code constant: Right Meta modifier key. */public static final int KEYCODE_META_RIGHT      = 118;/** Key code constant: Function modifier key. */public static final int KEYCODE_FUNCTION        = 119;/** Key code constant: System Request / Print Screen key. */public static final int KEYCODE_SYSRQ           = 120;/** Key code constant: Break / Pause key. */public static final int KEYCODE_BREAK           = 121;/** Key code constant: Home Movement key.* Used for scrolling or moving the cursor around to the start of a line* or to the top of a list. */public static final int KEYCODE_MOVE_HOME       = 122;/** Key code constant: End Movement key.* Used for scrolling or moving the cursor around to the end of a line* or to the bottom of a list. */public static final int KEYCODE_MOVE_END        = 123;/** Key code constant: Insert key.* Toggles insert / overwrite edit mode. */public static final int KEYCODE_INSERT          = 124;/** Key code constant: Forward key.* Navigates forward in the history stack.  Complement of {@link #KEYCODE_BACK}. */public static final int KEYCODE_FORWARD         = 125;/** Key code constant: Play media key. */public static final int KEYCODE_MEDIA_PLAY      = 126;/** Key code constant: Pause media key. */public static final int KEYCODE_MEDIA_PAUSE     = 127;/** Key code constant: Close media key.* May be used to close a CD tray, for example. */public static final int KEYCODE_MEDIA_CLOSE     = 128;/** Key code constant: Eject media key.* May be used to eject a CD tray, for example. */public static final int KEYCODE_MEDIA_EJECT     = 129;/** Key code constant: Record media key. */public static final int KEYCODE_MEDIA_RECORD    = 130;/** Key code constant: F1 key. */public static final int KEYCODE_F1              = 131;/** Key code constant: F2 key. */public static final int KEYCODE_F2              = 132;/** Key code constant: F3 key. */public static final int KEYCODE_F3              = 133;/** Key code constant: F4 key. */public static final int KEYCODE_F4              = 134;/** Key code constant: F5 key. */public static final int KEYCODE_F5              = 135;/** Key code constant: F6 key. */public static final int KEYCODE_F6              = 136;/** Key code constant: F7 key. */public static final int KEYCODE_F7              = 137;/** Key code constant: F8 key. */public static final int KEYCODE_F8              = 138;/** Key code constant: F9 key. */public static final int KEYCODE_F9              = 139;/** Key code constant: F10 key. */public static final int KEYCODE_F10             = 140;/** Key code constant: F11 key. */public static final int KEYCODE_F11             = 141;/** Key code constant: F12 key. */public static final int KEYCODE_F12             = 142;/** Key code constant: Num Lock key.* This is the Num Lock key; it is different from {@link #KEYCODE_NUM}.* This key alters the behavior of other keys on the numeric keypad. */public static final int KEYCODE_NUM_LOCK        = 143;/** Key code constant: Numeric keypad '0' key. */public static final int KEYCODE_NUMPAD_0        = 144;/** Key code constant: Numeric keypad '1' key. */public static final int KEYCODE_NUMPAD_1        = 145;/** Key code constant: Numeric keypad '2' key. */public static final int KEYCODE_NUMPAD_2        = 146;/** Key code constant: Numeric keypad '3' key. */public static final int KEYCODE_NUMPAD_3        = 147;/** Key code constant: Numeric keypad '4' key. */public static final int KEYCODE_NUMPAD_4        = 148;/** Key code constant: Numeric keypad '5' key. */public static final int KEYCODE_NUMPAD_5        = 149;/** Key code constant: Numeric keypad '6' key. */public static final int KEYCODE_NUMPAD_6        = 150;/** Key code constant: Numeric keypad '7' key. */public static final int KEYCODE_NUMPAD_7        = 151;/** Key code constant: Numeric keypad '8' key. */public static final int KEYCODE_NUMPAD_8        = 152;/** Key code constant: Numeric keypad '9' key. */public static final int KEYCODE_NUMPAD_9        = 153;/** Key code constant: Numeric keypad '/' key (for division). */public static final int KEYCODE_NUMPAD_DIVIDE   = 154;/** Key code constant: Numeric keypad '*' key (for multiplication). */public static final int KEYCODE_NUMPAD_MULTIPLY = 155;/** Key code constant: Numeric keypad '-' key (for subtraction). */public static final int KEYCODE_NUMPAD_SUBTRACT = 156;/** Key code constant: Numeric keypad '+' key (for addition). */public static final int KEYCODE_NUMPAD_ADD      = 157;/** Key code constant: Numeric keypad '.' key (for decimals or digit grouping). */public static final int KEYCODE_NUMPAD_DOT      = 158;/** Key code constant: Numeric keypad ',' key (for decimals or digit grouping). */public static final int KEYCODE_NUMPAD_COMMA    = 159;/** Key code constant: Numeric keypad Enter key. */public static final int KEYCODE_NUMPAD_ENTER    = 160;/** Key code constant: Numeric keypad '=' key. */public static final int KEYCODE_NUMPAD_EQUALS   = 161;/** Key code constant: Numeric keypad '(' key. */public static final int KEYCODE_NUMPAD_LEFT_PAREN = 162;/** Key code constant: Numeric keypad ')' key. */public static final int KEYCODE_NUMPAD_RIGHT_PAREN = 163;/** Key code constant: Volume Mute key.* Mutes the speaker, unlike {@link #KEYCODE_MUTE}.* This key should normally be implemented as a toggle such that the first press* mutes the speaker and the second press restores the original volume. */public static final int KEYCODE_VOLUME_MUTE     = 164;/** Key code constant: Info key.* Common on TV remotes to show additional information related to what is* currently being viewed. */public static final int KEYCODE_INFO            = 165;/** Key code constant: Channel up key.* On TV remotes, increments the television channel. */public static final int KEYCODE_CHANNEL_UP      = 166;/** Key code constant: Channel down key.* On TV remotes, decrements the television channel. */public static final int KEYCODE_CHANNEL_DOWN    = 167;/** Key code constant: Zoom in key. */public static final int KEYCODE_ZOOM_IN         = 168;/** Key code constant: Zoom out key. */public static final int KEYCODE_ZOOM_OUT        = 169;/** Key code constant: TV key.* On TV remotes, switches to viewing live TV. */public static final int KEYCODE_TV              = 170;/** Key code constant: Window key.* On TV remotes, toggles picture-in-picture mode or other windowing functions. */public static final int KEYCODE_WINDOW          = 171;/** Key code constant: Guide key.* On TV remotes, shows a programming guide. */public static final int KEYCODE_GUIDE           = 172;/** Key code constant: DVR key.* On some TV remotes, switches to a DVR mode for recorded shows. */public static final int KEYCODE_DVR             = 173;/** Key code constant: Bookmark key.* On some TV remotes, bookmarks content or web pages. */public static final int KEYCODE_BOOKMARK        = 174;/** Key code constant: Toggle captions key.* Switches the mode for closed-captioning text, for example during television shows. */public static final int KEYCODE_CAPTIONS        = 175;/** Key code constant: Settings key.* Starts the system settings activity. */public static final int KEYCODE_SETTINGS        = 176;/** Key code constant: TV power key.* On TV remotes, toggles the power on a television screen. */public static final int KEYCODE_TV_POWER        = 177;/** Key code constant: TV input key.* On TV remotes, switches the input on a television screen. */public static final int KEYCODE_TV_INPUT        = 178;/** Key code constant: Set-top-box power key.* On TV remotes, toggles the power on an external Set-top-box. */public static final int KEYCODE_STB_POWER       = 179;/** Key code constant: Set-top-box input key.* On TV remotes, switches the input mode on an external Set-top-box. */public static final int KEYCODE_STB_INPUT       = 180;/** Key code constant: A/V Receiver power key.* On TV remotes, toggles the power on an external A/V Receiver. */public static final int KEYCODE_AVR_POWER       = 181;/** Key code constant: A/V Receiver input key.* On TV remotes, switches the input mode on an external A/V Receiver. */public static final int KEYCODE_AVR_INPUT       = 182;/** Key code constant: Red "programmable" key.* On TV remotes, acts as a contextual/programmable key. */public static final int KEYCODE_PROG_RED        = 183;/** Key code constant: Green "programmable" key.* On TV remotes, actsas a contextual/programmable key. */public static final int KEYCODE_PROG_GREEN      = 184;/** Key code constant: Yellow "programmable" key.* On TV remotes, acts as a contextual/programmable key. */public static final int KEYCODE_PROG_YELLOW     = 185;/** Key code constant: Blue "programmable" key.* On TV remotes, acts as a contextual/programmable key. */public static final int KEYCODE_PROG_BLUE       = 186;/** Key code constant: App switch key.* Should bring up the application switcher dialog. */public static final int KEYCODE_APP_SWITCH      = 187;/** Key code constant: Generic Game Pad Button #1.*/public static final int KEYCODE_BUTTON_1        = 188;/** Key code constant: Generic Game Pad Button #2.*/public static final int KEYCODE_BUTTON_2        = 189;/** Key code constant: Generic Game Pad Button #3.*/public static final int KEYCODE_BUTTON_3        = 190;/** Key code constant: Generic Game Pad Button #4.*/public static final int KEYCODE_BUTTON_4        = 191;/** Key code constant: Generic Game Pad Button #5.*/public static final int KEYCODE_BUTTON_5        = 192;/** Key code constant: Generic Game Pad Button #6.*/public static final int KEYCODE_BUTTON_6        = 193;/** Key code constant: Generic Game Pad Button #7.*/public static final int KEYCODE_BUTTON_7        = 194;/** Key code constant: Generic Game Pad Button #8.*/public static final int KEYCODE_BUTTON_8        = 195;/** Key code constant: Generic Game Pad Button #9.*/public static final int KEYCODE_BUTTON_9        = 196;/** Key code constant: Generic Game Pad Button #10.*/public static final int KEYCODE_BUTTON_10       = 197;/** Key code constant: Generic Game Pad Button #11.*/public static final int KEYCODE_BUTTON_11       = 198;/** Key code constant: Generic Game Pad Button #12.*/public static final int KEYCODE_BUTTON_12       = 199;/** Key code constant: Generic Game Pad Button #13.*/public static final int KEYCODE_BUTTON_13       = 200;/** Key code constant: Generic Game Pad Button #14.*/public static final int KEYCODE_BUTTON_14       = 201;/** Key code constant: Generic Game Pad Button #15.*/public static final int KEYCODE_BUTTON_15       = 202;/** Key code constant: Generic Game Pad Button #16.*/public static final int KEYCODE_BUTTON_16       = 203;/** Key code constant: Language Switch key.* Toggles the current input language such as switching between English and Japanese on* a QWERTY keyboard.  On some devices, the same function may be performed by* pressing Shift+Spacebar. */public static final int KEYCODE_LANGUAGE_SWITCH = 204;/** Key code constant: Manner Mode key.* Toggles silent or vibrate mode on and off to make the device behave more politely* in certain settings such as on a crowded train.  On some devices, the key may only* operate when long-pressed. */public static final int KEYCODE_MANNER_MODE     = 205;/** Key code constant: 3D Mode key.* Toggles the display between 2D and 3D mode. */public static final int KEYCODE_3D_MODE         = 206;/** Key code constant: Contacts special function key.* Used to launch an address book application. */public static final int KEYCODE_CONTACTS        = 207;/** Key code constant: Calendar special function key.* Used to launch a calendar application. */public static final int KEYCODE_CALENDAR        = 208;/** Key code constant: Music special function key.* Used to launch a music player application. */public static final int KEYCODE_MUSIC           = 209;/** Key code constant: Calculator special function key.* Used to launch a calculator application. */public static final int KEYCODE_CALCULATOR      = 210;/** Key code constant: Japanese full-width / half-width key. */public static final int KEYCODE_ZENKAKU_HANKAKU = 211;/** Key code constant: Japanese alphanumeric key. */public static final int KEYCODE_EISU            = 212;/** Key code constant: Japanese non-conversion key. */public static final int KEYCODE_MUHENKAN        = 213;/** Key code constant: Japanese conversion key. */public static final int KEYCODE_HENKAN          = 214;/** Key code constant: Japanese katakana / hiragana key. */public static final int KEYCODE_KATAKANA_HIRAGANA = 215;/** Key code constant: Japanese Yen key. */public static final int KEYCODE_YEN             = 216;/** Key code constant: Japanese Ro key. */public static final int KEYCODE_RO              = 217;/** Key code constant: Japanese kana key. */public static final int KEYCODE_KANA            = 218;/** Key code constant: Assist key.* Launches the global assist activity.  Not delivered to applications. */public static final int KEYCODE_ASSIST          = 219;/** Key code constant: Brightness Down key.* Adjusts the screen brightness down. */public static final int KEYCODE_BRIGHTNESS_DOWN = 220;/** Key code constant: Brightness Up key.* Adjusts the screen brightness up. */public static final int KEYCODE_BRIGHTNESS_UP   = 221;/** Key code constant: Audio Track key* Switches the audio tracks. */public static final int KEYCODE_MEDIA_AUDIO_TRACK = 222;public static final int KEYCODE_RECALL          = 250;public static final int KEYCODE_HEADSET_IN      = 251;public static final int KEYCODE_HEADSET_OUT     = 252;public static final int KEYCODE_MIC_ON          = 253;public static final int KEYCODE_TOUCH_ZOOMIN    = 254;public static final int KEYCODE_TOUCH_ZOOMOUT   = 255;public static final int KEYCODE_ICLOUD          = 256;public static final int KEYCODE_VOIP            = 257;public static final int KEYCODE_GAME_MODE_OPEN  = 258;public static final int KEYCODE_GAME_MODE_QUIT  = 259;public static final int KEYCODE_GAME_KEY_SET    = 260;public static final int KEYCODE_RESOLUTION_RATIO= 1001;public static final int KEYCODE_SUB             = 1004;public static final int KEYCODE_AUDIO           = 1010;public static final int KEYCODE_FAVORITES       = 1177;public static final int KEYCODE_IME             = 1178;public static final int KEYCODE_SEEK            = 1180;public static final int KEYCODE_VOD             = 1182;public static final int KEYCODE_NPVR            = 1184;public static final int KEYCODE_PQ              = 1185;private static final int LAST_KEYCODE           = KEYCODE_PQ;// NOTE: If you add a new keycode here you must also add it to://  isSystem()//  frameworks/native/include/android/keycodes.h//  frameworks/base/include/androidfw/KeycodeLabels.h//  external/webkit/WebKit/android/plugins/ANPKeyCodes.h//  frameworks/base/core/res/res/values/attrs.xml//  emulator?//  LAST_KEYCODE//  KEYCODE_SYMBOLIC_NAMES////  Also Android currently does not reserve code ranges for vendor-//  specific key codes.  If you have new key codes to have, you//  MUST contribute a patch to the open source project to define//  those new codes.  This is intended to maintain a consistent//  set of key code definitions across all Android devices.// Symbolic names of all key codes.private static final SparseArray<String> KEYCODE_SYMBOLIC_NAMES = new SparseArray<String>();private static void populateKeycodeSymbolicNames() {SparseArray<String> names = KEYCODE_SYMBOLIC_NAMES;names.append(KEYCODE_UNKNOWN, "KEYCODE_UNKNOWN");names.append(KEYCODE_SOFT_LEFT, "KEYCODE_SOFT_LEFT");names.append(KEYCODE_SOFT_RIGHT, "KEYCODE_SOFT_RIGHT");names.append(KEYCODE_HOME, "KEYCODE_HOME");names.append(KEYCODE_BACK, "KEYCODE_BACK");names.append(KEYCODE_CALL, "KEYCODE_CALL");names.append(KEYCODE_ENDCALL, "KEYCODE_ENDCALL");names.append(KEYCODE_0, "KEYCODE_0");names.append(KEYCODE_1, "KEYCODE_1");names.append(KEYCODE_2, "KEYCODE_2");names.append(KEYCODE_3, "KEYCODE_3");names.append(KEYCODE_4, "KEYCODE_4");names.append(KEYCODE_5, "KEYCODE_5");names.append(KEYCODE_6, "KEYCODE_6");names.append(KEYCODE_7, "KEYCODE_7");names.append(KEYCODE_8, "KEYCODE_8");names.append(KEYCODE_9, "KEYCODE_9");names.append(KEYCODE_STAR, "KEYCODE_STAR");names.append(KEYCODE_POUND, "KEYCODE_POUND");names.append(KEYCODE_DPAD_UP, "KEYCODE_DPAD_UP");names.append(KEYCODE_DPAD_DOWN, "KEYCODE_DPAD_DOWN");names.append(KEYCODE_DPAD_LEFT, "KEYCODE_DPAD_LEFT");names.append(KEYCODE_DPAD_RIGHT, "KEYCODE_DPAD_RIGHT");names.append(KEYCODE_DPAD_CENTER, "KEYCODE_DPAD_CENTER");names.append(KEYCODE_VOLUME_UP, "KEYCODE_VOLUME_UP");names.append(KEYCODE_VOLUME_DOWN, "KEYCODE_VOLUME_DOWN");names.append(KEYCODE_POWER, "KEYCODE_POWER");names.append(KEYCODE_CAMERA, "KEYCODE_CAMERA");names.append(KEYCODE_CLEAR, "KEYCODE_CLEAR");names.append(KEYCODE_A, "KEYCODE_A");names.append(KEYCODE_B, "KEYCODE_B");names.append(KEYCODE_C, "KEYCODE_C");names.append(KEYCODE_D, "KEYCODE_D");names.append(KEYCODE_E, "KEYCODE_E");names.append(KEYCODE_F, "KEYCODE_F");names.append(KEYCODE_G, "KEYCODE_G");names.append(KEYCODE_H, "KEYCODE_H");names.append(KEYCODE_I, "KEYCODE_I");names.append(KEYCODE_J, "KEYCODE_J");names.append(KEYCODE_K, "KEYCODE_K");names.append(KEYCODE_L, "KEYCODE_L");names.append(KEYCODE_M, "KEYCODE_M");names.append(KEYCODE_N, "KEYCODE_N");names.append(KEYCODE_O, "KEYCODE_O");names.append(KEYCODE_P, "KEYCODE_P");names.append(KEYCODE_Q, "KEYCODE_Q");names.append(KEYCODE_R, "KEYCODE_R");names.append(KEYCODE_S, "KEYCODE_S");names.append(KEYCODE_T, "KEYCODE_T");names.append(KEYCODE_U, "KEYCODE_U");names.append(KEYCODE_V, "KEYCODE_V");names.append(KEYCODE_W, "KEYCODE_W");names.append(KEYCODE_X, "KEYCODE_X");names.append(KEYCODE_Y, "KEYCODE_Y");names.append(KEYCODE_Z, "KEYCODE_Z");names.append(KEYCODE_COMMA, "KEYCODE_COMMA");names.append(KEYCODE_PERIOD, "KEYCODE_PERIOD");names.append(KEYCODE_ALT_LEFT, "KEYCODE_ALT_LEFT");names.append(KEYCODE_ALT_RIGHT, "KEYCODE_ALT_RIGHT");names.append(KEYCODE_SHIFT_LEFT, "KEYCODE_SHIFT_LEFT");names.append(KEYCODE_SHIFT_RIGHT, "KEYCODE_SHIFT_RIGHT");names.append(KEYCODE_TAB, "KEYCODE_TAB");names.append(KEYCODE_SPACE, "KEYCODE_SPACE");names.append(KEYCODE_SYM, "KEYCODE_SYM");names.append(KEYCODE_EXPLORER, "KEYCODE_EXPLORER");names.append(KEYCODE_ENVELOPE, "KEYCODE_ENVELOPE");names.append(KEYCODE_ENTER, "KEYCODE_ENTER");names.append(KEYCODE_DEL, "KEYCODE_DEL");names.append(KEYCODE_GRAVE, "KEYCODE_GRAVE");names.append(KEYCODE_MINUS, "KEYCODE_MINUS");names.append(KEYCODE_EQUALS, "KEYCODE_EQUALS");names.append(KEYCODE_LEFT_BRACKET, "KEYCODE_LEFT_BRACKET");names.append(KEYCODE_RIGHT_BRACKET, "KEYCODE_RIGHT_BRACKET");names.append(KEYCODE_BACKSLASH, "KEYCODE_BACKSLASH");names.append(KEYCODE_SEMICOLON, "KEYCODE_SEMICOLON");names.append(KEYCODE_APOSTROPHE, "KEYCODE_APOSTROPHE");names.append(KEYCODE_SLASH, "KEYCODE_SLASH");names.append(KEYCODE_AT, "KEYCODE_AT");names.append(KEYCODE_NUM, "KEYCODE_NUM");names.append(KEYCODE_HEADSETHOOK, "KEYCODE_HEADSETHOOK");names.append(KEYCODE_FOCUS, "KEYCODE_FOCUS");names.append(KEYCODE_PLUS, "KEYCODE_PLUS");names.append(KEYCODE_MENU, "KEYCODE_MENU");names.append(KEYCODE_NOTIFICATION, "KEYCODE_NOTIFICATION");names.append(KEYCODE_SEARCH, "KEYCODE_SEARCH");names.append(KEYCODE_MEDIA_PLAY_PAUSE, "KEYCODE_MEDIA_PLAY_PAUSE");names.append(KEYCODE_MEDIA_STOP, "KEYCODE_MEDIA_STOP");names.append(KEYCODE_MEDIA_NEXT, "KEYCODE_MEDIA_NEXT");names.append(KEYCODE_MEDIA_PREVIOUS, "KEYCODE_MEDIA_PREVIOUS");names.append(KEYCODE_MEDIA_REWIND, "KEYCODE_MEDIA_REWIND");names.append(KEYCODE_MEDIA_FAST_FORWARD, "KEYCODE_MEDIA_FAST_FORWARD");names.append(KEYCODE_MUTE, "KEYCODE_MUTE");names.append(KEYCODE_PAGE_UP, "KEYCODE_PAGE_UP");names.append(KEYCODE_PAGE_DOWN, "KEYCODE_PAGE_DOWN");names.append(KEYCODE_PICTSYMBOLS, "KEYCODE_PICTSYMBOLS");names.append(KEYCODE_SWITCH_CHARSET, "KEYCODE_SWITCH_CHARSET");names.append(KEYCODE_BUTTON_A, "KEYCODE_BUTTON_A");names.append(KEYCODE_BUTTON_B, "KEYCODE_BUTTON_B");names.append(KEYCODE_BUTTON_C, "KEYCODE_BUTTON_C");names.append(KEYCODE_BUTTON_X, "KEYCODE_BUTTON_X");names.append(KEYCODE_BUTTON_Y, "KEYCODE_BUTTON_Y");names.append(KEYCODE_BUTTON_Z, "KEYCODE_BUTTON_Z");names.append(KEYCODE_BUTTON_L1, "KEYCODE_BUTTON_L1");names.append(KEYCODE_BUTTON_R1, "KEYCODE_BUTTON_R1");names.append(KEYCODE_BUTTON_L2, "KEYCODE_BUTTON_L2");names.append(KEYCODE_BUTTON_R2, "KEYCODE_BUTTON_R2");names.append(KEYCODE_BUTTON_THUMBL, "KEYCODE_BUTTON_THUMBL");names.append(KEYCODE_BUTTON_THUMBR, "KEYCODE_BUTTON_THUMBR");names.append(KEYCODE_BUTTON_START, "KEYCODE_BUTTON_START");names.append(KEYCODE_BUTTON_SELECT, "KEYCODE_BUTTON_SELECT");names.append(KEYCODE_BUTTON_MODE, "KEYCODE_BUTTON_MODE");names.append(KEYCODE_ESCAPE, "KEYCODE_ESCAPE");names.append(KEYCODE_FORWARD_DEL, "KEYCODE_FORWARD_DEL");names.append(KEYCODE_CTRL_LEFT, "KEYCODE_CTRL_LEFT");names.append(KEYCODE_CTRL_RIGHT, "KEYCODE_CTRL_RIGHT");names.append(KEYCODE_CAPS_LOCK, "KEYCODE_CAPS_LOCK");names.append(KEYCODE_SCROLL_LOCK, "KEYCODE_SCROLL_LOCK");names.append(KEYCODE_META_LEFT, "KEYCODE_META_LEFT");names.append(KEYCODE_META_RIGHT, "KEYCODE_META_RIGHT");names.append(KEYCODE_FUNCTION, "KEYCODE_FUNCTION");names.append(KEYCODE_SYSRQ, "KEYCODE_SYSRQ");names.append(KEYCODE_BREAK, "KEYCODE_BREAK");names.append(KEYCODE_MOVE_HOME, "KEYCODE_MOVE_HOME");names.append(KEYCODE_MOVE_END, "KEYCODE_MOVE_END");names.append(KEYCODE_INSERT, "KEYCODE_INSERT");names.append(KEYCODE_FORWARD, "KEYCODE_FORWARD");names.append(KEYCODE_MEDIA_PLAY, "KEYCODE_MEDIA_PLAY");names.append(KEYCODE_MEDIA_PAUSE, "KEYCODE_MEDIA_PAUSE");names.append(KEYCODE_MEDIA_CLOSE, "KEYCODE_MEDIA_CLOSE");names.append(KEYCODE_MEDIA_EJECT, "KEYCODE_MEDIA_EJECT");names.append(KEYCODE_MEDIA_RECORD, "KEYCODE_MEDIA_RECORD");names.append(KEYCODE_F1, "KEYCODE_F1");names.append(KEYCODE_F2, "KEYCODE_F2");names.append(KEYCODE_F3, "KEYCODE_F3");names.append(KEYCODE_F4, "KEYCODE_F4");names.append(KEYCODE_F5, "KEYCODE_F5");names.append(KEYCODE_F6, "KEYCODE_F6");names.append(KEYCODE_F7, "KEYCODE_F7");names.append(KEYCODE_F8, "KEYCODE_F8");names.append(KEYCODE_F9, "KEYCODE_F9");names.append(KEYCODE_F10, "KEYCODE_F10");names.append(KEYCODE_F11, "KEYCODE_F11");names.append(KEYCODE_F12, "KEYCODE_F12");names.append(KEYCODE_NUM_LOCK, "KEYCODE_NUM_LOCK");names.append(KEYCODE_NUMPAD_0, "KEYCODE_NUMPAD_0");names.append(KEYCODE_NUMPAD_1, "KEYCODE_NUMPAD_1");names.append(KEYCODE_NUMPAD_2, "KEYCODE_NUMPAD_2");names.append(KEYCODE_NUMPAD_3, "KEYCODE_NUMPAD_3");names.append(KEYCODE_NUMPAD_4, "KEYCODE_NUMPAD_4");names.append(KEYCODE_NUMPAD_5, "KEYCODE_NUMPAD_5");names.append(KEYCODE_NUMPAD_6, "KEYCODE_NUMPAD_6");names.append(KEYCODE_NUMPAD_7, "KEYCODE_NUMPAD_7");names.append(KEYCODE_NUMPAD_8, "KEYCODE_NUMPAD_8");names.append(KEYCODE_NUMPAD_9, "KEYCODE_NUMPAD_9");names.append(KEYCODE_NUMPAD_DIVIDE, "KEYCODE_NUMPAD_DIVIDE");names.append(KEYCODE_NUMPAD_MULTIPLY, "KEYCODE_NUMPAD_MULTIPLY");names.append(KEYCODE_NUMPAD_SUBTRACT, "KEYCODE_NUMPAD_SUBTRACT");names.append(KEYCODE_NUMPAD_ADD, "KEYCODE_NUMPAD_ADD");names.append(KEYCODE_NUMPAD_DOT, "KEYCODE_NUMPAD_DOT");names.append(KEYCODE_NUMPAD_COMMA, "KEYCODE_NUMPAD_COMMA");names.append(KEYCODE_NUMPAD_ENTER, "KEYCODE_NUMPAD_ENTER");names.append(KEYCODE_NUMPAD_EQUALS, "KEYCODE_NUMPAD_EQUALS");names.append(KEYCODE_NUMPAD_LEFT_PAREN, "KEYCODE_NUMPAD_LEFT_PAREN");names.append(KEYCODE_NUMPAD_RIGHT_PAREN, "KEYCODE_NUMPAD_RIGHT_PAREN");names.append(KEYCODE_VOLUME_MUTE, "KEYCODE_VOLUME_MUTE");names.append(KEYCODE_INFO, "KEYCODE_INFO");names.append(KEYCODE_CHANNEL_UP, "KEYCODE_CHANNEL_UP");names.append(KEYCODE_CHANNEL_DOWN, "KEYCODE_CHANNEL_DOWN");names.append(KEYCODE_ZOOM_IN, "KEYCODE_ZOOM_IN");names.append(KEYCODE_ZOOM_OUT, "KEYCODE_ZOOM_OUT");names.append(KEYCODE_TV, "KEYCODE_TV");names.append(KEYCODE_WINDOW, "KEYCODE_WINDOW");names.append(KEYCODE_GUIDE, "KEYCODE_GUIDE");names.append(KEYCODE_DVR, "KEYCODE_DVR");names.append(KEYCODE_BOOKMARK, "KEYCODE_BOOKMARK");names.append(KEYCODE_CAPTIONS, "KEYCODE_CAPTIONS");names.append(KEYCODE_SETTINGS, "KEYCODE_SETTINGS");names.append(KEYCODE_TV_POWER, "KEYCODE_TV_POWER");names.append(KEYCODE_TV_INPUT, "KEYCODE_TV_INPUT");names.append(KEYCODE_STB_INPUT, "KEYCODE_STB_INPUT");names.append(KEYCODE_STB_POWER, "KEYCODE_STB_POWER");names.append(KEYCODE_AVR_POWER, "KEYCODE_AVR_POWER");names.append(KEYCODE_AVR_INPUT, "KEYCODE_AVR_INPUT");names.append(KEYCODE_PROG_RED, "KEYCODE_PROG_RED");names.append(KEYCODE_PROG_GREEN, "KEYCODE_PROG_GREEN");names.append(KEYCODE_PROG_YELLOW, "KEYCODE_PROG_YELLOW");names.append(KEYCODE_PROG_BLUE, "KEYCODE_PROG_BLUE");names.append(KEYCODE_APP_SWITCH, "KEYCODE_APP_SWITCH");names.append(KEYCODE_BUTTON_1, "KEYCODE_BUTTON_1");names.append(KEYCODE_BUTTON_2, "KEYCODE_BUTTON_2");names.append(KEYCODE_BUTTON_3, "KEYCODE_BUTTON_3");names.append(KEYCODE_BUTTON_4, "KEYCODE_BUTTON_4");names.append(KEYCODE_BUTTON_5, "KEYCODE_BUTTON_5");names.append(KEYCODE_BUTTON_6, "KEYCODE_BUTTON_6");names.append(KEYCODE_BUTTON_7, "KEYCODE_BUTTON_7");names.append(KEYCODE_BUTTON_8, "KEYCODE_BUTTON_8");names.append(KEYCODE_BUTTON_9, "KEYCODE_BUTTON_9");names.append(KEYCODE_BUTTON_10, "KEYCODE_BUTTON_10");names.append(KEYCODE_BUTTON_11, "KEYCODE_BUTTON_11");names.append(KEYCODE_BUTTON_12, "KEYCODE_BUTTON_12");names.append(KEYCODE_BUTTON_13, "KEYCODE_BUTTON_13");names.append(KEYCODE_BUTTON_14, "KEYCODE_BUTTON_14");names.append(KEYCODE_BUTTON_15, "KEYCODE_BUTTON_15");names.append(KEYCODE_BUTTON_16, "KEYCODE_BUTTON_16");names.append(KEYCODE_LANGUAGE_SWITCH, "KEYCODE_LANGUAGE_SWITCH");names.append(KEYCODE_MANNER_MODE, "KEYCODE_MANNER_MODE");names.append(KEYCODE_3D_MODE, "KEYCODE_3D_MODE");names.append(KEYCODE_CONTACTS, "KEYCODE_CONTACTS");names.append(KEYCODE_CALENDAR, "KEYCODE_CALENDAR");names.append(KEYCODE_MUSIC, "KEYCODE_MUSIC");names.append(KEYCODE_CALCULATOR, "KEYCODE_CALCULATOR");names.append(KEYCODE_ZENKAKU_HANKAKU, "KEYCODE_ZENKAKU_HANKAKU");names.append(KEYCODE_EISU, "KEYCODE_EISU");names.append(KEYCODE_MUHENKAN, "KEYCODE_MUHENKAN");names.append(KEYCODE_HENKAN, "KEYCODE_HENKAN");names.append(KEYCODE_KATAKANA_HIRAGANA, "KEYCODE_KATAKANA_HIRAGANA");names.append(KEYCODE_YEN, "KEYCODE_YEN");names.append(KEYCODE_RO, "KEYCODE_RO");names.append(KEYCODE_KANA, "KEYCODE_KANA");names.append(KEYCODE_ASSIST, "KEYCODE_ASSIST");names.append(KEYCODE_BRIGHTNESS_DOWN, "KEYCODE_BRIGHTNESS_DOWN");names.append(KEYCODE_BRIGHTNESS_UP, "KEYCODE_BRIGHTNESS_UP");names.append(KEYCODE_MEDIA_AUDIO_TRACK, "KEYCODE_MEDIA_AUDIO_TRACK");};// Symbolic names of all metakeys in bit order from least significant to most significant.// Accordingly there are exactly 32 values in this table.private static final String[] META_SYMBOLIC_NAMES = new String[] {"META_SHIFT_ON","META_ALT_ON","META_SYM_ON","META_FUNCTION_ON","META_ALT_LEFT_ON","META_ALT_RIGHT_ON","META_SHIFT_LEFT_ON","META_SHIFT_RIGHT_ON","META_CAP_LOCKED","META_ALT_LOCKED","META_SYM_LOCKED","0x00000800","META_CTRL_ON","META_CTRL_LEFT_ON","META_CTRL_RIGHT_ON","0x00008000","META_META_ON","META_META_LEFT_ON","META_META_RIGHT_ON","0x00080000","META_CAPS_LOCK_ON","META_NUM_LOCK_ON","META_SCROLL_LOCK_ON","0x00800000","0x01000000","0x02000000","0x04000000","0x08000000","0x10000000","0x20000000","0x40000000","0x80000000",};/*** @deprecated There are now more than MAX_KEYCODE keycodes.* Use {@link #getMaxKeyCode()} instead.*/@Deprecatedpublic static final int MAX_KEYCODE             = 84;/*** {@link #getAction} value: the key has been pressed down.*/public static final int ACTION_DOWN             = 0;/*** {@link #getAction} value: the key has been released.*/public static final int ACTION_UP               = 1;/*** {@link #getAction} value: multiple duplicate key events have* occurred in a row, or a complex string is being delivered.  If the* key code is not {#link {@link #KEYCODE_UNKNOWN} then the* {#link {@link #getRepeatCount()} method returns the number of times* the given key code should be executed.* Otherwise, if the key code is {@link #KEYCODE_UNKNOWN}, then* this is a sequence of characters as returned by {@link #getCharacters}.*/public static final int ACTION_MULTIPLE         = 2;/*** SHIFT key locked in CAPS mode.* Reserved for use by {@link MetaKeyKeyListener} for a published constant in its API.* @hide*/public static final int META_CAP_LOCKED = 0x100;/*** ALT key locked.* Reserved for use by {@link MetaKeyKeyListener} for a published constant in its API.* @hide*/public static final int META_ALT_LOCKED = 0x200;/*** SYM key locked.* Reserved for use by {@link MetaKeyKeyListener} for a published constant in its API.* @hide*/public static final int META_SYM_LOCKED = 0x400;/*** Text is in selection mode.* Reserved for use by {@link MetaKeyKeyListener} for a private unpublished constant* in its API that is currently being retained for legacy reasons.* @hide*/public static final int META_SELECTING = 0x800;/*** <p>This mask is used to check whether one of the ALT meta keys is pressed.</p>** @see #isAltPressed()* @see #getMetaState()* @see #KEYCODE_ALT_LEFT* @see #KEYCODE_ALT_RIGHT*/public static final int META_ALT_ON = 0x02;/*** <p>This mask is used to check whether the left ALT meta key is pressed.</p>** @see #isAltPressed()* @see #getMetaState()* @see #KEYCODE_ALT_LEFT*/public static final int META_ALT_LEFT_ON = 0x10;/*** <p>This mask is used to check whether the right the ALT meta key is pressed.</p>** @see #isAltPressed()* @see #getMetaState()* @see #KEYCODE_ALT_RIGHT*/public static final int META_ALT_RIGHT_ON = 0x20;/*** <p>This mask is used to check whether one of the SHIFT meta keys is pressed.</p>** @see #isShiftPressed()* @see #getMetaState()* @see #KEYCODE_SHIFT_LEFT* @see #KEYCODE_SHIFT_RIGHT*/public static final int META_SHIFT_ON = 0x1;/*** <p>This mask is used to check whether the left SHIFT meta key is pressed.</p>** @see #isShiftPressed()* @see #getMetaState()* @see #KEYCODE_SHIFT_LEFT*/public static final int META_SHIFT_LEFT_ON = 0x40;/*** <p>This mask is used to check whether the right SHIFT meta key is pressed.</p>** @see #isShiftPressed()* @see #getMetaState()* @see #KEYCODE_SHIFT_RIGHT*/public static final int META_SHIFT_RIGHT_ON = 0x80;/*** <p>This mask is used to check whether the SYM meta key is pressed.</p>** @see #isSymPressed()* @see #getMetaState()*/public static final int META_SYM_ON = 0x4;/*** <p>This mask is used to check whether the FUNCTION meta key is pressed.</p>** @see #isFunctionPressed()* @see #getMetaState()*/public static final int META_FUNCTION_ON = 0x8;/*** <p>This mask is used to check whether one of the CTRL meta keys is pressed.</p>** @see #isCtrlPressed()* @see #getMetaState()* @see #KEYCODE_CTRL_LEFT* @see #KEYCODE_CTRL_RIGHT*/public static final int META_CTRL_ON = 0x1000;/*** <p>This mask is used to check whether the left CTRL meta key is pressed.</p>** @see #isCtrlPressed()* @see #getMetaState()* @see #KEYCODE_CTRL_LEFT*/public static final int META_CTRL_LEFT_ON = 0x2000;/*** <p>This mask is used to check whether the right CTRL meta key is pressed.</p>** @see #isCtrlPressed()* @see #getMetaState()* @see #KEYCODE_CTRL_RIGHT*/public static final int META_CTRL_RIGHT_ON = 0x4000;/*** <p>This mask is used to check whether one of the META meta keys is pressed.</p>** @see #isMetaPressed()* @see #getMetaState()* @see #KEYCODE_META_LEFT* @see #KEYCODE_META_RIGHT*/public static final int META_META_ON = 0x10000;/*** <p>This mask is used to check whether the left META meta key is pressed.</p>** @see #isMetaPressed()* @see #getMetaState()* @see #KEYCODE_META_LEFT*/public static final int META_META_LEFT_ON = 0x20000;/*** <p>This mask is used to check whether the right META meta key is pressed.</p>** @see #isMetaPressed()* @see #getMetaState()* @see #KEYCODE_META_RIGHT*/public static final int META_META_RIGHT_ON = 0x40000;/*** <p>This mask is used to check whether the CAPS LOCK meta key is on.</p>** @see #isCapsLockOn()* @see #getMetaState()* @see #KEYCODE_CAPS_LOCK*/public static final int META_CAPS_LOCK_ON = 0x100000;/*** <p>This mask is used to check whether the NUM LOCK meta key is on.</p>** @see #isNumLockOn()* @see #getMetaState()* @see #KEYCODE_NUM_LOCK*/public static final int META_NUM_LOCK_ON = 0x200000;/*** <p>This mask is used to check whether the SCROLL LOCK meta key is on.</p>** @see #isScrollLockOn()* @see #getMetaState()* @see #KEYCODE_SCROLL_LOCK*/public static final int META_SCROLL_LOCK_ON = 0x400000;/*** This mask is a combination of {@link #META_SHIFT_ON}, {@link #META_SHIFT_LEFT_ON}* and {@link #META_SHIFT_RIGHT_ON}.*/public static final int META_SHIFT_MASK = META_SHIFT_ON| META_SHIFT_LEFT_ON | META_SHIFT_RIGHT_ON;/*** This mask is a combination of {@link #META_ALT_ON}, {@link #META_ALT_LEFT_ON}* and {@link #META_ALT_RIGHT_ON}.*/public static final int META_ALT_MASK = META_ALT_ON| META_ALT_LEFT_ON | META_ALT_RIGHT_ON;/*** This mask is a combination of {@link #META_CTRL_ON}, {@link #META_CTRL_LEFT_ON}* and {@link #META_CTRL_RIGHT_ON}.*/public static final int META_CTRL_MASK = META_CTRL_ON| META_CTRL_LEFT_ON | META_CTRL_RIGHT_ON;/*** This mask is a combination of {@link #META_META_ON}, {@link #META_META_LEFT_ON}* and {@link #META_META_RIGHT_ON}.*/public static final int META_META_MASK = META_META_ON| META_META_LEFT_ON | META_META_RIGHT_ON;/*** This mask is set if the device woke because of this key event.*/public static final int FLAG_WOKE_HERE = 0x1;/*** This mask is set if the key event was generated by a software keyboard.*/public static final int FLAG_SOFT_KEYBOARD = 0x2;/*** This mask is set if we don't want the key event to cause us to leave* touch mode.*/public static final int FLAG_KEEP_TOUCH_MODE = 0x4;/*** This mask is set if an event was known to come from a trusted part* of the system.  That is, the event is known to come from the user,* and could not have been spoofed by a third party component.*/public static final int FLAG_FROM_SYSTEM = 0x8;/*** This mask is used for compatibility, to identify enter keys that are* coming from an IME whose enter key has been auto-labelled "next" or* "done".  This allows TextView to dispatch these as normal enter keys* for old applications, but still do the appropriate action when* receiving them.*/public static final int FLAG_EDITOR_ACTION = 0x10;/*** When associated with up key events, this indicates that the key press* has been canceled.  Typically this is used with virtual touch screen* keys, where the user can slide from the virtual key area on to the* display: in that case, the application will receive a canceled up* event and should not perform the action normally associated with the* key.  Note that for this to work, the application can not perform an* action for a key until it receives an up or the long press timeout has* expired. */public static final int FLAG_CANCELED = 0x20;/*** This key event was generated by a virtual (on-screen) hard key area.* Typically this is an area of the touchscreen, outside of the regular* display, dedicated to "hardware" buttons.*/public static final int FLAG_VIRTUAL_HARD_KEY = 0x40;/*** This flag is set for the first key repeat that occurs after the* long press timeout.*/public static final int FLAG_LONG_PRESS = 0x80;/*** Set when a key event has {@link #FLAG_CANCELED} set because a long* press action was executed while it was down. */public static final int FLAG_CANCELED_LONG_PRESS = 0x100;/*** Set for {@link #ACTION_UP} when this event's key code is still being* tracked from its initial down.  That is, somebody requested that tracking* started on the key down and a long press has not caused* the tracking to be canceled.*/public static final int FLAG_TRACKING = 0x200;/*** Set when a key event has been synthesized to implement default behavior* for an event that the application did not handle.* Fallback key events are generated by unhandled trackball motions* (to emulate a directional keypad) and by certain unhandled key presses* that are declared in the key map (such as special function numeric keypad* keys when numlock is off).*/public static final int FLAG_FALLBACK = 0x400;/*** Signifies that the key is being predispatched.* @hide*/public static final int FLAG_PREDISPATCH = 0x20000000;/*** Private control to determine when an app is tracking a key sequence.* @hide*/public static final int FLAG_START_TRACKING = 0x40000000;/*** Private flag that indicates when the system has detected that this key event* may be inconsistent with respect to the sequence of previously delivered key events,* such as when a key up event is sent but the key was not down.** @hide* @see #isTainted* @see #setTainted*/public static final int FLAG_TAINTED = 0x80000000;/*** Returns the maximum keycode.*/public static int getMaxKeyCode() {return LAST_KEYCODE;}/*** Get the character that is produced by putting accent on the character* c.* For example, getDeadChar('`', 'e') returns &egrave;.*/public static int getDeadChar(int accent, int c) {return KeyCharacterMap.getDeadChar(accent, c);}static final boolean DEBUG = false;static final String TAG = "KeyEvent";private static final int MAX_RECYCLED = 10;private static final Object gRecyclerLock = new Object();private static int gRecyclerUsed;private static KeyEvent gRecyclerTop;private KeyEvent mNext;private int mDeviceId;private int mSource;private int mMetaState;private int mAction;private int mKeyCode;private int mScanCode;private int mRepeatCount;private int mFlags;private long mDownTime;private long mEventTime;private String mCharacters;public interface Callback {/*** Called when a key down event has occurred.  If you return true,* you can first call {@link KeyEvent#startTracking()* KeyEvent.startTracking()} to have the framework track the event* through its {@link #onKeyUp(int, KeyEvent)} and also call your* {@link #onKeyLongPress(int, KeyEvent)} if it occurs.* * @param keyCode The value in event.getKeyCode().* @param event Description of the key event.* * @return If you handled the event, return true.  If you want to allow*         the event to be handled by the next receiver, return false.*/boolean onKeyDown(int keyCode, KeyEvent event);/*** Called when a long press has occurred.  If you return true,* the final key up will have {@link KeyEvent#FLAG_CANCELED} and* {@link KeyEvent#FLAG_CANCELED_LONG_PRESS} set.  Note that in* order to receive this callback, someone in the event change* <em>must</em> return true from {@link #onKeyDown} <em>and</em>* call {@link KeyEvent#startTracking()} on the event.* * @param keyCode The value in event.getKeyCode().* @param event Description of the key event.* * @return If you handled the event, return true.  If you want to allow*         the event to be handled by the next receiver, return false.*/boolean onKeyLongPress(int keyCode, KeyEvent event);/*** Called when a key up event has occurred.* * @param keyCode The value in event.getKeyCode().* @param event Description of the key event.* * @return If you handled the event, return true.  If you want to allow*         the event to be handled by the next receiver, return false.*/boolean onKeyUp(int keyCode, KeyEvent event);/*** Called when multiple down/up pairs of the same key have occurred* in a row.* * @param keyCode The value in event.getKeyCode().* @param count Number of pairs as returned by event.getRepeatCount().* @param event Description of the key event.* * @return If you handled the event, return true.  If you want to allow*         the event to be handled by the next receiver, return false.*/boolean onKeyMultiple(int keyCode, int count, KeyEvent event);}static {populateKeycodeSymbolicNames();}private KeyEvent() {}/*** Create a new key event.* * @param action Action code: either {@link #ACTION_DOWN},* {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.* @param code The key code.*/public KeyEvent(int action, int code) {mAction = action;mKeyCode = code;mRepeatCount = 0;mDeviceId = KeyCharacterMap.VIRTUAL_KEYBOARD;}/*** Create a new key event.* * @param downTime The time (in {@link android.os.SystemClock#uptimeMillis})* at which this key code originally went down.* @param eventTime The time (in {@link android.os.SystemClock#uptimeMillis})* at which this event happened.* @param action Action code: either {@link #ACTION_DOWN},* {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.* @param code The key code.* @param repeat A repeat count for down events (> 0 if this is after the* initial down) or event count for multiple events.*/public KeyEvent(long downTime, long eventTime, int action,int code, int repeat) {mDownTime = downTime;mEventTime = eventTime;mAction = action;mKeyCode = code;mRepeatCount = repeat;mDeviceId = KeyCharacterMap.VIRTUAL_KEYBOARD;}/*** Create a new key event.* * @param downTime The time (in {@link android.os.SystemClock#uptimeMillis})* at which this key code originally went down.* @param eventTime The time (in {@link android.os.SystemClock#uptimeMillis})* at which this event happened.* @param action Action code: either {@link #ACTION_DOWN},* {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.* @param code The key code.* @param repeat A repeat count for down events (> 0 if this is after the* initial down) or event count for multiple events.* @param metaState Flags indicating which meta keys are currently pressed.*/public KeyEvent(long downTime, long eventTime, int action,int code, int repeat, int metaState) {mDownTime = downTime;mEventTime = eventTime;mAction = action;mKeyCode = code;mRepeatCount = repeat;mMetaState = metaState;mDeviceId = KeyCharacterMap.VIRTUAL_KEYBOARD;}/*** Create a new key event.* * @param downTime The time (in {@link android.os.SystemClock#uptimeMillis})* at which this key code originally went down.* @param eventTime The time (in {@link android.os.SystemClock#uptimeMillis})* at which this event happened.* @param action Action code: either {@link #ACTION_DOWN},* {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.* @param code The key code.* @param repeat A repeat count for down events (> 0 if this is after the* initial down) or event count for multiple events.* @param metaState Flags indicating which meta keys are currently pressed.* @param deviceId The device ID that generated the key event.* @param scancode Raw device scan code of the event.*/public KeyEvent(long downTime, long eventTime, int action,int code, int repeat, int metaState,int deviceId, int scancode) {mDownTime = downTime;mEventTime = eventTime;mAction = action;mKeyCode = code;mRepeatCount = repeat;mMetaState = metaState;mDeviceId = deviceId;mScanCode = scancode;}/*** Create a new key event.* * @param downTime The time (in {@link android.os.SystemClock#uptimeMillis})* at which this key code originally went down.* @param eventTime The time (in {@link android.os.SystemClock#uptimeMillis})* at which this event happened.* @param action Action code: either {@link #ACTION_DOWN},* {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.* @param code The key code.* @param repeat A repeat count for down events (> 0 if this is after the* initial down) or event count for multiple events.* @param metaState Flags indicating which meta keys are currently pressed.* @param deviceId The device ID that generated the key event.* @param scancode Raw device scan code of the event.* @param flags The flags for this key event*/public KeyEvent(long downTime, long eventTime, int action,int code, int repeat, int metaState,int deviceId, int scancode, int flags) {mDownTime = downTime;mEventTime = eventTime;mAction = action;mKeyCode = code;mRepeatCount = repeat;mMetaState = metaState;mDeviceId = deviceId;mScanCode = scancode;mFlags = flags;}/*** Create a new key event.* * @param downTime The time (in {@link android.os.SystemClock#uptimeMillis})* at which this key code originally went down.* @param eventTime The time (in {@link android.os.SystemClock#uptimeMillis})* at which this event happened.* @param action Action code: either {@link #ACTION_DOWN},* {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.* @param code The key code.* @param repeat A repeat count for down events (> 0 if this is after the* initial down) or event count for multiple events.* @param metaState Flags indicating which meta keys are currently pressed.* @param deviceId The device ID that generated the key event.* @param scancode Raw device scan code of the event.* @param flags The flags for this key event* @param source The input source such as {@link InputDevice#SOURCE_KEYBOARD}.*/public KeyEvent(long downTime, long eventTime, int action,int code, int repeat, int metaState,int deviceId, int scancode, int flags, int source) {mDownTime = downTime;mEventTime = eventTime;mAction = action;mKeyCode = code;mRepeatCount = repeat;mMetaState = metaState;mDeviceId = deviceId;mScanCode = scancode;mFlags = flags;mSource = source;}/*** Create a new key event for a string of characters.  The key code,* action, repeat count and source will automatically be set to* {@link #KEYCODE_UNKNOWN}, {@link #ACTION_MULTIPLE}, 0, and* {@link InputDevice#SOURCE_KEYBOARD} for you.* * @param time The time (in {@link android.os.SystemClock#uptimeMillis})* at which this event occured.* @param characters The string of characters.* @param deviceId The device ID that generated the key event.* @param flags The flags for this key event*/public KeyEvent(long time, String characters, int deviceId, int flags) {mDownTime = time;mEventTime = time;mCharacters = characters;mAction = ACTION_MULTIPLE;mKeyCode = KEYCODE_UNKNOWN;mRepeatCount = 0;mDeviceId = deviceId;mFlags = flags;mSource = InputDevice.SOURCE_KEYBOARD;}/*** Make an exact copy of an existing key event.*/public KeyEvent(KeyEvent origEvent) {mDownTime = origEvent.mDownTime;mEventTime = origEvent.mEventTime;mAction = origEvent.mAction;mKeyCode = origEvent.mKeyCode;mRepeatCount = origEvent.mRepeatCount;mMetaState = origEvent.mMetaState;mDeviceId = origEvent.mDeviceId;mSource = origEvent.mSource;mScanCode = origEvent.mScanCode;mFlags = origEvent.mFlags;mCharacters = origEvent.mCharacters;}/*** Copy an existing key event, modifying its time and repeat count.* * @deprecated Use {@link #changeTimeRepeat(KeyEvent, long, int)}* instead.* * @param origEvent The existing event to be copied.* @param eventTime The new event time* (in {@link android.os.SystemClock#uptimeMillis}) of the event.* @param newRepeat The new repeat count of the event.*/@Deprecatedpublic KeyEvent(KeyEvent origEvent, long eventTime, int newRepeat) {mDownTime = origEvent.mDownTime;mEventTime = eventTime;mAction = origEvent.mAction;mKeyCode = origEvent.mKeyCode;mRepeatCount = newRepeat;mMetaState = origEvent.mMetaState;mDeviceId = origEvent.mDeviceId;mSource = origEvent.mSource;mScanCode = origEvent.mScanCode;mFlags = origEvent.mFlags;mCharacters = origEvent.mCharacters;}private static KeyEvent obtain() {final KeyEvent ev;synchronized (gRecyclerLock) {ev = gRecyclerTop;if (ev == null) {return new KeyEvent();}gRecyclerTop = ev.mNext;gRecyclerUsed -= 1;}ev.mNext = null;ev.prepareForReuse();return ev;}/*** Obtains a (potentially recycled) key event.** @hide*/public static KeyEvent obtain(long downTime, long eventTime, int action,int code, int repeat, int metaState,int deviceId, int scancode, int flags, int source, String characters) {KeyEvent ev = obtain();ev.mDownTime = downTime;ev.mEventTime = eventTime;ev.mAction = action;ev.mKeyCode = code;ev.mRepeatCount = repeat;ev.mMetaState = metaState;ev.mDeviceId = deviceId;ev.mScanCode = scancode;ev.mFlags = flags;ev.mSource = source;ev.mCharacters = characters;return ev;}/*** Obtains a (potentially recycled) copy of another key event.** @hide*/public static KeyEvent obtain(KeyEvent other) {KeyEvent ev = obtain();ev.mDownTime = other.mDownTime;ev.mEventTime = other.mEventTime;ev.mAction = other.mAction;ev.mKeyCode = other.mKeyCode;ev.mRepeatCount = other.mRepeatCount;ev.mMetaState = other.mMetaState;ev.mDeviceId = other.mDeviceId;ev.mScanCode = other.mScanCode;ev.mFlags = other.mFlags;ev.mSource = other.mSource;ev.mCharacters = other.mCharacters;return ev;}/** @hide */@Overridepublic KeyEvent copy() {return obtain(this);}/*** Recycles a key event.* Key events should only be recycled if they are owned by the system since user* code expects them to be essentially immutable, "tracking" notwithstanding.** @hide*/@Overridepublic final void recycle() {super.recycle();mCharacters = null;synchronized (gRecyclerLock) {if (gRecyclerUsed < MAX_RECYCLED) {gRecyclerUsed++;mNext = gRecyclerTop;gRecyclerTop = this;}}}/** @hide */@Overridepublic final void recycleIfNeededAfterDispatch() {// Do nothing.}/*** Create a new key event that is the same as the given one, but whose* event time and repeat count are replaced with the given value.* * @param event The existing event to be copied.  This is not modified.* @param eventTime The new event time* (in {@link android.os.SystemClock#uptimeMillis}) of the event.* @param newRepeat The new repeat count of the event.*/public static KeyEvent changeTimeRepeat(KeyEvent event, long eventTime,int newRepeat) {return new KeyEvent(event, eventTime, newRepeat);}/*** Create a new key event that is the same as the given one, but whose* event time and repeat count are replaced with the given value.* * @param event The existing event to be copied.  This is not modified.* @param eventTime The new event time* (in {@link android.os.SystemClock#uptimeMillis}) of the event.* @param newRepeat The new repeat count of the event.* @param newFlags New flags for the event, replacing the entire value* in the original event.*/public static KeyEvent changeTimeRepeat(KeyEvent event, long eventTime,int newRepeat, int newFlags) {KeyEvent ret = new KeyEvent(event);ret.mEventTime = eventTime;ret.mRepeatCount = newRepeat;ret.mFlags = newFlags;return ret;}/*** Copy an existing key event, modifying its action.* * @param origEvent The existing event to be copied.* @param action The new action code of the event.*/private KeyEvent(KeyEvent origEvent, int action) {mDownTime = origEvent.mDownTime;mEventTime = origEvent.mEventTime;mAction = action;mKeyCode = origEvent.mKeyCode;mRepeatCount = origEvent.mRepeatCount;mMetaState = origEvent.mMetaState;mDeviceId = origEvent.mDeviceId;mSource = origEvent.mSource;mScanCode = origEvent.mScanCode;mFlags = origEvent.mFlags;// Don't copy mCharacters, since one way or the other we'll lose it// when changing the action.}/*** Create a new key event that is the same as the given one, but whose* action is replaced with the given value.* * @param event The existing event to be copied.  This is not modified.* @param action The new action code of the event.*/public static KeyEvent changeAction(KeyEvent event, int action) {return new KeyEvent(event, action);}/*** Create a new key event that is the same as the given one, but whose* flags are replaced with the given value.* * @param event The existing event to be copied.  This is not modified.* @param flags The new flags constant.*/public static KeyEvent changeFlags(KeyEvent event, int flags) {event = new KeyEvent(event);event.mFlags = flags;return event;}/** @hide */@Overridepublic final boolean isTainted() {return (mFlags & FLAG_TAINTED) != 0;}/** @hide */@Overridepublic final void setTainted(boolean tainted) {mFlags = tainted ? mFlags | FLAG_TAINTED : mFlags & ~FLAG_TAINTED;}/*** Don't use in new code, instead explicitly check* {@link #getAction()}.* * @return If the action is ACTION_DOWN, returns true; else false.** @deprecated* @hide*/@Deprecated public final boolean isDown() {return mAction == ACTION_DOWN;}/*** Is this a system key?  System keys can not be used for menu shortcuts.* * TODO: this information should come from a table somewhere.* TODO: should the dpad keys be here?  arguably, because they also shouldn't be menu shortcuts*/public final boolean isSystem() {return native_isSystemKey(mKeyCode);}/** @hide */public final boolean hasDefaultAction() {return native_hasDefaultAction(mKeyCode);}/*** Returns true if the specified keycode is a gamepad button.* @return True if the keycode is a gamepad button, such as {@link #KEYCODE_BUTTON_A}.*/public static final boolean isGamepadButton(int keyCode) {switch (keyCode) {case KeyEvent.KEYCODE_BUTTON_A:case KeyEvent.KEYCODE_BUTTON_B:case KeyEvent.KEYCODE_BUTTON_C:case KeyEvent.KEYCODE_BUTTON_X:case KeyEvent.KEYCODE_BUTTON_Y:case KeyEvent.KEYCODE_BUTTON_Z:case KeyEvent.KEYCODE_BUTTON_L1:case KeyEvent.KEYCODE_BUTTON_R1:case KeyEvent.KEYCODE_BUTTON_L2:case KeyEvent.KEYCODE_BUTTON_R2:case KeyEvent.KEYCODE_BUTTON_THUMBL:case KeyEvent.KEYCODE_BUTTON_THUMBR:case KeyEvent.KEYCODE_BUTTON_START:case KeyEvent.KEYCODE_BUTTON_SELECT:case KeyEvent.KEYCODE_BUTTON_MODE:case KeyEvent.KEYCODE_BUTTON_1:case KeyEvent.KEYCODE_BUTTON_2:case KeyEvent.KEYCODE_BUTTON_3:case KeyEvent.KEYCODE_BUTTON_4:case KeyEvent.KEYCODE_BUTTON_5:case KeyEvent.KEYCODE_BUTTON_6:case KeyEvent.KEYCODE_BUTTON_7:case KeyEvent.KEYCODE_BUTTON_8:case KeyEvent.KEYCODE_BUTTON_9:case KeyEvent.KEYCODE_BUTTON_10:case KeyEvent.KEYCODE_BUTTON_11:case KeyEvent.KEYCODE_BUTTON_12:case KeyEvent.KEYCODE_BUTTON_13:case KeyEvent.KEYCODE_BUTTON_14:case KeyEvent.KEYCODE_BUTTON_15:case KeyEvent.KEYCODE_BUTTON_16:return true;default:return false;}}/** Whether key will, by default, trigger a click on the focused view.* @hide*/public static final boolean isConfirmKey(int keyCode) {switch (keyCode) {case KeyEvent.KEYCODE_DPAD_CENTER:case KeyEvent.KEYCODE_ENTER:return true;default:return false;}}/** {@inheritDoc} */@Overridepublic final int getDeviceId() {return mDeviceId;}/** {@inheritDoc} */@Overridepublic final int getSource() {return mSource;}/** {@inheritDoc} */@Overridepublic final void setSource(int source) {mSource = source;}/*** <p>Returns the state of the meta keys.</p>** @return an integer in which each bit set to 1 represents a pressed*         meta key** @see #isAltPressed()* @see #isShiftPressed()* @see #isSymPressed()* @see #isCtrlPressed()* @see #isMetaPressed()* @see #isFunctionPressed()* @see #isCapsLockOn()* @see #isNumLockOn()* @see #isScrollLockOn()* @see #META_ALT_ON* @see #META_ALT_LEFT_ON* @see #META_ALT_RIGHT_ON* @see #META_SHIFT_ON* @see #META_SHIFT_LEFT_ON* @see #META_SHIFT_RIGHT_ON* @see #META_SYM_ON* @see #META_FUNCTION_ON* @see #META_CTRL_ON* @see #META_CTRL_LEFT_ON* @see #META_CTRL_RIGHT_ON* @see #META_META_ON* @see #META_META_LEFT_ON* @see #META_META_RIGHT_ON* @see #META_CAPS_LOCK_ON* @see #META_NUM_LOCK_ON* @see #META_SCROLL_LOCK_ON* @see #getModifiers*/public final int getMetaState() {return mMetaState;}/*** Returns the state of the modifier keys.* <p>* For the purposes of this function, {@link #KEYCODE_CAPS_LOCK},* {@link #KEYCODE_SCROLL_LOCK}, and {@link #KEYCODE_NUM_LOCK} are* not considered modifier keys.  Consequently, this function specifically masks out* {@link #META_CAPS_LOCK_ON}, {@link #META_SCROLL_LOCK_ON} and {@link #META_NUM_LOCK_ON}.* </p><p>* The value returned consists of the meta state (from {@link #getMetaState})* normalized using {@link #normalizeMetaState(int)} and then masked with* {@link #getModifierMetaStateMask} so that only valid modifier bits are retained.* </p>** @return An integer in which each bit set to 1 represents a pressed modifier key.* @see #getMetaState*/public final int getModifiers() {return normalizeMetaState(mMetaState) & META_MODIFIER_MASK;}/*** Returns the flags for this key event.** @see #FLAG_WOKE_HERE*/public final int getFlags() {return mFlags;}// Mask of all modifier key meta states.  Specifically excludes locked keys like caps lock.private static final int META_MODIFIER_MASK =META_SHIFT_ON | META_SHIFT_LEFT_ON | META_SHIFT_RIGHT_ON| META_ALT_ON | META_ALT_LEFT_ON | META_ALT_RIGHT_ON| META_CTRL_ON | META_CTRL_LEFT_ON | META_CTRL_RIGHT_ON| META_META_ON | META_META_LEFT_ON | META_META_RIGHT_ON| META_SYM_ON | META_FUNCTION_ON;// Mask of all lock key meta states.private static final int META_LOCK_MASK =META_CAPS_LOCK_ON | META_NUM_LOCK_ON | META_SCROLL_LOCK_ON;// Mask of all valid meta states.private static final int META_ALL_MASK = META_MODIFIER_MASK | META_LOCK_MASK;// Mask of all synthetic meta states that are reserved for API compatibility with// historical uses in MetaKeyKeyListener.private static final int META_SYNTHETIC_MASK =META_CAP_LOCKED | META_ALT_LOCKED | META_SYM_LOCKED | META_SELECTING;// Mask of all meta states that are not valid use in specifying a modifier key.// These bits are known to be used for purposes other than specifying modifiers.private static final int META_INVALID_MODIFIER_MASK =META_LOCK_MASK | META_SYNTHETIC_MASK;/*** Gets a mask that includes all valid modifier key meta state bits.* <p>* For the purposes of this function, {@link #KEYCODE_CAPS_LOCK},* {@link #KEYCODE_SCROLL_LOCK}, and {@link #KEYCODE_NUM_LOCK} are* not considered modifier keys.  Consequently, the mask specifically excludes* {@link #META_CAPS_LOCK_ON}, {@link #META_SCROLL_LOCK_ON} and {@link #META_NUM_LOCK_ON}.* </p>** @return The modifier meta state mask which is a combination of* {@link #META_SHIFT_ON}, {@link #META_SHIFT_LEFT_ON}, {@link #META_SHIFT_RIGHT_ON},* {@link #META_ALT_ON}, {@link #META_ALT_LEFT_ON}, {@link #META_ALT_RIGHT_ON},* {@link #META_CTRL_ON}, {@link #META_CTRL_LEFT_ON}, {@link #META_CTRL_RIGHT_ON},* {@link #META_META_ON}, {@link #META_META_LEFT_ON}, {@link #META_META_RIGHT_ON},* {@link #META_SYM_ON}, {@link #META_FUNCTION_ON}.*/public static int getModifierMetaStateMask() {return META_MODIFIER_MASK;}/*** Returns true if this key code is a modifier key.* <p>* For the purposes of this function, {@link #KEYCODE_CAPS_LOCK},* {@link #KEYCODE_SCROLL_LOCK}, and {@link #KEYCODE_NUM_LOCK} are* not considered modifier keys.  Consequently, this function return false* for those keys.* </p>** @return True if the key code is one of* {@link #KEYCODE_SHIFT_LEFT} {@link #KEYCODE_SHIFT_RIGHT},* {@link #KEYCODE_ALT_LEFT}, {@link #KEYCODE_ALT_RIGHT},* {@link #KEYCODE_CTRL_LEFT}, {@link #KEYCODE_CTRL_RIGHT},* {@link #KEYCODE_META_LEFT}, or {@link #KEYCODE_META_RIGHT},* {@link #KEYCODE_SYM}, {@link #KEYCODE_NUM}, {@link #KEYCODE_FUNCTION}.*/public static boolean isModifierKey(int keyCode) {switch (keyCode) {case KEYCODE_SHIFT_LEFT:case KEYCODE_SHIFT_RIGHT:case KEYCODE_ALT_LEFT:case KEYCODE_ALT_RIGHT:case KEYCODE_CTRL_LEFT:case KEYCODE_CTRL_RIGHT:case KEYCODE_META_LEFT:case KEYCODE_META_RIGHT:case KEYCODE_SYM:case KEYCODE_NUM:case KEYCODE_FUNCTION:return true;default:return false;}}/*** Normalizes the specified meta state.* <p>* The meta state is normalized such that if either the left or right modifier meta state* bits are set then the result will also include the universal bit for that modifier.* </p><p>* If the specified meta state contains {@link #META_ALT_LEFT_ON} then* the result will also contain {@link #META_ALT_ON} in addition to {@link #META_ALT_LEFT_ON}* and the other bits that were specified in the input.  The same is process is* performed for shift, control and meta.* </p><p>* If the specified meta state contains synthetic meta states defined by* {@link MetaKeyKeyListener}, then those states are translated here and the original* synthetic meta states are removed from the result.* {@link MetaKeyKeyListener#META_CAP_LOCKED} is translated to {@link #META_CAPS_LOCK_ON}.* {@link MetaKeyKeyListener#META_ALT_LOCKED} is translated to {@link #META_ALT_ON}.* {@link MetaKeyKeyListener#META_SYM_LOCKED} is translated to {@link #META_SYM_ON}.* </p><p>* Undefined meta state bits are removed.* </p>** @param metaState The meta state.* @return The normalized meta state.*/public static int normalizeMetaState(int metaState) {if ((metaState & (META_SHIFT_LEFT_ON | META_SHIFT_RIGHT_ON)) != 0) {metaState |= META_SHIFT_ON;}if ((metaState & (META_ALT_LEFT_ON | META_ALT_RIGHT_ON)) != 0) {metaState |= META_ALT_ON;}if ((metaState & (META_CTRL_LEFT_ON | META_CTRL_RIGHT_ON)) != 0) {metaState |= META_CTRL_ON;}if ((metaState & (META_META_LEFT_ON | META_META_RIGHT_ON)) != 0) {metaState |= META_META_ON;}if ((metaState & MetaKeyKeyListener.META_CAP_LOCKED) != 0) {metaState |= META_CAPS_LOCK_ON;}if ((metaState & MetaKeyKeyListener.META_ALT_LOCKED) != 0) {metaState |= META_ALT_ON;}if ((metaState & MetaKeyKeyListener.META_SYM_LOCKED) != 0) {metaState |= META_SYM_ON;}return metaState & META_ALL_MASK;}/*** Returns true if no modifiers keys are pressed according to the specified meta state.* <p>* For the purposes of this function, {@link #KEYCODE_CAPS_LOCK},* {@link #KEYCODE_SCROLL_LOCK}, and {@link #KEYCODE_NUM_LOCK} are* not considered modifier keys.  Consequently, this function ignores* {@link #META_CAPS_LOCK_ON}, {@link #META_SCROLL_LOCK_ON} and {@link #META_NUM_LOCK_ON}.* </p><p>* The meta state is normalized prior to comparison using {@link #normalizeMetaState(int)}.* </p>** @param metaState The meta state to consider.* @return True if no modifier keys are pressed.* @see #hasNoModifiers()*/public static boolean metaStateHasNoModifiers(int metaState) {return (normalizeMetaState(metaState) & META_MODIFIER_MASK) == 0;}/*** Returns true if only the specified modifier keys are pressed according to* the specified meta state.  Returns false if a different combination of modifier* keys are pressed.* <p>* For the purposes of this function, {@link #KEYCODE_CAPS_LOCK},* {@link #KEYCODE_SCROLL_LOCK}, and {@link #KEYCODE_NUM_LOCK} are* not considered modifier keys.  Consequently, this function ignores* {@link #META_CAPS_LOCK_ON}, {@link #META_SCROLL_LOCK_ON} and {@link #META_NUM_LOCK_ON}.* </p><p>* If the specified modifier mask includes directional modifiers, such as* {@link #META_SHIFT_LEFT_ON}, then this method ensures that the* modifier is pressed on that side.* If the specified modifier mask includes non-directional modifiers, such as* {@link #META_SHIFT_ON}, then this method ensures that the modifier* is pressed on either side.* If the specified modifier mask includes both directional and non-directional modifiers* for the same type of key, such as {@link #META_SHIFT_ON} and {@link #META_SHIFT_LEFT_ON},* then this method throws an illegal argument exception.* </p>** @param metaState The meta state to consider.* @param modifiers The meta state of the modifier keys to check.  May be a combination* of modifier meta states as defined by {@link #getModifierMetaStateMask()}.  May be 0 to* ensure that no modifier keys are pressed.* @return True if only the specified modifier keys are pressed.* @throws IllegalArgumentException if the modifiers parameter contains invalid modifiers* @see #hasModifiers*/public static boolean metaStateHasModifiers(int metaState, int modifiers) {// Note: For forward compatibility, we allow the parameter to contain meta states//       that we do not recognize but we explicitly disallow meta states that//       are not valid modifiers.if ((modifiers & META_INVALID_MODIFIER_MASK) != 0) {throw new IllegalArgumentException("modifiers must not contain "+ "META_CAPS_LOCK_ON, META_NUM_LOCK_ON, META_SCROLL_LOCK_ON, "+ "META_CAP_LOCKED, META_ALT_LOCKED, META_SYM_LOCKED, "+ "or META_SELECTING");}metaState = normalizeMetaState(metaState) & META_MODIFIER_MASK;metaState = metaStateFilterDirectionalModifiers(metaState, modifiers,META_SHIFT_ON, META_SHIFT_LEFT_ON, META_SHIFT_RIGHT_ON);metaState = metaStateFilterDirectionalModifiers(metaState, modifiers,META_ALT_ON, META_ALT_LEFT_ON, META_ALT_RIGHT_ON);metaState = metaStateFilterDirectionalModifiers(metaState, modifiers,META_CTRL_ON, META_CTRL_LEFT_ON, META_CTRL_RIGHT_ON);metaState = metaStateFilterDirectionalModifiers(metaState, modifiers,META_META_ON, META_META_LEFT_ON, META_META_RIGHT_ON);return metaState == modifiers;}private static int metaStateFilterDirectionalModifiers(int metaState,int modifiers, int basic, int left, int right) {final boolean wantBasic = (modifiers & basic) != 0;final int directional = left | right;final boolean wantLeftOrRight = (modifiers & directional) != 0;if (wantBasic) {if (wantLeftOrRight) {throw new IllegalArgumentException("modifiers must not contain "+ metaStateToString(basic) + " combined with "+ metaStateToString(left) + " or " + metaStateToString(right));}return metaState & ~directional;} else if (wantLeftOrRight) {return metaState & ~basic;} else {return metaState;}}/*** Returns true if no modifier keys are pressed.* <p>* For the purposes of this function, {@link #KEYCODE_CAPS_LOCK},* {@link #KEYCODE_SCROLL_LOCK}, and {@link #KEYCODE_NUM_LOCK} are* not considered modifier keys.  Consequently, this function ignores* {@link #META_CAPS_LOCK_ON}, {@link #META_SCROLL_LOCK_ON} and {@link #META_NUM_LOCK_ON}.* </p><p>* The meta state is normalized prior to comparison using {@link #normalizeMetaState(int)}.* </p>** @return True if no modifier keys are pressed.* @see #metaStateHasNoModifiers*/public final boolean hasNoModifiers() {return metaStateHasNoModifiers(mMetaState);}/*** Returns true if only the specified modifiers keys are pressed.* Returns false if a different combination of modifier keys are pressed.* <p>* For the purposes of this function, {@link #KEYCODE_CAPS_LOCK},* {@link #KEYCODE_SCROLL_LOCK}, and {@link #KEYCODE_NUM_LOCK} are* not considered modifier keys.  Consequently, this function ignores* {@link #META_CAPS_LOCK_ON}, {@link #META_SCROLL_LOCK_ON} and {@link #META_NUM_LOCK_ON}.* </p><p>* If the specified modifier mask includes directional modifiers, such as* {@link #META_SHIFT_LEFT_ON}, then this method ensures that the* modifier is pressed on that side.* If the specified modifier mask includes non-directional modifiers, such as* {@link #META_SHIFT_ON}, then this method ensures that the modifier* is pressed on either side.* If the specified modifier mask includes both directional and non-directional modifiers* for the same type of key, such as {@link #META_SHIFT_ON} and {@link #META_SHIFT_LEFT_ON},* then this method throws an illegal argument exception.* </p>** @param modifiers The meta state of the modifier keys to check.  May be a combination* of modifier meta states as defined by {@link #getModifierMetaStateMask()}.  May be 0 to* ensure that no modifier keys are pressed.* @return True if only the specified modifier keys are pressed.* @throws IllegalArgumentException if the modifiers parameter contains invalid modifiers* @see #metaStateHasModifiers*/public final boolean hasModifiers(int modifiers) {return metaStateHasModifiers(mMetaState, modifiers);}/*** <p>Returns the pressed state of the ALT meta key.</p>** @return true if the ALT key is pressed, false otherwise** @see #KEYCODE_ALT_LEFT* @see #KEYCODE_ALT_RIGHT* @see #META_ALT_ON*/public final boolean isAltPressed() {return (mMetaState & META_ALT_ON) != 0;}/*** <p>Returns the pressed state of the SHIFT meta key.</p>** @return true if the SHIFT key is pressed, false otherwise** @see #KEYCODE_SHIFT_LEFT* @see #KEYCODE_SHIFT_RIGHT* @see #META_SHIFT_ON*/public final boolean isShiftPressed() {return (mMetaState & META_SHIFT_ON) != 0;}/*** <p>Returns the pressed state of the SYM meta key.</p>** @return true if the SYM key is pressed, false otherwise** @see #KEYCODE_SYM* @see #META_SYM_ON*/public final boolean isSymPressed() {return (mMetaState & META_SYM_ON) != 0;}/*** <p>Returns the pressed state of the CTRL meta key.</p>** @return true if the CTRL key is pressed, false otherwise** @see #KEYCODE_CTRL_LEFT* @see #KEYCODE_CTRL_RIGHT* @see #META_CTRL_ON*/public final boolean isCtrlPressed() {return (mMetaState & META_CTRL_ON) != 0;}/*** <p>Returns the pressed state of the META meta key.</p>** @return true if the META key is pressed, false otherwise** @see #KEYCODE_META_LEFT* @see #KEYCODE_META_RIGHT* @see #META_META_ON*/public final boolean isMetaPressed() {return (mMetaState & META_META_ON) != 0;}/*** <p>Returns the pressed state of the FUNCTION meta key.</p>** @return true if the FUNCTION key is pressed, false otherwise** @see #KEYCODE_FUNCTION* @see #META_FUNCTION_ON*/public final boolean isFunctionPressed() {return (mMetaState & META_FUNCTION_ON) != 0;}/*** <p>Returns the locked state of the CAPS LOCK meta key.</p>** @return true if the CAPS LOCK key is on, false otherwise** @see #KEYCODE_CAPS_LOCK* @see #META_CAPS_LOCK_ON*/public final boolean isCapsLockOn() {return (mMetaState & META_CAPS_LOCK_ON) != 0;}/*** <p>Returns the locked state of the NUM LOCK meta key.</p>** @return true if the NUM LOCK key is on, false otherwise** @see #KEYCODE_NUM_LOCK* @see #META_NUM_LOCK_ON*/public final boolean isNumLockOn() {return (mMetaState & META_NUM_LOCK_ON) != 0;}/*** <p>Returns the locked state of the SCROLL LOCK meta key.</p>** @return true if the SCROLL LOCK key is on, false otherwise** @see #KEYCODE_SCROLL_LOCK* @see #META_SCROLL_LOCK_ON*/public final boolean isScrollLockOn() {return (mMetaState & META_SCROLL_LOCK_ON) != 0;}/*** Retrieve the action of this key event.  May be either* {@link #ACTION_DOWN}, {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.* * @return The event action: ACTION_DOWN, ACTION_UP, or ACTION_MULTIPLE.*/public final int getAction() {return mAction;}/*** For {@link #ACTION_UP} events, indicates that the event has been* canceled as per {@link #FLAG_CANCELED}.*/public final boolean isCanceled() {return (mFlags&FLAG_CANCELED) != 0;}/*** Call this during {@link Callback#onKeyDown} to have the system track* the key through its final up (possibly including a long press).  Note* that only one key can be tracked at a time -- if another key down* event is received while a previous one is being tracked, tracking is* stopped on the previous event.*/public final void startTracking() {mFlags |= FLAG_START_TRACKING;}/*** For {@link #ACTION_UP} events, indicates that the event is still being* tracked from its initial down event as per* {@link #FLAG_TRACKING}.*/public final boolean isTracking() {return (mFlags&FLAG_TRACKING) != 0;}/*** For {@link #ACTION_DOWN} events, indicates that the event has been* canceled as per {@link #FLAG_LONG_PRESS}.*/public final boolean isLongPress() {return (mFlags&FLAG_LONG_PRESS) != 0;}/*** Retrieve the key code of the key event.  This is the physical key that* was pressed, <em>not</em> the Unicode character.* * @return The key code of the event.*/public final int getKeyCode() {return mKeyCode;}/*** For the special case of a {@link #ACTION_MULTIPLE} event with key* code of {@link #KEYCODE_UNKNOWN}, this is a raw string of characters* associated with the event.  In all other cases it is null.* * @return Returns a String of 1 or more characters associated with* the event.*/public final String getCharacters() {return mCharacters;}/*** Retrieve the hardware key id of this key event.  These values are not* reliable and vary from device to device.** {@more}* Mostly this is here for debugging purposes.*/public final int getScanCode() {return mScanCode;}/*** Retrieve the repeat count of the event.  For both key up and key down* events, this is the number of times the key has repeated with the first* down starting at 0 and counting up from there.  For multiple key* events, this is the number of down/up pairs that have occurred.* * @return The number of times the key has repeated.*/public final int getRepeatCount() {return mRepeatCount;}/*** Retrieve the time of the most recent key down event,* in the {@link android.os.SystemClock#uptimeMillis} time base.  If this* is a down event, this will be the same as {@link #getEventTime()}.* Note that when chording keys, this value is the down time of the* most recently pressed key, which may <em>not</em> be the same physical* key of this event.* * @return Returns the most recent key down time, in the* {@link android.os.SystemClock#uptimeMillis} time base*/public final long getDownTime() {return mDownTime;}/*** Retrieve the time this event occurred,* in the {@link android.os.SystemClock#uptimeMillis} time base.** @return Returns the time this event occurred, * in the {@link android.os.SystemClock#uptimeMillis} time base.*/@Overridepublic final long getEventTime() {return mEventTime;}/*** Retrieve the time this event occurred,* in the {@link android.os.SystemClock#uptimeMillis} time base but with* nanosecond (instead of millisecond) precision.* <p>* The value is in nanosecond precision but it may not have nanosecond accuracy.* </p>** @return Returns the time this event occurred,* in the {@link android.os.SystemClock#uptimeMillis} time base but with* nanosecond (instead of millisecond) precision.** @hide*/@Overridepublic final long getEventTimeNano() {return mEventTime * 1000000L;}/*** Renamed to {@link #getDeviceId}.* * @hide* @deprecated use {@link #getDeviceId()} instead.*/@Deprecatedpublic final int getKeyboardDevice() {return mDeviceId;}/*** Gets the {@link KeyCharacterMap} associated with the keyboard device.** @return The associated key character map.* @throws {@link KeyCharacterMap.UnavailableException} if the key character map* could not be loaded because it was malformed or the default key character map* is missing from the system.** @see KeyCharacterMap#load*/public final KeyCharacterMap getKeyCharacterMap() {return KeyCharacterMap.load(mDeviceId);}/*** Gets the primary character for this key.* In other words, the label that is physically printed on it.** @return The display label character, or 0 if none (eg. for non-printing keys).*/public char getDisplayLabel() {return getKeyCharacterMap().getDisplayLabel(mKeyCode);}/*** Gets the Unicode character generated by the specified key and meta* key state combination.* <p>* Returns the Unicode character that the specified key would produce* when the specified meta bits (see {@link MetaKeyKeyListener})* were active.* </p><p>* Returns 0 if the key is not one that is used to type Unicode* characters.* </p><p>* If the return value has bit {@link KeyCharacterMap#COMBINING_ACCENT} set, the* key is a "dead key" that should be combined with another to* actually produce a character -- see {@link KeyCharacterMap#getDeadChar} --* after masking with {@link KeyCharacterMap#COMBINING_ACCENT_MASK}.* </p>** @return The associated character or combining accent, or 0 if none.*/public int getUnicodeChar() {return getUnicodeChar(mMetaState);}/*** Gets the Unicode character generated by the specified key and meta* key state combination.* <p>* Returns the Unicode character that the specified key would produce* when the specified meta bits (see {@link MetaKeyKeyListener})* were active.* </p><p>* Returns 0 if the key is not one that is used to type Unicode* characters.* </p><p>* If the return value has bit {@link KeyCharacterMap#COMBINING_ACCENT} set, the* key is a "dead key" that should be combined with another to* actually produce a character -- see {@link KeyCharacterMap#getDeadChar} --* after masking with {@link KeyCharacterMap#COMBINING_ACCENT_MASK}.* </p>** @param metaState The meta key modifier state.* @return The associated character or combining accent, or 0 if none.*/public int getUnicodeChar(int metaState) {return getKeyCharacterMap().get(mKeyCode, metaState);}/*** Get the character conversion data for a given key code.** @param results A {@link KeyCharacterMap.KeyData} instance that will be* filled with the results.* @return True if the key was mapped.  If the key was not mapped, results is not modified.** @deprecated instead use {@link #getDisplayLabel()},* {@link #getNumber()} or {@link #getUnicodeChar(int)}.*/@Deprecatedpublic boolean getKeyData(KeyData results) {return getKeyCharacterMap().getKeyData(mKeyCode, results);}/*** Gets the first character in the character array that can be generated* by the specified key code.* <p>* This is a convenience function that returns the same value as* {@link #getMatch(char[],int) getMatch(chars, 0)}.* </p>** @param chars The array of matching characters to consider.* @return The matching associated character, or 0 if none.*/public char getMatch(char[] chars) {return getMatch(chars, 0);}/*** Gets the first character in the character array that can be generated* by the specified key code.  If there are multiple choices, prefers* the one that would be generated with the specified meta key modifier state.** @param chars The array of matching characters to consider.* @param metaState The preferred meta key modifier state.* @return The matching associated character, or 0 if none.*/public char getMatch(char[] chars, int metaState) {return getKeyCharacterMap().getMatch(mKeyCode, chars, metaState);}/*** Gets the number or symbol associated with the key.* <p>* The character value is returned, not the numeric value.* If the key is not a number, but is a symbol, the symbol is retuned.* </p><p>* This method is intended to to support dial pads and other numeric or* symbolic entry on keyboards where certain keys serve dual function* as alphabetic and symbolic keys.  This method returns the number* or symbol associated with the key independent of whether the user* has pressed the required modifier.* </p><p>* For example, on one particular keyboard the keys on the top QWERTY row generate* numbers when ALT is pressed such that ALT-Q maps to '1'.  So for that keyboard* when {@link #getNumber} is called with {@link KeyEvent#KEYCODE_Q} it returns '1'* so that the user can type numbers without pressing ALT when it makes sense.* </p>** @return The associated numeric or symbolic character, or 0 if none.*/public char getNumber() {return getKeyCharacterMap().getNumber(mKeyCode);}/*** Returns true if this key produces a glyph.** @return True if the key is a printing key.*/public boolean isPrintingKey() {return getKeyCharacterMap().isPrintingKey(mKeyCode);}/*** @deprecated Use {@link #dispatch(Callback, DispatcherState, Object)} instead.*/@Deprecatedpublic final boolean dispatch(Callback receiver) {return dispatch(receiver, null, null);}/*** Deliver this key event to a {@link Callback} interface.  If this is* an ACTION_MULTIPLE event and it is not handled, then an attempt will* be made to deliver a single normal event.* * @param receiver The Callback that will be given the event.* @param state State information retained across events.* @param target The target of the dispatch, for use in tracking.* * @return The return value from the Callback method that was called.*/public final boolean dispatch(Callback receiver, DispatcherState state,Object target) {switch (mAction) {case ACTION_DOWN: {mFlags &= ~FLAG_START_TRACKING;if (DEBUG) Log.v(TAG, "Key down to " + target + " in " + state+ ": " + this);boolean res = receiver.onKeyDown(mKeyCode, this);if (state != null) {if (res && mRepeatCount == 0 && (mFlags&FLAG_START_TRACKING) != 0) {if (DEBUG) Log.v(TAG, "  Start tracking!");state.startTracking(this, target);} else if (isLongPress() && state.isTracking(this)) {try {if (receiver.onKeyLongPress(mKeyCode, this)) {if (DEBUG) Log.v(TAG, "  Clear from long press!");state.performedLongPress(this);res = true;}} catch (AbstractMethodError e) {}}}return res;}case ACTION_UP:if (DEBUG) Log.v(TAG, "Key up to " + target + " in " + state+ ": " + this);if (state != null) {state.handleUpEvent(this);}return receiver.onKeyUp(mKeyCode, this);case ACTION_MULTIPLE:final int count = mRepeatCount;final int code = mKeyCode;if (receiver.onKeyMultiple(code, count, this)) {return true;}if (code != KeyEvent.KEYCODE_UNKNOWN) {mAction = ACTION_DOWN;mRepeatCount = 0;boolean handled = receiver.onKeyDown(code, this);if (handled) {mAction = ACTION_UP;receiver.onKeyUp(code, this);}mAction = ACTION_MULTIPLE;mRepeatCount = count;return handled;}return false;}return false;}/*** Use with {@link KeyEvent#dispatch(Callback, DispatcherState, Object)}* for more advanced key dispatching, such as long presses.*/public static class DispatcherState {int mDownKeyCode;Object mDownTarget;SparseIntArray mActiveLongPresses = new SparseIntArray();/*** Reset back to initial state.*/public void reset() {if (DEBUG) Log.v(TAG, "Reset: " + this);mDownKeyCode = 0;mDownTarget = null;mActiveLongPresses.clear();}/*** Stop any tracking associated with this target.*/public void reset(Object target) {if (mDownTarget == target) {if (DEBUG) Log.v(TAG, "Reset in " + target + ": " + this);mDownKeyCode = 0;mDownTarget = null;}}/*** Start tracking the key code associated with the given event.  This* can only be called on a key down.  It will allow you to see any* long press associated with the key, and will result in* {@link KeyEvent#isTracking} return true on the long press and up* events.* * <p>This is only needed if you are directly dispatching events, rather* than handling them in {@link Callback#onKeyDown}.*/public void startTracking(KeyEvent event, Object target) {if (event.getAction() != ACTION_DOWN) {throw new IllegalArgumentException("Can only start tracking on a down event");}if (DEBUG) Log.v(TAG, "Start trackingt in " + target + ": " + this);mDownKeyCode = event.getKeyCode();mDownTarget = target;}/*** Return true if the key event is for a key code that is currently* being tracked by the dispatcher.*/public boolean isTracking(KeyEvent event) {return mDownKeyCode == event.getKeyCode();}/*** Keep track of the given event's key code as having performed an* action with a long press, so no action should occur on the up.* <p>This is only needed if you are directly dispatching events, rather* than handling them in {@link Callback#onKeyLongPress}.*/public void performedLongPress(KeyEvent event) {mActiveLongPresses.put(event.getKeyCode(), 1);}/*** Handle key up event to stop tracking.  This resets the dispatcher state,* and updates the key event state based on it.* <p>This is only needed if you are directly dispatching events, rather* than handling them in {@link Callback#onKeyUp}.*/public void handleUpEvent(KeyEvent event) {final int keyCode = event.getKeyCode();if (DEBUG) Log.v(TAG, "Handle key up " + event + ": " + this);int index = mActiveLongPresses.indexOfKey(keyCode);if (index >= 0) {if (DEBUG) Log.v(TAG, "  Index: " + index);event.mFlags |= FLAG_CANCELED | FLAG_CANCELED_LONG_PRESS;mActiveLongPresses.removeAt(index);}if (mDownKeyCode == keyCode) {if (DEBUG) Log.v(TAG, "  Tracking!");event.mFlags |= FLAG_TRACKING;mDownKeyCode = 0;mDownTarget = null;}}}@Overridepublic String toString() {StringBuilder msg = new StringBuilder();msg.append("KeyEvent { action=").append(actionToString(mAction));msg.append(", keyCode=").append(keyCodeToString(mKeyCode));msg.append(", scanCode=").append(mScanCode);if (mCharacters != null) {msg.append(", characters=\"").append(mCharacters).append("\"");}msg.append(", metaState=").append(metaStateToString(mMetaState));msg.append(", flags=0x").append(Integer.toHexString(mFlags));msg.append(", repeatCount=").append(mRepeatCount);msg.append(", eventTime=").append(mEventTime);msg.append(", downTime=").append(mDownTime);msg.append(", deviceId=").append(mDeviceId);msg.append(", source=0x").append(Integer.toHexString(mSource));msg.append(" }");return msg.toString();}/*** Returns a string that represents the symbolic name of the specified action* such as "ACTION_DOWN", or an equivalent numeric constant such as "35" if unknown.** @param action The action.* @return The symbolic name of the specified action.* @hide*/public static String actionToString(int action) {switch (action) {case ACTION_DOWN:return "ACTION_DOWN";case ACTION_UP:return "ACTION_UP";case ACTION_MULTIPLE:return "ACTION_MULTIPLE";default:return Integer.toString(action);}}/*** Returns a string that represents the symbolic name of the specified keycode* such as "KEYCODE_A", "KEYCODE_DPAD_UP", or an equivalent numeric constant* such as "1001" if unknown.** @param keyCode The key code.* @return The symbolic name of the specified keycode.** @see KeyCharacterMap#getDisplayLabel*/public static String keyCodeToString(int keyCode) {String symbolicName = KEYCODE_SYMBOLIC_NAMES.get(keyCode);return symbolicName != null ? symbolicName : Integer.toString(keyCode);}/*** Gets a keycode by its symbolic name such as "KEYCODE_A" or an equivalent* numeric constant such as "1001".** @param symbolicName The symbolic name of the keycode.* @return The keycode or {@link #KEYCODE_UNKNOWN} if not found.* @see #keycodeToString(int)*/public static int keyCodeFromString(String symbolicName) {if (symbolicName == null) {throw new IllegalArgumentException("symbolicName must not be null");}final int count = KEYCODE_SYMBOLIC_NAMES.size();for (int i = 0; i < count; i++) {if (symbolicName.equals(KEYCODE_SYMBOLIC_NAMES.valueAt(i))) {return i;}}try {return Integer.parseInt(symbolicName, 10);} catch (NumberFormatException ex) {return KEYCODE_UNKNOWN;}}/*** Returns a string that represents the symbolic name of the specified combined meta* key modifier state flags such as "0", "META_SHIFT_ON",* "META_ALT_ON|META_SHIFT_ON" or an equivalent numeric constant such as "0x10000000"* if unknown.** @param metaState The meta state.* @return The symbolic name of the specified combined meta state flags.* @hide*/public static String metaStateToString(int metaState) {if (metaState == 0) {return "0";}StringBuilder result = null;int i = 0;while (metaState != 0) {final boolean isSet = (metaState & 1) != 0;metaState >>>= 1; // unsigned shift!if (isSet) {final String name = META_SYMBOLIC_NAMES[i];if (result == null) {if (metaState == 0) {return name;}result = new StringBuilder(name);} else {result.append('|');result.append(name);}}i += 1;}return result.toString();}public static final Parcelable.Creator<KeyEvent> CREATOR= new Parcelable.Creator<KeyEvent>() {public KeyEvent createFromParcel(Parcel in) {in.readInt(); // skip token, we already know this is a KeyEventreturn KeyEvent.createFromParcelBody(in);}public KeyEvent[] newArray(int size) {return new KeyEvent[size];}};/** @hide */public static KeyEvent createFromParcelBody(Parcel in) {return new KeyEvent(in);}private KeyEvent(Parcel in) {mDeviceId = in.readInt();mSource = in.readInt();mAction = in.readInt();mKeyCode = in.readInt();mRepeatCount = in.readInt();mMetaState = in.readInt();mScanCode = in.readInt();mFlags = in.readInt();mDownTime = in.readLong();mEventTime = in.readLong();}public void writeToParcel(Parcel out, int flags) {out.writeInt(PARCEL_TOKEN_KEY_EVENT);out.writeInt(mDeviceId);out.writeInt(mSource);out.writeInt(mAction);out.writeInt(mKeyCode);out.writeInt(mRepeatCount);out.writeInt(mMetaState);out.writeInt(mScanCode);out.writeInt(mFlags);out.writeLong(mDownTime);out.writeLong(mEventTime);}private native boolean native_isSystemKey(int keyCode);private native boolean native_hasDefaultAction(int keyCode);
}

Android 键值大全(键值定义源码)相关推荐

  1. JavaScript实现计算π值算法(附完整源码)

    JavaScript实现计算π值算法(附完整源码) π.js完整源代码 π.js完整源代码 const circleRadius = 1; function getNGonSideLength(sid ...

  2. 【Matlab图像去噪】小波滤波(硬阙值+软阙值)+中值滤波图像去噪【含源码 462期】

    一.代码运行视频(哔哩哔哩) [Matlab图像去噪]小波滤波(硬阙值+软阙值)+中值滤波图像去噪[含源码 462期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 ...

  3. Metis异常检测算法率值检测和量值检测源码刨析

    Metis异常检测算法率值检测和量值检测源码刨析 1. 测试代码 2. 率值检测 2.1 rate_predict方法(detect.py) 2.2 predict方法(statistic.py) 2 ...

  4. Android 9 (P)之init进程启动源码分析指南之三

          Android 9 (P)之init进程启动源码分析指南之三 Android 9 (P)系统启动及进程创建源码分析目录: Android 9 (P)之init进程启动源码分析指南之一 An ...

  5. Android 9(P)之init进程启动源码分析指南之一

         Android 9 之init进程启动源码分析指南之一 Android 9 (P) 系统启动及进程创建源码分析目录: Android 9 (P)之init进程启动源码分析指南之一 Andro ...

  6. Android使用GridView实现俄罗斯方块(附源码)(三)

    GitHub地址: https://github.com/weijifen/AndroidTetris 移动方向 移动方向包括左移,右移和下移. 移动方块实际是对position向量做改变,改变之后使 ...

  7. Android 8.1/9.0 MTK Camera源码分析之录像快门声音控制流程

    前面已经针对拍照快门声音控制流程进行了分析,接下来分析一下录像快门声音的控制流程. Android 8.1/9.0 MTK Camera源码分析之快门声音控制流程 这两篇文章其实都是相对于手机系统RO ...

  8. 这份1307页Android面试全套真题解析,源码+原理+手写框架

    前言 前不久,几个朋友聚会,谈到了现在的后辈,我就说起了那个大三就已经拿到网易offer的小学弟. 这个学弟是00后,专升本进入我们学校的.进来后就非常努力,每次上课都是第一个到教室的,每次都是坐第一 ...

  9. Android View体系(五)从源码解析View的事件分发机制

    Android View体系(一)视图坐标系 Android View体系(二)实现View滑动的六种方法 Android View体系(三)属性动画 Android View体系(四)从源码解析Sc ...

最新文章

  1. 全网最详细之一网打尽数据结构中与树相关的算法
  2. linux中进程退出函数:exit()和_exit()的区别
  3. 手把手教你建github技术博客
  4. 面试一位硕士海龟前端小姐姐有感
  5. 正则表达式 BRE 与 ERE的区别
  6. 基于opencv在摄像头ubuntu根据视频获取
  7. 思科数据中心Nexus 3000
  8. SOLOv2论文简读
  9. 输入某年某月某日,Java判断这一天是这一年的第几天?
  10. Computing Platform------系统平台及其系列
  11. MathType编辑手写体
  12. SpringBoot 生成带水印pdf | 中文字体问题
  13. php iis 一键安装包,php iis一键安装包指的是什么
  14. 【汇正财经】企业资本的意义
  15. 一个新的开始,fightting!
  16. Spark核心编程系列(一)——RDD详解
  17. 困扰成都青年的20年癫痫在三博脑科医院终结
  18. python爬虫——世界排名前1000大学
  19. 十四届全国大学生“恩智浦”杯智能汽车竞赛信标组总结(4)
  20. imi v0.3 发布,自动管理请求上下文,新增参数过滤器

热门文章

  1. uoni扫地机器人好用吗_能存图、会思考,Uoni由利扫地机器人深度体验:看得到的好用...
  2. Hibernate(二)
  3. Sparse Checkout 在 Monorepo 工程下的应用
  4. 使用ThinkPHP框架快速搭建网站【转】
  5. 强大的Git客户端:SourceTree插件开发指南
  6. java中算三角形面积_java中用类求三角形面积
  7. JAVA方法和本地方法
  8. div中的p标签于img设置同一水平_P标签和img标签的问题
  9. 往余额宝里存50万,不工作了可以吗,为什么?
  10. 王者荣耀鸿蒙抽奖,王者荣耀鸿运抽奖玩法攻略 鸿运抽奖怎么玩