Android KeyCode 列表
转载至:https://www.cnblogs.com/larack/p/4223465.html
一.KEYCODE列表
电话键
| KEYCODE_CALL | 拨号键 | 5 |
| KEYCODE_ENDCALL | 挂机键 | 6 |
| KEYCODE_HOME | 按键Home | 3 |
| KEYCODE_MENU | 菜单键 | 82 |
| KEYCODE_BACK | 返回键 | 4 |
| KEYCODE_SEARCH | 搜索键 | 84 |
| KEYCODE_CAMERA | 拍照键 | 27 |
| KEYCODE_FOCUS | 拍照对焦键 | 80 |
| KEYCODE_POWER | 电源键 | 26 |
| KEYCODE_NOTIFICATION | 通知键 | 83 |
| KEYCODE_MUTE | 话筒静音键 | 91 |
| KEYCODE_VOLUME_MUTE | 扬声器静音键 | 164 |
| KEYCODE_VOLUME_UP | 音量增加键 | 24 |
| KEYCODE_VOLUME_DOWN | 音量减小键 | 25 |
控制键
| KEYCODE_ENTER | 回车键 | 66 |
| KEYCODE_ESCAPE | ESC键 | 111 |
| KEYCODE_DPAD_CENTER | 导航键 确定键 | 23 |
| KEYCODE_DPAD_UP | 导航键 向上 | 19 |
| KEYCODE_DPAD_DOWN | 导航键 向下 | 20 |
| KEYCODE_DPAD_LEFT | 导航键 向左 | 21 |
| KEYCODE_DPAD_RIGHT | 导航键 向右 | 22 |
| KEYCODE_MOVE_HOME | 光标移动到开始键 | 122 |
| KEYCODE_MOVE_END | 光标移动到末尾键 | 123 |
| KEYCODE_PAGE_UP | 向上翻页键 | 92 |
| KEYCODE_PAGE_DOWN | 向下翻页键 | 93 |
| KEYCODE_DEL | 退格键 | 67 |
| KEYCODE_FORWARD_DEL | 删除键 | 112 |
| KEYCODE_INSERT | 插入键 | 124 |
| KEYCODE_TAB | Tab键 | 61 |
| KEYCODE_NUM_LOCK | 小键盘锁 | 143 |
| KEYCODE_CAPS_LOCK | 大写锁定键 | 115 |
| KEYCODE_BREAK | Break/Pause键 | 121 |
| KEYCODE_SCROLL_LOCK | 滚动锁定键 | 116 |
| KEYCODE_ZOOM_IN | 放大键 | 168 |
| KEYCODE_ZOOM_OUT | 缩小键 | 169 |
组合键
| KEYCODE_ALT_LEFT | Alt+Left |
| KEYCODE_ALT_RIGHT | Alt+Right |
| KEYCODE_CTRL_LEFT | Control+Left |
| KEYCODE_CTRL_RIGHT | Control+Right |
| KEYCODE_SHIFT_LEFT | Shift+Left |
| KEYCODE_SHIFT_RIGHT | Shift+Right |
基本
| KEYCODE_0 | 按键'0' | 7 |
| KEYCODE_1 | 按键'1' | 8 |
| KEYCODE_2 | 按键'2' | 9 |
| KEYCODE_3 | 按键'3' | 10 |
| KEYCODE_4 | 按键'4' | 11 |
| KEYCODE_5 | 按键'5' | 12 |
| KEYCODE_6 | 按键'6' | 13 |
| KEYCODE_7 | 按键'7' | 14 |
| KEYCODE_8 | 按键'8' | 15 |
| KEYCODE_9 | 按键'9' | 16 |
| KEYCODE_A | 按键'A' | 29 |
| KEYCODE_B | 按键'B' | 30 |
| KEYCODE_C | 按键'C' | 31 |
| KEYCODE_D | 按键'D' | 32 |
| KEYCODE_E | 按键'E' | 33 |
| KEYCODE_F | 按键'F' | 34 |
| KEYCODE_G | 按键'G' | 35 |
| KEYCODE_H | 按键'H' | 36 |
| KEYCODE_I | 按键'I' | 37 |
| KEYCODE_J | 按键'J' | 38 |
| KEYCODE_K | 按键'K' | 39 |
| KEYCODE_L | 按键'L' | 40 |
| KEYCODE_M | 按键'M' | 41 |
| KEYCODE_N | 按键'N' | 42 |
| KEYCODE_O | 按键'O' | 43 |
| KEYCODE_P | 按键'P' | 44 |
| KEYCODE_Q | 按键'Q' | 45 |
| KEYCODE_R | 按键'R' | 46 |
| KEYCODE_S | 按键'S' | 47 |
| KEYCODE_T | 按键'T' | 48 |
| KEYCODE_U | 按键'U' | 49 |
| KEYCODE_V | 按键'V' | 50 |
| KEYCODE_W | 按键'W' | 51 |
| KEYCODE_X | 按键'X' | 52 |
| KEYCODE_Y | 按键'Y' | 53 |
| KEYCODE_Z | 按键'Z' | 54 |
符号
| KEYCODE_PLUS | 按键'+' |
| KEYCODE_MINUS | 按键'-' |
| KEYCODE_STAR | 按键'*' |
| KEYCODE_SLASH | 按键'/' |
| KEYCODE_EQUALS | 按键'=' |
| KEYCODE_AT | 按键'@' |
| KEYCODE_POUND | 按键'#' |
| KEYCODE_APOSTROPHE | 按键''' (单引号) |
| KEYCODE_BACKSLASH | 按键'\' |
| KEYCODE_COMMA | 按键',' |
| KEYCODE_PERIOD | 按键'.' |
| KEYCODE_LEFT_BRACKET | 按键'[' |
| KEYCODE_RIGHT_BRACKET | 按键']' |
| KEYCODE_SEMICOLON | 按键';' |
| KEYCODE_GRAVE | 按键'`' |
| KEYCODE_SPACE | 空格键 |
小键盘
| KEYCODE_NUMPAD_0 | 小键盘按键'0' |
| KEYCODE_NUMPAD_1 | 小键盘按键'1' |
| KEYCODE_NUMPAD_2 | 小键盘按键'2' |
| KEYCODE_NUMPAD_3 | 小键盘按键'3' |
| KEYCODE_NUMPAD_4 | 小键盘按键'4' |
| KEYCODE_NUMPAD_5 | 小键盘按键'5' |
| KEYCODE_NUMPAD_6 | 小键盘按键'6' |
| KEYCODE_NUMPAD_7 | 小键盘按键'7' |
| KEYCODE_NUMPAD_8 | 小键盘按键'8' |
| KEYCODE_NUMPAD_9 | 小键盘按键'9' |
| KEYCODE_NUMPAD_ADD | 小键盘按键'+' |
| KEYCODE_NUMPAD_SUBTRACT | 小键盘按键'-' |
| KEYCODE_NUMPAD_MULTIPLY | 小键盘按键'*' |
| KEYCODE_NUMPAD_DIVIDE | 小键盘按键'/' |
| KEYCODE_NUMPAD_EQUALS | 小键盘按键'=' |
| KEYCODE_NUMPAD_COMMA | 小键盘按键',' |
| KEYCODE_NUMPAD_DOT | 小键盘按键'.' |
| KEYCODE_NUMPAD_LEFT_PAREN | 小键盘按键'(' |
| KEYCODE_NUMPAD_RIGHT_PAREN | 小键盘按键')' |
| KEYCODE_NUMPAD_ENTER | 小键盘按键回车 |
功能键
| KEYCODE_F1 | 按键F1 |
| KEYCODE_F2 | 按键F2 |
| KEYCODE_F3 | 按键F3 |
| KEYCODE_F4 | 按键F4 |
| KEYCODE_F5 | 按键F5 |
| KEYCODE_F6 | 按键F6 |
| KEYCODE_F7 | 按键F7 |
| KEYCODE_F8 | 按键F8 |
| KEYCODE_F9 | 按键F9 |
| KEYCODE_F10 | 按键F10 |
| KEYCODE_F11 | 按键F11 |
| KEYCODE_F12 | 按键F12 |
多媒体键
| KEYCODE_MEDIA_PLAY | 多媒体键 播放 |
| KEYCODE_MEDIA_STOP | 多媒体键 停止 |
| KEYCODE_MEDIA_PAUSE | 多媒体键 暂停 |
| KEYCODE_MEDIA_PLAY_PAUSE | 多媒体键 播放/暂停 |
| KEYCODE_MEDIA_FAST_FORWARD | 多媒体键 快进 |
| KEYCODE_MEDIA_REWIND | 多媒体键 快退 |
| KEYCODE_MEDIA_NEXT | 多媒体键 下一首 |
| KEYCODE_MEDIA_PREVIOUS | 多媒体键 上一首 |
| KEYCODE_MEDIA_CLOSE | 多媒体键 关闭 |
| KEYCODE_MEDIA_EJECT | 多媒体键 弹出 |
| KEYCODE_MEDIA_RECORD | 多媒体键 录音 |
手柄按键
| KEYCODE_BUTTON_1 | 通用游戏手柄按钮#1 |
| KEYCODE_BUTTON_2 | 通用游戏手柄按钮 #2 |
| KEYCODE_BUTTON_3 | 通用游戏手柄按钮 #3 |
| KEYCODE_BUTTON_4 | 通用游戏手柄按钮 #4 |
| KEYCODE_BUTTON_5 | 通用游戏手柄按钮 #5 |
| KEYCODE_BUTTON_6 | 通用游戏手柄按钮 #6 |
| KEYCODE_BUTTON_7 | 通用游戏手柄按钮 #7 |
| KEYCODE_BUTTON_8 | 通用游戏手柄按钮 #8 |
| KEYCODE_BUTTON_9 | 通用游戏手柄按钮 #9 |
| KEYCODE_BUTTON_10 | 通用游戏手柄按钮 #10 |
| KEYCODE_BUTTON_11 | 通用游戏手柄按钮 #11 |
| KEYCODE_BUTTON_12 | 通用游戏手柄按钮 #12 |
| KEYCODE_BUTTON_13 | 通用游戏手柄按钮 #13 |
| KEYCODE_BUTTON_14 | 通用游戏手柄按钮 #14 |
| KEYCODE_BUTTON_15 | 通用游戏手柄按钮 #15 |
| KEYCODE_BUTTON_16 | 通用游戏手柄按钮 #16 |
| KEYCODE_BUTTON_A | 游戏手柄按钮 A |
| KEYCODE_BUTTON_B | 游戏手柄按钮 B |
| KEYCODE_BUTTON_C | 游戏手柄按钮 C |
| KEYCODE_BUTTON_X | 游戏手柄按钮 X |
| KEYCODE_BUTTON_Y | 游戏手柄按钮 Y |
| KEYCODE_BUTTON_Z | 游戏手柄按钮 Z |
| KEYCODE_BUTTON_L1 | 游戏手柄按钮 L1 |
| KEYCODE_BUTTON_L2 | 游戏手柄按钮 L2 |
| KEYCODE_BUTTON_R1 | 游戏手柄按钮 R1 |
| KEYCODE_BUTTON_R2 | 游戏手柄按钮 R2 |
| KEYCODE_BUTTON_MODE | 游戏手柄按钮 Mode |
| KEYCODE_BUTTON_SELECT | 游戏手柄按钮 Select |
| KEYCODE_BUTTON_START | 游戏手柄按钮 Start |
| KEYCODE_BUTTON_THUMBL | Left Thumb Button |
| KEYCODE_BUTTON_THUMBR | Right Thumb Button |
待查
|
|
|
|
KEYCODE_NUM |
按键Number modifier |
|
KEYCODE_INFO |
按键Info |
|
按键App switch |
|
|
KEYCODE_BOOKMARK |
按键Bookmark |
|
KEYCODE_AVR_INPUT |
按键A/V Receiver input |
|
KEYCODE_AVR_POWER |
按键A/V Receiver power |
|
KEYCODE_CAPTIONS |
按键Toggle captions |
|
KEYCODE_CHANNEL_DOWN |
按键Channel down |
|
KEYCODE_CHANNEL_UP |
按键Channel up |
|
KEYCODE_CLEAR |
按键Clear |
|
KEYCODE_DVR |
按键DVR |
|
KEYCODE_ENVELOPE |
按键Envelope special function |
|
KEYCODE_EXPLORER |
按键Explorer special function |
|
KEYCODE_FORWARD |
按键Forward |
|
KEYCODE_FORWARD_DEL |
按键Forward Delete |
|
KEYCODE_FUNCTION |
按键Function modifier |
|
KEYCODE_GUIDE |
按键Guide |
|
KEYCODE_HEADSETHOOK |
按键Headset Hook |
|
KEYCODE_META_LEFT |
按键Left Meta modifier |
|
KEYCODE_META_RIGHT |
按键Right Meta modifier |
|
KEYCODE_PICTSYMBOLS |
按键Picture Symbols modifier |
|
KEYCODE_PROG_BLUE |
按键Blue “programmable” |
|
KEYCODE_PROG_GREEN |
按键Green “programmable” |
|
KEYCODE_PROG_RED |
按键Red “programmable” |
|
KEYCODE_PROG_YELLOW |
按键Yellow “programmable” |
|
KEYCODE_SETTINGS |
按键Settings |
|
KEYCODE_SOFT_LEFT |
按键Soft Left |
|
KEYCODE_SOFT_RIGHT |
按键Soft Right |
|
KEYCODE_STB_INPUT |
按键Set-top-box input |
|
KEYCODE_STB_POWER |
按键Set-top-box power |
|
KEYCODE_SWITCH_CHARSET |
按键Switch Charset modifier |
|
KEYCODE_SYM |
按键Symbol modifier |
|
KEYCODE_SYSRQ |
按键System Request / Print Screen |
|
KEYCODE_TV |
按键TV |
|
KEYCODE_TV_INPUT |
按键TV input |
|
KEYCODE_TV_POWER |
按键TV power |
|
KEYCODE_WINDOW |
按键Window |
|
KEYCODE_UNKNOWN |
未知按键 |
二.底层代码实现
frameworks/base/data/keyboards/Generic.kl
1 key 1 ESCAPE
2 key 2 1
3 key 3 2
4 key 4 3
5 key 5 4
6 key 6 5
7 key 7 6
8 key 8 7
9 key 9 8
10 key 10 9
11 key 11 0
12 key 12 MINUS
13 key 13 EQUALS
14 key 14 DEL
15 key 15 TAB
16 key 16 Q
17 key 17 W
18 key 18 E
19 key 19 R
20 key 20 T
21 key 21 Y
22 key 22 U
23 key 23 I
24 key 24 O
25 key 25 P
26 key 26 LEFT_BRACKET
27 key 27 RIGHT_BRACKET
28 key 28 ENTER
29 key 29 CTRL_LEFT
30 key 30 A
31 key 31 S
32 key 32 D
33 key 33 F
34 key 34 G
35 key 35 H
36 key 36 J
37 key 37 K
38 key 38 L
39 key 39 SEMICOLON
40 key 40 APOSTROPHE
41 key 41 GRAVE
42 key 42 SHIFT_LEFT
43 key 43 BACKSLASH
44 key 44 Z
45 key 45 X
46 key 46 C
47 key 47 V
48 key 48 B
49 key 49 N
50 key 50 M
51 key 51 COMMA
52 key 52 PERIOD
53 key 53 SLASH
54 key 54 SHIFT_RIGHT
55 key 55 NUMPAD_MULTIPLY
56 key 56 ALT_LEFT
57 key 57 SPACE
58 key 58 CAPS_LOCK
59 key 59 F1
60 key 60 F2
61 key 61 F3
62 key 62 F4
63 key 63 F5
64 key 64 F6
65 key 65 F7
66 key 66 F8
67 key 67 F9
68 key 68 F10
69 key 69 NUM_LOCK
70 key 70 SCROLL_LOCK
71 key 71 NUMPAD_7
72 key 72 NUMPAD_8
73 key 73 NUMPAD_9
74 key 74 NUMPAD_SUBTRACT
75 key 75 NUMPAD_4
76 key 76 NUMPAD_5
77 key 77 NUMPAD_6
78 key 78 NUMPAD_ADD
79 key 79 NUMPAD_1
80 key 80 NUMPAD_2
81 key 81 NUMPAD_3
82 key 82 NUMPAD_0
83 key 83 NUMPAD_DOT
84 # key 84 (undefined)
85 key 85 ZENKAKU_HANKAKU
86 key 86 BACKSLASH
87 key 87 F11
88 key 88 F12
89 key 89 RO
90 # key 90 "KEY_KATAKANA"
91 # key 91 "KEY_HIRAGANA"
92 key 92 HENKAN
93 key 93 KATAKANA_HIRAGANA
94 key 94 MUHENKAN
95 key 95 NUMPAD_COMMA
96 key 96 NUMPAD_ENTER
97 key 97 CTRL_RIGHT
98 key 98 NUMPAD_DIVIDE
99 key 99 SYSRQ
100 key 100 ALT_RIGHT
101 # key 101 "KEY_LINEFEED"
102 key 102 MOVE_HOME
103 key 103 DPAD_UP
104 key 104 PAGE_UP
105 key 105 DPAD_LEFT
106 key 106 DPAD_RIGHT
107 key 107 MOVE_END
108 key 108 DPAD_DOWN
109 key 109 PAGE_DOWN
110 key 110 INSERT
111 key 111 FORWARD_DEL
112 # key 112 "KEY_MACRO"
113 key 113 VOLUME_MUTE
114 key 114 VOLUME_DOWN
115 key 115 VOLUME_UP
116 key 116 POWER WAKE
117 key 117 NUMPAD_EQUALS
118 # key 118 "KEY_KPPLUSMINUS"
119 key 119 BREAK
120 # key 120 (undefined)
121 key 121 NUMPAD_COMMA
122 key 122 KANA
123 key 123 EISU
124 key 124 YEN
125 key 125 META_LEFT
126 key 126 META_RIGHT
127 key 127 MENU WAKE_DROPPED
128 key 128 MEDIA_STOP
129 # key 129 "KEY_AGAIN"
130 # key 130 "KEY_PROPS"
131 # key 131 "KEY_UNDO"
132 # key 132 "KEY_FRONT"
133 # key 133 "KEY_COPY"
134 # key 134 "KEY_OPEN"
135 # key 135 "KEY_PASTE"
136 # key 136 "KEY_FIND"
137 # key 137 "KEY_CUT"
138 # key 138 "KEY_HELP"
139 key 139 MENU WAKE_DROPPED
140 key 140 CALCULATOR
141 # key 141 "KEY_SETUP"
142 key 142 POWER WAKE
143 key 143 POWER WAKE
144 # key 144 "KEY_FILE"
145 # key 145 "KEY_SENDFILE"
146 # key 146 "KEY_DELETEFILE"
147 # key 147 "KEY_XFER"
148 # key 148 "KEY_PROG1"
149 # key 149 "KEY_PROG2"
150 key 150 EXPLORER
151 # key 151 "KEY_MSDOS"
152 key 152 POWER WAKE
153 # key 153 "KEY_DIRECTION"
154 # key 154 "KEY_CYCLEWINDOWS"
155 key 155 ENVELOPE
156 key 156 BOOKMARK
157 # key 157 "KEY_COMPUTER"
158 key 158 BACK WAKE_DROPPED
159 key 159 FORWARD
160 key 160 MEDIA_CLOSE
161 key 161 MEDIA_EJECT
162 key 162 MEDIA_EJECT
163 key 163 MEDIA_NEXT
164 key 164 MEDIA_PLAY_PAUSE
165 key 165 MEDIA_PREVIOUS
166 key 166 MEDIA_STOP
167 key 167 MEDIA_RECORD
168 key 168 MEDIA_REWIND
169 key 169 CALL
170 # key 170 "KEY_ISO"
171 key 171 MUSIC
172 key 172 HOME
173 # key 173 "KEY_REFRESH"
174 # key 174 "KEY_EXIT"
175 # key 175 "KEY_MOVE"
176 # key 176 "KEY_EDIT"
177 key 177 PAGE_UP
178 key 178 PAGE_DOWN
179 key 179 NUMPAD_LEFT_PAREN
180 key 180 NUMPAD_RIGHT_PAREN
181 # key 181 "KEY_NEW"
182 # key 182 "KEY_REDO"
183 # key 183 F13
184 # key 184 F14
185 # key 185 F15
186 # key 186 F16
187 # key 187 F17
188 # key 188 F18
189 # key 189 F19
190 # key 190 F20
191 # key 191 F21
192 # key 192 F22
193 # key 193 F23
194 # key 194 F24
195 # key 195 (undefined)
196 # key 196 (undefined)
197 # key 197 (undefined)
198 # key 198 (undefined)
199 # key 199 (undefined)
200 key 200 MEDIA_PLAY
201 key 201 MEDIA_PAUSE
202 # key 202 "KEY_PROG3"
203 # key 203 "KEY_PROG4"
204 # key 204 (undefined)
205 # key 205 "KEY_SUSPEND"
206 # key 206 "KEY_CLOSE"
207 key 207 MEDIA_PLAY
208 key 208 MEDIA_FAST_FORWARD
209 # key 209 "KEY_BASSBOOST"
210 # key 210 "KEY_PRINT"
211 # key 211 "KEY_HP"
212 key 212 CAMERA
213 key 213 MUSIC
214 # key 214 "KEY_QUESTION"
215 key 215 ENVELOPE
216 # key 216 "KEY_CHAT"
217 key 217 SEARCH
218 # key 218 "KEY_CONNECT"
219 # key 219 "KEY_FINANCE"
220 # key 220 "KEY_SPORT"
221 # key 221 "KEY_SHOP"
222 # key 222 "KEY_ALTERASE"
223 # key 223 "KEY_CANCEL"
224 # key 224 "KEY_BRIGHTNESSDOWN"
225 # key 225 "KEY_BRIGHTNESSUP"
226 key 226 HEADSETHOOK
227
228 key 256 BUTTON_1
229 key 257 BUTTON_2
230 key 258 BUTTON_3
231 key 259 BUTTON_4
232 key 260 BUTTON_5
233 key 261 BUTTON_6
234 key 262 BUTTON_7
235 key 263 BUTTON_8
236 key 264 BUTTON_9
237 key 265 BUTTON_10
238 key 266 BUTTON_11
239 key 267 BUTTON_12
240 key 268 BUTTON_13
241 key 269 BUTTON_14
242 key 270 BUTTON_15
243 key 271 BUTTON_16
244
245 key 288 BUTTON_1
246 key 289 BUTTON_2
247 key 290 BUTTON_3
248 key 291 BUTTON_4
249 key 292 BUTTON_5
250 key 293 BUTTON_6
251 key 294 BUTTON_7
252 key 295 BUTTON_8
253 key 296 BUTTON_9
254 key 297 BUTTON_10
255 key 298 BUTTON_11
256 key 299 BUTTON_12
257 key 300 BUTTON_13
258 key 301 BUTTON_14
259 key 302 BUTTON_15
260 key 303 BUTTON_16
261
262
263 key 304 BUTTON_A
264 key 305 BUTTON_B
265 key 306 BUTTON_C
266 key 307 BUTTON_X
267 key 308 BUTTON_Y
268 key 309 BUTTON_Z
269 key 310 BUTTON_L1
270 key 311 BUTTON_R1
271 key 312 BUTTON_L2
272 key 313 BUTTON_R2
273 key 314 BUTTON_SELECT
274 key 315 BUTTON_START
275 key 316 BUTTON_MODE
276 key 317 BUTTON_THUMBL
277 key 318 BUTTON_THUMBR
278
279
280 # key 352 "KEY_OK"
281 key 353 DPAD_CENTER
282 # key 354 "KEY_GOTO"
283 # key 355 "KEY_CLEAR"
284 # key 356 "KEY_POWER2"
285 # key 357 "KEY_OPTION"
286 # key 358 "KEY_INFO"
287 # key 359 "KEY_TIME"
288 # key 360 "KEY_VENDOR"
289 # key 361 "KEY_ARCHIVE"
290 key 362 GUIDE
291 # key 363 "KEY_CHANNEL"
292 # key 364 "KEY_FAVORITES"
293 # key 365 "KEY_EPG"
294 key 366 DVR
295 # key 367 "KEY_MHP"
296 # key 368 "KEY_LANGUAGE"
297 # key 369 "KEY_TITLE"
298 # key 370 "KEY_SUBTITLE"
299 # key 371 "KEY_ANGLE"
300 # key 372 "KEY_ZOOM"
301 # key 373 "KEY_MODE"
302 # key 374 "KEY_KEYBOARD"
303 # key 375 "KEY_SCREEN"
304 # key 376 "KEY_PC"
305 key 377 TV
306 # key 378 "KEY_TV2"
307 # key 379 "KEY_VCR"
308 # key 380 "KEY_VCR2"
309 # key 381 "KEY_SAT"
310 # key 382 "KEY_SAT2"
311 # key 383 "KEY_CD"
312 # key 384 "KEY_TAPE"
313 # key 385 "KEY_RADIO"
314 # key 386 "KEY_TUNER"
315 # key 387 "KEY_PLAYER"
316 # key 388 "KEY_TEXT"
317 # key 389 "KEY_DVD"
318 # key 390 "KEY_AUX"
319 # key 391 "KEY_MP3"
320 # key 392 "KEY_AUDIO"
321 # key 393 "KEY_VIDEO"
322 # key 394 "KEY_DIRECTORY"
323 # key 395 "KEY_LIST"
324 # key 396 "KEY_MEMO"
325 key 397 CALENDAR
326 # key 398 "KEY_RED"
327 # key 399 "KEY_GREEN"
328 # key 400 "KEY_YELLOW"
329 # key 401 "KEY_BLUE"
330 key 402 CHANNEL_UP
331 key 403 CHANNEL_DOWN
332 # key 404 "KEY_FIRST"
333 # key 405 "KEY_LAST"
334 # key 406 "KEY_AB"
335 # key 407 "KEY_NEXT"
336 # key 408 "KEY_RESTART"
337 # key 409 "KEY_SLOW"
338 # key 410 "KEY_SHUFFLE"
339 # key 411 "KEY_BREAK"
340 # key 412 "KEY_PREVIOUS"
341 # key 413 "KEY_DIGITS"
342 # key 414 "KEY_TEEN"
343 # key 415 "KEY_TWEN"
344
345 key 429 CONTACTS
346
347 # key 448 "KEY_DEL_EOL"
348 # key 449 "KEY_DEL_EOS"
349 # key 450 "KEY_INS_LINE"
350 # key 451 "KEY_DEL_LINE"
351
352
353 key 464 FUNCTION
354 key 465 ESCAPE FUNCTION
355 key 466 F1 FUNCTION
356 key 467 F2 FUNCTION
357 key 468 F3 FUNCTION
358 key 469 F4 FUNCTION
359 key 470 F5 FUNCTION
360 key 471 F6 FUNCTION
361 key 472 F7 FUNCTION
362 key 473 F8 FUNCTION
363 key 474 F9 FUNCTION
364 key 475 F10 FUNCTION
365 key 476 F11 FUNCTION
366 key 477 F12 FUNCTION
367 key 478 1 FUNCTION
368 key 479 2 FUNCTION
369 key 480 D FUNCTION
370 key 481 E FUNCTION
371 key 482 F FUNCTION
372 key 483 S FUNCTION
373 key 484 B FUNCTION
374
375
376 # key 497 KEY_BRL_DOT1
377 # key 498 KEY_BRL_DOT2
378 # key 499 KEY_BRL_DOT3
379 # key 500 KEY_BRL_DOT4
380 # key 501 KEY_BRL_DOT5
381 # key 502 KEY_BRL_DOT6
382 # key 503 KEY_BRL_DOT7
383 # key 504 KEY_BRL_DOT8
384
385
386 # Joystick and game controller axes.
387 # Axes that are not mapped will be assigned generic axis numbers by the input subsystem.
388 axis 0x00 X
389 axis 0x01 Y
390 axis 0x02 Z
391 axis 0x03 RX
392 axis 0x04 RY
393 axis 0x05 RZ
394 axis 0x06 THROTTLE
395 axis 0x07 RUDDER
396 axis 0x08 WHEEL
397 axis 0x09 GAS
398 axis 0x0a BRAKE
399 axis 0x10 HAT_X
400 axis 0x11 HAT_Y
401
402 key 158 BACK WAKE_DROPPED
403
404 类型 CODE NAME
405
406 有些没有用到的用'#'注释
407
408
409
410 kernel/include/linux/input.h
411
412 #ifndef _INPUT_H
413 #define _INPUT_H
414
415 /*
416 * Copyright (c) 1999-2002 Vojtech Pavlik
417 *
418 * This program is free software; you can redistribute it and/or modify it
419 * under the terms of the GNU General Public License version 2 as published by
420 * the Free Software Foundation.
421 */
422
423 #ifdef __KERNEL__
424 #include <linux/time.h>
425 #include <linux/list.h>
426 #else
427 #include <sys/time.h>
428 #include <sys/ioctl.h>
429 #include <sys/types.h>
430 #include <linux/types.h>
431 #endif
432
433 /*
434 * The event structure itself
435 */
436
437 struct input_event {
438 struct timeval time;
439 __u16 type;
440 __u16 code;
441 __s32 value;
442 };
443
444 /*
445 * Protocol version.
446 */
447
448 #define EV_VERSION 0x010001
449
450 /*
451 * IOCTLs (0x00 - 0x7f)
452 */
453
454 struct input_id {
455 __u16 bustype;
456 __u16 vendor;
457 __u16 product;
458 __u16 version;
459 };
460
461 /**
462 * struct input_absinfo - used by EVIOCGABS/EVIOCSABS ioctls
463 * @value: latest reported value for the axis.
464 * @minimum: specifies minimum value for the axis.
465 * @maximum: specifies maximum value for the axis.
466 * @fuzz: specifies fuzz value that is used to filter noise from
467 * the event stream.
468 * @flat: values that are within this value will be discarded by
469 * joydev interface and reported as 0 instead.
470 * @resolution: specifies resolution for the values reported for
471 * the axis.
472 *
473 * Note that input core does not clamp reported values to the
474 * [minimum, maximum] limits, such task is left to userspace.
475 *
476 * Resolution for main axes (ABS_X, ABS_Y, ABS_Z) is reported in
477 * units per millimeter (units/mm), resolution for rotational axes
478 * (ABS_RX, ABS_RY, ABS_RZ) is reported in units per radian.
479 */
480 struct input_absinfo {
481 __s32 value;
482 __s32 minimum;
483 __s32 maximum;
484 __s32 fuzz;
485 __s32 flat;
486 __s32 resolution;
487 };
488
489 /**
490 * struct input_keymap_entry - used by EVIOCGKEYCODE/EVIOCSKEYCODE ioctls
491 * @scancode: scancode represented in machine-endian form.
492 * @len: length of the scancode that resides in @scancode buffer.
493 * @index: index in the keymap, may be used instead of scancode
494 * @flags: allows to specify how kernel should handle the request. For
495 * example, setting INPUT_KEYMAP_BY_INDEX flag indicates that kernel
496 * should perform lookup in keymap by @index instead of @scancode
497 * @keycode: key code assigned to this scancode
498 *
499 * The structure is used to retrieve and modify keymap data. Users have
500 * option of performing lookup either by @scancode itself or by @index
501 * in keymap entry. EVIOCGKEYCODE will also return scancode or index
502 * (depending on which element was used to perform lookup).
503 */
504 struct input_keymap_entry {
505 #define INPUT_KEYMAP_BY_INDEX (1 << 0)
506 __u8 flags;
507 __u8 len;
508 __u16 index;
509 __u32 keycode;
510 __u8 scancode[32];
511 };
512
513 #define EVIOCGVERSION _IOR('E', 0x01, int) /* get driver version */
514 #define EVIOCGID _IOR('E', 0x02, struct input_id) /* get device ID */
515 #define EVIOCGREP _IOR('E', 0x03, unsigned int[2]) /* get repeat settings */
516 #define EVIOCSREP _IOW('E', 0x03, unsigned int[2]) /* set repeat settings */
517
518 #define EVIOCGKEYCODE _IOR('E', 0x04, unsigned int[2]) /* get keycode */
519 #define EVIOCGKEYCODE_V2 _IOR('E', 0x04, struct input_keymap_entry)
520 #define EVIOCSKEYCODE _IOW('E', 0x04, unsigned int[2]) /* set keycode */
521 #define EVIOCSKEYCODE_V2 _IOW('E', 0x04, struct input_keymap_entry)
522
523 #define EVIOCGNAME(len) _IOC(_IOC_READ, 'E', 0x06, len) /* get device name */
524 #define EVIOCGPHYS(len) _IOC(_IOC_READ, 'E', 0x07, len) /* get physical location */
525 #define EVIOCGUNIQ(len) _IOC(_IOC_READ, 'E', 0x08, len) /* get unique identifier */
526 #define EVIOCGPROP(len) _IOC(_IOC_READ, 'E', 0x09, len) /* get device properties */
527
528 #define EVIOCGKEY(len) _IOC(_IOC_READ, 'E', 0x18, len) /* get global key state */
529 #define EVIOCGLED(len) _IOC(_IOC_READ, 'E', 0x19, len) /* get all LEDs */
530 #define EVIOCGSND(len) _IOC(_IOC_READ, 'E', 0x1a, len) /* get all sounds status */
531 #define EVIOCGSW(len) _IOC(_IOC_READ, 'E', 0x1b, len) /* get all switch states */
532
533 #define EVIOCGBIT(ev,len) _IOC(_IOC_READ, 'E', 0x20 + ev, len) /* get event bits */
534 #define EVIOCGABS(abs) _IOR('E', 0x40 + abs, struct input_absinfo) /* get abs value/limits */
535 #define EVIOCSABS(abs) _IOW('E', 0xc0 + abs, struct input_absinfo) /* set abs value/limits */
536
537 #define EVIOCSFF _IOC(_IOC_WRITE, 'E', 0x80, sizeof(struct ff_effect)) /* send a force effect to a force feedback device */
538 #define EVIOCRMFF _IOW('E', 0x81, int) /* Erase a force effect */
539 #define EVIOCGEFFECTS _IOR('E', 0x84, int) /* Report number of effects playable at the same time */
540
541 #define EVIOCGRAB _IOW('E', 0x90, int) /* Grab/Release device */
542
543 #define EVIOCGSUSPENDBLOCK _IOR('E', 0x91, int) /* get suspend block enable */
544 #define EVIOCSSUSPENDBLOCK _IOW('E', 0x91, int) /* set suspend block enable */
545
546 /*
547 * Device properties and quirks
548 */
549
550 #define INPUT_PROP_POINTER 0x00 /* needs a pointer */
551 #define INPUT_PROP_DIRECT 0x01 /* direct input devices */
552 #define INPUT_PROP_BUTTONPAD 0x02 /* has button(s) under pad */
553 #define INPUT_PROP_SEMI_MT 0x03 /* touch rectangle only */
554
555 #define INPUT_PROP_MAX 0x1f
556 #define INPUT_PROP_CNT (INPUT_PROP_MAX + 1)
557
558 /*
559 * Event types
560 */
561
562 #define EV_SYN 0x00
563 #define EV_KEY 0x01
564 #define EV_REL 0x02
565 #define EV_ABS 0x03
566 #define EV_MSC 0x04
567 #define EV_SW 0x05
568 #define EV_LED 0x11
569 #define EV_SND 0x12
570 #define EV_REP 0x14
571 #define EV_FF 0x15
572 #define EV_PWR 0x16
573 #define EV_FF_STATUS 0x17
574 #define EV_MAX 0x1f
575 #define EV_CNT (EV_MAX+1)
576
577 /*
578 * Synchronization events.
579 */
580
581 #define SYN_REPORT 0
582 #define SYN_CONFIG 1
583 #define SYN_MT_REPORT 2
584 #define SYN_DROPPED 3
585
586 /*
587 * Keys and buttons
588 *
589 * Most of the keys/buttons are modeled after USB HUT 1.12
590 * (see http://www.usb.org/developers/hidpage).
591 * Abbreviations in the comments:
592 * AC - Application Control
593 * AL - Application Launch Button
594 * SC - System Control
595 */
596
597 #define KEY_RESERVED 0
598 #define KEY_ESC 1
599 #define KEY_1 2
600 #define KEY_2 3
601 #define KEY_3 4
602 #define KEY_4 5
603 #define KEY_5 6
604 #define KEY_6 7
605 #define KEY_7 8
606 #define KEY_8 9
607 #define KEY_9 10
608 #define KEY_0 11
609 #define KEY_MINUS 12
610 #define KEY_EQUAL 13
611 #define KEY_BACKSPACE 14
612 #define KEY_TAB 15
613 #define KEY_Q 16
614 #define KEY_W 17
615 #define KEY_E 18
616 #define KEY_R 19
617 #define KEY_T 20
618 #define KEY_Y 21
619 #define KEY_U 22
620 #define KEY_I 23
621 #define KEY_O 24
622 #define KEY_P 25
623 #define KEY_LEFTBRACE 26
624 #define KEY_RIGHTBRACE 27
625 #define KEY_ENTER 28
626 #define KEY_LEFTCTRL 29
627 #define KEY_A 30
628 #define KEY_S 31
629 #define KEY_D 32
630 #define KEY_F 33
631 #define KEY_G 34
632 #define KEY_H 35
633 #define KEY_J 36
634 #define KEY_K 37
635 #define KEY_L 38
636 #define KEY_SEMICOLON 39
637 #define KEY_APOSTROPHE 40
638 #define KEY_GRAVE 41
639 #define KEY_LEFTSHIFT 42
640 #define KEY_BACKSLASH 43
641 #define KEY_Z 44
642 #define KEY_X 45
643 #define KEY_C 46
644 #define KEY_V 47
645 #define KEY_B 48
646 #define KEY_N 49
647 #define KEY_M 50
648 #define KEY_COMMA 51
649 #define KEY_DOT 52
650 #define KEY_SLASH 53
651 #define KEY_RIGHTSHIFT 54
652 #define KEY_KPASTERISK 55
653 #define KEY_LEFTALT 56
654 #define KEY_SPACE 57
655 #define KEY_CAPSLOCK 58
656 #define KEY_F1 59
657 #define KEY_F2 60
658 #define KEY_F3 61
659 #define KEY_F4 62
660 #define KEY_F5 63
661 #define KEY_F6 64
662 #define KEY_F7 65
663 #define KEY_F8 66
664 #define KEY_F9 67
665 #define KEY_F10 68
666 #define KEY_NUMLOCK 69
667 #define KEY_SCROLLLOCK 70
668 #define KEY_KP7 71
669 #define KEY_KP8 72
670 #define KEY_KP9 73
671 #define KEY_KPMINUS 74
672 #define KEY_KP4 75
673 #define KEY_KP5 76
674 #define KEY_KP6 77
675 #define KEY_KPPLUS 78
676 #define KEY_KP1 79
677 #define KEY_KP2 80
678 #define KEY_KP3 81
679 #define KEY_KP0 82
680 #define KEY_KPDOT 83
681
682 #define KEY_ZENKAKUHANKAKU 85
683 #define KEY_102ND 86
684 #define KEY_F11 87
685 #define KEY_F12 88
686 #define KEY_RO 89
687 #define KEY_KATAKANA 90
688 #define KEY_HIRAGANA 91
689 #define KEY_HENKAN 92
690 #define KEY_KATAKANAHIRAGANA 93
691 #define KEY_MUHENKAN 94
692 #define KEY_KPJPCOMMA 95
693 #define KEY_KPENTER 96
694 #define KEY_RIGHTCTRL 97
695 #define KEY_KPSLASH 98
696 #define KEY_SYSRQ 99
697 #define KEY_RIGHTALT 100
698 #define KEY_LINEFEED 101
699 #define KEY_HOME 102
700 #define KEY_UP 103
701 #define KEY_PAGEUP 104
702 #define KEY_LEFT 105
703 #define KEY_RIGHT 106
704 #define KEY_END 107
705 #define KEY_DOWN 108
706 #define KEY_PAGEDOWN 109
707 #define KEY_INSERT 110
708 #define KEY_DELETE 111
709 #define KEY_MACRO 112
710 #define KEY_MUTE 113
711 #define KEY_VOLUMEDOWN 114
712 #define KEY_VOLUMEUP 115
713 #define KEY_POWER 116 /* SC System Power Down */
714 #define KEY_KPEQUAL 117
715 #define KEY_KPPLUSMINUS 118
716 #define KEY_PAUSE 119
717 #define KEY_SCALE 120 /* AL Compiz Scale (Expose) */
718
719 #define KEY_KPCOMMA 121
720 #define KEY_HANGEUL 122
721 #define KEY_HANGUEL KEY_HANGEUL
722 #define KEY_HANJA 123
723 #define KEY_YEN 124
724 #define KEY_LEFTMETA 125
725 #define KEY_RIGHTMETA 126
726 #define KEY_COMPOSE 127
727
728 #define KEY_STOP 128 /* AC Stop */
729 #define KEY_AGAIN 129
730 #define KEY_PROPS 130 /* AC Properties */
731 #define KEY_UNDO 131 /* AC Undo */
732 #define KEY_FRONT 132
733 #define KEY_COPY 133 /* AC Copy */
734 #define KEY_OPEN 134 /* AC Open */
735 #define KEY_PASTE 135 /* AC Paste */
736 #define KEY_FIND 136 /* AC Search */
737 #define KEY_CUT 137 /* AC Cut */
738 #define KEY_HELP 138 /* AL Integrated Help Center */
739 #define KEY_MENU 139 /* Menu (show menu) */
740 #define KEY_CALC 140 /* AL Calculator */
741 #define KEY_SETUP 141
742 #define KEY_SLEEP 142 /* SC System Sleep */
743 #define KEY_WAKEUP 143 /* System Wake Up */
744 #define KEY_FILE 144 /* AL Local Machine Browser */
745 #define KEY_SENDFILE 145
746 #define KEY_DELETEFILE 146
747 #define KEY_XFER 147
748 #define KEY_PROG1 148
749 #define KEY_PROG2 149
750 #define KEY_WWW 150 /* AL Internet Browser */
751 #define KEY_MSDOS 151
752 #define KEY_COFFEE 152 /* AL Terminal Lock/Screensaver */
753 #define KEY_SCREENLOCK KEY_COFFEE
754 #define KEY_DIRECTION 153
755 #define KEY_CYCLEWINDOWS 154
756 #define KEY_MAIL 155
757 #define KEY_BOOKMARKS 156 /* AC Bookmarks */
758 #define KEY_COMPUTER 157
759 #define KEY_BACK 158 /* AC Back */
760 #define KEY_FORWARD 159 /* AC Forward */
761 #define KEY_CLOSECD 160
762 #define KEY_EJECTCD 161
763 #define KEY_EJECTCLOSECD 162
764 #define KEY_NEXTSONG 163
765 #define KEY_PLAYPAUSE 164
766 #define KEY_PREVIOUSSONG 165
767 #define KEY_STOPCD 166
768 #define KEY_RECORD 167
769 #define KEY_REWIND 168
770 #define KEY_PHONE 169 /* Media Select Telephone */
771 #define KEY_ISO 170
772 #define KEY_CONFIG 171 /* AL Consumer Control Configuration */
773 #define KEY_HOMEPAGE 172 /* AC Home */
774 #define KEY_REFRESH 173 /* AC Refresh */
775 #define KEY_EXIT 174 /* AC Exit */
776 #define KEY_MOVE 175
777 #define KEY_EDIT 176
778 #define KEY_SCROLLUP 177
779 #define KEY_SCROLLDOWN 178
780 #define KEY_KPLEFTPAREN 179
781 #define KEY_KPRIGHTPAREN 180
782 #define KEY_NEW 181 /* AC New */
783 #define KEY_REDO 182 /* AC Redo/Repeat */
784
785 #define KEY_F13 183
786 #define KEY_F14 184
787 #define KEY_F15 185
788 #define KEY_F16 186
789 #define KEY_F17 187
790 #define KEY_F18 188
791 #define KEY_F19 189
792 #define KEY_F20 190
793 #define KEY_F21 191
794 #define KEY_F22 192
795 #define KEY_F23 193
796 #define KEY_F24 194
797
798 #define KEY_PLAYCD 200
799 #define KEY_PAUSECD 201
800 #define KEY_PROG3 202
801 #define KEY_PROG4 203
802 #define KEY_DASHBOARD 204 /* AL Dashboard */
803 #define KEY_SUSPEND 205
804 #define KEY_CLOSE 206 /* AC Close */
805 #define KEY_PLAY 207
806 #define KEY_FASTFORWARD 208
807 #define KEY_BASSBOOST 209
808 #define KEY_PRINT 210 /* AC Print */
809 #define KEY_HP 211
810 #define KEY_CAMERA 212
811 #define KEY_SOUND 213
812 #define KEY_QUESTION 214
813 #define KEY_EMAIL 215
814 #define KEY_CHAT 216
815 #define KEY_SEARCH 217
816 #define KEY_CONNECT 218
817 #define KEY_FINANCE 219 /* AL Checkbook/Finance */
818 #define KEY_SPORT 220
819 #define KEY_SHOP 221
820 #define KEY_ALTERASE 222
821 #define KEY_CANCEL 223 /* AC Cancel */
822 #define KEY_BRIGHTNESSDOWN 224
823 #define KEY_BRIGHTNESSUP 225
824 #define KEY_MEDIA 226
825
826 #define KEY_SWITCHVIDEOMODE 227 /* Cycle between available video
827 outputs (Monitor/LCD/TV-out/etc) */
828 #define KEY_KBDILLUMTOGGLE 228
829 #define KEY_KBDILLUMDOWN 229
830 #define KEY_KBDILLUMUP 230
831
832 #define KEY_SEND 231 /* AC Send */
833 #define KEY_REPLY 232 /* AC Reply */
834 #define KEY_FORWARDMAIL 233 /* AC Forward Msg */
835 #define KEY_SAVE 234 /* AC Save */
836 #define KEY_DOCUMENTS 235
837
838 #define KEY_BATTERY 236
839
840 #define KEY_BLUETOOTH 237
841 #define KEY_WLAN 238
842 #define KEY_UWB 239
843
844 #define KEY_UNKNOWN 240
845
846 #define KEY_VIDEO_NEXT 241 /* drive next video source */
847 #define KEY_VIDEO_PREV 242 /* drive previous video source */
848 #define KEY_BRIGHTNESS_CYCLE 243 /* brightness up, after max is min */
849 #define KEY_BRIGHTNESS_ZERO 244 /* brightness off, use ambient */
850 #define KEY_DISPLAY_OFF 245 /* display device to off state */
851
852 #define KEY_WIMAX 246
853 #define KEY_RFKILL 247 /* Key that controls all radios */
854
855 /* Code 255 is reserved for special needs of AT keyboard driver */
856
857 #define BTN_MISC 0x100
858 #define BTN_0 0x100
859 #define BTN_1 0x101
860 #define BTN_2 0x102
861 #define BTN_3 0x103
862 #define BTN_4 0x104
863 #define BTN_5 0x105
864 #define BTN_6 0x106
865 #define BTN_7 0x107
866 #define BTN_8 0x108
867 #define BTN_9 0x109
868
869 #define BTN_MOUSE 0x110
870 #define BTN_LEFT 0x110
871 #define BTN_RIGHT 0x111
872 #define BTN_MIDDLE 0x112
873 #define BTN_SIDE 0x113
874 #define BTN_EXTRA 0x114
875 #define BTN_FORWARD 0x115
876 #define BTN_BACK 0x116
877 #define BTN_TASK 0x117
878
879 #define BTN_JOYSTICK 0x120
880 #define BTN_TRIGGER 0x120
881 #define BTN_THUMB 0x121
882 #define BTN_THUMB2 0x122
883 #define BTN_TOP 0x123
884 #define BTN_TOP2 0x124
885 #define BTN_PINKIE 0x125
886 #define BTN_BASE 0x126
887 #define BTN_BASE2 0x127
888 #define BTN_BASE3 0x128
889 #define BTN_BASE4 0x129
890 #define BTN_BASE5 0x12a
891 #define BTN_BASE6 0x12b
892 #define BTN_DEAD 0x12f
893
894 #define BTN_GAMEPAD 0x130
895 #define BTN_A 0x130
896 #define BTN_B 0x131
897 #define BTN_C 0x132
898 #define BTN_X 0x133
899 #define BTN_Y 0x134
900 #define BTN_Z 0x135
901 #define BTN_TL 0x136
902 #define BTN_TR 0x137
903 #define BTN_TL2 0x138
904 #define BTN_TR2 0x139
905 #define BTN_SELECT 0x13a
906 #define BTN_START 0x13b
907 #define BTN_MODE 0x13c
908 #define BTN_THUMBL 0x13d
909 #define BTN_THUMBR 0x13e
910
911 #define BTN_DIGI 0x140
912 #define BTN_TOOL_PEN 0x140
913 #define BTN_TOOL_RUBBER 0x141
914 #define BTN_TOOL_BRUSH 0x142
915 #define BTN_TOOL_PENCIL 0x143
916 #define BTN_TOOL_AIRBRUSH 0x144
917 #define BTN_TOOL_FINGER 0x145
918 #define BTN_TOOL_MOUSE 0x146
919 #define BTN_TOOL_LENS 0x147
920 #define BTN_TOUCH 0x14a
921 #define BTN_STYLUS 0x14b
922 #define BTN_STYLUS2 0x14c
923 #define BTN_TOOL_DOUBLETAP 0x14d
924 #define BTN_TOOL_TRIPLETAP 0x14e
925 #define BTN_TOOL_QUADTAP 0x14f /* Four fingers on trackpad */
926
927 #define BTN_WHEEL 0x150
928 #define BTN_GEAR_DOWN 0x150
929 #define BTN_GEAR_UP 0x151
930
931 #define KEY_OK 0x160
932 #define KEY_SELECT 0x161
933 #define KEY_GOTO 0x162
934 #define KEY_CLEAR 0x163
935 #define KEY_POWER2 0x164
936 #define KEY_OPTION 0x165
937 #define KEY_INFO 0x166 /* AL OEM Features/Tips/Tutorial */
938 #define KEY_TIME 0x167
939 #define KEY_VENDOR 0x168
940 #define KEY_ARCHIVE 0x169
941 #define KEY_PROGRAM 0x16a /* Media Select Program Guide */
942 #define KEY_CHANNEL 0x16b
943 #define KEY_FAVORITES 0x16c
944 #define KEY_EPG 0x16d
945 #define KEY_PVR 0x16e /* Media Select Home */
946 #define KEY_MHP 0x16f
947 #define KEY_LANGUAGE 0x170
948 #define KEY_TITLE 0x171
949 #define KEY_SUBTITLE 0x172
950 #define KEY_ANGLE 0x173
951 #define KEY_ZOOM 0x174
952 #define KEY_MODE 0x175
953 #define KEY_KEYBOARD 0x176
954 #define KEY_SCREEN 0x177
955 #define KEY_PC 0x178 /* Media Select Computer */
956 #define KEY_TV 0x179 /* Media Select TV */
957 #define KEY_TV2 0x17a /* Media Select Cable */
958 #define KEY_VCR 0x17b /* Media Select VCR */
959 #define KEY_VCR2 0x17c /* VCR Plus */
960 #define KEY_SAT 0x17d /* Media Select Satellite */
961 #define KEY_SAT2 0x17e
962 #define KEY_CD 0x17f /* Media Select CD */
963 #define KEY_TAPE 0x180 /* Media Select Tape */
964 #define KEY_RADIO 0x181
965 #define KEY_TUNER 0x182 /* Media Select Tuner */
966 #define KEY_PLAYER 0x183
967 #define KEY_TEXT 0x184
968 #define KEY_DVD 0x185 /* Media Select DVD */
969 #define KEY_AUX 0x186
970 #define KEY_MP3 0x187
971 #define KEY_AUDIO 0x188 /* AL Audio Browser */
972 #define KEY_VIDEO 0x189 /* AL Movie Browser */
973 #define KEY_DIRECTORY 0x18a
974 #define KEY_LIST 0x18b
975 #define KEY_MEMO 0x18c /* Media Select Messages */
976 #define KEY_CALENDAR 0x18d
977 #define KEY_RED 0x18e
978 #define KEY_GREEN 0x18f
979 #define KEY_YELLOW 0x190
980 #define KEY_BLUE 0x191
981 #define KEY_CHANNELUP 0x192 /* Channel Increment */
982 #define KEY_CHANNELDOWN 0x193 /* Channel Decrement */
983 #define KEY_FIRST 0x194
984 #define KEY_LAST 0x195 /* Recall Last */
985 #define KEY_AB 0x196
986 #define KEY_NEXT 0x197
987 #define KEY_RESTART 0x198
988 #define KEY_SLOW 0x199
989 #define KEY_SHUFFLE 0x19a
990 #define KEY_BREAK 0x19b
991 #define KEY_PREVIOUS 0x19c
992 #define KEY_DIGITS 0x19d
993 #define KEY_TEEN 0x19e
994 #define KEY_TWEN 0x19f
995 #define KEY_VIDEOPHONE 0x1a0 /* Media Select Video Phone */
996 #define KEY_GAMES 0x1a1 /* Media Select Games */
997 #define KEY_ZOOMIN 0x1a2 /* AC Zoom In */
998 #define KEY_ZOOMOUT 0x1a3 /* AC Zoom Out */
999 #define KEY_ZOOMRESET 0x1a4 /* AC Zoom */
1000 #define KEY_WORDPROCESSOR 0x1a5 /* AL Word Processor */
1001 #define KEY_EDITOR 0x1a6 /* AL Text Editor */
1002 #define KEY_SPREADSHEET 0x1a7 /* AL Spreadsheet */
1003 #define KEY_GRAPHICSEDITOR 0x1a8 /* AL Graphics Editor */
1004 #define KEY_PRESENTATION 0x1a9 /* AL Presentation App */
1005 #define KEY_DATABASE 0x1aa /* AL Database App */
1006 #define KEY_NEWS 0x1ab /* AL Newsreader */
1007 #define KEY_VOICEMAIL 0x1ac /* AL Voicemail */
1008 #define KEY_ADDRESSBOOK 0x1ad /* AL Contacts/Address Book */
1009 #define KEY_MESSENGER 0x1ae /* AL Instant Messaging */
1010 #define KEY_DISPLAYTOGGLE 0x1af /* Turn display (LCD) on and off */
1011 #define KEY_SPELLCHECK 0x1b0 /* AL Spell Check */
1012 #define KEY_LOGOFF 0x1b1 /* AL Logoff */
1013
1014 #define KEY_DOLLAR 0x1b2
1015 #define KEY_EURO 0x1b3
1016
1017 #define KEY_FRAMEBACK 0x1b4 /* Consumer - transport controls */
1018 #define KEY_FRAMEFORWARD 0x1b5
1019 #define KEY_CONTEXT_MENU 0x1b6 /* GenDesc - system context menu */
1020 #define KEY_MEDIA_REPEAT 0x1b7 /* Consumer - transport control */
1021 #define KEY_10CHANNELSUP 0x1b8 /* 10 channels up (10+) */
1022 #define KEY_10CHANNELSDOWN 0x1b9 /* 10 channels down (10-) */
1023 #define KEY_IMAGES 0x1ba /* AL Image Browser */
1024
1025 #define KEY_DEL_EOL 0x1c0
1026 #define KEY_DEL_EOS 0x1c1
1027 #define KEY_INS_LINE 0x1c2
1028 #define KEY_DEL_LINE 0x1c3
1029
1030 #define KEY_FN 0x1d0
1031 #define KEY_FN_ESC 0x1d1
1032 #define KEY_FN_F1 0x1d2
1033 #define KEY_FN_F2 0x1d3
1034 #define KEY_FN_F3 0x1d4
1035 #define KEY_FN_F4 0x1d5
1036 #define KEY_FN_F5 0x1d6
1037 #define KEY_FN_F6 0x1d7
1038 #define KEY_FN_F7 0x1d8
1039 #define KEY_FN_F8 0x1d9
1040 #define KEY_FN_F9 0x1da
1041 #define KEY_FN_F10 0x1db
1042 #define KEY_FN_F11 0x1dc
1043 #define KEY_FN_F12 0x1dd
1044 #define KEY_FN_1 0x1de
1045 #define KEY_FN_2 0x1df
1046 #define KEY_FN_D 0x1e0
1047 #define KEY_FN_E 0x1e1
1048 #define KEY_FN_F 0x1e2
1049 #define KEY_FN_S 0x1e3
1050 #define KEY_FN_B 0x1e4
1051
1052 #define KEY_BRL_DOT1 0x1f1
1053 #define KEY_BRL_DOT2 0x1f2
1054 #define KEY_BRL_DOT3 0x1f3
1055 #define KEY_BRL_DOT4 0x1f4
1056 #define KEY_BRL_DOT5 0x1f5
1057 #define KEY_BRL_DOT6 0x1f6
1058 #define KEY_BRL_DOT7 0x1f7
1059 #define KEY_BRL_DOT8 0x1f8
1060 #define KEY_BRL_DOT9 0x1f9
1061 #define KEY_BRL_DOT10 0x1fa
1062
1063 #define KEY_NUMERIC_0 0x200 /* used by phones, remote controls, */
1064 #define KEY_NUMERIC_1 0x201 /* and other keypads */
1065 #define KEY_NUMERIC_2 0x202
1066 #define KEY_NUMERIC_3 0x203
1067 #define KEY_NUMERIC_4 0x204
1068 #define KEY_NUMERIC_5 0x205
1069 #define KEY_NUMERIC_6 0x206
1070 #define KEY_NUMERIC_7 0x207
1071 #define KEY_NUMERIC_8 0x208
1072 #define KEY_NUMERIC_9 0x209
1073 #define KEY_NUMERIC_STAR 0x20a
1074 #define KEY_NUMERIC_POUND 0x20b
1075
1076 #define KEY_CAMERA_FOCUS 0x210
1077 #define KEY_WPS_BUTTON 0x211 /* WiFi Protected Setup key */
1078
1079 #define KEY_TOUCHPAD_TOGGLE 0x212 /* Request switch touchpad on or off */
1080 #define KEY_TOUCHPAD_ON 0x213
1081 #define KEY_TOUCHPAD_OFF 0x214
1082
1083 #define KEY_CAMERA_ZOOMIN 0x215
1084 #define KEY_CAMERA_ZOOMOUT 0x216
1085 #define KEY_CAMERA_UP 0x217
1086 #define KEY_CAMERA_DOWN 0x218
1087 #define KEY_CAMERA_LEFT 0x219
1088 #define KEY_CAMERA_RIGHT 0x21a
1089
1090 #define BTN_TRIGGER_HAPPY 0x2c0
1091 #define BTN_TRIGGER_HAPPY1 0x2c0
1092 #define BTN_TRIGGER_HAPPY2 0x2c1
1093 #define BTN_TRIGGER_HAPPY3 0x2c2
1094 #define BTN_TRIGGER_HAPPY4 0x2c3
1095 #define BTN_TRIGGER_HAPPY5 0x2c4
1096 #define BTN_TRIGGER_HAPPY6 0x2c5
1097 #define BTN_TRIGGER_HAPPY7 0x2c6
1098 #define BTN_TRIGGER_HAPPY8 0x2c7
1099 #define BTN_TRIGGER_HAPPY9 0x2c8
1100 #define BTN_TRIGGER_HAPPY10 0x2c9
1101 #define BTN_TRIGGER_HAPPY11 0x2ca
1102 #define BTN_TRIGGER_HAPPY12 0x2cb
1103 #define BTN_TRIGGER_HAPPY13 0x2cc
1104 #define BTN_TRIGGER_HAPPY14 0x2cd
1105 #define BTN_TRIGGER_HAPPY15 0x2ce
1106 #define BTN_TRIGGER_HAPPY16 0x2cf
1107 #define BTN_TRIGGER_HAPPY17 0x2d0
1108 #define BTN_TRIGGER_HAPPY18 0x2d1
1109 #define BTN_TRIGGER_HAPPY19 0x2d2
1110 #define BTN_TRIGGER_HAPPY20 0x2d3
1111 #define BTN_TRIGGER_HAPPY21 0x2d4
1112 #define BTN_TRIGGER_HAPPY22 0x2d5
1113 #define BTN_TRIGGER_HAPPY23 0x2d6
1114 #define BTN_TRIGGER_HAPPY24 0x2d7
1115 #define BTN_TRIGGER_HAPPY25 0x2d8
1116 #define BTN_TRIGGER_HAPPY26 0x2d9
1117 #define BTN_TRIGGER_HAPPY27 0x2da
1118 #define BTN_TRIGGER_HAPPY28 0x2db
1119 #define BTN_TRIGGER_HAPPY29 0x2dc
1120 #define BTN_TRIGGER_HAPPY30 0x2dd
1121 #define BTN_TRIGGER_HAPPY31 0x2de
1122 #define BTN_TRIGGER_HAPPY32 0x2df
1123 #define BTN_TRIGGER_HAPPY33 0x2e0
1124 #define BTN_TRIGGER_HAPPY34 0x2e1
1125 #define BTN_TRIGGER_HAPPY35 0x2e2
1126 #define BTN_TRIGGER_HAPPY36 0x2e3
1127 #define BTN_TRIGGER_HAPPY37 0x2e4
1128 #define BTN_TRIGGER_HAPPY38 0x2e5
1129 #define BTN_TRIGGER_HAPPY39 0x2e6
1130 #define BTN_TRIGGER_HAPPY40 0x2e7
1131
1132 /* We avoid low common keys in module aliases so they don't get huge. */
1133 #define KEY_MIN_INTERESTING KEY_MUTE
1134 #define KEY_MAX 0x2ff
1135 #define KEY_CNT (KEY_MAX+1)
1136
1137 /*
1138 * Relative axes
1139 */
1140
1141 #define REL_X 0x00
1142 #define REL_Y 0x01
1143 #define REL_Z 0x02
1144 #define REL_RX 0x03
1145 #define REL_RY 0x04
1146 #define REL_RZ 0x05
1147 #define REL_HWHEEL 0x06
1148 #define REL_DIAL 0x07
1149 #define REL_WHEEL 0x08
1150 #define REL_MISC 0x09
1151 #define REL_MAX 0x0f
1152 #define REL_CNT (REL_MAX+1)
1153
1154 /*
1155 * Absolute axes
1156 */
1157
1158 #define ABS_X 0x00
1159 #define ABS_Y 0x01
1160 #define ABS_Z 0x02
1161 #define ABS_RX 0x03
1162 #define ABS_RY 0x04
1163 #define ABS_RZ 0x05
1164 #define ABS_THROTTLE 0x06
1165 #define ABS_RUDDER 0x07
1166 #define ABS_WHEEL 0x08
1167 #define ABS_GAS 0x09
1168 #define ABS_BRAKE 0x0a
1169 #define ABS_HAT0X 0x10
1170 #define ABS_HAT0Y 0x11
1171 #define ABS_HAT1X 0x12
1172 #define ABS_HAT1Y 0x13
1173 #define ABS_HAT2X 0x14
1174 #define ABS_HAT2Y 0x15
1175 #define ABS_HAT3X 0x16
1176 #define ABS_HAT3Y 0x17
1177 #define ABS_PRESSURE 0x18
1178 #define ABS_DISTANCE 0x19
1179 #define ABS_TILT_X 0x1a
1180 #define ABS_TILT_Y 0x1b
1181 #define ABS_TOOL_WIDTH 0x1c
1182
1183 #define ABS_VOLUME 0x20
1184
1185 #define ABS_MISC 0x28
1186
1187 #define ABS_MT_SLOT 0x2f /* MT slot being modified */
1188 #define ABS_MT_TOUCH_MAJOR 0x30 /* Major axis of touching ellipse */
1189 #define ABS_MT_TOUCH_MINOR 0x31 /* Minor axis (omit if circular) */
1190 #define ABS_MT_WIDTH_MAJOR 0x32 /* Major axis of approaching ellipse */
1191 #define ABS_MT_WIDTH_MINOR 0x33 /* Minor axis (omit if circular) */
1192 #define ABS_MT_ORIENTATION 0x34 /* Ellipse orientation */
1193 #define ABS_MT_POSITION_X 0x35 /* Center X ellipse position */
1194 #define ABS_MT_POSITION_Y 0x36 /* Center Y ellipse position */
1195 #define ABS_MT_TOOL_TYPE 0x37 /* Type of touching device */
1196 #define ABS_MT_BLOB_ID 0x38 /* Group a set of packets as a blob */
1197 #define ABS_MT_TRACKING_ID 0x39 /* Unique ID of initiated contact */
1198 #define ABS_MT_PRESSURE 0x3a /* Pressure on contact area */
1199 #define ABS_MT_DISTANCE 0x3b /* Contact hover distance */
1200
1201 #ifdef __KERNEL__
1202 /* Implementation details, userspace should not care about these */
1203 #define ABS_MT_FIRST ABS_MT_TOUCH_MAJOR
1204 #define ABS_MT_LAST ABS_MT_DISTANCE
1205 #endif
1206
1207 #define ABS_MAX 0x3f
1208 #define ABS_CNT (ABS_MAX+1)
1209
1210 /*
1211 * Switch events
1212 */
1213
1214 #define SW_LID 0x00 /* set = lid shut */
1215 #define SW_TABLET_MODE 0x01 /* set = tablet mode */
1216 #define SW_HEADPHONE_INSERT 0x02 /* set = inserted */
1217 #define SW_RFKILL_ALL 0x03 /* rfkill master switch, type "any"
1218 set = radio enabled */
1219 #define SW_RADIO SW_RFKILL_ALL /* deprecated */
1220 #define SW_MICROPHONE_INSERT 0x04 /* set = inserted */
1221 #define SW_DOCK 0x05 /* set = plugged into dock */
1222 #define SW_LINEOUT_INSERT 0x06 /* set = inserted */
1223 #define SW_JACK_PHYSICAL_INSERT 0x07 /* set = mechanical switch set */
1224 #define SW_VIDEOOUT_INSERT 0x08 /* set = inserted */
1225 #define SW_CAMERA_LENS_COVER 0x09 /* set = lens covered */
1226 #define SW_KEYPAD_SLIDE 0x0a /* set = keypad slide out */
1227 #define SW_FRONT_PROXIMITY 0x0b /* set = front proximity sensor active */
1228 #define SW_ROTATE_LOCK 0x0c /* set = rotate locked/disabled */
1229 #define SW_MAX 0x0f
1230 #define SW_CNT (SW_MAX+1)
1231
1232 /*
1233 * Misc events
1234 */
1235
1236 #define MSC_SERIAL 0x00
1237 #define MSC_PULSELED 0x01
1238 #define MSC_GESTURE 0x02
1239 #define MSC_RAW 0x03
1240 #define MSC_SCAN 0x04
1241 #define MSC_MAX 0x07
1242 #define MSC_CNT (MSC_MAX+1)
1243
1244 /*
1245 * LEDs
1246 */
1247
1248 #define LED_NUML 0x00
1249 #define LED_CAPSL 0x01
1250 #define LED_SCROLLL 0x02
1251 #define LED_COMPOSE 0x03
1252 #define LED_KANA 0x04
1253 #define LED_SLEEP 0x05
1254 #define LED_SUSPEND 0x06
1255 #define LED_MUTE 0x07
1256 #define LED_MISC 0x08
1257 #define LED_MAIL 0x09
1258 #define LED_CHARGING 0x0a
1259 #define LED_MAX 0x0f
1260 #define LED_CNT (LED_MAX+1)
1261
1262 /*
1263 * Autorepeat values
1264 */
1265
1266 #define REP_DELAY 0x00
1267 #define REP_PERIOD 0x01
1268 #define REP_MAX 0x01
1269 #define REP_CNT (REP_MAX+1)
1270
1271 /*
1272 * Sounds
1273 */
1274
1275 #define SND_CLICK 0x00
1276 #define SND_BELL 0x01
1277 #define SND_TONE 0x02
1278 #define SND_MAX 0x07
1279 #define SND_CNT (SND_MAX+1)
1280
1281 /*
1282 * IDs.
1283 */
1284
1285 #define ID_BUS 0
1286 #define ID_VENDOR 1
1287 #define ID_PRODUCT 2
1288 #define ID_VERSION 3
1289
1290 #define BUS_PCI 0x01
1291 #define BUS_ISAPNP 0x02
1292 #define BUS_USB 0x03
1293 #define BUS_HIL 0x04
1294 #define BUS_BLUETOOTH 0x05
1295 #define BUS_VIRTUAL 0x06
1296
1297 #define BUS_ISA 0x10
1298 #define BUS_I8042 0x11
1299 #define BUS_XTKBD 0x12
1300 #define BUS_RS232 0x13
1301 #define BUS_GAMEPORT 0x14
1302 #define BUS_PARPORT 0x15
1303 #define BUS_AMIGA 0x16
1304 #define BUS_ADB 0x17
1305 #define BUS_I2C 0x18
1306 #define BUS_HOST 0x19
1307 #define BUS_GSC 0x1A
1308 #define BUS_ATARI 0x1B
1309 #define BUS_SPI 0x1C
1310
1311 /*
1312 * MT_TOOL types
1313 */
1314 #define MT_TOOL_FINGER 0
1315 #define MT_TOOL_PEN 1
1316 #define MT_TOOL_MAX 1
1317
1318 /*
1319 * Values describing the status of a force-feedback effect
1320 */
1321 #define FF_STATUS_STOPPED 0x00
1322 #define FF_STATUS_PLAYING 0x01
1323 #define FF_STATUS_MAX 0x01
1324
1325 /*
1326 * Structures used in ioctls to upload effects to a device
1327 * They are pieces of a bigger structure (called ff_effect)
1328 */
1329
1330 /*
1331 * All duration values are expressed in ms. Values above 32767 ms (0x7fff)
1332 * should not be used and have unspecified results.
1333 */
1334
1335 /**
1336 * struct ff_replay - defines scheduling of the force-feedback effect
1337 * @length: duration of the effect
1338 * @delay: delay before effect should start playing
1339 */
1340 struct ff_replay {
1341 __u16 length;
1342 __u16 delay;
1343 };
1344
1345 /**
1346 * struct ff_trigger - defines what triggers the force-feedback effect
1347 * @button: number of the button triggering the effect
1348 * @interval: controls how soon the effect can be re-triggered
1349 */
1350 struct ff_trigger {
1351 __u16 button;
1352 __u16 interval;
1353 };
1354
1355 /**
1356 * struct ff_envelope - generic force-feedback effect envelope
1357 * @attack_length: duration of the attack (ms)
1358 * @attack_level: level at the beginning of the attack
1359 * @fade_length: duration of fade (ms)
1360 * @fade_level: level at the end of fade
1361 *
1362 * The @attack_level and @fade_level are absolute values; when applying
1363 * envelope force-feedback core will convert to positive/negative
1364 * value based on polarity of the default level of the effect.
1365 * Valid range for the attack and fade levels is 0x0000 - 0x7fff
1366 */
1367 struct ff_envelope {
1368 __u16 attack_length;
1369 __u16 attack_level;
1370 __u16 fade_length;
1371 __u16 fade_level;
1372 };
1373
1374 /**
1375 * struct ff_constant_effect - defines parameters of a constant force-feedback effect
1376 * @level: strength of the effect; may be negative
1377 * @envelope: envelope data
1378 */
1379 struct ff_constant_effect {
1380 __s16 level;
1381 struct ff_envelope envelope;
1382 };
1383
1384 /**
1385 * struct ff_ramp_effect - defines parameters of a ramp force-feedback effect
1386 * @start_level: beginning strength of the effect; may be negative
1387 * @end_level: final strength of the effect; may be negative
1388 * @envelope: envelope data
1389 */
1390 struct ff_ramp_effect {
1391 __s16 start_level;
1392 __s16 end_level;
1393 struct ff_envelope envelope;
1394 };
1395
1396 /**
1397 * struct ff_condition_effect - defines a spring or friction force-feedback effect
1398 * @right_saturation: maximum level when joystick moved all way to the right
1399 * @left_saturation: same for the left side
1400 * @right_coeff: controls how fast the force grows when the joystick moves
1401 * to the right
1402 * @left_coeff: same for the left side
1403 * @deadband: size of the dead zone, where no force is produced
1404 * @center: position of the dead zone
1405 */
1406 struct ff_condition_effect {
1407 __u16 right_saturation;
1408 __u16 left_saturation;
1409
1410 __s16 right_coeff;
1411 __s16 left_coeff;
1412
1413 __u16 deadband;
1414 __s16 center;
1415 };
1416
1417 /**
1418 * struct ff_periodic_effect - defines parameters of a periodic force-feedback effect
1419 * @waveform: kind of the effect (wave)
1420 * @period: period of the wave (ms)
1421 * @magnitude: peak value
1422 * @offset: mean value of the wave (roughly)
1423 * @phase: 'horizontal' shift
1424 * @envelope: envelope data
1425 * @custom_len: number of samples (FF_CUSTOM only)
1426 * @custom_data: buffer of samples (FF_CUSTOM only)
1427 *
1428 * Known waveforms - FF_SQUARE, FF_TRIANGLE, FF_SINE, FF_SAW_UP,
1429 * FF_SAW_DOWN, FF_CUSTOM. The exact syntax FF_CUSTOM is undefined
1430 * for the time being as no driver supports it yet.
1431 *
1432 * Note: the data pointed by custom_data is copied by the driver.
1433 * You can therefore dispose of the memory after the upload/update.
1434 */
1435 struct ff_periodic_effect {
1436 __u16 waveform;
1437 __u16 period;
1438 __s16 magnitude;
1439 __s16 offset;
1440 __u16 phase;
1441
1442 struct ff_envelope envelope;
1443
1444 __u32 custom_len;
1445 __s16 __user *custom_data;
1446 };
1447
1448 /**
1449 * struct ff_rumble_effect - defines parameters of a periodic force-feedback effect
1450 * @strong_magnitude: magnitude of the heavy motor
1451 * @weak_magnitude: magnitude of the light one
1452 *
1453 * Some rumble pads have two motors of different weight. Strong_magnitude
1454 * represents the magnitude of the vibration generated by the heavy one.
1455 */
1456 struct ff_rumble_effect {
1457 __u16 strong_magnitude;
1458 __u16 weak_magnitude;
1459 };
1460
1461 /**
1462 * struct ff_effect - defines force feedback effect
1463 * @type: type of the effect (FF_CONSTANT, FF_PERIODIC, FF_RAMP, FF_SPRING,
1464 * FF_FRICTION, FF_DAMPER, FF_RUMBLE, FF_INERTIA, or FF_CUSTOM)
1465 * @id: an unique id assigned to an effect
1466 * @direction: direction of the effect
1467 * @trigger: trigger conditions (struct ff_trigger)
1468 * @replay: scheduling of the effect (struct ff_replay)
1469 * @u: effect-specific structure (one of ff_constant_effect, ff_ramp_effect,
1470 * ff_periodic_effect, ff_condition_effect, ff_rumble_effect) further
1471 * defining effect parameters
1472 *
1473 * This structure is sent through ioctl from the application to the driver.
1474 * To create a new effect application should set its @id to -1; the kernel
1475 * will return assigned @id which can later be used to update or delete
1476 * this effect.
1477 *
1478 * Direction of the effect is encoded as follows:
1479 * 0 deg -> 0x0000 (down)
1480 * 90 deg -> 0x4000 (left)
1481 * 180 deg -> 0x8000 (up)
1482 * 270 deg -> 0xC000 (right)
1483 */
1484 struct ff_effect {
1485 __u16 type;
1486 __s16 id;
1487 __u16 direction;
1488 struct ff_trigger trigger;
1489 struct ff_replay replay;
1490
1491 union {
1492 struct ff_constant_effect constant;
1493 struct ff_ramp_effect ramp;
1494 struct ff_periodic_effect periodic;
1495 struct ff_condition_effect condition[2]; /* One for each axis */
1496 struct ff_rumble_effect rumble;
1497 } u;
1498 };
1499
1500 /*
1501 * Force feedback effect types
1502 */
1503
1504 #define FF_RUMBLE 0x50
1505 #define FF_PERIODIC 0x51
1506 #define FF_CONSTANT 0x52
1507 #define FF_SPRING 0x53
1508 #define FF_FRICTION 0x54
1509 #define FF_DAMPER 0x55
1510 #define FF_INERTIA 0x56
1511 #define FF_RAMP 0x57
1512
1513 #define FF_EFFECT_MIN FF_RUMBLE
1514 #define FF_EFFECT_MAX FF_RAMP
1515
1516 /*
1517 * Force feedback periodic effect types
1518 */
1519
1520 #define FF_SQUARE 0x58
1521 #define FF_TRIANGLE 0x59
1522 #define FF_SINE 0x5a
1523 #define FF_SAW_UP 0x5b
1524 #define FF_SAW_DOWN 0x5c
1525 #define FF_CUSTOM 0x5d
1526
1527 #define FF_WAVEFORM_MIN FF_SQUARE
1528 #define FF_WAVEFORM_MAX FF_CUSTOM
1529
1530 /*
1531 * Set ff device properties
1532 */
1533
1534 #define FF_GAIN 0x60
1535 #define FF_AUTOCENTER 0x61
1536
1537 #define FF_MAX 0x7f
1538 #define FF_CNT (FF_MAX+1)
1539
1540 #ifdef __KERNEL__
1541
1542 /*
1543 * In-kernel definitions.
1544 */
1545
1546 #include <linux/device.h>
1547 #include <linux/fs.h>
1548 #include <linux/timer.h>
1549 #include <linux/mod_devicetable.h>
1550
1551 /**
1552 * struct input_dev - represents an input device
1553 * @name: name of the device
1554 * @phys: physical path to the device in the system hierarchy
1555 * @uniq: unique identification code for the device (if device has it)
1556 * @id: id of the device (struct input_id)
1557 * @propbit: bitmap of device properties and quirks
1558 * @evbit: bitmap of types of events supported by the device (EV_KEY,
1559 * EV_REL, etc.)
1560 * @keybit: bitmap of keys/buttons this device has
1561 * @relbit: bitmap of relative axes for the device
1562 * @absbit: bitmap of absolute axes for the device
1563 * @mscbit: bitmap of miscellaneous events supported by the device
1564 * @ledbit: bitmap of leds present on the device
1565 * @sndbit: bitmap of sound effects supported by the device
1566 * @ffbit: bitmap of force feedback effects supported by the device
1567 * @swbit: bitmap of switches present on the device
1568 * @hint_events_per_packet: average number of events generated by the
1569 * device in a packet (between EV_SYN/SYN_REPORT events). Used by
1570 * event handlers to estimate size of the buffer needed to hold
1571 * events.
1572 * @keycodemax: size of keycode table
1573 * @keycodesize: size of elements in keycode table
1574 * @keycode: map of scancodes to keycodes for this device
1575 * @getkeycode: optional legacy method to retrieve current keymap.
1576 * @setkeycode: optional method to alter current keymap, used to implement
1577 * sparse keymaps. If not supplied default mechanism will be used.
1578 * The method is being called while holding event_lock and thus must
1579 * not sleep
1580 * @ff: force feedback structure associated with the device if device
1581 * supports force feedback effects
1582 * @repeat_key: stores key code of the last key pressed; used to implement
1583 * software autorepeat
1584 * @timer: timer for software autorepeat
1585 * @rep: current values for autorepeat parameters (delay, rate)
1586 * @mt: pointer to array of struct input_mt_slot holding current values
1587 * of tracked contacts
1588 * @mtsize: number of MT slots the device uses
1589 * @slot: MT slot currently being transmitted
1590 * @trkid: stores MT tracking ID for the current contact
1591 * @absinfo: array of &struct input_absinfo elements holding information
1592 * about absolute axes (current value, min, max, flat, fuzz,
1593 * resolution)
1594 * @key: reflects current state of device's keys/buttons
1595 * @led: reflects current state of device's LEDs
1596 * @snd: reflects current state of sound effects
1597 * @sw: reflects current state of device's switches
1598 * @open: this method is called when the very first user calls
1599 * input_open_device(). The driver must prepare the device
1600 * to start generating events (start polling thread,
1601 * request an IRQ, submit URB, etc.)
1602 * @close: this method is called when the very last user calls
1603 * input_close_device().
1604 * @flush: purges the device. Most commonly used to get rid of force
1605 * feedback effects loaded into the device when disconnecting
1606 * from it
1607 * @event: event handler for events sent _to_ the device, like EV_LED
1608 * or EV_SND. The device is expected to carry out the requested
1609 * action (turn on a LED, play sound, etc.) The call is protected
1610 * by @event_lock and must not sleep
1611 * @grab: input handle that currently has the device grabbed (via
1612 * EVIOCGRAB ioctl). When a handle grabs a device it becomes sole
1613 * recipient for all input events coming from the device
1614 * @event_lock: this spinlock is is taken when input core receives
1615 * and processes a new event for the device (in input_event()).
1616 * Code that accesses and/or modifies parameters of a device
1617 * (such as keymap or absmin, absmax, absfuzz, etc.) after device
1618 * has been registered with input core must take this lock.
1619 * @mutex: serializes calls to open(), close() and flush() methods
1620 * @users: stores number of users (input handlers) that opened this
1621 * device. It is used by input_open_device() and input_close_device()
1622 * to make sure that dev->open() is only called when the first
1623 * user opens device and dev->close() is called when the very
1624 * last user closes the device
1625 * @going_away: marks devices that are in a middle of unregistering and
1626 * causes input_open_device*() fail with -ENODEV.
1627 * @sync: set to %true when there were no new events since last EV_SYN
1628 * @dev: driver model's view of this device
1629 * @h_list: list of input handles associated with the device. When
1630 * accessing the list dev->mutex must be held
1631 * @node: used to place the device onto input_dev_list
1632 */
1633 struct input_dev {
1634 const char *name;
1635 const char *phys;
1636 const char *uniq;
1637 struct input_id id;
1638
1639 unsigned long propbit[BITS_TO_LONGS(INPUT_PROP_CNT)];
1640
1641 unsigned long evbit[BITS_TO_LONGS(EV_CNT)];
1642 unsigned long keybit[BITS_TO_LONGS(KEY_CNT)];
1643 unsigned long relbit[BITS_TO_LONGS(REL_CNT)];
1644 unsigned long absbit[BITS_TO_LONGS(ABS_CNT)];
1645 unsigned long mscbit[BITS_TO_LONGS(MSC_CNT)];
1646 unsigned long ledbit[BITS_TO_LONGS(LED_CNT)];
1647 unsigned long sndbit[BITS_TO_LONGS(SND_CNT)];
1648 unsigned long ffbit[BITS_TO_LONGS(FF_CNT)];
1649 unsigned long swbit[BITS_TO_LONGS(SW_CNT)];
1650
1651 unsigned int hint_events_per_packet;
1652
1653 unsigned int keycodemax;
1654 unsigned int keycodesize;
1655 void *keycode;
1656
1657 int (*setkeycode)(struct input_dev *dev,
1658 const struct input_keymap_entry *ke,
1659 unsigned int *old_keycode);
1660 int (*getkeycode)(struct input_dev *dev,
1661 struct input_keymap_entry *ke);
1662
1663 struct ff_device *ff;
1664
1665 unsigned int repeat_key;
1666 struct timer_list timer;
1667
1668 int rep[REP_CNT];
1669
1670 struct input_mt_slot *mt;
1671 int mtsize;
1672 int slot;
1673 int trkid;
1674
1675 struct input_absinfo *absinfo;
1676
1677 unsigned long key[BITS_TO_LONGS(KEY_CNT)];
1678 unsigned long led[BITS_TO_LONGS(LED_CNT)];
1679 unsigned long snd[BITS_TO_LONGS(SND_CNT)];
1680 unsigned long sw[BITS_TO_LONGS(SW_CNT)];
1681
1682 int (*open)(struct input_dev *dev);
1683 void (*close)(struct input_dev *dev);
1684 int (*flush)(struct input_dev *dev, struct file *file);
1685 int (*event)(struct input_dev *dev, unsigned int type, unsigned int code, int value);
1686
1687 struct input_handle __rcu *grab;
1688
1689 spinlock_t event_lock;
1690 struct mutex mutex;
1691
1692 unsigned int users;
1693 bool going_away;
1694
1695 bool sync;
1696
1697 struct device dev;
1698
1699 struct list_head h_list;
1700 struct list_head node;
1701 };
1702 #define to_input_dev(d) container_of(d, struct input_dev, dev)
1703
1704 /*
1705 * Verify that we are in sync with input_device_id mod_devicetable.h #defines
1706 */
1707
1708 #if EV_MAX != INPUT_DEVICE_ID_EV_MAX
1709 #error "EV_MAX and INPUT_DEVICE_ID_EV_MAX do not match"
1710 #endif
1711
1712 #if KEY_MIN_INTERESTING != INPUT_DEVICE_ID_KEY_MIN_INTERESTING
1713 #error "KEY_MIN_INTERESTING and INPUT_DEVICE_ID_KEY_MIN_INTERESTING do not match"
1714 #endif
1715
1716 #if KEY_MAX != INPUT_DEVICE_ID_KEY_MAX
1717 #error "KEY_MAX and INPUT_DEVICE_ID_KEY_MAX do not match"
1718 #endif
1719
1720 #if REL_MAX != INPUT_DEVICE_ID_REL_MAX
1721 #error "REL_MAX and INPUT_DEVICE_ID_REL_MAX do not match"
1722 #endif
1723
1724 #if ABS_MAX != INPUT_DEVICE_ID_ABS_MAX
1725 #error "ABS_MAX and INPUT_DEVICE_ID_ABS_MAX do not match"
1726 #endif
1727
1728 #if MSC_MAX != INPUT_DEVICE_ID_MSC_MAX
1729 #error "MSC_MAX and INPUT_DEVICE_ID_MSC_MAX do not match"
1730 #endif
1731
1732 #if LED_MAX != INPUT_DEVICE_ID_LED_MAX
1733 #error "LED_MAX and INPUT_DEVICE_ID_LED_MAX do not match"
1734 #endif
1735
1736 #if SND_MAX != INPUT_DEVICE_ID_SND_MAX
1737 #error "SND_MAX and INPUT_DEVICE_ID_SND_MAX do not match"
1738 #endif
1739
1740 #if FF_MAX != INPUT_DEVICE_ID_FF_MAX
1741 #error "FF_MAX and INPUT_DEVICE_ID_FF_MAX do not match"
1742 #endif
1743
1744 #if SW_MAX != INPUT_DEVICE_ID_SW_MAX
1745 #error "SW_MAX and INPUT_DEVICE_ID_SW_MAX do not match"
1746 #endif
1747
1748 #define INPUT_DEVICE_ID_MATCH_DEVICE \
1749 (INPUT_DEVICE_ID_MATCH_BUS | INPUT_DEVICE_ID_MATCH_VENDOR | INPUT_DEVICE_ID_MATCH_PRODUCT)
1750 #define INPUT_DEVICE_ID_MATCH_DEVICE_AND_VERSION \
1751 (INPUT_DEVICE_ID_MATCH_DEVICE | INPUT_DEVICE_ID_MATCH_VERSION)
1752
1753 struct input_handle;
1754
1755 /**
1756 * struct input_handler - implements one of interfaces for input devices
1757 * @private: driver-specific data
1758 * @event: event handler. This method is being called by input core with
1759 * interrupts disabled and dev->event_lock spinlock held and so
1760 * it may not sleep
1761 * @filter: similar to @event; separates normal event handlers from
1762 * "filters".
1763 * @match: called after comparing device's id with handler's id_table
1764 * to perform fine-grained matching between device and handler
1765 * @connect: called when attaching a handler to an input device
1766 * @disconnect: disconnects a handler from input device
1767 * @start: starts handler for given handle. This function is called by
1768 * input core right after connect() method and also when a process
1769 * that "grabbed" a device releases it
1770 * @fops: file operations this driver implements
1771 * @minor: beginning of range of 32 minors for devices this driver
1772 * can provide
1773 * @name: name of the handler, to be shown in /proc/bus/input/handlers
1774 * @id_table: pointer to a table of input_device_ids this driver can
1775 * handle
1776 * @h_list: list of input handles associated with the handler
1777 * @node: for placing the driver onto input_handler_list
1778 *
1779 * Input handlers attach to input devices and create input handles. There
1780 * are likely several handlers attached to any given input device at the
1781 * same time. All of them will get their copy of input event generated by
1782 * the device.
1783 *
1784 * The very same structure is used to implement input filters. Input core
1785 * allows filters to run first and will not pass event to regular handlers
1786 * if any of the filters indicate that the event should be filtered (by
1787 * returning %true from their filter() method).
1788 *
1789 * Note that input core serializes calls to connect() and disconnect()
1790 * methods.
1791 */
1792 struct input_handler {
1793
1794 void *private;
1795
1796 void (*event)(struct input_handle *handle, unsigned int type, unsigned int code, int value);
1797 bool (*filter)(struct input_handle *handle, unsigned int type, unsigned int code, int value);
1798 bool (*match)(struct input_handler *handler, struct input_dev *dev);
1799 int (*connect)(struct input_handler *handler, struct input_dev *dev, const struct input_device_id *id);
1800 void (*disconnect)(struct input_handle *handle);
1801 void (*start)(struct input_handle *handle);
1802
1803 const struct file_operations *fops;
1804 int minor;
1805 const char *name;
1806
1807 const struct input_device_id *id_table;
1808
1809 struct list_head h_list;
1810 struct list_head node;
1811 };
1812
1813 /**
1814 * struct input_handle - links input device with an input handler
1815 * @private: handler-specific data
1816 * @open: counter showing whether the handle is 'open', i.e. should deliver
1817 * events from its device
1818 * @name: name given to the handle by handler that created it
1819 * @dev: input device the handle is attached to
1820 * @handler: handler that works with the device through this handle
1821 * @d_node: used to put the handle on device's list of attached handles
1822 * @h_node: used to put the handle on handler's list of handles from which
1823 * it gets events
1824 */
1825 struct input_handle {
1826
1827 void *private;
1828
1829 int open;
1830 const char *name;
1831
1832 struct input_dev *dev;
1833 struct input_handler *handler;
1834
1835 struct list_head d_node;
1836 struct list_head h_node;
1837 };
1838
1839 struct input_dev *input_allocate_device(void);
1840 void input_free_device(struct input_dev *dev);
1841
1842 static inline struct input_dev *input_get_device(struct input_dev *dev)
1843 {
1844 return dev ? to_input_dev(get_device(&dev->dev)) : NULL;
1845 }
1846
1847 static inline void input_put_device(struct input_dev *dev)
1848 {
1849 if (dev)
1850 put_device(&dev->dev);
1851 }
1852
1853 static inline void *input_get_drvdata(struct input_dev *dev)
1854 {
1855 return dev_get_drvdata(&dev->dev);
1856 }
1857
1858 static inline void input_set_drvdata(struct input_dev *dev, void *data)
1859 {
1860 dev_set_drvdata(&dev->dev, data);
1861 }
1862
1863 int __must_check input_register_device(struct input_dev *);
1864 void input_unregister_device(struct input_dev *);
1865
1866 void input_reset_device(struct input_dev *);
1867
1868 int __must_check input_register_handler(struct input_handler *);
1869 void input_unregister_handler(struct input_handler *);
1870
1871 int input_handler_for_each_handle(struct input_handler *, void *data,
1872 int (*fn)(struct input_handle *, void *));
1873
1874 int input_register_handle(struct input_handle *);
1875 void input_unregister_handle(struct input_handle *);
1876
1877 int input_grab_device(struct input_handle *);
1878 void input_release_device(struct input_handle *);
1879
1880 int input_open_device(struct input_handle *);
1881 void input_close_device(struct input_handle *);
1882
1883 int input_flush_device(struct input_handle *handle, struct file *file);
1884
1885 void input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value);
1886 void input_inject_event(struct input_handle *handle, unsigned int type, unsigned int code, int value);
1887
1888 static inline void input_report_key(struct input_dev *dev, unsigned int code, int value)
1889 {
1890 input_event(dev, EV_KEY, code, !!value);
1891 }
1892
1893 static inline void input_report_rel(struct input_dev *dev, unsigned int code, int value)
1894 {
1895 input_event(dev, EV_REL, code, value);
1896 }
1897
1898 static inline void input_report_abs(struct input_dev *dev, unsigned int code, int value)
1899 {
1900 input_event(dev, EV_ABS, code, value);
1901 }
1902
1903 static inline void input_report_ff_status(struct input_dev *dev, unsigned int code, int value)
1904 {
1905 input_event(dev, EV_FF_STATUS, code, value);
1906 }
1907
1908 static inline void input_report_switch(struct input_dev *dev, unsigned int code, int value)
1909 {
1910 input_event(dev, EV_SW, code, !!value);
1911 }
1912
1913 static inline void input_sync(struct input_dev *dev)
1914 {
1915 input_event(dev, EV_SYN, SYN_REPORT, 0);
1916 }
1917
1918 static inline void input_mt_sync(struct input_dev *dev)
1919 {
1920 input_event(dev, EV_SYN, SYN_MT_REPORT, 0);
1921 }
1922
1923 void input_set_capability(struct input_dev *dev, unsigned int type, unsigned int code);
1924
1925 /**
1926 * input_set_events_per_packet - tell handlers about the driver event rate
1927 * @dev: the input device used by the driver
1928 * @n_events: the average number of events between calls to input_sync()
1929 *
1930 * If the event rate sent from a device is unusually large, use this
1931 * function to set the expected event rate. This will allow handlers
1932 * to set up an appropriate buffer size for the event stream, in order
1933 * to minimize information loss.
1934 */
1935 static inline void input_set_events_per_packet(struct input_dev *dev, int n_events)
1936 {
1937 dev->hint_events_per_packet = n_events;
1938 }
1939
1940 void input_alloc_absinfo(struct input_dev *dev);
1941 void input_set_abs_params(struct input_dev *dev, unsigned int axis,
1942 int min, int max, int fuzz, int flat);
1943
1944 #define INPUT_GENERATE_ABS_ACCESSORS(_suffix, _item) \
1945 static inline int input_abs_get_##_suffix(struct input_dev *dev, \
1946 unsigned int axis) \
1947 { \
1948 return dev->absinfo ? dev->absinfo[axis]._item : 0; \
1949 } \
1950 \
1951 static inline void input_abs_set_##_suffix(struct input_dev *dev, \
1952 unsigned int axis, int val) \
1953 { \
1954 input_alloc_absinfo(dev); \
1955 if (dev->absinfo) \
1956 dev->absinfo[axis]._item = val; \
1957 }
1958
1959 INPUT_GENERATE_ABS_ACCESSORS(val, value)
1960 INPUT_GENERATE_ABS_ACCESSORS(min, minimum)
1961 INPUT_GENERATE_ABS_ACCESSORS(max, maximum)
1962 INPUT_GENERATE_ABS_ACCESSORS(fuzz, fuzz)
1963 INPUT_GENERATE_ABS_ACCESSORS(flat, flat)
1964 INPUT_GENERATE_ABS_ACCESSORS(res, resolution)
1965
1966 int input_scancode_to_scalar(const struct input_keymap_entry *ke,
1967 unsigned int *scancode);
1968
1969 int input_get_keycode(struct input_dev *dev, struct input_keymap_entry *ke);
1970 int input_set_keycode(struct input_dev *dev,
1971 const struct input_keymap_entry *ke);
1972
1973 extern struct class input_class;
1974
1975 /**
1976 * struct ff_device - force-feedback part of an input device
1977 * @upload: Called to upload an new effect into device
1978 * @erase: Called to erase an effect from device
1979 * @playback: Called to request device to start playing specified effect
1980 * @set_gain: Called to set specified gain
1981 * @set_autocenter: Called to auto-center device
1982 * @destroy: called by input core when parent input device is being
1983 * destroyed
1984 * @private: driver-specific data, will be freed automatically
1985 * @ffbit: bitmap of force feedback capabilities truly supported by
1986 * device (not emulated like ones in input_dev->ffbit)
1987 * @mutex: mutex for serializing access to the device
1988 * @max_effects: maximum number of effects supported by device
1989 * @effects: pointer to an array of effects currently loaded into device
1990 * @effect_owners: array of effect owners; when file handle owning
1991 * an effect gets closed the effect is automatically erased
1992 *
1993 * Every force-feedback device must implement upload() and playback()
1994 * methods; erase() is optional. set_gain() and set_autocenter() need
1995 * only be implemented if driver sets up FF_GAIN and FF_AUTOCENTER
1996 * bits.
1997 *
1998 * Note that playback(), set_gain() and set_autocenter() are called with
1999 * dev->event_lock spinlock held and interrupts off and thus may not
2000 * sleep.
2001 */
2002 struct ff_device {
2003 int (*upload)(struct input_dev *dev, struct ff_effect *effect,
2004 struct ff_effect *old);
2005 int (*erase)(struct input_dev *dev, int effect_id);
2006
2007 int (*playback)(struct input_dev *dev, int effect_id, int value);
2008 void (*set_gain)(struct input_dev *dev, u16 gain);
2009 void (*set_autocenter)(struct input_dev *dev, u16 magnitude);
2010
2011 void (*destroy)(struct ff_device *);
2012
2013 void *private;
2014
2015 unsigned long ffbit[BITS_TO_LONGS(FF_CNT)];
2016
2017 struct mutex mutex;
2018
2019 int max_effects;
2020 struct ff_effect *effects;
2021 struct file *effect_owners[];
2022 };
2023
2024 int input_ff_create(struct input_dev *dev, int max_effects);
2025 void input_ff_destroy(struct input_dev *dev);
2026
2027 int input_ff_event(struct input_dev *dev, unsigned int type, unsigned int code, int value);
2028
2029 int input_ff_upload(struct input_dev *dev, struct ff_effect *effect, struct file *file);
2030 int input_ff_erase(struct input_dev *dev, int effect_id, struct file *file);
2031
2032 int input_ff_create_memless(struct input_dev *dev, void *data,
2033 int (*play_effect)(struct input_dev *, void *, struct ff_effect *));
2034
2035 #endif
2036 #endif
2037
2038 #define KEY_BACK 158 /* AC Back */
2039
2040 KEY CODE
2041
2042 这里的值跟上面的XX.kl文件对应
2043
2044 fraemworks/base/core/java/android/view/KeyEvent.java
2045
2046 /*
2047 * Copyright (C) 2006 The Android Open Source Project
2048 *
2049 * Licensed under the Apache License, Version 2.0 (the "License");
2050 * you may not use this file except in compliance with the License.
2051 * You may obtain a copy of the License at
2052 *
2053 * http://www.apache.org/licenses/LICENSE-2.0
2054 *
2055 * Unless required by applicable law or agreed to in writing, software
2056 * distributed under the License is distributed on an "AS IS" BASIS,
2057 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2058 * See the License for the specific language governing permissions and
2059 * limitations under the License.
2060 */
2061
2062 package android.view;
2063
2064 import android.os.Parcel;
2065 import android.os.Parcelable;
2066 import android.text.method.MetaKeyKeyListener;
2067 import android.util.Log;
2068 import android.util.Slog;
2069 import android.util.SparseArray;
2070 import android.util.SparseIntArray;
2071 import android.view.KeyCharacterMap;
2072 import android.view.KeyCharacterMap.KeyData;
2073
2074 /**
2075 * Object used to report key and button events.
2076 * <p>
2077 * Each key press is described by a sequence of key events. A key press
2078 * starts with a key event with {@link #ACTION_DOWN}. If the key is held
2079 * sufficiently long that it repeats, then the initial down is followed
2080 * additional key events with {@link #ACTION_DOWN} and a non-zero value for
2081 * {@link #getRepeatCount()}. The last key event is a {@link #ACTION_UP}
2082 * for the key up. If the key press is canceled, the key up event will have the
2083 * {@link #FLAG_CANCELED} flag set.
2084 * </p><p>
2085 * Key events are generally accompanied by a key code ({@link #getKeyCode()}),
2086 * scan code ({@link #getScanCode()}) and meta state ({@link #getMetaState()}).
2087 * Key code constants are defined in this class. Scan code constants are raw
2088 * device-specific codes obtained from the OS and so are not generally meaningful
2089 * to applications unless interpreted using the {@link KeyCharacterMap}.
2090 * Meta states describe the pressed state of key modifiers
2091 * such as {@link #META_SHIFT_ON} or {@link #META_ALT_ON}.
2092 * </p><p>
2093 * Key codes typically correspond one-to-one with individual keys on an input device.
2094 * Many keys and key combinations serve quite different functions on different
2095 * input devices so care must be taken when interpreting them. Always use the
2096 * {@link KeyCharacterMap} associated with the input device when mapping keys
2097 * to characters. Be aware that there may be multiple key input devices active
2098 * at the same time and each will have its own key character map.
2099 * </p><p>
2100 * As soft input methods can use multiple and inventive ways of inputting text,
2101 * there is no guarantee that any key press on a soft keyboard will generate a key
2102 * event: this is left to the IME's discretion, and in fact sending such events is
2103 * discouraged. You should never rely on receiving KeyEvents for any key on a soft
2104 * input method. In particular, the default software keyboard will never send any
2105 * key event to any application targetting Jelly Bean or later, and will only send
2106 * events for some presses of the delete and return keys to applications targetting
2107 * Ice Cream Sandwich or earlier. Be aware that other software input methods may
2108 * never send key events regardless of the version. Consider using editor actions
2109 * like {@link android.view.inputmethod.EditorInfo#IME_ACTION_DONE} if you need
2110 * specific interaction with the software keyboard, as it gives more visibility to
2111 * the user as to how your application will react to key presses.
2112 * </p><p>
2113 * When interacting with an IME, the framework may deliver key events
2114 * with the special action {@link #ACTION_MULTIPLE} that either specifies
2115 * that single repeated key code or a sequence of characters to insert.
2116 * </p><p>
2117 * In general, the framework cannot guarantee that the key events it delivers
2118 * to a view always constitute complete key sequences since some events may be dropped
2119 * or modified by containing views before they are delivered. The view implementation
2120 * should be prepared to handle {@link #FLAG_CANCELED} and should tolerate anomalous
2121 * situations such as receiving a new {@link #ACTION_DOWN} without first having
2122 * received an {@link #ACTION_UP} for the prior key press.
2123 * </p><p>
2124 * Refer to {@link InputDevice} for more information about how different kinds of
2125 * input devices and sources represent keys and buttons.
2126 * </p>
2127 */
2128 public class KeyEvent extends InputEvent implements Parcelable {
2129 /** Key code constant: Unknown key code. */
2130 public static final int KEYCODE_UNKNOWN = 0;
2131 /** Key code constant: Soft Left key.
2132 * Usually situated below the display on phones and used as a multi-function
2133 * feature key for selecting a software defined function shown on the bottom left
2134 * of the display. */
2135 public static final int KEYCODE_SOFT_LEFT = 1;
2136 /** Key code constant: Soft Right key.
2137 * Usually situated below the display on phones and used as a multi-function
2138 * feature key for selecting a software defined function shown on the bottom right
2139 * of the display. */
2140 public static final int KEYCODE_SOFT_RIGHT = 2;
2141 /** Key code constant: Home key.
2142 * This key is handled by the framework and is never delivered to applications. */
2143 public static final int KEYCODE_HOME = 3;
2144 /** Key code constant: Back key. */
2145 public static final int KEYCODE_BACK = 4;
2146 /** Key code constant: Call key. */
2147 public static final int KEYCODE_CALL = 5;
2148 /** Key code constant: End Call key. */
2149 public static final int KEYCODE_ENDCALL = 6;
2150 /** Key code constant: '0' key. */
2151 public static final int KEYCODE_0 = 7;
2152 /** Key code constant: '1' key. */
2153 public static final int KEYCODE_1 = 8;
2154 /** Key code constant: '2' key. */
2155 public static final int KEYCODE_2 = 9;
2156 /** Key code constant: '3' key. */
2157 public static final int KEYCODE_3 = 10;
2158 /** Key code constant: '4' key. */
2159 public static final int KEYCODE_4 = 11;
2160 /** Key code constant: '5' key. */
2161 public static final int KEYCODE_5 = 12;
2162 /** Key code constant: '6' key. */
2163 public static final int KEYCODE_6 = 13;
2164 /** Key code constant: '7' key. */
2165 public static final int KEYCODE_7 = 14;
2166 /** Key code constant: '8' key. */
2167 public static final int KEYCODE_8 = 15;
2168 /** Key code constant: '9' key. */
2169 public static final int KEYCODE_9 = 16;
2170 /** Key code constant: '*' key. */
2171 public static final int KEYCODE_STAR = 17;
2172 /** Key code constant: '#' key. */
2173 public static final int KEYCODE_POUND = 18;
2174 /** Key code constant: Directional Pad Up key.
2175 * May also be synthesized from trackball motions. */
2176 public static final int KEYCODE_DPAD_UP = 19;
2177 /** Key code constant: Directional Pad Down key.
2178 * May also be synthesized from trackball motions. */
2179 public static final int KEYCODE_DPAD_DOWN = 20;
2180 /** Key code constant: Directional Pad Left key.
2181 * May also be synthesized from trackball motions. */
2182 public static final int KEYCODE_DPAD_LEFT = 21;
2183 /** Key code constant: Directional Pad Right key.
2184 * May also be synthesized from trackball motions. */
2185 public static final int KEYCODE_DPAD_RIGHT = 22;
2186 /** Key code constant: Directional Pad Center key.
2187 * May also be synthesized from trackball motions. */
2188 public static final int KEYCODE_DPAD_CENTER = 23;
2189 /** Key code constant: Volume Up key.
2190 * Adjusts the speaker volume up. */
2191 public static final int KEYCODE_VOLUME_UP = 24;
2192 /** Key code constant: Volume Down key.
2193 * Adjusts the speaker volume down. */
2194 public static final int KEYCODE_VOLUME_DOWN = 25;
2195 /** Key code constant: Power key. */
2196 public static final int KEYCODE_POWER = 26;
2197 /** Key code constant: Camera key.
2198 * Used to launch a camera application or take pictures. */
2199 public static final int KEYCODE_CAMERA = 27;
2200 /** Key code constant: Clear key. */
2201 public static final int KEYCODE_CLEAR = 28;
2202 /** Key code constant: 'A' key. */
2203 public static final int KEYCODE_A = 29;
2204 /** Key code constant: 'B' key. */
2205 public static final int KEYCODE_B = 30;
2206 /** Key code constant: 'C' key. */
2207 public static final int KEYCODE_C = 31;
2208 /** Key code constant: 'D' key. */
2209 public static final int KEYCODE_D = 32;
2210 /** Key code constant: 'E' key. */
2211 public static final int KEYCODE_E = 33;
2212 /** Key code constant: 'F' key. */
2213 public static final int KEYCODE_F = 34;
2214 /** Key code constant: 'G' key. */
2215 public static final int KEYCODE_G = 35;
2216 /** Key code constant: 'H' key. */
2217 public static final int KEYCODE_H = 36;
2218 /** Key code constant: 'I' key. */
2219 public static final int KEYCODE_I = 37;
2220 /** Key code constant: 'J' key. */
2221 public static final int KEYCODE_J = 38;
2222 /** Key code constant: 'K' key. */
2223 public static final int KEYCODE_K = 39;
2224 /** Key code constant: 'L' key. */
2225 public static final int KEYCODE_L = 40;
2226 /** Key code constant: 'M' key. */
2227 public static final int KEYCODE_M = 41;
2228 /** Key code constant: 'N' key. */
2229 public static final int KEYCODE_N = 42;
2230 /** Key code constant: 'O' key. */
2231 public static final int KEYCODE_O = 43;
2232 /** Key code constant: 'P' key. */
2233 public static final int KEYCODE_P = 44;
2234 /** Key code constant: 'Q' key. */
2235 public static final int KEYCODE_Q = 45;
2236 /** Key code constant: 'R' key. */
2237 public static final int KEYCODE_R = 46;
2238 /** Key code constant: 'S' key. */
2239 public static final int KEYCODE_S = 47;
2240 /** Key code constant: 'T' key. */
2241 public static final int KEYCODE_T = 48;
2242 /** Key code constant: 'U' key. */
2243 public static final int KEYCODE_U = 49;
2244 /** Key code constant: 'V' key. */
2245 public static final int KEYCODE_V = 50;
2246 /** Key code constant: 'W' key. */
2247 public static final int KEYCODE_W = 51;
2248 /** Key code constant: 'X' key. */
2249 public static final int KEYCODE_X = 52;
2250 /** Key code constant: 'Y' key. */
2251 public static final int KEYCODE_Y = 53;
2252 /** Key code constant: 'Z' key. */
2253 public static final int KEYCODE_Z = 54;
2254 /** Key code constant: ',' key. */
2255 public static final int KEYCODE_COMMA = 55;
2256 /** Key code constant: '.' key. */
2257 public static final int KEYCODE_PERIOD = 56;
2258 /** Key code constant: Left Alt modifier key. */
2259 public static final int KEYCODE_ALT_LEFT = 57;
2260 /** Key code constant: Right Alt modifier key. */
2261 public static final int KEYCODE_ALT_RIGHT = 58;
2262 /** Key code constant: Left Shift modifier key. */
2263 public static final int KEYCODE_SHIFT_LEFT = 59;
2264 /** Key code constant: Right Shift modifier key. */
2265 public static final int KEYCODE_SHIFT_RIGHT = 60;
2266 /** Key code constant: Tab key. */
2267 public static final int KEYCODE_TAB = 61;
2268 /** Key code constant: Space key. */
2269 public static final int KEYCODE_SPACE = 62;
2270 /** Key code constant: Symbol modifier key.
2271 * Used to enter alternate symbols. */
2272 public static final int KEYCODE_SYM = 63;
2273 /** Key code constant: Explorer special function key.
2274 * Used to launch a browser application. */
2275 public static final int KEYCODE_EXPLORER = 64;
2276 /** Key code constant: Envelope special function key.
2277 * Used to launch a mail application. */
2278 public static final int KEYCODE_ENVELOPE = 65;
2279 /** Key code constant: Enter key. */
2280 public static final int KEYCODE_ENTER = 66;
2281 /** Key code constant: Backspace key.
2282 * Deletes characters before the insertion point, unlike {@link #KEYCODE_FORWARD_DEL}. */
2283 public static final int KEYCODE_DEL = 67;
2284 /** Key code constant: '`' (backtick) key. */
2285 public static final int KEYCODE_GRAVE = 68;
2286 /** Key code constant: '-'. */
2287 public static final int KEYCODE_MINUS = 69;
2288 /** Key code constant: '=' key. */
2289 public static final int KEYCODE_EQUALS = 70;
2290 /** Key code constant: '[' key. */
2291 public static final int KEYCODE_LEFT_BRACKET = 71;
2292 /** Key code constant: ']' key. */
2293 public static final int KEYCODE_RIGHT_BRACKET = 72;
2294 /** Key code constant: '\' key. */
2295 public static final int KEYCODE_BACKSLASH = 73;
2296 /** Key code constant: ';' key. */
2297 public static final int KEYCODE_SEMICOLON = 74;
2298 /** Key code constant: ''' (apostrophe) key. */
2299 public static final int KEYCODE_APOSTROPHE = 75;
2300 /** Key code constant: '/' key. */
2301 public static final int KEYCODE_SLASH = 76;
2302 /** Key code constant: '@' key. */
2303 public static final int KEYCODE_AT = 77;
2304 /** Key code constant: Number modifier key.
2305 * Used to enter numeric symbols.
2306 * This key is not Num Lock; it is more like {@link #KEYCODE_ALT_LEFT} and is
2307 * interpreted as an ALT key by {@link android.text.method.MetaKeyKeyListener}. */
2308 public static final int KEYCODE_NUM = 78;
2309 /** Key code constant: Headset Hook key.
2310 * Used to hang up calls and stop media. */
2311 public static final int KEYCODE_HEADSETHOOK = 79;
2312 /** Key code constant: Camera Focus key.
2313 * Used to focus the camera. */
2314 public static final int KEYCODE_FOCUS = 80; // *Camera* focus
2315 /** Key code constant: '+' key. */
2316 public static final int KEYCODE_PLUS = 81;
2317 /** Key code constant: Menu key. */
2318 public static final int KEYCODE_MENU = 82;
2319 /** Key code constant: Notification key. */
2320 public static final int KEYCODE_NOTIFICATION = 83;
2321 /** Key code constant: Search key. */
2322 public static final int KEYCODE_SEARCH = 84;
2323 /** Key code constant: Play/Pause media key. */
2324 public static final int KEYCODE_MEDIA_PLAY_PAUSE= 85;
2325 /** Key code constant: Stop media key. */
2326 public static final int KEYCODE_MEDIA_STOP = 86;
2327 /** Key code constant: Play Next media key. */
2328 public static final int KEYCODE_MEDIA_NEXT = 87;
2329 /** Key code constant: Play Previous media key. */
2330 public static final int KEYCODE_MEDIA_PREVIOUS = 88;
2331 /** Key code constant: Rewind media key. */
2332 public static final int KEYCODE_MEDIA_REWIND = 89;
2333 /** Key code constant: Fast Forward media key. */
2334 public static final int KEYCODE_MEDIA_FAST_FORWARD = 90;
2335 /** Key code constant: Mute key.
2336 * Mutes the microphone, unlike {@link #KEYCODE_VOLUME_MUTE}. */
2337 public static final int KEYCODE_MUTE = 91;
2338 /** Key code constant: Page Up key. */
2339 public static final int KEYCODE_PAGE_UP = 92;
2340 /** Key code constant: Page Down key. */
2341 public static final int KEYCODE_PAGE_DOWN = 93;
2342 /** Key code constant: Picture Symbols modifier key.
2343 * Used to switch symbol sets (Emoji, Kao-moji). */
2344 public static final int KEYCODE_PICTSYMBOLS = 94; // switch symbol-sets (Emoji,Kao-moji)
2345 /** Key code constant: Switch Charset modifier key.
2346 * Used to switch character sets (Kanji, Katakana). */
2347 public static final int KEYCODE_SWITCH_CHARSET = 95; // switch char-sets (Kanji,Katakana)
2348 /** Key code constant: A Button key.
2349 * On a game controller, the A button should be either the button labeled A
2350 * or the first button on the upper row of controller buttons. */
2351 public static final int KEYCODE_BUTTON_A = 96;
2352 /** Key code constant: B Button key.
2353 * On a game controller, the B button should be either the button labeled B
2354 * or the second button on the upper row of controller buttons. */
2355 public static final int KEYCODE_BUTTON_B = 97;
2356 /** Key code constant: C Button key.
2357 * On a game controller, the C button should be either the button labeled C
2358 * or the third button on the upper row of controller buttons. */
2359 public static final int KEYCODE_BUTTON_C = 98;
2360 /** Key code constant: X Button key.
2361 * On a game controller, the X button should be either the button labeled X
2362 * or the first button on the lower row of controller buttons. */
2363 public static final int KEYCODE_BUTTON_X = 99;
2364 /** Key code constant: Y Button key.
2365 * On a game controller, the Y button should be either the button labeled Y
2366 * or the second button on the lower row of controller buttons. */
2367 public static final int KEYCODE_BUTTON_Y = 100;
2368 /** Key code constant: Z Button key.
2369 * On a game controller, the Z button should be either the button labeled Z
2370 * or the third button on the lower row of controller buttons. */
2371 public static final int KEYCODE_BUTTON_Z = 101;
2372 /** Key code constant: L1 Button key.
2373 * On a game controller, the L1 button should be either the button labeled L1 (or L)
2374 * or the top left trigger button. */
2375 public static final int KEYCODE_BUTTON_L1 = 102;
2376 /** Key code constant: R1 Button key.
2377 * On a game controller, the R1 button should be either the button labeled R1 (or R)
2378 * or the top right trigger button. */
2379 public static final int KEYCODE_BUTTON_R1 = 103;
2380 /** Key code constant: L2 Button key.
2381 * On a game controller, the L2 button should be either the button labeled L2
2382 * or the bottom left trigger button. */
2383 public static final int KEYCODE_BUTTON_L2 = 104;
2384 /** Key code constant: R2 Button key.
2385 * On a game controller, the R2 button should be either the button labeled R2
2386 * or the bottom right trigger button. */
2387 public static final int KEYCODE_BUTTON_R2 = 105;
2388 /** Key code constant: Left Thumb Button key.
2389 * On a game controller, the left thumb button indicates that the left (or only)
2390 * joystick is pressed. */
2391 public static final int KEYCODE_BUTTON_THUMBL = 106;
2392 /** Key code constant: Right Thumb Button key.
2393 * On a game controller, the right thumb button indicates that the right
2394 * joystick is pressed. */
2395 public static final int KEYCODE_BUTTON_THUMBR = 107;
2396 /** Key code constant: Start Button key.
2397 * On a game controller, the button labeled Start. */
2398 public static final int KEYCODE_BUTTON_START = 108;
2399 /** Key code constant: Select Button key.
2400 * On a game controller, the button labeled Select. */
2401 public static final int KEYCODE_BUTTON_SELECT = 109;
2402 /** Key code constant: Mode Button key.
2403 * On a game controller, the button labeled Mode. */
2404 public static final int KEYCODE_BUTTON_MODE = 110;
2405 /** Key code constant: Escape key. */
2406 public static final int KEYCODE_ESCAPE = 111;
2407 /** Key code constant: Forward Delete key.
2408 * Deletes characters ahead of the insertion point, unlike {@link #KEYCODE_DEL}. */
2409 public static final int KEYCODE_FORWARD_DEL = 112;
2410 /** Key code constant: Left Control modifier key. */
2411 public static final int KEYCODE_CTRL_LEFT = 113;
2412 /** Key code constant: Right Control modifier key. */
2413 public static final int KEYCODE_CTRL_RIGHT = 114;
2414 /** Key code constant: Caps Lock key. */
2415 public static final int KEYCODE_CAPS_LOCK = 115;
2416 /** Key code constant: Scroll Lock key. */
2417 public static final int KEYCODE_SCROLL_LOCK = 116;
2418 /** Key code constant: Left Meta modifier key. */
2419 public static final int KEYCODE_META_LEFT = 117;
2420 /** Key code constant: Right Meta modifier key. */
2421 public static final int KEYCODE_META_RIGHT = 118;
2422 /** Key code constant: Function modifier key. */
2423 public static final int KEYCODE_FUNCTION = 119;
2424 /** Key code constant: System Request / Print Screen key. */
2425 public static final int KEYCODE_SYSRQ = 120;
2426 /** Key code constant: Break / Pause key. */
2427 public static final int KEYCODE_BREAK = 121;
2428 /** Key code constant: Home Movement key.
2429 * Used for scrolling or moving the cursor around to the start of a line
2430 * or to the top of a list. */
2431 public static final int KEYCODE_MOVE_HOME = 122;
2432 /** Key code constant: End Movement key.
2433 * Used for scrolling or moving the cursor around to the end of a line
2434 * or to the bottom of a list. */
2435 public static final int KEYCODE_MOVE_END = 123;
2436 /** Key code constant: Insert key.
2437 * Toggles insert / overwrite edit mode. */
2438 public static final int KEYCODE_INSERT = 124;
2439 /** Key code constant: Forward key.
2440 * Navigates forward in the history stack. Complement of {@link #KEYCODE_BACK}. */
2441 public static final int KEYCODE_FORWARD = 125;
2442 /** Key code constant: Play media key. */
2443 public static final int KEYCODE_MEDIA_PLAY = 126;
2444 /** Key code constant: Pause media key. */
2445 public static final int KEYCODE_MEDIA_PAUSE = 127;
2446 /** Key code constant: Close media key.
2447 * May be used to close a CD tray, for example. */
2448 public static final int KEYCODE_MEDIA_CLOSE = 128;
2449 /** Key code constant: Eject media key.
2450 * May be used to eject a CD tray, for example. */
2451 public static final int KEYCODE_MEDIA_EJECT = 129;
2452 /** Key code constant: Record media key. */
2453 public static final int KEYCODE_MEDIA_RECORD = 130;
2454 /** Key code constant: F1 key. */
2455 public static final int KEYCODE_F1 = 131;
2456 /** Key code constant: F2 key. */
2457 public static final int KEYCODE_F2 = 132;
2458 /** Key code constant: F3 key. */
2459 public static final int KEYCODE_F3 = 133;
2460 /** Key code constant: F4 key. */
2461 public static final int KEYCODE_F4 = 134;
2462 /** Key code constant: F5 key. */
2463 public static final int KEYCODE_F5 = 135;
2464 /** Key code constant: F6 key. */
2465 public static final int KEYCODE_F6 = 136;
2466 /** Key code constant: F7 key. */
2467 public static final int KEYCODE_F7 = 137;
2468 /** Key code constant: F8 key. */
2469 public static final int KEYCODE_F8 = 138;
2470 /** Key code constant: F9 key. */
2471 public static final int KEYCODE_F9 = 139;
2472 /** Key code constant: F10 key. */
2473 public static final int KEYCODE_F10 = 140;
2474 /** Key code constant: F11 key. */
2475 public static final int KEYCODE_F11 = 141;
2476 /** Key code constant: F12 key. */
2477 public static final int KEYCODE_F12 = 142;
2478 /** Key code constant: Num Lock key.
2479 * This is the Num Lock key; it is different from {@link #KEYCODE_NUM}.
2480 * This key alters the behavior of other keys on the numeric keypad. */
2481 public static final int KEYCODE_NUM_LOCK = 143;
2482 /** Key code constant: Numeric keypad '0' key. */
2483 public static final int KEYCODE_NUMPAD_0 = 144;
2484 /** Key code constant: Numeric keypad '1' key. */
2485 public static final int KEYCODE_NUMPAD_1 = 145;
2486 /** Key code constant: Numeric keypad '2' key. */
2487 public static final int KEYCODE_NUMPAD_2 = 146;
2488 /** Key code constant: Numeric keypad '3' key. */
2489 public static final int KEYCODE_NUMPAD_3 = 147;
2490 /** Key code constant: Numeric keypad '4' key. */
2491 public static final int KEYCODE_NUMPAD_4 = 148;
2492 /** Key code constant: Numeric keypad '5' key. */
2493 public static final int KEYCODE_NUMPAD_5 = 149;
2494 /** Key code constant: Numeric keypad '6' key. */
2495 public static final int KEYCODE_NUMPAD_6 = 150;
2496 /** Key code constant: Numeric keypad '7' key. */
2497 public static final int KEYCODE_NUMPAD_7 = 151;
2498 /** Key code constant: Numeric keypad '8' key. */
2499 public static final int KEYCODE_NUMPAD_8 = 152;
2500 /** Key code constant: Numeric keypad '9' key. */
2501 public static final int KEYCODE_NUMPAD_9 = 153;
2502 /** Key code constant: Numeric keypad '/' key (for division). */
2503 public static final int KEYCODE_NUMPAD_DIVIDE = 154;
2504 /** Key code constant: Numeric keypad '*' key (for multiplication). */
2505 public static final int KEYCODE_NUMPAD_MULTIPLY = 155;
2506 /** Key code constant: Numeric keypad '-' key (for subtraction). */
2507 public static final int KEYCODE_NUMPAD_SUBTRACT = 156;
2508 /** Key code constant: Numeric keypad '+' key (for addition). */
2509 public static final int KEYCODE_NUMPAD_ADD = 157;
2510 /** Key code constant: Numeric keypad '.' key (for decimals or digit grouping). */
2511 public static final int KEYCODE_NUMPAD_DOT = 158;
2512 /** Key code constant: Numeric keypad ',' key (for decimals or digit grouping). */
2513 public static final int KEYCODE_NUMPAD_COMMA = 159;
2514 /** Key code constant: Numeric keypad Enter key. */
2515 public static final int KEYCODE_NUMPAD_ENTER = 160;
2516 /** Key code constant: Numeric keypad '=' key. */
2517 public static final int KEYCODE_NUMPAD_EQUALS = 161;
2518 /** Key code constant: Numeric keypad '(' key. */
2519 public static final int KEYCODE_NUMPAD_LEFT_PAREN = 162;
2520 /** Key code constant: Numeric keypad ')' key. */
2521 public static final int KEYCODE_NUMPAD_RIGHT_PAREN = 163;
2522 /** Key code constant: Volume Mute key.
2523 * Mutes the speaker, unlike {@link #KEYCODE_MUTE}.
2524 * This key should normally be implemented as a toggle such that the first press
2525 * mutes the speaker and the second press restores the original volume. */
2526 public static final int KEYCODE_VOLUME_MUTE = 164;
2527 /** Key code constant: Info key.
2528 * Common on TV remotes to show additional information related to what is
2529 * currently being viewed. */
2530 public static final int KEYCODE_INFO = 165;
2531 /** Key code constant: Channel up key.
2532 * On TV remotes, increments the television channel. */
2533 public static final int KEYCODE_CHANNEL_UP = 166;
2534 /** Key code constant: Channel down key.
2535 * On TV remotes, decrements the television channel. */
2536 public static final int KEYCODE_CHANNEL_DOWN = 167;
2537 /** Key code constant: Zoom in key. */
2538 public static final int KEYCODE_ZOOM_IN = 168;
2539 /** Key code constant: Zoom out key. */
2540 public static final int KEYCODE_ZOOM_OUT = 169;
2541 /** Key code constant: TV key.
2542 * On TV remotes, switches to viewing live TV. */
2543 public static final int KEYCODE_TV = 170;
2544 /** Key code constant: Window key.
2545 * On TV remotes, toggles picture-in-picture mode or other windowing functions. */
2546 public static final int KEYCODE_WINDOW = 171;
2547 /** Key code constant: Guide key.
2548 * On TV remotes, shows a programming guide. */
2549 public static final int KEYCODE_GUIDE = 172;
2550 /** Key code constant: DVR key.
2551 * On some TV remotes, switches to a DVR mode for recorded shows. */
2552 public static final int KEYCODE_DVR = 173;
2553 /** Key code constant: Bookmark key.
2554 * On some TV remotes, bookmarks content or web pages. */
2555 public static final int KEYCODE_BOOKMARK = 174;
2556 /** Key code constant: Toggle captions key.
2557 * Switches the mode for closed-captioning text, for example during television shows. */
2558 public static final int KEYCODE_CAPTIONS = 175;
2559 /** Key code constant: Settings key.
2560 * Starts the system settings activity. */
2561 public static final int KEYCODE_SETTINGS = 176;
2562 /** Key code constant: TV power key.
2563 * On TV remotes, toggles the power on a television screen. */
2564 public static final int KEYCODE_TV_POWER = 177;
2565 /** Key code constant: TV input key.
2566 * On TV remotes, switches the input on a television screen. */
2567 public static final int KEYCODE_TV_INPUT = 178;
2568 /** Key code constant: Set-top-box power key.
2569 * On TV remotes, toggles the power on an external Set-top-box. */
2570 public static final int KEYCODE_STB_POWER = 179;
2571 /** Key code constant: Set-top-box input key.
2572 * On TV remotes, switches the input mode on an external Set-top-box. */
2573 public static final int KEYCODE_STB_INPUT = 180;
2574 /** Key code constant: A/V Receiver power key.
2575 * On TV remotes, toggles the power on an external A/V Receiver. */
2576 public static final int KEYCODE_AVR_POWER = 181;
2577 /** Key code constant: A/V Receiver input key.
2578 * On TV remotes, switches the input mode on an external A/V Receiver. */
2579 public static final int KEYCODE_AVR_INPUT = 182;
2580 /** Key code constant: Red "programmable" key.
2581 * On TV remotes, acts as a contextual/programmable key. */
2582 public static final int KEYCODE_PROG_RED = 183;
2583 /** Key code constant: Green "programmable" key.
2584 * On TV remotes, actsas a contextual/programmable key. */
2585 public static final int KEYCODE_PROG_GREEN = 184;
2586 /** Key code constant: Yellow "programmable" key.
2587 * On TV remotes, acts as a contextual/programmable key. */
2588 public static final int KEYCODE_PROG_YELLOW = 185;
2589 /** Key code constant: Blue "programmable" key.
2590 * On TV remotes, acts as a contextual/programmable key. */
2591 public static final int KEYCODE_PROG_BLUE = 186;
2592 /** Key code constant: App switch key.
2593 * Should bring up the application switcher dialog. */
2594 public static final int KEYCODE_APP_SWITCH = 187;
2595 /** Key code constant: Generic Game Pad Button #1.*/
2596 public static final int KEYCODE_BUTTON_1 = 188;
2597 /** Key code constant: Generic Game Pad Button #2.*/
2598 public static final int KEYCODE_BUTTON_2 = 189;
2599 /** Key code constant: Generic Game Pad Button #3.*/
2600 public static final int KEYCODE_BUTTON_3 = 190;
2601 /** Key code constant: Generic Game Pad Button #4.*/
2602 public static final int KEYCODE_BUTTON_4 = 191;
2603 /** Key code constant: Generic Game Pad Button #5.*/
2604 public static final int KEYCODE_BUTTON_5 = 192;
2605 /** Key code constant: Generic Game Pad Button #6.*/
2606 public static final int KEYCODE_BUTTON_6 = 193;
2607 /** Key code constant: Generic Game Pad Button #7.*/
2608 public static final int KEYCODE_BUTTON_7 = 194;
2609 /** Key code constant: Generic Game Pad Button #8.*/
2610 public static final int KEYCODE_BUTTON_8 = 195;
2611 /** Key code constant: Generic Game Pad Button #9.*/
2612 public static final int KEYCODE_BUTTON_9 = 196;
2613 /** Key code constant: Generic Game Pad Button #10.*/
2614 public static final int KEYCODE_BUTTON_10 = 197;
2615 /** Key code constant: Generic Game Pad Button #11.*/
2616 public static final int KEYCODE_BUTTON_11 = 198;
2617 /** Key code constant: Generic Game Pad Button #12.*/
2618 public static final int KEYCODE_BUTTON_12 = 199;
2619 /** Key code constant: Generic Game Pad Button #13.*/
2620 public static final int KEYCODE_BUTTON_13 = 200;
2621 /** Key code constant: Generic Game Pad Button #14.*/
2622 public static final int KEYCODE_BUTTON_14 = 201;
2623 /** Key code constant: Generic Game Pad Button #15.*/
2624 public static final int KEYCODE_BUTTON_15 = 202;
2625 /** Key code constant: Generic Game Pad Button #16.*/
2626 public static final int KEYCODE_BUTTON_16 = 203;
2627 /** Key code constant: Language Switch key.
2628 * Toggles the current input language such as switching between English and Japanese on
2629 * a QWERTY keyboard. On some devices, the same function may be performed by
2630 * pressing Shift+Spacebar. */
2631 public static final int KEYCODE_LANGUAGE_SWITCH = 204;
2632 /** Key code constant: Manner Mode key.
2633 * Toggles silent or vibrate mode on and off to make the device behave more politely
2634 * in certain settings such as on a crowded train. On some devices, the key may only
2635 * operate when long-pressed. */
2636 public static final int KEYCODE_MANNER_MODE = 205;
2637 /** Key code constant: 3D Mode key.
2638 * Toggles the display between 2D and 3D mode. */
2639 public static final int KEYCODE_3D_MODE = 206;
2640 /** Key code constant: Contacts special function key.
2641 * Used to launch an address book application. */
2642 public static final int KEYCODE_CONTACTS = 207;
2643 /** Key code constant: Calendar special function key.
2644 * Used to launch a calendar application. */
2645 public static final int KEYCODE_CALENDAR = 208;
2646 /** Key code constant: Music special function key.
2647 * Used to launch a music player application. */
2648 public static final int KEYCODE_MUSIC = 209;
2649 /** Key code constant: Calculator special function key.
2650 * Used to launch a calculator application. */
2651 public static final int KEYCODE_CALCULATOR = 210;
2652 /** Key code constant: Japanese full-width / half-width key. */
2653 public static final int KEYCODE_ZENKAKU_HANKAKU = 211;
2654 /** Key code constant: Japanese alphanumeric key. */
2655 public static final int KEYCODE_EISU = 212;
2656 /** Key code constant: Japanese non-conversion key. */
2657 public static final int KEYCODE_MUHENKAN = 213;
2658 /** Key code constant: Japanese conversion key. */
2659 public static final int KEYCODE_HENKAN = 214;
2660 /** Key code constant: Japanese katakana / hiragana key. */
2661 public static final int KEYCODE_KATAKANA_HIRAGANA = 215;
2662 /** Key code constant: Japanese Yen key. */
2663 public static final int KEYCODE_YEN = 216;
2664 /** Key code constant: Japanese Ro key. */
2665 public static final int KEYCODE_RO = 217;
2666 /** Key code constant: Japanese kana key. */
2667 public static final int KEYCODE_KANA = 218;
2668 /** Key code constant: Assist key.
2669 * Launches the global assist activity. Not delivered to applications. */
2670 public static final int KEYCODE_ASSIST = 219;
2671
2672 private static final int LAST_KEYCODE = KEYCODE_ASSIST;
2673
2674 // NOTE: If you add a new keycode here you must also add it to:
2675 // isSystem()
2676 // native/include/android/keycodes.h
2677 // frameworks/base/include/ui/KeycodeLabels.h
2678 // external/webkit/WebKit/android/plugins/ANPKeyCodes.h
2679 // frameworks/base/core/res/res/values/attrs.xml
2680 // emulator?
2681 // LAST_KEYCODE
2682 // KEYCODE_SYMBOLIC_NAMES
2683 //
2684 // Also Android currently does not reserve code ranges for vendor-
2685 // specific key codes. If you have new key codes to have, you
2686 // MUST contribute a patch to the open source project to define
2687 // those new codes. This is intended to maintain a consistent
2688 // set of key code definitions across all Android devices.
2689
2690 // Symbolic names of all key codes.
2691 private static final SparseArray<String> KEYCODE_SYMBOLIC_NAMES = new SparseArray<String>();
2692 private static void populateKeycodeSymbolicNames() {
2693 SparseArray<String> names = KEYCODE_SYMBOLIC_NAMES;
2694 names.append(KEYCODE_UNKNOWN, "KEYCODE_UNKNOWN");
2695 names.append(KEYCODE_SOFT_LEFT, "KEYCODE_SOFT_LEFT");
2696 names.append(KEYCODE_SOFT_RIGHT, "KEYCODE_SOFT_RIGHT");
2697 names.append(KEYCODE_HOME, "KEYCODE_HOME");
2698 names.append(KEYCODE_BACK, "KEYCODE_BACK");
2699 names.append(KEYCODE_CALL, "KEYCODE_CALL");
2700 names.append(KEYCODE_ENDCALL, "KEYCODE_ENDCALL");
2701 names.append(KEYCODE_0, "KEYCODE_0");
2702 names.append(KEYCODE_1, "KEYCODE_1");
2703 names.append(KEYCODE_2, "KEYCODE_2");
2704 names.append(KEYCODE_3, "KEYCODE_3");
2705 names.append(KEYCODE_4, "KEYCODE_4");
2706 names.append(KEYCODE_5, "KEYCODE_5");
2707 names.append(KEYCODE_6, "KEYCODE_6");
2708 names.append(KEYCODE_7, "KEYCODE_7");
2709 names.append(KEYCODE_8, "KEYCODE_8");
2710 names.append(KEYCODE_9, "KEYCODE_9");
2711 names.append(KEYCODE_STAR, "KEYCODE_STAR");
2712 names.append(KEYCODE_POUND, "KEYCODE_POUND");
2713 names.append(KEYCODE_DPAD_UP, "KEYCODE_DPAD_UP");
2714 names.append(KEYCODE_DPAD_DOWN, "KEYCODE_DPAD_DOWN");
2715 names.append(KEYCODE_DPAD_LEFT, "KEYCODE_DPAD_LEFT");
2716 names.append(KEYCODE_DPAD_RIGHT, "KEYCODE_DPAD_RIGHT");
2717 names.append(KEYCODE_DPAD_CENTER, "KEYCODE_DPAD_CENTER");
2718 names.append(KEYCODE_VOLUME_UP, "KEYCODE_VOLUME_UP");
2719 names.append(KEYCODE_VOLUME_DOWN, "KEYCODE_VOLUME_DOWN");
2720 names.append(KEYCODE_POWER, "KEYCODE_POWER");
2721 names.append(KEYCODE_CAMERA, "KEYCODE_CAMERA");
2722 names.append(KEYCODE_CLEAR, "KEYCODE_CLEAR");
2723 names.append(KEYCODE_A, "KEYCODE_A");
2724 names.append(KEYCODE_B, "KEYCODE_B");
2725 names.append(KEYCODE_C, "KEYCODE_C");
2726 names.append(KEYCODE_D, "KEYCODE_D");
2727 names.append(KEYCODE_E, "KEYCODE_E");
2728 names.append(KEYCODE_F, "KEYCODE_F");
2729 names.append(KEYCODE_G, "KEYCODE_G");
2730 names.append(KEYCODE_H, "KEYCODE_H");
2731 names.append(KEYCODE_I, "KEYCODE_I");
2732 names.append(KEYCODE_J, "KEYCODE_J");
2733 names.append(KEYCODE_K, "KEYCODE_K");
2734 names.append(KEYCODE_L, "KEYCODE_L");
2735 names.append(KEYCODE_M, "KEYCODE_M");
2736 names.append(KEYCODE_N, "KEYCODE_N");
2737 names.append(KEYCODE_O, "KEYCODE_O");
2738 names.append(KEYCODE_P, "KEYCODE_P");
2739 names.append(KEYCODE_Q, "KEYCODE_Q");
2740 names.append(KEYCODE_R, "KEYCODE_R");
2741 names.append(KEYCODE_S, "KEYCODE_S");
2742 names.append(KEYCODE_T, "KEYCODE_T");
2743 names.append(KEYCODE_U, "KEYCODE_U");
2744 names.append(KEYCODE_V, "KEYCODE_V");
2745 names.append(KEYCODE_W, "KEYCODE_W");
2746 names.append(KEYCODE_X, "KEYCODE_X");
2747 names.append(KEYCODE_Y, "KEYCODE_Y");
2748 names.append(KEYCODE_Z, "KEYCODE_Z");
2749 names.append(KEYCODE_COMMA, "KEYCODE_COMMA");
2750 names.append(KEYCODE_PERIOD, "KEYCODE_PERIOD");
2751 names.append(KEYCODE_ALT_LEFT, "KEYCODE_ALT_LEFT");
2752 names.append(KEYCODE_ALT_RIGHT, "KEYCODE_ALT_RIGHT");
2753 names.append(KEYCODE_SHIFT_LEFT, "KEYCODE_SHIFT_LEFT");
2754 names.append(KEYCODE_SHIFT_RIGHT, "KEYCODE_SHIFT_RIGHT");
2755 names.append(KEYCODE_TAB, "KEYCODE_TAB");
2756 names.append(KEYCODE_SPACE, "KEYCODE_SPACE");
2757 names.append(KEYCODE_SYM, "KEYCODE_SYM");
2758 names.append(KEYCODE_EXPLORER, "KEYCODE_EXPLORER");
2759 names.append(KEYCODE_ENVELOPE, "KEYCODE_ENVELOPE");
2760 names.append(KEYCODE_ENTER, "KEYCODE_ENTER");
2761 names.append(KEYCODE_DEL, "KEYCODE_DEL");
2762 names.append(KEYCODE_GRAVE, "KEYCODE_GRAVE");
2763 names.append(KEYCODE_MINUS, "KEYCODE_MINUS");
2764 names.append(KEYCODE_EQUALS, "KEYCODE_EQUALS");
2765 names.append(KEYCODE_LEFT_BRACKET, "KEYCODE_LEFT_BRACKET");
2766 names.append(KEYCODE_RIGHT_BRACKET, "KEYCODE_RIGHT_BRACKET");
2767 names.append(KEYCODE_BACKSLASH, "KEYCODE_BACKSLASH");
2768 names.append(KEYCODE_SEMICOLON, "KEYCODE_SEMICOLON");
2769 names.append(KEYCODE_APOSTROPHE, "KEYCODE_APOSTROPHE");
2770 names.append(KEYCODE_SLASH, "KEYCODE_SLASH");
2771 names.append(KEYCODE_AT, "KEYCODE_AT");
2772 names.append(KEYCODE_NUM, "KEYCODE_NUM");
2773 names.append(KEYCODE_HEADSETHOOK, "KEYCODE_HEADSETHOOK");
2774 names.append(KEYCODE_FOCUS, "KEYCODE_FOCUS");
2775 names.append(KEYCODE_PLUS, "KEYCODE_PLUS");
2776 names.append(KEYCODE_MENU, "KEYCODE_MENU");
2777 names.append(KEYCODE_NOTIFICATION, "KEYCODE_NOTIFICATION");
2778 names.append(KEYCODE_SEARCH, "KEYCODE_SEARCH");
2779 names.append(KEYCODE_MEDIA_PLAY_PAUSE, "KEYCODE_MEDIA_PLAY_PAUSE");
2780 names.append(KEYCODE_MEDIA_STOP, "KEYCODE_MEDIA_STOP");
2781 names.append(KEYCODE_MEDIA_NEXT, "KEYCODE_MEDIA_NEXT");
2782 names.append(KEYCODE_MEDIA_PREVIOUS, "KEYCODE_MEDIA_PREVIOUS");
2783 names.append(KEYCODE_MEDIA_REWIND, "KEYCODE_MEDIA_REWIND");
2784 names.append(KEYCODE_MEDIA_FAST_FORWARD, "KEYCODE_MEDIA_FAST_FORWARD");
2785 names.append(KEYCODE_MUTE, "KEYCODE_MUTE");
2786 names.append(KEYCODE_PAGE_UP, "KEYCODE_PAGE_UP");
2787 names.append(KEYCODE_PAGE_DOWN, "KEYCODE_PAGE_DOWN");
2788 names.append(KEYCODE_PICTSYMBOLS, "KEYCODE_PICTSYMBOLS");
2789 names.append(KEYCODE_SWITCH_CHARSET, "KEYCODE_SWITCH_CHARSET");
2790 names.append(KEYCODE_BUTTON_A, "KEYCODE_BUTTON_A");
2791 names.append(KEYCODE_BUTTON_B, "KEYCODE_BUTTON_B");
2792 names.append(KEYCODE_BUTTON_C, "KEYCODE_BUTTON_C");
2793 names.append(KEYCODE_BUTTON_X, "KEYCODE_BUTTON_X");
2794 names.append(KEYCODE_BUTTON_Y, "KEYCODE_BUTTON_Y");
2795 names.append(KEYCODE_BUTTON_Z, "KEYCODE_BUTTON_Z");
2796 names.append(KEYCODE_BUTTON_L1, "KEYCODE_BUTTON_L1");
2797 names.append(KEYCODE_BUTTON_R1, "KEYCODE_BUTTON_R1");
2798 names.append(KEYCODE_BUTTON_L2, "KEYCODE_BUTTON_L2");
2799 names.append(KEYCODE_BUTTON_R2, "KEYCODE_BUTTON_R2");
2800 names.append(KEYCODE_BUTTON_THUMBL, "KEYCODE_BUTTON_THUMBL");
2801 names.append(KEYCODE_BUTTON_THUMBR, "KEYCODE_BUTTON_THUMBR");
2802 names.append(KEYCODE_BUTTON_START, "KEYCODE_BUTTON_START");
2803 names.append(KEYCODE_BUTTON_SELECT, "KEYCODE_BUTTON_SELECT");
2804 names.append(KEYCODE_BUTTON_MODE, "KEYCODE_BUTTON_MODE");
2805 names.append(KEYCODE_ESCAPE, "KEYCODE_ESCAPE");
2806 names.append(KEYCODE_FORWARD_DEL, "KEYCODE_FORWARD_DEL");
2807 names.append(KEYCODE_CTRL_LEFT, "KEYCODE_CTRL_LEFT");
2808 names.append(KEYCODE_CTRL_RIGHT, "KEYCODE_CTRL_RIGHT");
2809 names.append(KEYCODE_CAPS_LOCK, "KEYCODE_CAPS_LOCK");
2810 names.append(KEYCODE_SCROLL_LOCK, "KEYCODE_SCROLL_LOCK");
2811 names.append(KEYCODE_META_LEFT, "KEYCODE_META_LEFT");
2812 names.append(KEYCODE_META_RIGHT, "KEYCODE_META_RIGHT");
2813 names.append(KEYCODE_FUNCTION, "KEYCODE_FUNCTION");
2814 names.append(KEYCODE_SYSRQ, "KEYCODE_SYSRQ");
2815 names.append(KEYCODE_BREAK, "KEYCODE_BREAK");
2816 names.append(KEYCODE_MOVE_HOME, "KEYCODE_MOVE_HOME");
2817 names.append(KEYCODE_MOVE_END, "KEYCODE_MOVE_END");
2818 names.append(KEYCODE_INSERT, "KEYCODE_INSERT");
2819 names.append(KEYCODE_FORWARD, "KEYCODE_FORWARD");
2820 names.append(KEYCODE_MEDIA_PLAY, "KEYCODE_MEDIA_PLAY");
2821 names.append(KEYCODE_MEDIA_PAUSE, "KEYCODE_MEDIA_PAUSE");
2822 names.append(KEYCODE_MEDIA_CLOSE, "KEYCODE_MEDIA_CLOSE");
2823 names.append(KEYCODE_MEDIA_EJECT, "KEYCODE_MEDIA_EJECT");
2824 names.append(KEYCODE_MEDIA_RECORD, "KEYCODE_MEDIA_RECORD");
2825 names.append(KEYCODE_F1, "KEYCODE_F1");
2826 names.append(KEYCODE_F2, "KEYCODE_F2");
2827 names.append(KEYCODE_F3, "KEYCODE_F3");
2828 names.append(KEYCODE_F4, "KEYCODE_F4");
2829 names.append(KEYCODE_F5, "KEYCODE_F5");
2830 names.append(KEYCODE_F6, "KEYCODE_F6");
2831 names.append(KEYCODE_F7, "KEYCODE_F7");
2832 names.append(KEYCODE_F8, "KEYCODE_F8");
2833 names.append(KEYCODE_F9, "KEYCODE_F9");
2834 names.append(KEYCODE_F10, "KEYCODE_F10");
2835 names.append(KEYCODE_F11, "KEYCODE_F11");
2836 names.append(KEYCODE_F12, "KEYCODE_F12");
2837 names.append(KEYCODE_NUM_LOCK, "KEYCODE_NUM_LOCK");
2838 names.append(KEYCODE_NUMPAD_0, "KEYCODE_NUMPAD_0");
2839 names.append(KEYCODE_NUMPAD_1, "KEYCODE_NUMPAD_1");
2840 names.append(KEYCODE_NUMPAD_2, "KEYCODE_NUMPAD_2");
2841 names.append(KEYCODE_NUMPAD_3, "KEYCODE_NUMPAD_3");
2842 names.append(KEYCODE_NUMPAD_4, "KEYCODE_NUMPAD_4");
2843 names.append(KEYCODE_NUMPAD_5, "KEYCODE_NUMPAD_5");
2844 names.append(KEYCODE_NUMPAD_6, "KEYCODE_NUMPAD_6");
2845 names.append(KEYCODE_NUMPAD_7, "KEYCODE_NUMPAD_7");
2846 names.append(KEYCODE_NUMPAD_8, "KEYCODE_NUMPAD_8");
2847 names.append(KEYCODE_NUMPAD_9, "KEYCODE_NUMPAD_9");
2848 names.append(KEYCODE_NUMPAD_DIVIDE, "KEYCODE_NUMPAD_DIVIDE");
2849 names.append(KEYCODE_NUMPAD_MULTIPLY, "KEYCODE_NUMPAD_MULTIPLY");
2850 names.append(KEYCODE_NUMPAD_SUBTRACT, "KEYCODE_NUMPAD_SUBTRACT");
2851 names.append(KEYCODE_NUMPAD_ADD, "KEYCODE_NUMPAD_ADD");
2852 names.append(KEYCODE_NUMPAD_DOT, "KEYCODE_NUMPAD_DOT");
2853 names.append(KEYCODE_NUMPAD_COMMA, "KEYCODE_NUMPAD_COMMA");
2854 names.append(KEYCODE_NUMPAD_ENTER, "KEYCODE_NUMPAD_ENTER");
2855 names.append(KEYCODE_NUMPAD_EQUALS, "KEYCODE_NUMPAD_EQUALS");
2856 names.append(KEYCODE_NUMPAD_LEFT_PAREN, "KEYCODE_NUMPAD_LEFT_PAREN");
2857 names.append(KEYCODE_NUMPAD_RIGHT_PAREN, "KEYCODE_NUMPAD_RIGHT_PAREN");
2858 names.append(KEYCODE_VOLUME_MUTE, "KEYCODE_VOLUME_MUTE");
2859 names.append(KEYCODE_INFO, "KEYCODE_INFO");
2860 names.append(KEYCODE_CHANNEL_UP, "KEYCODE_CHANNEL_UP");
2861 names.append(KEYCODE_CHANNEL_DOWN, "KEYCODE_CHANNEL_DOWN");
2862 names.append(KEYCODE_ZOOM_IN, "KEYCODE_ZOOM_IN");
2863 names.append(KEYCODE_ZOOM_OUT, "KEYCODE_ZOOM_OUT");
2864 names.append(KEYCODE_TV, "KEYCODE_TV");
2865 names.append(KEYCODE_WINDOW, "KEYCODE_WINDOW");
2866 names.append(KEYCODE_GUIDE, "KEYCODE_GUIDE");
2867 names.append(KEYCODE_DVR, "KEYCODE_DVR");
2868 names.append(KEYCODE_BOOKMARK, "KEYCODE_BOOKMARK");
2869 names.append(KEYCODE_CAPTIONS, "KEYCODE_CAPTIONS");
2870 names.append(KEYCODE_SETTINGS, "KEYCODE_SETTINGS");
2871 names.append(KEYCODE_TV_POWER, "KEYCODE_TV_POWER");
2872 names.append(KEYCODE_TV_INPUT, "KEYCODE_TV_INPUT");
2873 names.append(KEYCODE_STB_INPUT, "KEYCODE_STB_INPUT");
2874 names.append(KEYCODE_STB_POWER, "KEYCODE_STB_POWER");
2875 names.append(KEYCODE_AVR_POWER, "KEYCODE_AVR_POWER");
2876 names.append(KEYCODE_AVR_INPUT, "KEYCODE_AVR_INPUT");
2877 names.append(KEYCODE_PROG_RED, "KEYCODE_PROG_RED");
2878 names.append(KEYCODE_PROG_GREEN, "KEYCODE_PROG_GREEN");
2879 names.append(KEYCODE_PROG_YELLOW, "KEYCODE_PROG_YELLOW");
2880 names.append(KEYCODE_PROG_BLUE, "KEYCODE_PROG_BLUE");
2881 names.append(KEYCODE_APP_SWITCH, "KEYCODE_APP_SWITCH");
2882 names.append(KEYCODE_BUTTON_1, "KEYCODE_BUTTON_1");
2883 names.append(KEYCODE_BUTTON_2, "KEYCODE_BUTTON_2");
2884 names.append(KEYCODE_BUTTON_3, "KEYCODE_BUTTON_3");
2885 names.append(KEYCODE_BUTTON_4, "KEYCODE_BUTTON_4");
2886 names.append(KEYCODE_BUTTON_5, "KEYCODE_BUTTON_5");
2887 names.append(KEYCODE_BUTTON_6, "KEYCODE_BUTTON_6");
2888 names.append(KEYCODE_BUTTON_7, "KEYCODE_BUTTON_7");
2889 names.append(KEYCODE_BUTTON_8, "KEYCODE_BUTTON_8");
2890 names.append(KEYCODE_BUTTON_9, "KEYCODE_BUTTON_9");
2891 names.append(KEYCODE_BUTTON_10, "KEYCODE_BUTTON_10");
2892 names.append(KEYCODE_BUTTON_11, "KEYCODE_BUTTON_11");
2893 names.append(KEYCODE_BUTTON_12, "KEYCODE_BUTTON_12");
2894 names.append(KEYCODE_BUTTON_13, "KEYCODE_BUTTON_13");
2895 names.append(KEYCODE_BUTTON_14, "KEYCODE_BUTTON_14");
2896 names.append(KEYCODE_BUTTON_15, "KEYCODE_BUTTON_15");
2897 names.append(KEYCODE_BUTTON_16, "KEYCODE_BUTTON_16");
2898 names.append(KEYCODE_LANGUAGE_SWITCH, "KEYCODE_LANGUAGE_SWITCH");
2899 names.append(KEYCODE_MANNER_MODE, "KEYCODE_MANNER_MODE");
2900 names.append(KEYCODE_3D_MODE, "KEYCODE_3D_MODE");
2901 names.append(KEYCODE_CONTACTS, "KEYCODE_CONTACTS");
2902 names.append(KEYCODE_CALENDAR, "KEYCODE_CALENDAR");
2903 names.append(KEYCODE_MUSIC, "KEYCODE_MUSIC");
2904 names.append(KEYCODE_CALCULATOR, "KEYCODE_CALCULATOR");
2905 names.append(KEYCODE_ZENKAKU_HANKAKU, "KEYCODE_ZENKAKU_HANKAKU");
2906 names.append(KEYCODE_EISU, "KEYCODE_EISU");
2907 names.append(KEYCODE_MUHENKAN, "KEYCODE_MUHENKAN");
2908 names.append(KEYCODE_HENKAN, "KEYCODE_HENKAN");
2909 names.append(KEYCODE_KATAKANA_HIRAGANA, "KEYCODE_KATAKANA_HIRAGANA");
2910 names.append(KEYCODE_YEN, "KEYCODE_YEN");
2911 names.append(KEYCODE_RO, "KEYCODE_RO");
2912 names.append(KEYCODE_KANA, "KEYCODE_KANA");
2913 names.append(KEYCODE_ASSIST, "KEYCODE_ASSIST");
2914 };
2915
2916 // Symbolic names of all metakeys in bit order from least significant to most significant.
2917 // Accordingly there are exactly 32 values in this table.
2918 private static final String[] META_SYMBOLIC_NAMES = new String[] {
2919 "META_SHIFT_ON",
2920 "META_ALT_ON",
2921 "META_SYM_ON",
2922 "META_FUNCTION_ON",
2923 "META_ALT_LEFT_ON",
2924 "META_ALT_RIGHT_ON",
2925 "META_SHIFT_LEFT_ON",
2926 "META_SHIFT_RIGHT_ON",
2927 "META_CAP_LOCKED",
2928 "META_ALT_LOCKED",
2929 "META_SYM_LOCKED",
2930 "0x00000800",
2931 "META_CTRL_ON",
2932 "META_CTRL_LEFT_ON",
2933 "META_CTRL_RIGHT_ON",
2934 "0x00008000",
2935 "META_META_ON",
2936 "META_META_LEFT_ON",
2937 "META_META_RIGHT_ON",
2938 "0x00080000",
2939 "META_CAPS_LOCK_ON",
2940 "META_NUM_LOCK_ON",
2941 "META_SCROLL_LOCK_ON",
2942 "0x00800000",
2943 "0x01000000",
2944 "0x02000000",
2945 "0x04000000",
2946 "0x08000000",
2947 "0x10000000",
2948 "0x20000000",
2949 "0x40000000",
2950 "0x80000000",
2951 };
2952
2953 /**
2954 * @deprecated There are now more than MAX_KEYCODE keycodes.
2955 * Use {@link #getMaxKeyCode()} instead.
2956 */
2957 @Deprecated
2958 public static final int MAX_KEYCODE = 84;
2959
2960 /**
2961 * {@link #getAction} value: the key has been pressed down.
2962 */
2963 public static final int ACTION_DOWN = 0;
2964 /**
2965 * {@link #getAction} value: the key has been released.
2966 */
2967 public static final int ACTION_UP = 1;
2968 /**
2969 * {@link #getAction} value: multiple duplicate key events have
2970 * occurred in a row, or a complex string is being delivered. If the
2971 * key code is not {#link {@link #KEYCODE_UNKNOWN} then the
2972 * {#link {@link #getRepeatCount()} method returns the number of times
2973 * the given key code should be executed.
2974 * Otherwise, if the key code is {@link #KEYCODE_UNKNOWN}, then
2975 * this is a sequence of characters as returned by {@link #getCharacters}.
2976 */
2977 public static final int ACTION_MULTIPLE = 2;
2978
2979 /**
2980 * SHIFT key locked in CAPS mode.
2981 * Reserved for use by {@link MetaKeyKeyListener} for a published constant in its API.
2982 * @hide
2983 */
2984 public static final int META_CAP_LOCKED = 0x100;
2985
2986 /**
2987 * ALT key locked.
2988 * Reserved for use by {@link MetaKeyKeyListener} for a published constant in its API.
2989 * @hide
2990 */
2991 public static final int META_ALT_LOCKED = 0x200;
2992
2993 /**
2994 * SYM key locked.
2995 * Reserved for use by {@link MetaKeyKeyListener} for a published constant in its API.
2996 * @hide
2997 */
2998 public static final int META_SYM_LOCKED = 0x400;
2999
3000 /**
3001 * Text is in selection mode.
3002 * Reserved for use by {@link MetaKeyKeyListener} for a private unpublished constant
3003 * in its API that is currently being retained for legacy reasons.
3004 * @hide
3005 */
3006 public static final int META_SELECTING = 0x800;
3007
3008 /**
3009 * <p>This mask is used to check whether one of the ALT meta keys is pressed.</p>
3010 *
3011 * @see #isAltPressed()
3012 * @see #getMetaState()
3013 * @see #KEYCODE_ALT_LEFT
3014 * @see #KEYCODE_ALT_RIGHT
3015 */
3016 public static final int META_ALT_ON = 0x02;
3017
3018 /**
3019 * <p>This mask is used to check whether the left ALT meta key is pressed.</p>
3020 *
3021 * @see #isAltPressed()
3022 * @see #getMetaState()
3023 * @see #KEYCODE_ALT_LEFT
3024 */
3025 public static final int META_ALT_LEFT_ON = 0x10;
3026
3027 /**
3028 * <p>This mask is used to check whether the right the ALT meta key is pressed.</p>
3029 *
3030 * @see #isAltPressed()
3031 * @see #getMetaState()
3032 * @see #KEYCODE_ALT_RIGHT
3033 */
3034 public static final int META_ALT_RIGHT_ON = 0x20;
3035
3036 /**
3037 * <p>This mask is used to check whether one of the SHIFT meta keys is pressed.</p>
3038 *
3039 * @see #isShiftPressed()
3040 * @see #getMetaState()
3041 * @see #KEYCODE_SHIFT_LEFT
3042 * @see #KEYCODE_SHIFT_RIGHT
3043 */
3044 public static final int META_SHIFT_ON = 0x1;
3045
3046 /**
3047 * <p>This mask is used to check whether the left SHIFT meta key is pressed.</p>
3048 *
3049 * @see #isShiftPressed()
3050 * @see #getMetaState()
3051 * @see #KEYCODE_SHIFT_LEFT
3052 */
3053 public static final int META_SHIFT_LEFT_ON = 0x40;
3054
3055 /**
3056 * <p>This mask is used to check whether the right SHIFT meta key is pressed.</p>
3057 *
3058 * @see #isShiftPressed()
3059 * @see #getMetaState()
3060 * @see #KEYCODE_SHIFT_RIGHT
3061 */
3062 public static final int META_SHIFT_RIGHT_ON = 0x80;
3063
3064 /**
3065 * <p>This mask is used to check whether the SYM meta key is pressed.</p>
3066 *
3067 * @see #isSymPressed()
3068 * @see #getMetaState()
3069 */
3070 public static final int META_SYM_ON = 0x4;
3071
3072 /**
3073 * <p>This mask is used to check whether the FUNCTION meta key is pressed.</p>
3074 *
3075 * @see #isFunctionPressed()
3076 * @see #getMetaState()
3077 */
3078 public static final int META_FUNCTION_ON = 0x8;
3079
3080 /**
3081 * <p>This mask is used to check whether one of the CTRL meta keys is pressed.</p>
3082 *
3083 * @see #isCtrlPressed()
3084 * @see #getMetaState()
3085 * @see #KEYCODE_CTRL_LEFT
3086 * @see #KEYCODE_CTRL_RIGHT
3087 */
3088 public static final int META_CTRL_ON = 0x1000;
3089
3090 /**
3091 * <p>This mask is used to check whether the left CTRL meta key is pressed.</p>
3092 *
3093 * @see #isCtrlPressed()
3094 * @see #getMetaState()
3095 * @see #KEYCODE_CTRL_LEFT
3096 */
3097 public static final int META_CTRL_LEFT_ON = 0x2000;
3098
3099 /**
3100 * <p>This mask is used to check whether the right CTRL meta key is pressed.</p>
3101 *
3102 * @see #isCtrlPressed()
3103 * @see #getMetaState()
3104 * @see #KEYCODE_CTRL_RIGHT
3105 */
3106 public static final int META_CTRL_RIGHT_ON = 0x4000;
3107
3108 /**
3109 * <p>This mask is used to check whether one of the META meta keys is pressed.</p>
3110 *
3111 * @see #isMetaPressed()
3112 * @see #getMetaState()
3113 * @see #KEYCODE_META_LEFT
3114 * @see #KEYCODE_META_RIGHT
3115 */
3116 public static final int META_META_ON = 0x10000;
3117
3118 /**
3119 * <p>This mask is used to check whether the left META meta key is pressed.</p>
3120 *
3121 * @see #isMetaPressed()
3122 * @see #getMetaState()
3123 * @see #KEYCODE_META_LEFT
3124 */
3125 public static final int META_META_LEFT_ON = 0x20000;
3126
3127 /**
3128 * <p>This mask is used to check whether the right META meta key is pressed.</p>
3129 *
3130 * @see #isMetaPressed()
3131 * @see #getMetaState()
3132 * @see #KEYCODE_META_RIGHT
3133 */
3134 public static final int META_META_RIGHT_ON = 0x40000;
3135
3136 /**
3137 * <p>This mask is used to check whether the CAPS LOCK meta key is on.</p>
3138 *
3139 * @see #isCapsLockOn()
3140 * @see #getMetaState()
3141 * @see #KEYCODE_CAPS_LOCK
3142 */
3143 public static final int META_CAPS_LOCK_ON = 0x100000;
3144
3145 /**
3146 * <p>This mask is used to check whether the NUM LOCK meta key is on.</p>
3147 *
3148 * @see #isNumLockOn()
3149 * @see #getMetaState()
3150 * @see #KEYCODE_NUM_LOCK
3151 */
3152 public static final int META_NUM_LOCK_ON = 0x200000;
3153
3154 /**
3155 * <p>This mask is used to check whether the SCROLL LOCK meta key is on.</p>
3156 *
3157 * @see #isScrollLockOn()
3158 * @see #getMetaState()
3159 * @see #KEYCODE_SCROLL_LOCK
3160 */
3161 public static final int META_SCROLL_LOCK_ON = 0x400000;
3162
3163 /**
3164 * This mask is a combination of {@link #META_SHIFT_ON}, {@link #META_SHIFT_LEFT_ON}
3165 * and {@link #META_SHIFT_RIGHT_ON}.
3166 */
3167 public static final int META_SHIFT_MASK = META_SHIFT_ON
3168 | META_SHIFT_LEFT_ON | META_SHIFT_RIGHT_ON;
3169
3170 /**
3171 * This mask is a combination of {@link #META_ALT_ON}, {@link #META_ALT_LEFT_ON}
3172 * and {@link #META_ALT_RIGHT_ON}.
3173 */
3174 public static final int META_ALT_MASK = META_ALT_ON
3175 | META_ALT_LEFT_ON | META_ALT_RIGHT_ON;
3176
3177 /**
3178 * This mask is a combination of {@link #META_CTRL_ON}, {@link #META_CTRL_LEFT_ON}
3179 * and {@link #META_CTRL_RIGHT_ON}.
3180 */
3181 public static final int META_CTRL_MASK = META_CTRL_ON
3182 | META_CTRL_LEFT_ON | META_CTRL_RIGHT_ON;
3183
3184 /**
3185 * This mask is a combination of {@link #META_META_ON}, {@link #META_META_LEFT_ON}
3186 * and {@link #META_META_RIGHT_ON}.
3187 */
3188 public static final int META_META_MASK = META_META_ON
3189 | META_META_LEFT_ON | META_META_RIGHT_ON;
3190
3191 /**
3192 * This mask is set if the device woke because of this key event.
3193 */
3194 public static final int FLAG_WOKE_HERE = 0x1;
3195
3196 /**
3197 * This mask is set if the key event was generated by a software keyboard.
3198 */
3199 public static final int FLAG_SOFT_KEYBOARD = 0x2;
3200
3201 /**
3202 * This mask is set if we don't want the key event to cause us to leave
3203 * touch mode.
3204 */
3205 public static final int FLAG_KEEP_TOUCH_MODE = 0x4;
3206
3207 /**
3208 * This mask is set if an event was known to come from a trusted part
3209 * of the system. That is, the event is known to come from the user,
3210 * and could not have been spoofed by a third party component.
3211 */
3212 public static final int FLAG_FROM_SYSTEM = 0x8;
3213
3214 /**
3215 * This mask is used for compatibility, to identify enter keys that are
3216 * coming from an IME whose enter key has been auto-labelled "next" or
3217 * "done". This allows TextView to dispatch these as normal enter keys
3218 * for old applications, but still do the appropriate action when
3219 * receiving them.
3220 */
3221 public static final int FLAG_EDITOR_ACTION = 0x10;
3222
3223 /**
3224 * When associated with up key events, this indicates that the key press
3225 * has been canceled. Typically this is used with virtual touch screen
3226 * keys, where the user can slide from the virtual key area on to the
3227 * display: in that case, the application will receive a canceled up
3228 * event and should not perform the action normally associated with the
3229 * key. Note that for this to work, the application can not perform an
3230 * action for a key until it receives an up or the long press timeout has
3231 * expired.
3232 */
3233 public static final int FLAG_CANCELED = 0x20;
3234
3235 /**
3236 * This key event was generated by a virtual (on-screen) hard key area.
3237 * Typically this is an area of the touchscreen, outside of the regular
3238 * display, dedicated to "hardware" buttons.
3239 */
3240 public static final int FLAG_VIRTUAL_HARD_KEY = 0x40;
3241
3242 /**
3243 * This flag is set for the first key repeat that occurs after the
3244 * long press timeout.
3245 */
3246 public static final int FLAG_LONG_PRESS = 0x80;
3247
3248 /**
3249 * Set when a key event has {@link #FLAG_CANCELED} set because a long
3250 * press action was executed while it was down.
3251 */
3252 public static final int FLAG_CANCELED_LONG_PRESS = 0x100;
3253
3254 /**
3255 * Set for {@link #ACTION_UP} when this event's key code is still being
3256 * tracked from its initial down. That is, somebody requested that tracking
3257 * started on the key down and a long press has not caused
3258 * the tracking to be canceled.
3259 */
3260 public static final int FLAG_TRACKING = 0x200;
3261
3262 /**
3263 * Set when a key event has been synthesized to implement default behavior
3264 * for an event that the application did not handle.
3265 * Fallback key events are generated by unhandled trackball motions
3266 * (to emulate a directional keypad) and by certain unhandled key presses
3267 * that are declared in the key map (such as special function numeric keypad
3268 * keys when numlock is off).
3269 */
3270 public static final int FLAG_FALLBACK = 0x400;
3271
3272 /**
3273 * Private control to determine when an app is tracking a key sequence.
3274 * @hide
3275 */
3276 public static final int FLAG_START_TRACKING = 0x40000000;
3277
3278 /**
3279 * Private flag that indicates when the system has detected that this key event
3280 * may be inconsistent with respect to the sequence of previously delivered key events,
3281 * such as when a key up event is sent but the key was not down.
3282 *
3283 * @hide
3284 * @see #isTainted
3285 * @see #setTainted
3286 */
3287 public static final int FLAG_TAINTED = 0x80000000;
3288
3289 /**
3290 * Returns the maximum keycode.
3291 */
3292 public static int getMaxKeyCode() {
3293 return LAST_KEYCODE;
3294 }
3295
3296 /**
3297 * Get the character that is produced by putting accent on the character
3298 * c.
3299 * For example, getDeadChar('`', 'e') returns è.
3300 */
3301 public static int getDeadChar(int accent, int c) {
3302 return KeyCharacterMap.getDeadChar(accent, c);
3303 }
3304
3305 static final boolean DEBUG = false;
3306 static final String TAG = "KeyEvent";
3307
3308 private static final int MAX_RECYCLED = 10;
3309 private static final Object gRecyclerLock = new Object();
3310 private static int gRecyclerUsed;
3311 private static KeyEvent gRecyclerTop;
3312
3313 private KeyEvent mNext;
3314
3315 private int mDeviceId;
3316 private int mSource;
3317 private int mMetaState;
3318 private int mAction;
3319 private int mKeyCode;
3320 private int mScanCode;
3321 private int mRepeatCount;
3322 private int mFlags;
3323 private long mDownTime;
3324 private long mEventTime;
3325 private String mCharacters;
3326
3327 public interface Callback {
3328 /**
3329 * Called when a key down event has occurred. If you return true,
3330 * you can first call {@link KeyEvent#startTracking()
3331 * KeyEvent.startTracking()} to have the framework track the event
3332 * through its {@link #onKeyUp(int, KeyEvent)} and also call your
3333 * {@link #onKeyLongPress(int, KeyEvent)} if it occurs.
3334 *
3335 * @param keyCode The value in event.getKeyCode().
3336 * @param event Description of the key event.
3337 *
3338 * @return If you handled the event, return true. If you want to allow
3339 * the event to be handled by the next receiver, return false.
3340 */
3341 boolean onKeyDown(int keyCode, KeyEvent event);
3342
3343 /**
3344 * Called when a long press has occurred. If you return true,
3345 * the final key up will have {@link KeyEvent#FLAG_CANCELED} and
3346 * {@link KeyEvent#FLAG_CANCELED_LONG_PRESS} set. Note that in
3347 * order to receive this callback, someone in the event change
3348 * <em>must</em> return true from {@link #onKeyDown} <em>and</em>
3349 * call {@link KeyEvent#startTracking()} on the event.
3350 *
3351 * @param keyCode The value in event.getKeyCode().
3352 * @param event Description of the key event.
3353 *
3354 * @return If you handled the event, return true. If you want to allow
3355 * the event to be handled by the next receiver, return false.
3356 */
3357 boolean onKeyLongPress(int keyCode, KeyEvent event);
3358
3359 /**
3360 * Called when a key up event has occurred.
3361 *
3362 * @param keyCode The value in event.getKeyCode().
3363 * @param event Description of the key event.
3364 *
3365 * @return If you handled the event, return true. If you want to allow
3366 * the event to be handled by the next receiver, return false.
3367 */
3368 boolean onKeyUp(int keyCode, KeyEvent event);
3369
3370 /**
3371 * Called when multiple down/up pairs of the same key have occurred
3372 * in a row.
3373 *
3374 * @param keyCode The value in event.getKeyCode().
3375 * @param count Number of pairs as returned by event.getRepeatCount().
3376 * @param event Description of the key event.
3377 *
3378 * @return If you handled the event, return true. If you want to allow
3379 * the event to be handled by the next receiver, return false.
3380 */
3381 boolean onKeyMultiple(int keyCode, int count, KeyEvent event);
3382 }
3383
3384 static {
3385 populateKeycodeSymbolicNames();
3386 }
3387
3388 private KeyEvent() {
3389 }
3390
3391 /**
3392 * Create a new key event.
3393 *
3394 * @param action Action code: either {@link #ACTION_DOWN},
3395 * {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.
3396 * @param code The key code.
3397 */
3398 public KeyEvent(int action, int code) {
3399 mAction = action;
3400 mKeyCode = code;
3401 mRepeatCount = 0;
3402 mDeviceId = KeyCharacterMap.VIRTUAL_KEYBOARD;
3403 }
3404
3405 /**
3406 * Create a new key event.
3407 *
3408 * @param downTime The time (in {@link android.os.SystemClock#uptimeMillis})
3409 * at which this key code originally went down.
3410 * @param eventTime The time (in {@link android.os.SystemClock#uptimeMillis})
3411 * at which this event happened.
3412 * @param action Action code: either {@link #ACTION_DOWN},
3413 * {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.
3414 * @param code The key code.
3415 * @param repeat A repeat count for down events (> 0 if this is after the
3416 * initial down) or event count for multiple events.
3417 */
3418 public KeyEvent(long downTime, long eventTime, int action,
3419 int code, int repeat) {
3420 mDownTime = downTime;
3421 mEventTime = eventTime;
3422 mAction = action;
3423 mKeyCode = code;
3424 mRepeatCount = repeat;
3425 mDeviceId = KeyCharacterMap.VIRTUAL_KEYBOARD;
3426 }
3427
3428 /**
3429 * Create a new key event.
3430 *
3431 * @param downTime The time (in {@link android.os.SystemClock#uptimeMillis})
3432 * at which this key code originally went down.
3433 * @param eventTime The time (in {@link android.os.SystemClock#uptimeMillis})
3434 * at which this event happened.
3435 * @param action Action code: either {@link #ACTION_DOWN},
3436 * {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.
3437 * @param code The key code.
3438 * @param repeat A repeat count for down events (> 0 if this is after the
3439 * initial down) or event count for multiple events.
3440 * @param metaState Flags indicating which meta keys are currently pressed.
3441 */
3442 public KeyEvent(long downTime, long eventTime, int action,
3443 int code, int repeat, int metaState) {
3444 mDownTime = downTime;
3445 mEventTime = eventTime;
3446 mAction = action;
3447 mKeyCode = code;
3448 mRepeatCount = repeat;
3449 mMetaState = metaState;
3450 mDeviceId = KeyCharacterMap.VIRTUAL_KEYBOARD;
3451 }
3452
3453 /**
3454 * Create a new key event.
3455 *
3456 * @param downTime The time (in {@link android.os.SystemClock#uptimeMillis})
3457 * at which this key code originally went down.
3458 * @param eventTime The time (in {@link android.os.SystemClock#uptimeMillis})
3459 * at which this event happened.
3460 * @param action Action code: either {@link #ACTION_DOWN},
3461 * {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.
3462 * @param code The key code.
3463 * @param repeat A repeat count for down events (> 0 if this is after the
3464 * initial down) or event count for multiple events.
3465 * @param metaState Flags indicating which meta keys are currently pressed.
3466 * @param deviceId The device ID that generated the key event.
3467 * @param scancode Raw device scan code of the event.
3468 */
3469 public KeyEvent(long downTime, long eventTime, int action,
3470 int code, int repeat, int metaState,
3471 int deviceId, int scancode) {
3472 mDownTime = downTime;
3473 mEventTime = eventTime;
3474 mAction = action;
3475 mKeyCode = code;
3476 mRepeatCount = repeat;
3477 mMetaState = metaState;
3478 mDeviceId = deviceId;
3479 mScanCode = scancode;
3480 }
3481
3482 /**
3483 * Create a new key event.
3484 *
3485 * @param downTime The time (in {@link android.os.SystemClock#uptimeMillis})
3486 * at which this key code originally went down.
3487 * @param eventTime The time (in {@link android.os.SystemClock#uptimeMillis})
3488 * at which this event happened.
3489 * @param action Action code: either {@link #ACTION_DOWN},
3490 * {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.
3491 * @param code The key code.
3492 * @param repeat A repeat count for down events (> 0 if this is after the
3493 * initial down) or event count for multiple events.
3494 * @param metaState Flags indicating which meta keys are currently pressed.
3495 * @param deviceId The device ID that generated the key event.
3496 * @param scancode Raw device scan code of the event.
3497 * @param flags The flags for this key event
3498 */
3499 public KeyEvent(long downTime, long eventTime, int action,
3500 int code, int repeat, int metaState,
3501 int deviceId, int scancode, int flags) {
3502 mDownTime = downTime;
3503 mEventTime = eventTime;
3504 mAction = action;
3505 mKeyCode = code;
3506 mRepeatCount = repeat;
3507 mMetaState = metaState;
3508 mDeviceId = deviceId;
3509 mScanCode = scancode;
3510 mFlags = flags;
3511 }
3512
3513 /**
3514 * Create a new key event.
3515 *
3516 * @param downTime The time (in {@link android.os.SystemClock#uptimeMillis})
3517 * at which this key code originally went down.
3518 * @param eventTime The time (in {@link android.os.SystemClock#uptimeMillis})
3519 * at which this event happened.
3520 * @param action Action code: either {@link #ACTION_DOWN},
3521 * {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.
3522 * @param code The key code.
3523 * @param repeat A repeat count for down events (> 0 if this is after the
3524 * initial down) or event count for multiple events.
3525 * @param metaState Flags indicating which meta keys are currently pressed.
3526 * @param deviceId The device ID that generated the key event.
3527 * @param scancode Raw device scan code of the event.
3528 * @param flags The flags for this key event
3529 * @param source The input source such as {@link InputDevice#SOURCE_KEYBOARD}.
3530 */
3531 public KeyEvent(long downTime, long eventTime, int action,
3532 int code, int repeat, int metaState,
3533 int deviceId, int scancode, int flags, int source) {
3534 mDownTime = downTime;
3535 mEventTime = eventTime;
3536 mAction = action;
3537 mKeyCode = code;
3538 mRepeatCount = repeat;
3539 mMetaState = metaState;
3540 mDeviceId = deviceId;
3541 mScanCode = scancode;
3542 mFlags = flags;
3543 mSource = source;
3544 }
3545
3546 /**
3547 * Create a new key event for a string of characters. The key code,
3548 * action, repeat count and source will automatically be set to
3549 * {@link #KEYCODE_UNKNOWN}, {@link #ACTION_MULTIPLE}, 0, and
3550 * {@link InputDevice#SOURCE_KEYBOARD} for you.
3551 *
3552 * @param time The time (in {@link android.os.SystemClock#uptimeMillis})
3553 * at which this event occured.
3554 * @param characters The string of characters.
3555 * @param deviceId The device ID that generated the key event.
3556 * @param flags The flags for this key event
3557 */
3558 public KeyEvent(long time, String characters, int deviceId, int flags) {
3559 mDownTime = time;
3560 mEventTime = time;
3561 mCharacters = characters;
3562 mAction = ACTION_MULTIPLE;
3563 mKeyCode = KEYCODE_UNKNOWN;
3564 mRepeatCount = 0;
3565 mDeviceId = deviceId;
3566 mFlags = flags;
3567 mSource = InputDevice.SOURCE_KEYBOARD;
3568 }
3569
3570 /**
3571 * Make an exact copy of an existing key event.
3572 */
3573 public KeyEvent(KeyEvent origEvent) {
3574 mDownTime = origEvent.mDownTime;
3575 mEventTime = origEvent.mEventTime;
3576 mAction = origEvent.mAction;
3577 mKeyCode = origEvent.mKeyCode;
3578 mRepeatCount = origEvent.mRepeatCount;
3579 mMetaState = origEvent.mMetaState;
3580 mDeviceId = origEvent.mDeviceId;
3581 mSource = origEvent.mSource;
3582 mScanCode = origEvent.mScanCode;
3583 mFlags = origEvent.mFlags;
3584 mCharacters = origEvent.mCharacters;
3585 }
3586
3587 /**
3588 * Copy an existing key event, modifying its time and repeat count.
3589 *
3590 * @deprecated Use {@link #changeTimeRepeat(KeyEvent, long, int)}
3591 * instead.
3592 *
3593 * @param origEvent The existing event to be copied.
3594 * @param eventTime The new event time
3595 * (in {@link android.os.SystemClock#uptimeMillis}) of the event.
3596 * @param newRepeat The new repeat count of the event.
3597 */
3598 @Deprecated
3599 public KeyEvent(KeyEvent origEvent, long eventTime, int newRepeat) {
3600 mDownTime = origEvent.mDownTime;
3601 mEventTime = eventTime;
3602 mAction = origEvent.mAction;
3603 mKeyCode = origEvent.mKeyCode;
3604 mRepeatCount = newRepeat;
3605 mMetaState = origEvent.mMetaState;
3606 mDeviceId = origEvent.mDeviceId;
3607 mSource = origEvent.mSource;
3608 mScanCode = origEvent.mScanCode;
3609 mFlags = origEvent.mFlags;
3610 mCharacters = origEvent.mCharacters;
3611 }
3612
3613 private static KeyEvent obtain() {
3614 final KeyEvent ev;
3615 synchronized (gRecyclerLock) {
3616 ev = gRecyclerTop;
3617 if (ev == null) {
3618 return new KeyEvent();
3619 }
3620 gRecyclerTop = ev.mNext;
3621 gRecyclerUsed -= 1;
3622 }
3623 ev.mNext = null;
3624 ev.prepareForReuse();
3625 return ev;
3626 }
3627
3628 /**
3629 * Obtains a (potentially recycled) key event.
3630 *
3631 * @hide
3632 */
3633 public static KeyEvent obtain(long downTime, long eventTime, int action,
3634 int code, int repeat, int metaState,
3635 int deviceId, int scancode, int flags, int source, String characters) {
3636 KeyEvent ev = obtain();
3637 ev.mDownTime = downTime;
3638 ev.mEventTime = eventTime;
3639 ev.mAction = action;
3640 ev.mKeyCode = code;
3641 ev.mRepeatCount = repeat;
3642 ev.mMetaState = metaState;
3643 ev.mDeviceId = deviceId;
3644 ev.mScanCode = scancode;
3645 ev.mFlags = flags;
3646 ev.mSource = source;
3647 ev.mCharacters = characters;
3648 return ev;
3649 }
3650
3651 /**
3652 * Obtains a (potentially recycled) copy of another key event.
3653 *
3654 * @hide
3655 */
3656 public static KeyEvent obtain(KeyEvent other) {
3657 KeyEvent ev = obtain();
3658 ev.mDownTime = other.mDownTime;
3659 ev.mEventTime = other.mEventTime;
3660 ev.mAction = other.mAction;
3661 ev.mKeyCode = other.mKeyCode;
3662 ev.mRepeatCount = other.mRepeatCount;
3663 ev.mMetaState = other.mMetaState;
3664 ev.mDeviceId = other.mDeviceId;
3665 ev.mScanCode = other.mScanCode;
3666 ev.mFlags = other.mFlags;
3667 ev.mSource = other.mSource;
3668 ev.mCharacters = other.mCharacters;
3669 return ev;
3670 }
3671
3672 /** @hide */
3673 @Override
3674 public KeyEvent copy() {
3675 return obtain(this);
3676 }
3677
3678 /**
3679 * Recycles a key event.
3680 * Key events should only be recycled if they are owned by the system since user
3681 * code expects them to be essentially immutable, "tracking" notwithstanding.
3682 *
3683 * @hide
3684 */
3685 @Override
3686 public final void recycle() {
3687 super.recycle();
3688 mCharacters = null;
3689
3690 synchronized (gRecyclerLock) {
3691 if (gRecyclerUsed < MAX_RECYCLED) {
3692 gRecyclerUsed++;
3693 mNext = gRecyclerTop;
3694 gRecyclerTop = this;
3695 }
3696 }
3697 }
3698
3699 /** @hide */
3700 @Override
3701 public final void recycleIfNeededAfterDispatch() {
3702 // Do nothing.
3703 }
3704
3705 /**
3706 * Create a new key event that is the same as the given one, but whose
3707 * event time and repeat count are replaced with the given value.
3708 *
3709 * @param event The existing event to be copied. This is not modified.
3710 * @param eventTime The new event time
3711 * (in {@link android.os.SystemClock#uptimeMillis}) of the event.
3712 * @param newRepeat The new repeat count of the event.
3713 */
3714 public static KeyEvent changeTimeRepeat(KeyEvent event, long eventTime,
3715 int newRepeat) {
3716 return new KeyEvent(event, eventTime, newRepeat);
3717 }
3718
3719 /**
3720 * Create a new key event that is the same as the given one, but whose
3721 * event time and repeat count are replaced with the given value.
3722 *
3723 * @param event The existing event to be copied. This is not modified.
3724 * @param eventTime The new event time
3725 * (in {@link android.os.SystemClock#uptimeMillis}) of the event.
3726 * @param newRepeat The new repeat count of the event.
3727 * @param newFlags New flags for the event, replacing the entire value
3728 * in the original event.
3729 */
3730 public static KeyEvent changeTimeRepeat(KeyEvent event, long eventTime,
3731 int newRepeat, int newFlags) {
3732 KeyEvent ret = new KeyEvent(event);
3733 ret.mEventTime = eventTime;
3734 ret.mRepeatCount = newRepeat;
3735 ret.mFlags = newFlags;
3736 return ret;
3737 }
3738
3739 /**
3740 * Copy an existing key event, modifying its action.
3741 *
3742 * @param origEvent The existing event to be copied.
3743 * @param action The new action code of the event.
3744 */
3745 private KeyEvent(KeyEvent origEvent, int action) {
3746 mDownTime = origEvent.mDownTime;
3747 mEventTime = origEvent.mEventTime;
3748 mAction = action;
3749 mKeyCode = origEvent.mKeyCode;
3750 mRepeatCount = origEvent.mRepeatCount;
3751 mMetaState = origEvent.mMetaState;
3752 mDeviceId = origEvent.mDeviceId;
3753 mSource = origEvent.mSource;
3754 mScanCode = origEvent.mScanCode;
3755 mFlags = origEvent.mFlags;
3756 // Don't copy mCharacters, since one way or the other we'll lose it
3757 // when changing the action.
3758 }
3759
3760 /**
3761 * Create a new key event that is the same as the given one, but whose
3762 * action is replaced with the given value.
3763 *
3764 * @param event The existing event to be copied. This is not modified.
3765 * @param action The new action code of the event.
3766 */
3767 public static KeyEvent changeAction(KeyEvent event, int action) {
3768 return new KeyEvent(event, action);
3769 }
3770
3771 /**
3772 * Create a new key event that is the same as the given one, but whose
3773 * flags are replaced with the given value.
3774 *
3775 * @param event The existing event to be copied. This is not modified.
3776 * @param flags The new flags constant.
3777 */
3778 public static KeyEvent changeFlags(KeyEvent event, int flags) {
3779 event = new KeyEvent(event);
3780 event.mFlags = flags;
3781 return event;
3782 }
3783
3784 /** @hide */
3785 @Override
3786 public final boolean isTainted() {
3787 return (mFlags & FLAG_TAINTED) != 0;
3788 }
3789
3790 /** @hide */
3791 @Override
3792 public final void setTainted(boolean tainted) {
3793 mFlags = tainted ? mFlags | FLAG_TAINTED : mFlags & ~FLAG_TAINTED;
3794 }
3795
3796 /**
3797 * Don't use in new code, instead explicitly check
3798 * {@link #getAction()}.
3799 *
3800 * @return If the action is ACTION_DOWN, returns true; else false.
3801 *
3802 * @deprecated
3803 * @hide
3804 */
3805 @Deprecated public final boolean isDown() {
3806 return mAction == ACTION_DOWN;
3807 }
3808
3809 /**
3810 * Is this a system key? System keys can not be used for menu shortcuts.
3811 *
3812 * TODO: this information should come from a table somewhere.
3813 * TODO: should the dpad keys be here? arguably, because they also shouldn't be menu shortcuts
3814 */
3815 public final boolean isSystem() {
3816 return native_isSystemKey(mKeyCode);
3817 }
3818
3819 /** @hide */
3820 public final boolean hasDefaultAction() {
3821 return native_hasDefaultAction(mKeyCode);
3822 }
3823
3824 /**
3825 * Returns true if the specified keycode is a gamepad button.
3826 * @return True if the keycode is a gamepad button, such as {@link #KEYCODE_BUTTON_A}.
3827 */
3828 public static final boolean isGamepadButton(int keyCode) {
3829 switch (keyCode) {
3830 case KeyEvent.KEYCODE_BUTTON_A:
3831 case KeyEvent.KEYCODE_BUTTON_B:
3832 case KeyEvent.KEYCODE_BUTTON_C:
3833 case KeyEvent.KEYCODE_BUTTON_X:
3834 case KeyEvent.KEYCODE_BUTTON_Y:
3835 case KeyEvent.KEYCODE_BUTTON_Z:
3836 case KeyEvent.KEYCODE_BUTTON_L1:
3837 case KeyEvent.KEYCODE_BUTTON_R1:
3838 case KeyEvent.KEYCODE_BUTTON_L2:
3839 case KeyEvent.KEYCODE_BUTTON_R2:
3840 case KeyEvent.KEYCODE_BUTTON_THUMBL:
3841 case KeyEvent.KEYCODE_BUTTON_THUMBR:
3842 case KeyEvent.KEYCODE_BUTTON_START:
3843 case KeyEvent.KEYCODE_BUTTON_SELECT:
3844 case KeyEvent.KEYCODE_BUTTON_MODE:
3845 case KeyEvent.KEYCODE_BUTTON_1:
3846 case KeyEvent.KEYCODE_BUTTON_2:
3847 case KeyEvent.KEYCODE_BUTTON_3:
3848 case KeyEvent.KEYCODE_BUTTON_4:
3849 case KeyEvent.KEYCODE_BUTTON_5:
3850 case KeyEvent.KEYCODE_BUTTON_6:
3851 case KeyEvent.KEYCODE_BUTTON_7:
3852 case KeyEvent.KEYCODE_BUTTON_8:
3853 case KeyEvent.KEYCODE_BUTTON_9:
3854 case KeyEvent.KEYCODE_BUTTON_10:
3855 case KeyEvent.KEYCODE_BUTTON_11:
3856 case KeyEvent.KEYCODE_BUTTON_12:
3857 case KeyEvent.KEYCODE_BUTTON_13:
3858 case KeyEvent.KEYCODE_BUTTON_14:
3859 case KeyEvent.KEYCODE_BUTTON_15:
3860 case KeyEvent.KEYCODE_BUTTON_16:
3861 return true;
3862 default:
3863 return false;
3864 }
3865 }
3866
3867 /** {@inheritDoc} */
3868 @Override
3869 public final int getDeviceId() {
3870 return mDeviceId;
3871 }
3872
3873 /** {@inheritDoc} */
3874 @Override
3875 public final int getSource() {
3876 return mSource;
3877 }
3878
3879 /** {@inheritDoc} */
3880 @Override
3881 public final void setSource(int source) {
3882 mSource = source;
3883 }
3884
3885 /**
3886 * <p>Returns the state of the meta keys.</p>
3887 *
3888 * @return an integer in which each bit set to 1 represents a pressed
3889 * meta key
3890 *
3891 * @see #isAltPressed()
3892 * @see #isShiftPressed()
3893 * @see #isSymPressed()
3894 * @see #isCtrlPressed()
3895 * @see #isMetaPressed()
3896 * @see #isFunctionPressed()
3897 * @see #isCapsLockOn()
3898 * @see #isNumLockOn()
3899 * @see #isScrollLockOn()
3900 * @see #META_ALT_ON
3901 * @see #META_ALT_LEFT_ON
3902 * @see #META_ALT_RIGHT_ON
3903 * @see #META_SHIFT_ON
3904 * @see #META_SHIFT_LEFT_ON
3905 * @see #META_SHIFT_RIGHT_ON
3906 * @see #META_SYM_ON
3907 * @see #META_FUNCTION_ON
3908 * @see #META_CTRL_ON
3909 * @see #META_CTRL_LEFT_ON
3910 * @see #META_CTRL_RIGHT_ON
3911 * @see #META_META_ON
3912 * @see #META_META_LEFT_ON
3913 * @see #META_META_RIGHT_ON
3914 * @see #META_CAPS_LOCK_ON
3915 * @see #META_NUM_LOCK_ON
3916 * @see #META_SCROLL_LOCK_ON
3917 * @see #getModifiers
3918 */
3919 public final int getMetaState() {
3920 return mMetaState;
3921 }
3922
3923 /**
3924 * Returns the state of the modifier keys.
3925 * <p>
3926 * For the purposes of this function, {@link #KEYCODE_CAPS_LOCK},
3927 * {@link #KEYCODE_SCROLL_LOCK}, and {@link #KEYCODE_NUM_LOCK} are
3928 * not considered modifier keys. Consequently, this function specifically masks out
3929 * {@link #META_CAPS_LOCK_ON}, {@link #META_SCROLL_LOCK_ON} and {@link #META_NUM_LOCK_ON}.
3930 * </p><p>
3931 * The value returned consists of the meta state (from {@link #getMetaState})
3932 * normalized using {@link #normalizeMetaState(int)} and then masked with
3933 * {@link #getModifierMetaStateMask} so that only valid modifier bits are retained.
3934 * </p>
3935 *
3936 * @return An integer in which each bit set to 1 represents a pressed modifier key.
3937 * @see #getMetaState
3938 */
3939 public final int getModifiers() {
3940 return normalizeMetaState(mMetaState) & META_MODIFIER_MASK;
3941 }
3942
3943 /**
3944 * Returns the flags for this key event.
3945 *
3946 * @see #FLAG_WOKE_HERE
3947 */
3948 public final int getFlags() {
3949 return mFlags;
3950 }
3951
3952 // Mask of all modifier key meta states. Specifically excludes locked keys like caps lock.
3953 private static final int META_MODIFIER_MASK =
3954 META_SHIFT_ON | META_SHIFT_LEFT_ON | META_SHIFT_RIGHT_ON
3955 | META_ALT_ON | META_ALT_LEFT_ON | META_ALT_RIGHT_ON
3956 | META_CTRL_ON | META_CTRL_LEFT_ON | META_CTRL_RIGHT_ON
3957 | META_META_ON | META_META_LEFT_ON | META_META_RIGHT_ON
3958 | META_SYM_ON | META_FUNCTION_ON;
3959
3960 // Mask of all lock key meta states.
3961 private static final int META_LOCK_MASK =
3962 META_CAPS_LOCK_ON | META_NUM_LOCK_ON | META_SCROLL_LOCK_ON;
3963
3964 // Mask of all valid meta states.
3965 private static final int META_ALL_MASK = META_MODIFIER_MASK | META_LOCK_MASK;
3966
3967 // Mask of all synthetic meta states that are reserved for API compatibility with
3968 // historical uses in MetaKeyKeyListener.
3969 private static final int META_SYNTHETIC_MASK =
3970 META_CAP_LOCKED | META_ALT_LOCKED | META_SYM_LOCKED | META_SELECTING;
3971
3972 // Mask of all meta states that are not valid use in specifying a modifier key.
3973 // These bits are known to be used for purposes other than specifying modifiers.
3974 private static final int META_INVALID_MODIFIER_MASK =
3975 META_LOCK_MASK | META_SYNTHETIC_MASK;
3976
3977 /**
3978 * Gets a mask that includes all valid modifier key meta state bits.
3979 * <p>
3980 * For the purposes of this function, {@link #KEYCODE_CAPS_LOCK},
3981 * {@link #KEYCODE_SCROLL_LOCK}, and {@link #KEYCODE_NUM_LOCK} are
3982 * not considered modifier keys. Consequently, the mask specifically excludes
3983 * {@link #META_CAPS_LOCK_ON}, {@link #META_SCROLL_LOCK_ON} and {@link #META_NUM_LOCK_ON}.
3984 * </p>
3985 *
3986 * @return The modifier meta state mask which is a combination of
3987 * {@link #META_SHIFT_ON}, {@link #META_SHIFT_LEFT_ON}, {@link #META_SHIFT_RIGHT_ON},
3988 * {@link #META_ALT_ON}, {@link #META_ALT_LEFT_ON}, {@link #META_ALT_RIGHT_ON},
3989 * {@link #META_CTRL_ON}, {@link #META_CTRL_LEFT_ON}, {@link #META_CTRL_RIGHT_ON},
3990 * {@link #META_META_ON}, {@link #META_META_LEFT_ON}, {@link #META_META_RIGHT_ON},
3991 * {@link #META_SYM_ON}, {@link #META_FUNCTION_ON}.
3992 */
3993 public static int getModifierMetaStateMask() {
3994 return META_MODIFIER_MASK;
3995 }
3996
3997 /**
3998 * Returns true if this key code is a modifier key.
3999 * <p>
4000 * For the purposes of this function, {@link #KEYCODE_CAPS_LOCK},
4001 * {@link #KEYCODE_SCROLL_LOCK}, and {@link #KEYCODE_NUM_LOCK} are
4002 * not considered modifier keys. Consequently, this function return false
4003 * for those keys.
4004 * </p>
4005 *
4006 * @return True if the key code is one of
4007 * {@link #KEYCODE_SHIFT_LEFT} {@link #KEYCODE_SHIFT_RIGHT},
4008 * {@link #KEYCODE_ALT_LEFT}, {@link #KEYCODE_ALT_RIGHT},
4009 * {@link #KEYCODE_CTRL_LEFT}, {@link #KEYCODE_CTRL_RIGHT},
4010 * {@link #KEYCODE_META_LEFT}, or {@link #KEYCODE_META_RIGHT},
4011 * {@link #KEYCODE_SYM}, {@link #KEYCODE_NUM}, {@link #KEYCODE_FUNCTION}.
4012 */
4013 public static boolean isModifierKey(int keyCode) {
4014 switch (keyCode) {
4015 case KEYCODE_SHIFT_LEFT:
4016 case KEYCODE_SHIFT_RIGHT:
4017 case KEYCODE_ALT_LEFT:
4018 case KEYCODE_ALT_RIGHT:
4019 case KEYCODE_CTRL_LEFT:
4020 case KEYCODE_CTRL_RIGHT:
4021 case KEYCODE_META_LEFT:
4022 case KEYCODE_META_RIGHT:
4023 case KEYCODE_SYM:
4024 case KEYCODE_NUM:
4025 case KEYCODE_FUNCTION:
4026 return true;
4027 default:
4028 return false;
4029 }
4030 }
4031
4032 /**
4033 * Normalizes the specified meta state.
4034 * <p>
4035 * The meta state is normalized such that if either the left or right modifier meta state
4036 * bits are set then the result will also include the universal bit for that modifier.
4037 * </p><p>
4038 * If the specified meta state contains {@link #META_ALT_LEFT_ON} then
4039 * the result will also contain {@link #META_ALT_ON} in addition to {@link #META_ALT_LEFT_ON}
4040 * and the other bits that were specified in the input. The same is process is
4041 * performed for shift, control and meta.
4042 * </p><p>
4043 * If the specified meta state contains synthetic meta states defined by
4044 * {@link MetaKeyKeyListener}, then those states are translated here and the original
4045 * synthetic meta states are removed from the result.
4046 * {@link MetaKeyKeyListener#META_CAP_LOCKED} is translated to {@link #META_CAPS_LOCK_ON}.
4047 * {@link MetaKeyKeyListener#META_ALT_LOCKED} is translated to {@link #META_ALT_ON}.
4048 * {@link MetaKeyKeyListener#META_SYM_LOCKED} is translated to {@link #META_SYM_ON}.
4049 * </p><p>
4050 * Undefined meta state bits are removed.
4051 * </p>
4052 *
4053 * @param metaState The meta state.
4054 * @return The normalized meta state.
4055 */
4056 public static int normalizeMetaState(int metaState) {
4057 if ((metaState & (META_SHIFT_LEFT_ON | META_SHIFT_RIGHT_ON)) != 0) {
4058 metaState |= META_SHIFT_ON;
4059 }
4060 if ((metaState & (META_ALT_LEFT_ON | META_ALT_RIGHT_ON)) != 0) {
4061 metaState |= META_ALT_ON;
4062 }
4063 if ((metaState & (META_CTRL_LEFT_ON | META_CTRL_RIGHT_ON)) != 0) {
4064 metaState |= META_CTRL_ON;
4065 }
4066 if ((metaState & (META_META_LEFT_ON | META_META_RIGHT_ON)) != 0) {
4067 metaState |= META_META_ON;
4068 }
4069 if ((metaState & MetaKeyKeyListener.META_CAP_LOCKED) != 0) {
4070 metaState |= META_CAPS_LOCK_ON;
4071 }
4072 if ((metaState & MetaKeyKeyListener.META_ALT_LOCKED) != 0) {
4073 metaState |= META_ALT_ON;
4074 }
4075 if ((metaState & MetaKeyKeyListener.META_SYM_LOCKED) != 0) {
4076 metaState |= META_SYM_ON;
4077 }
4078 return metaState & META_ALL_MASK;
4079 }
4080
4081 /**
4082 * Returns true if no modifiers keys are pressed according to the specified meta state.
4083 * <p>
4084 * For the purposes of this function, {@link #KEYCODE_CAPS_LOCK},
4085 * {@link #KEYCODE_SCROLL_LOCK}, and {@link #KEYCODE_NUM_LOCK} are
4086 * not considered modifier keys. Consequently, this function ignores
4087 * {@link #META_CAPS_LOCK_ON}, {@link #META_SCROLL_LOCK_ON} and {@link #META_NUM_LOCK_ON}.
4088 * </p><p>
4089 * The meta state is normalized prior to comparison using {@link #normalizeMetaState(int)}.
4090 * </p>
4091 *
4092 * @param metaState The meta state to consider.
4093 * @return True if no modifier keys are pressed.
4094 * @see #hasNoModifiers()
4095 */
4096 public static boolean metaStateHasNoModifiers(int metaState) {
4097 return (normalizeMetaState(metaState) & META_MODIFIER_MASK) == 0;
4098 }
4099
4100 /**
4101 * Returns true if only the specified modifier keys are pressed according to
4102 * the specified meta state. Returns false if a different combination of modifier
4103 * keys are pressed.
4104 * <p>
4105 * For the purposes of this function, {@link #KEYCODE_CAPS_LOCK},
4106 * {@link #KEYCODE_SCROLL_LOCK}, and {@link #KEYCODE_NUM_LOCK} are
4107 * not considered modifier keys. Consequently, this function ignores
4108 * {@link #META_CAPS_LOCK_ON}, {@link #META_SCROLL_LOCK_ON} and {@link #META_NUM_LOCK_ON}.
4109 * </p><p>
4110 * If the specified modifier mask includes directional modifiers, such as
4111 * {@link #META_SHIFT_LEFT_ON}, then this method ensures that the
4112 * modifier is pressed on that side.
4113 * If the specified modifier mask includes non-directional modifiers, such as
4114 * {@link #META_SHIFT_ON}, then this method ensures that the modifier
4115 * is pressed on either side.
4116 * If the specified modifier mask includes both directional and non-directional modifiers
4117 * for the same type of key, such as {@link #META_SHIFT_ON} and {@link #META_SHIFT_LEFT_ON},
4118 * then this method throws an illegal argument exception.
4119 * </p>
4120 *
4121 * @param metaState The meta state to consider.
4122 * @param modifiers The meta state of the modifier keys to check. May be a combination
4123 * of modifier meta states as defined by {@link #getModifierMetaStateMask()}. May be 0 to
4124 * ensure that no modifier keys are pressed.
4125 * @return True if only the specified modifier keys are pressed.
4126 * @throws IllegalArgumentException if the modifiers parameter contains invalid modifiers
4127 * @see #hasModifiers
4128 */
4129 public static boolean metaStateHasModifiers(int metaState, int modifiers) {
4130 // Note: For forward compatibility, we allow the parameter to contain meta states
4131 // that we do not recognize but we explicitly disallow meta states that
4132 // are not valid modifiers.
4133 if ((modifiers & META_INVALID_MODIFIER_MASK) != 0) {
4134 throw new IllegalArgumentException("modifiers must not contain "
4135 + "META_CAPS_LOCK_ON, META_NUM_LOCK_ON, META_SCROLL_LOCK_ON, "
4136 + "META_CAP_LOCKED, META_ALT_LOCKED, META_SYM_LOCKED, "
4137 + "or META_SELECTING");
4138 }
4139
4140 metaState = normalizeMetaState(metaState) & META_MODIFIER_MASK;
4141 metaState = metaStateFilterDirectionalModifiers(metaState, modifiers,
4142 META_SHIFT_ON, META_SHIFT_LEFT_ON, META_SHIFT_RIGHT_ON);
4143 metaState = metaStateFilterDirectionalModifiers(metaState, modifiers,
4144 META_ALT_ON, META_ALT_LEFT_ON, META_ALT_RIGHT_ON);
4145 metaState = metaStateFilterDirectionalModifiers(metaState, modifiers,
4146 META_CTRL_ON, META_CTRL_LEFT_ON, META_CTRL_RIGHT_ON);
4147 metaState = metaStateFilterDirectionalModifiers(metaState, modifiers,
4148 META_META_ON, META_META_LEFT_ON, META_META_RIGHT_ON);
4149 return metaState == modifiers;
4150 }
4151
4152 private static int metaStateFilterDirectionalModifiers(int metaState,
4153 int modifiers, int basic, int left, int right) {
4154 final boolean wantBasic = (modifiers & basic) != 0;
4155 final int directional = left | right;
4156 final boolean wantLeftOrRight = (modifiers & directional) != 0;
4157
4158 if (wantBasic) {
4159 if (wantLeftOrRight) {
4160 throw new IllegalArgumentException("modifiers must not contain "
4161 + metaStateToString(basic) + " combined with "
4162 + metaStateToString(left) + " or " + metaStateToString(right));
4163 }
4164 return metaState & ~directional;
4165 } else if (wantLeftOrRight) {
4166 return metaState & ~basic;
4167 } else {
4168 return metaState;
4169 }
4170 }
4171
4172 /**
4173 * Returns true if no modifier keys are pressed.
4174 * <p>
4175 * For the purposes of this function, {@link #KEYCODE_CAPS_LOCK},
4176 * {@link #KEYCODE_SCROLL_LOCK}, and {@link #KEYCODE_NUM_LOCK} are
4177 * not considered modifier keys. Consequently, this function ignores
4178 * {@link #META_CAPS_LOCK_ON}, {@link #META_SCROLL_LOCK_ON} and {@link #META_NUM_LOCK_ON}.
4179 * </p><p>
4180 * The meta state is normalized prior to comparison using {@link #normalizeMetaState(int)}.
4181 * </p>
4182 *
4183 * @return True if no modifier keys are pressed.
4184 * @see #metaStateHasNoModifiers
4185 */
4186 public final boolean hasNoModifiers() {
4187 return metaStateHasNoModifiers(mMetaState);
4188 }
4189
4190 /**
4191 * Returns true if only the specified modifiers keys are pressed.
4192 * Returns false if a different combination of modifier keys are pressed.
4193 * <p>
4194 * For the purposes of this function, {@link #KEYCODE_CAPS_LOCK},
4195 * {@link #KEYCODE_SCROLL_LOCK}, and {@link #KEYCODE_NUM_LOCK} are
4196 * not considered modifier keys. Consequently, this function ignores
4197 * {@link #META_CAPS_LOCK_ON}, {@link #META_SCROLL_LOCK_ON} and {@link #META_NUM_LOCK_ON}.
4198 * </p><p>
4199 * If the specified modifier mask includes directional modifiers, such as
4200 * {@link #META_SHIFT_LEFT_ON}, then this method ensures that the
4201 * modifier is pressed on that side.
4202 * If the specified modifier mask includes non-directional modifiers, such as
4203 * {@link #META_SHIFT_ON}, then this method ensures that the modifier
4204 * is pressed on either side.
4205 * If the specified modifier mask includes both directional and non-directional modifiers
4206 * for the same type of key, such as {@link #META_SHIFT_ON} and {@link #META_SHIFT_LEFT_ON},
4207 * then this method throws an illegal argument exception.
4208 * </p>
4209 *
4210 * @param modifiers The meta state of the modifier keys to check. May be a combination
4211 * of modifier meta states as defined by {@link #getModifierMetaStateMask()}. May be 0 to
4212 * ensure that no modifier keys are pressed.
4213 * @return True if only the specified modifier keys are pressed.
4214 * @throws IllegalArgumentException if the modifiers parameter contains invalid modifiers
4215 * @see #metaStateHasModifiers
4216 */
4217 public final boolean hasModifiers(int modifiers) {
4218 return metaStateHasModifiers(mMetaState, modifiers);
4219 }
4220
4221 /**
4222 * <p>Returns the pressed state of the ALT meta key.</p>
4223 *
4224 * @return true if the ALT key is pressed, false otherwise
4225 *
4226 * @see #KEYCODE_ALT_LEFT
4227 * @see #KEYCODE_ALT_RIGHT
4228 * @see #META_ALT_ON
4229 */
4230 public final boolean isAltPressed() {
4231 return (mMetaState & META_ALT_ON) != 0;
4232 }
4233
4234 /**
4235 * <p>Returns the pressed state of the SHIFT meta key.</p>
4236 *
4237 * @return true if the SHIFT key is pressed, false otherwise
4238 *
4239 * @see #KEYCODE_SHIFT_LEFT
4240 * @see #KEYCODE_SHIFT_RIGHT
4241 * @see #META_SHIFT_ON
4242 */
4243 public final boolean isShiftPressed() {
4244 return (mMetaState & META_SHIFT_ON) != 0;
4245 }
4246
4247 /**
4248 * <p>Returns the pressed state of the SYM meta key.</p>
4249 *
4250 * @return true if the SYM key is pressed, false otherwise
4251 *
4252 * @see #KEYCODE_SYM
4253 * @see #META_SYM_ON
4254 */
4255 public final boolean isSymPressed() {
4256 return (mMetaState & META_SYM_ON) != 0;
4257 }
4258
4259 /**
4260 * <p>Returns the pressed state of the CTRL meta key.</p>
4261 *
4262 * @return true if the CTRL key is pressed, false otherwise
4263 *
4264 * @see #KEYCODE_CTRL_LEFT
4265 * @see #KEYCODE_CTRL_RIGHT
4266 * @see #META_CTRL_ON
4267 */
4268 public final boolean isCtrlPressed() {
4269 return (mMetaState & META_CTRL_ON) != 0;
4270 }
4271
4272 /**
4273 * <p>Returns the pressed state of the META meta key.</p>
4274 *
4275 * @return true if the META key is pressed, false otherwise
4276 *
4277 * @see #KEYCODE_META_LEFT
4278 * @see #KEYCODE_META_RIGHT
4279 * @see #META_META_ON
4280 */
4281 public final boolean isMetaPressed() {
4282 return (mMetaState & META_META_ON) != 0;
4283 }
4284
4285 /**
4286 * <p>Returns the pressed state of the FUNCTION meta key.</p>
4287 *
4288 * @return true if the FUNCTION key is pressed, false otherwise
4289 *
4290 * @see #KEYCODE_FUNCTION
4291 * @see #META_FUNCTION_ON
4292 */
4293 public final boolean isFunctionPressed() {
4294 return (mMetaState & META_FUNCTION_ON) != 0;
4295 }
4296
4297 /**
4298 * <p>Returns the locked state of the CAPS LOCK meta key.</p>
4299 *
4300 * @return true if the CAPS LOCK key is on, false otherwise
4301 *
4302 * @see #KEYCODE_CAPS_LOCK
4303 * @see #META_CAPS_LOCK_ON
4304 */
4305 public final boolean isCapsLockOn() {
4306 return (mMetaState & META_CAPS_LOCK_ON) != 0;
4307 }
4308
4309 /**
4310 * <p>Returns the locked state of the NUM LOCK meta key.</p>
4311 *
4312 * @return true if the NUM LOCK key is on, false otherwise
4313 *
4314 * @see #KEYCODE_NUM_LOCK
4315 * @see #META_NUM_LOCK_ON
4316 */
4317 public final boolean isNumLockOn() {
4318 return (mMetaState & META_NUM_LOCK_ON) != 0;
4319 }
4320
4321 /**
4322 * <p>Returns the locked state of the SCROLL LOCK meta key.</p>
4323 *
4324 * @return true if the SCROLL LOCK key is on, false otherwise
4325 *
4326 * @see #KEYCODE_SCROLL_LOCK
4327 * @see #META_SCROLL_LOCK_ON
4328 */
4329 public final boolean isScrollLockOn() {
4330 return (mMetaState & META_SCROLL_LOCK_ON) != 0;
4331 }
4332
4333 /**
4334 * Retrieve the action of this key event. May be either
4335 * {@link #ACTION_DOWN}, {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.
4336 *
4337 * @return The event action: ACTION_DOWN, ACTION_UP, or ACTION_MULTIPLE.
4338 */
4339 public final int getAction() {
4340 return mAction;
4341 }
4342
4343 /**
4344 * For {@link #ACTION_UP} events, indicates that the event has been
4345 * canceled as per {@link #FLAG_CANCELED}.
4346 */
4347 public final boolean isCanceled() {
4348 return (mFlags&FLAG_CANCELED) != 0;
4349 }
4350
4351 /**
4352 * Call this during {@link Callback#onKeyDown} to have the system track
4353 * the key through its final up (possibly including a long press). Note
4354 * that only one key can be tracked at a time -- if another key down
4355 * event is received while a previous one is being tracked, tracking is
4356 * stopped on the previous event.
4357 */
4358 public final void startTracking() {
4359 mFlags |= FLAG_START_TRACKING;
4360 }
4361
4362 /**
4363 * For {@link #ACTION_UP} events, indicates that the event is still being
4364 * tracked from its initial down event as per
4365 * {@link #FLAG_TRACKING}.
4366 */
4367 public final boolean isTracking() {
4368 return (mFlags&FLAG_TRACKING) != 0;
4369 }
4370
4371 /**
4372 * For {@link #ACTION_DOWN} events, indicates that the event has been
4373 * canceled as per {@link #FLAG_LONG_PRESS}.
4374 */
4375 public final boolean isLongPress() {
4376 return (mFlags&FLAG_LONG_PRESS) != 0;
4377 }
4378
4379 /**
4380 * Retrieve the key code of the key event. This is the physical key that
4381 * was pressed, <em>not</em> the Unicode character.
4382 *
4383 * @return The key code of the event.
4384 */
4385 public final int getKeyCode() {
4386 return mKeyCode;
4387 }
4388
4389 /**
4390 * For the special case of a {@link #ACTION_MULTIPLE} event with key
4391 * code of {@link #KEYCODE_UNKNOWN}, this is a raw string of characters
4392 * associated with the event. In all other cases it is null.
4393 *
4394 * @return Returns a String of 1 or more characters associated with
4395 * the event.
4396 */
4397 public final String getCharacters() {
4398 return mCharacters;
4399 }
4400
4401 /**
4402 * Retrieve the hardware key id of this key event. These values are not
4403 * reliable and vary from device to device.
4404 *
4405 * {@more}
4406 * Mostly this is here for debugging purposes.
4407 */
4408 public final int getScanCode() {
4409 return mScanCode;
4410 }
4411
4412 /**
4413 * Retrieve the repeat count of the event. For both key up and key down
4414 * events, this is the number of times the key has repeated with the first
4415 * down starting at 0 and counting up from there. For multiple key
4416 * events, this is the number of down/up pairs that have occurred.
4417 *
4418 * @return The number of times the key has repeated.
4419 */
4420 public final int getRepeatCount() {
4421 return mRepeatCount;
4422 }
4423
4424 /**
4425 * Retrieve the time of the most recent key down event,
4426 * in the {@link android.os.SystemClock#uptimeMillis} time base. If this
4427 * is a down event, this will be the same as {@link #getEventTime()}.
4428 * Note that when chording keys, this value is the down time of the
4429 * most recently pressed key, which may <em>not</em> be the same physical
4430 * key of this event.
4431 *
4432 * @return Returns the most recent key down time, in the
4433 * {@link android.os.SystemClock#uptimeMillis} time base
4434 */
4435 public final long getDownTime() {
4436 return mDownTime;
4437 }
4438
4439 /**
4440 * Retrieve the time this event occurred,
4441 * in the {@link android.os.SystemClock#uptimeMillis} time base.
4442 *
4443 * @return Returns the time this event occurred,
4444 * in the {@link android.os.SystemClock#uptimeMillis} time base.
4445 */
4446 @Override
4447 public final long getEventTime() {
4448 return mEventTime;
4449 }
4450
4451 /**
4452 * Retrieve the time this event occurred,
4453 * in the {@link android.os.SystemClock#uptimeMillis} time base but with
4454 * nanosecond (instead of millisecond) precision.
4455 * <p>
4456 * The value is in nanosecond precision but it may not have nanosecond accuracy.
4457 * </p>
4458 *
4459 * @return Returns the time this event occurred,
4460 * in the {@link android.os.SystemClock#uptimeMillis} time base but with
4461 * nanosecond (instead of millisecond) precision.
4462 *
4463 * @hide
4464 */
4465 @Override
4466 public final long getEventTimeNano() {
4467 return mEventTime * 1000000L;
4468 }
4469
4470 /**
4471 * Renamed to {@link #getDeviceId}.
4472 *
4473 * @hide
4474 * @deprecated use {@link #getDeviceId()} instead.
4475 */
4476 @Deprecated
4477 public final int getKeyboardDevice() {
4478 return mDeviceId;
4479 }
4480
4481 /**
4482 * Gets the {@link KeyCharacterMap} associated with the keyboard device.
4483 *
4484 * @return The associated key character map.
4485 * @throws {@link KeyCharacterMap.UnavailableException} if the key character map
4486 * could not be loaded because it was malformed or the default key character map
4487 * is missing from the system.
4488 *
4489 * @see KeyCharacterMap#load
4490 */
4491 public final KeyCharacterMap getKeyCharacterMap() {
4492 return KeyCharacterMap.load(mDeviceId);
4493 }
4494
4495 /**
4496 * Gets the primary character for this key.
4497 * In other words, the label that is physically printed on it.
4498 *
4499 * @return The display label character, or 0 if none (eg. for non-printing keys).
4500 */
4501 public char getDisplayLabel() {
4502 return getKeyCharacterMap().getDisplayLabel(mKeyCode);
4503 }
4504
4505 /**
4506 * Gets the Unicode character generated by the specified key and meta
4507 * key state combination.
4508 * <p>
4509 * Returns the Unicode character that the specified key would produce
4510 * when the specified meta bits (see {@link MetaKeyKeyListener})
4511 * were active.
4512 * </p><p>
4513 * Returns 0 if the key is not one that is used to type Unicode
4514 * characters.
4515 * </p><p>
4516 * If the return value has bit {@link KeyCharacterMap#COMBINING_ACCENT} set, the
4517 * key is a "dead key" that should be combined with another to
4518 * actually produce a character -- see {@link KeyCharacterMap#getDeadChar} --
4519 * after masking with {@link KeyCharacterMap#COMBINING_ACCENT_MASK}.
4520 * </p>
4521 *
4522 * @return The associated character or combining accent, or 0 if none.
4523 */
4524 public int getUnicodeChar() {
4525 return getUnicodeChar(mMetaState);
4526 }
4527
4528 /**
4529 * Gets the Unicode character generated by the specified key and meta
4530 * key state combination.
4531 * <p>
4532 * Returns the Unicode character that the specified key would produce
4533 * when the specified meta bits (see {@link MetaKeyKeyListener})
4534 * were active.
4535 * </p><p>
4536 * Returns 0 if the key is not one that is used to type Unicode
4537 * characters.
4538 * </p><p>
4539 * If the return value has bit {@link KeyCharacterMap#COMBINING_ACCENT} set, the
4540 * key is a "dead key" that should be combined with another to
4541 * actually produce a character -- see {@link KeyCharacterMap#getDeadChar} --
4542 * after masking with {@link KeyCharacterMap#COMBINING_ACCENT_MASK}.
4543 * </p>
4544 *
4545 * @param metaState The meta key modifier state.
4546 * @return The associated character or combining accent, or 0 if none.
4547 */
4548 public int getUnicodeChar(int metaState) {
4549 return getKeyCharacterMap().get(mKeyCode, metaState);
4550 }
4551
4552 /**
4553 * Get the character conversion data for a given key code.
4554 *
4555 * @param results A {@link KeyCharacterMap.KeyData} instance that will be
4556 * filled with the results.
4557 * @return True if the key was mapped. If the key was not mapped, results is not modified.
4558 *
4559 * @deprecated instead use {@link #getDisplayLabel()},
4560 * {@link #getNumber()} or {@link #getUnicodeChar(int)}.
4561 */
4562 @Deprecated
4563 public boolean getKeyData(KeyData results) {
4564 return getKeyCharacterMap().getKeyData(mKeyCode, results);
4565 }
4566
4567 /**
4568 * Gets the first character in the character array that can be generated
4569 * by the specified key code.
4570 * <p>
4571 * This is a convenience function that returns the same value as
4572 * {@link #getMatch(char[],int) getMatch(chars, 0)}.
4573 * </p>
4574 *
4575 * @param chars The array of matching characters to consider.
4576 * @return The matching associated character, or 0 if none.
4577 */
4578 public char getMatch(char[] chars) {
4579 return getMatch(chars, 0);
4580 }
4581
4582 /**
4583 * Gets the first character in the character array that can be generated
4584 * by the specified key code. If there are multiple choices, prefers
4585 * the one that would be generated with the specified meta key modifier state.
4586 *
4587 * @param chars The array of matching characters to consider.
4588 * @param metaState The preferred meta key modifier state.
4589 * @return The matching associated character, or 0 if none.
4590 */
4591 public char getMatch(char[] chars, int metaState) {
4592 return getKeyCharacterMap().getMatch(mKeyCode, chars, metaState);
4593 }
4594
4595 /**
4596 * Gets the number or symbol associated with the key.
4597 * <p>
4598 * The character value is returned, not the numeric value.
4599 * If the key is not a number, but is a symbol, the symbol is retuned.
4600 * </p><p>
4601 * This method is intended to to support dial pads and other numeric or
4602 * symbolic entry on keyboards where certain keys serve dual function
4603 * as alphabetic and symbolic keys. This method returns the number
4604 * or symbol associated with the key independent of whether the user
4605 * has pressed the required modifier.
4606 * </p><p>
4607 * For example, on one particular keyboard the keys on the top QWERTY row generate
4608 * numbers when ALT is pressed such that ALT-Q maps to '1'. So for that keyboard
4609 * when {@link #getNumber} is called with {@link KeyEvent#KEYCODE_Q} it returns '1'
4610 * so that the user can type numbers without pressing ALT when it makes sense.
4611 * </p>
4612 *
4613 * @return The associated numeric or symbolic character, or 0 if none.
4614 */
4615 public char getNumber() {
4616 return getKeyCharacterMap().getNumber(mKeyCode);
4617 }
4618
4619 /**
4620 * Returns true if this key produces a glyph.
4621 *
4622 * @return True if the key is a printing key.
4623 */
4624 public boolean isPrintingKey() {
4625 return getKeyCharacterMap().isPrintingKey(mKeyCode);
4626 }
4627
4628 /**
4629 * @deprecated Use {@link #dispatch(Callback, DispatcherState, Object)} instead.
4630 */
4631 @Deprecated
4632 public final boolean dispatch(Callback receiver) {
4633 return dispatch(receiver, null, null);
4634 }
4635
4636 /**
4637 * Deliver this key event to a {@link Callback} interface. If this is
4638 * an ACTION_MULTIPLE event and it is not handled, then an attempt will
4639 * be made to deliver a single normal event.
4640 *
4641 * @param receiver The Callback that will be given the event.
4642 * @param state State information retained across events.
4643 * @param target The target of the dispatch, for use in tracking.
4644 *
4645 * @return The return value from the Callback method that was called.
4646 */
4647 public final boolean dispatch(Callback receiver, DispatcherState state,
4648 Object target) {
4649 switch (mAction) {
4650 case ACTION_DOWN: {
4651 mFlags &= ~FLAG_START_TRACKING;
4652 if (DEBUG) Log.v(TAG, "Key down to " + target + " in " + state
4653 + ": " + this);
4654 boolean res = receiver.onKeyDown(mKeyCode, this);
4655 if (state != null) {
4656 if (res && mRepeatCount == 0 && (mFlags&FLAG_START_TRACKING) != 0) {
4657 if (DEBUG) Log.v(TAG, " Start tracking!");
4658 state.startTracking(this, target);
4659 } else if (isLongPress() && state.isTracking(this)) {
4660 try {
4661 if (receiver.onKeyLongPress(mKeyCode, this)) {
4662 if (DEBUG) Log.v(TAG, " Clear from long press!");
4663 state.performedLongPress(this);
4664 res = true;
4665 }
4666 } catch (AbstractMethodError e) {
4667 }
4668 }
4669 }
4670 return res;
4671 }
4672 case ACTION_UP:
4673 if (DEBUG) Log.v(TAG, "Key up to " + target + " in " + state
4674 + ": " + this);
4675 if (state != null) {
4676 state.handleUpEvent(this);
4677 }
4678 return receiver.onKeyUp(mKeyCode, this);
4679 case ACTION_MULTIPLE:
4680 final int count = mRepeatCount;
4681 final int code = mKeyCode;
4682 if (receiver.onKeyMultiple(code, count, this)) {
4683 return true;
4684 }
4685 if (code != KeyEvent.KEYCODE_UNKNOWN) {
4686 mAction = ACTION_DOWN;
4687 mRepeatCount = 0;
4688 boolean handled = receiver.onKeyDown(code, this);
4689 if (handled) {
4690 mAction = ACTION_UP;
4691 receiver.onKeyUp(code, this);
4692 }
4693 mAction = ACTION_MULTIPLE;
4694 mRepeatCount = count;
4695 return handled;
4696 }
4697 return false;
4698 }
4699 return false;
4700 }
4701
4702 /**
4703 * Use with {@link KeyEvent#dispatch(Callback, DispatcherState, Object)}
4704 * for more advanced key dispatching, such as long presses.
4705 */
4706 public static class DispatcherState {
4707 int mDownKeyCode;
4708 Object mDownTarget;
4709 SparseIntArray mActiveLongPresses = new SparseIntArray();
4710
4711 /**
4712 * Reset back to initial state.
4713 */
4714 public void reset() {
4715 if (DEBUG) Log.v(TAG, "Reset: " + this);
4716 mDownKeyCode = 0;
4717 mDownTarget = null;
4718 mActiveLongPresses.clear();
4719 }
4720
4721 /**
4722 * Stop any tracking associated with this target.
4723 */
4724 public void reset(Object target) {
4725 if (mDownTarget == target) {
4726 if (DEBUG) Log.v(TAG, "Reset in " + target + ": " + this);
4727 mDownKeyCode = 0;
4728 mDownTarget = null;
4729 }
4730 }
4731
4732 /**
4733 * Start tracking the key code associated with the given event. This
4734 * can only be called on a key down. It will allow you to see any
4735 * long press associated with the key, and will result in
4736 * {@link KeyEvent#isTracking} return true on the long press and up
4737 * events.
4738 *
4739 * <p>This is only needed if you are directly dispatching events, rather
4740 * than handling them in {@link Callback#onKeyDown}.
4741 */
4742 public void startTracking(KeyEvent event, Object target) {
4743 if (event.getAction() != ACTION_DOWN) {
4744 throw new IllegalArgumentException(
4745 "Can only start tracking on a down event");
4746 }
4747 if (DEBUG) Log.v(TAG, "Start trackingt in " + target + ": " + this);
4748 mDownKeyCode = event.getKeyCode();
4749 mDownTarget = target;
4750 }
4751
4752 /**
4753 * Return true if the key event is for a key code that is currently
4754 * being tracked by the dispatcher.
4755 */
4756 public boolean isTracking(KeyEvent event) {
4757 return mDownKeyCode == event.getKeyCode();
4758 }
4759
4760 /**
4761 * Keep track of the given event's key code as having performed an
4762 * action with a long press, so no action should occur on the up.
4763 * <p>This is only needed if you are directly dispatching events, rather
4764 * than handling them in {@link Callback#onKeyLongPress}.
4765 */
4766 public void performedLongPress(KeyEvent event) {
4767 mActiveLongPresses.put(event.getKeyCode(), 1);
4768 }
4769
4770 /**
4771 * Handle key up event to stop tracking. This resets the dispatcher state,
4772 * and updates the key event state based on it.
4773 * <p>This is only needed if you are directly dispatching events, rather
4774 * than handling them in {@link Callback#onKeyUp}.
4775 */
4776 public void handleUpEvent(KeyEvent event) {
4777 final int keyCode = event.getKeyCode();
4778 if (DEBUG) Log.v(TAG, "Handle key up " + event + ": " + this);
4779 int index = mActiveLongPresses.indexOfKey(keyCode);
4780 if (index >= 0) {
4781 if (DEBUG) Log.v(TAG, " Index: " + index);
4782 event.mFlags |= FLAG_CANCELED | FLAG_CANCELED_LONG_PRESS;
4783 mActiveLongPresses.removeAt(index);
4784 }
4785 if (mDownKeyCode == keyCode) {
4786 if (DEBUG) Log.v(TAG, " Tracking!");
4787 event.mFlags |= FLAG_TRACKING;
4788 mDownKeyCode = 0;
4789 mDownTarget = null;
4790 }
4791 }
4792 }
4793
4794 @Override
4795 public String toString() {
4796 StringBuilder msg = new StringBuilder();
4797 msg.append("KeyEvent { action=").append(actionToString(mAction));
4798 msg.append(", keyCode=").append(keyCodeToString(mKeyCode));
4799 msg.append(", scanCode=").append(mScanCode);
4800 if (mCharacters != null) {
4801 msg.append(", characters=\"").append(mCharacters).append("\"");
4802 }
4803 msg.append(", metaState=").append(metaStateToString(mMetaState));
4804 msg.append(", flags=0x").append(Integer.toHexString(mFlags));
4805 msg.append(", repeatCount=").append(mRepeatCount);
4806 msg.append(", eventTime=").append(mEventTime);
4807 msg.append(", downTime=").append(mDownTime);
4808 msg.append(", deviceId=").append(mDeviceId);
4809 msg.append(", source=0x").append(Integer.toHexString(mSource));
4810 msg.append(" }");
4811 return msg.toString();
4812 }
4813
4814 /**
4815 * Returns a string that represents the symbolic name of the specified action
4816 * such as "ACTION_DOWN", or an equivalent numeric constant such as "35" if unknown.
4817 *
4818 * @param action The action.
4819 * @return The symbolic name of the specified action.
4820 * @hide
4821 */
4822 public static String actionToString(int action) {
4823 switch (action) {
4824 case ACTION_DOWN:
4825 return "ACTION_DOWN";
4826 case ACTION_UP:
4827 return "ACTION_UP";
4828 case ACTION_MULTIPLE:
4829 return "ACTION_MULTIPLE";
4830 default:
4831 return Integer.toString(action);
4832 }
4833 }
4834
4835 /**
4836 * Returns a string that represents the symbolic name of the specified keycode
4837 * such as "KEYCODE_A", "KEYCODE_DPAD_UP", or an equivalent numeric constant
4838 * such as "1001" if unknown.
4839 *
4840 * @param keyCode The key code.
4841 * @return The symbolic name of the specified keycode.
4842 *
4843 * @see KeyCharacterMap#getDisplayLabel
4844 */
4845 public static String keyCodeToString(int keyCode) {
4846 String symbolicName = KEYCODE_SYMBOLIC_NAMES.get(keyCode);
4847 return symbolicName != null ? symbolicName : Integer.toString(keyCode);
4848 }
4849
4850 /**
4851 * Gets a keycode by its symbolic name such as "KEYCODE_A" or an equivalent
4852 * numeric constant such as "1001".
4853 *
4854 * @param symbolicName The symbolic name of the keycode.
4855 * @return The keycode or {@link #KEYCODE_UNKNOWN} if not found.
4856 * @see #keycodeToString
4857 */
4858 public static int keyCodeFromString(String symbolicName) {
4859 if (symbolicName == null) {
4860 throw new IllegalArgumentException("symbolicName must not be null");
4861 }
4862
4863 final int count = KEYCODE_SYMBOLIC_NAMES.size();
4864 for (int i = 0; i < count; i++) {
4865 if (symbolicName.equals(KEYCODE_SYMBOLIC_NAMES.valueAt(i))) {
4866 return i;
4867 }
4868 }
4869
4870 try {
4871 return Integer.parseInt(symbolicName, 10);
4872 } catch (NumberFormatException ex) {
4873 return KEYCODE_UNKNOWN;
4874 }
4875 }
4876
4877 /**
4878 * Returns a string that represents the symbolic name of the specified combined meta
4879 * key modifier state flags such as "0", "META_SHIFT_ON",
4880 * "META_ALT_ON|META_SHIFT_ON" or an equivalent numeric constant such as "0x10000000"
4881 * if unknown.
4882 *
4883 * @param metaState The meta state.
4884 * @return The symbolic name of the specified combined meta state flags.
4885 * @hide
4886 */
4887 public static String metaStateToString(int metaState) {
4888 if (metaState == 0) {
4889 return "0";
4890 }
4891 StringBuilder result = null;
4892 int i = 0;
4893 while (metaState != 0) {
4894 final boolean isSet = (metaState & 1) != 0;
4895 metaState >>>= 1; // unsigned shift!
4896 if (isSet) {
4897 final String name = META_SYMBOLIC_NAMES[i];
4898 if (result == null) {
4899 if (metaState == 0) {
4900 return name;
4901 }
4902 result = new StringBuilder(name);
4903 } else {
4904 result.append('|');
4905 result.append(name);
4906 }
4907 }
4908 i += 1;
4909 }
4910 return result.toString();
4911 }
4912
4913 public static final Parcelable.Creator<KeyEvent> CREATOR
4914 = new Parcelable.Creator<KeyEvent>() {
4915 public KeyEvent createFromParcel(Parcel in) {
4916 in.readInt(); // skip token, we already know this is a KeyEvent
4917 return KeyEvent.createFromParcelBody(in);
4918 }
4919
4920 public KeyEvent[] newArray(int size) {
4921 return new KeyEvent[size];
4922 }
4923 };
4924
4925 /** @hide */
4926 public static KeyEvent createFromParcelBody(Parcel in) {
4927 return new KeyEvent(in);
4928 }
4929
4930 private KeyEvent(Parcel in) {
4931 mDeviceId = in.readInt();
4932 mSource = in.readInt();
4933 mAction = in.readInt();
4934 mKeyCode = in.readInt();
4935 mRepeatCount = in.readInt();
4936 mMetaState = in.readInt();
4937 mScanCode = in.readInt();
4938 mFlags = in.readInt();
4939 mDownTime = in.readLong();
4940 mEventTime = in.readLong();
4941 }
4942
4943 public void writeToParcel(Parcel out, int flags) {
4944 out.writeInt(PARCEL_TOKEN_KEY_EVENT);
4945
4946 out.writeInt(mDeviceId);
4947 out.writeInt(mSource);
4948 out.writeInt(mAction);
4949 out.writeInt(mKeyCode);
4950 out.writeInt(mRepeatCount);
4951 out.writeInt(mMetaState);
4952 out.writeInt(mScanCode);
4953 out.writeInt(mFlags);
4954 out.writeLong(mDownTime);
4955 out.writeLong(mEventTime);
4956 }
4957
4958 private native boolean native_isSystemKey(int keyCode);
4959 private native boolean native_hasDefaultAction(int keyCode);
4960 }


浙公网安备 33010602011771号