1 /* 2 * Copyright (C) 2006 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.view; 18 19 import android.os.Parcel; 20 import android.os.Parcelable; 21 import android.util.Log; 22 import android.util.SparseIntArray; 23 import android.view.KeyCharacterMap; 24 import android.view.KeyCharacterMap.KeyData; 25 26 /** 27 * Contains constants for key events. 28 */ 29 public class KeyEvent implements Parcelable { 30 // key codes 31 public static final int KEYCODE_UNKNOWN = 0; 32 public static final int KEYCODE_SOFT_LEFT = 1; 33 public static final int KEYCODE_SOFT_RIGHT = 2; 34 public static final int KEYCODE_HOME = 3; 35 public static final int KEYCODE_BACK = 4; 36 public static final int KEYCODE_CALL = 5; 37 public static final int KEYCODE_ENDCALL = 6; 38 public static final int KEYCODE_0 = 7; 39 public static final int KEYCODE_1 = 8; 40 public static final int KEYCODE_2 = 9; 41 public static final int KEYCODE_3 = 10; 42 public static final int KEYCODE_4 = 11; 43 public static final int KEYCODE_5 = 12; 44 public static final int KEYCODE_6 = 13; 45 public static final int KEYCODE_7 = 14; 46 public static final int KEYCODE_8 = 15; 47 public static final int KEYCODE_9 = 16; 48 public static final int KEYCODE_STAR = 17; 49 public static final int KEYCODE_POUND = 18; 50 public static final int KEYCODE_DPAD_UP = 19; 51 public static final int KEYCODE_DPAD_DOWN = 20; 52 public static final int KEYCODE_DPAD_LEFT = 21; 53 public static final int KEYCODE_DPAD_RIGHT = 22; 54 public static final int KEYCODE_DPAD_CENTER = 23; 55 public static final int KEYCODE_VOLUME_UP = 24; 56 public static final int KEYCODE_VOLUME_DOWN = 25; 57 public static final int KEYCODE_POWER = 26; 58 public static final int KEYCODE_CAMERA = 27; 59 public static final int KEYCODE_CLEAR = 28; 60 public static final int KEYCODE_A = 29; 61 public static final int KEYCODE_B = 30; 62 public static final int KEYCODE_C = 31; 63 public static final int KEYCODE_D = 32; 64 public static final int KEYCODE_E = 33; 65 public static final int KEYCODE_F = 34; 66 public static final int KEYCODE_G = 35; 67 public static final int KEYCODE_H = 36; 68 public static final int KEYCODE_I = 37; 69 public static final int KEYCODE_J = 38; 70 public static final int KEYCODE_K = 39; 71 public static final int KEYCODE_L = 40; 72 public static final int KEYCODE_M = 41; 73 public static final int KEYCODE_N = 42; 74 public static final int KEYCODE_O = 43; 75 public static final int KEYCODE_P = 44; 76 public static final int KEYCODE_Q = 45; 77 public static final int KEYCODE_R = 46; 78 public static final int KEYCODE_S = 47; 79 public static final int KEYCODE_T = 48; 80 public static final int KEYCODE_U = 49; 81 public static final int KEYCODE_V = 50; 82 public static final int KEYCODE_W = 51; 83 public static final int KEYCODE_X = 52; 84 public static final int KEYCODE_Y = 53; 85 public static final int KEYCODE_Z = 54; 86 public static final int KEYCODE_COMMA = 55; 87 public static final int KEYCODE_PERIOD = 56; 88 public static final int KEYCODE_ALT_LEFT = 57; 89 public static final int KEYCODE_ALT_RIGHT = 58; 90 public static final int KEYCODE_SHIFT_LEFT = 59; 91 public static final int KEYCODE_SHIFT_RIGHT = 60; 92 public static final int KEYCODE_TAB = 61; 93 public static final int KEYCODE_SPACE = 62; 94 public static final int KEYCODE_SYM = 63; 95 public static final int KEYCODE_EXPLORER = 64; 96 public static final int KEYCODE_ENVELOPE = 65; 97 public static final int KEYCODE_ENTER = 66; 98 public static final int KEYCODE_DEL = 67; 99 public static final int KEYCODE_GRAVE = 68; 100 public static final int KEYCODE_MINUS = 69; 101 public static final int KEYCODE_EQUALS = 70; 102 public static final int KEYCODE_LEFT_BRACKET = 71; 103 public static final int KEYCODE_RIGHT_BRACKET = 72; 104 public static final int KEYCODE_BACKSLASH = 73; 105 public static final int KEYCODE_SEMICOLON = 74; 106 public static final int KEYCODE_APOSTROPHE = 75; 107 public static final int KEYCODE_SLASH = 76; 108 public static final int KEYCODE_AT = 77; 109 public static final int KEYCODE_NUM = 78; 110 public static final int KEYCODE_HEADSETHOOK = 79; 111 public static final int KEYCODE_FOCUS = 80; // *Camera* focus 112 public static final int KEYCODE_PLUS = 81; 113 public static final int KEYCODE_MENU = 82; 114 public static final int KEYCODE_NOTIFICATION = 83; 115 public static final int KEYCODE_SEARCH = 84; 116 public static final int KEYCODE_MEDIA_PLAY_PAUSE= 85; 117 public static final int KEYCODE_MEDIA_STOP = 86; 118 public static final int KEYCODE_MEDIA_NEXT = 87; 119 public static final int KEYCODE_MEDIA_PREVIOUS = 88; 120 public static final int KEYCODE_MEDIA_REWIND = 89; 121 public static final int KEYCODE_MEDIA_FAST_FORWARD = 90; 122 public static final int KEYCODE_MUTE = 91; 123 124 // NOTE: If you add a new keycode here you must also add it to: 125 // isSystem() 126 // frameworks/base/include/ui/KeycodeLabels.h 127 // tools/puppet_master/PuppetMaster/nav_keys.py 128 // frameworks/base/core/res/res/values/attrs.xml 129 // commands/monkey/Monkey.java 130 // emulator? 131 // 132 // Also Android currently does not reserve code ranges for vendor- 133 // specific key codes. If you have new key codes to have, you 134 // MUST contribute a patch to the open source project to define 135 // those new codes. This is intended to maintain a consistent 136 // set of key code definitions across all Android devices. 137 138 private static final int LAST_KEYCODE = KEYCODE_MUTE; 139 140 /** 141 * @deprecated There are now more than MAX_KEYCODE keycodes. 142 * Use {@link #getMaxKeyCode()} instead. 143 */ 144 @Deprecated 145 public static final int MAX_KEYCODE = 84; 146 147 /** 148 * {@link #getAction} value: the key has been pressed down. 149 */ 150 public static final int ACTION_DOWN = 0; 151 /** 152 * {@link #getAction} value: the key has been released. 153 */ 154 public static final int ACTION_UP = 1; 155 /** 156 * {@link #getAction} value: multiple duplicate key events have 157 * occurred in a row, or a complex string is being delivered. If the 158 * key code is not {#link {@link #KEYCODE_UNKNOWN} then the 159 * {#link {@link #getRepeatCount()} method returns the number of times 160 * the given key code should be executed. 161 * Otherwise, if the key code {@link #KEYCODE_UNKNOWN}, then 162 * this is a sequence of characters as returned by {@link #getCharacters}. 163 */ 164 public static final int ACTION_MULTIPLE = 2; 165 166 /** 167 * <p>This mask is used to check whether one of the ALT meta keys is pressed.</p> 168 * 169 * @see #isAltPressed() 170 * @see #getMetaState() 171 * @see #KEYCODE_ALT_LEFT 172 * @see #KEYCODE_ALT_RIGHT 173 */ 174 public static final int META_ALT_ON = 0x02; 175 176 /** 177 * <p>This mask is used to check whether the left ALT meta key is pressed.</p> 178 * 179 * @see #isAltPressed() 180 * @see #getMetaState() 181 * @see #KEYCODE_ALT_LEFT 182 */ 183 public static final int META_ALT_LEFT_ON = 0x10; 184 185 /** 186 * <p>This mask is used to check whether the right the ALT meta key is pressed.</p> 187 * 188 * @see #isAltPressed() 189 * @see #getMetaState() 190 * @see #KEYCODE_ALT_RIGHT 191 */ 192 public static final int META_ALT_RIGHT_ON = 0x20; 193 194 /** 195 * <p>This mask is used to check whether one of the SHIFT meta keys is pressed.</p> 196 * 197 * @see #isShiftPressed() 198 * @see #getMetaState() 199 * @see #KEYCODE_SHIFT_LEFT 200 * @see #KEYCODE_SHIFT_RIGHT 201 */ 202 public static final int META_SHIFT_ON = 0x1; 203 204 /** 205 * <p>This mask is used to check whether the left SHIFT meta key is pressed.</p> 206 * 207 * @see #isShiftPressed() 208 * @see #getMetaState() 209 * @see #KEYCODE_SHIFT_LEFT 210 */ 211 public static final int META_SHIFT_LEFT_ON = 0x40; 212 213 /** 214 * <p>This mask is used to check whether the right SHIFT meta key is pressed.</p> 215 * 216 * @see #isShiftPressed() 217 * @see #getMetaState() 218 * @see #KEYCODE_SHIFT_RIGHT 219 */ 220 public static final int META_SHIFT_RIGHT_ON = 0x80; 221 222 /** 223 * <p>This mask is used to check whether the SYM meta key is pressed.</p> 224 * 225 * @see #isSymPressed() 226 * @see #getMetaState() 227 */ 228 public static final int META_SYM_ON = 0x4; 229 230 /** 231 * This mask is set if the device woke because of this key event. 232 */ 233 public static final int FLAG_WOKE_HERE = 0x1; 234 235 /** 236 * This mask is set if the key event was generated by a software keyboard. 237 */ 238 public static final int FLAG_SOFT_KEYBOARD = 0x2; 239 240 /** 241 * This mask is set if we don't want the key event to cause us to leave 242 * touch mode. 243 */ 244 public static final int FLAG_KEEP_TOUCH_MODE = 0x4; 245 246 /** 247 * This mask is set if an event was known to come from a trusted part 248 * of the system. That is, the event is known to come from the user, 249 * and could not have been spoofed by a third party component. 250 */ 251 public static final int FLAG_FROM_SYSTEM = 0x8; 252 253 /** 254 * This mask is used for compatibility, to identify enter keys that are 255 * coming from an IME whose enter key has been auto-labelled "next" or 256 * "done". This allows TextView to dispatch these as normal enter keys 257 * for old applications, but still do the appropriate action when 258 * receiving them. 259 */ 260 public static final int FLAG_EDITOR_ACTION = 0x10; 261 262 /** 263 * When associated with up key events, this indicates that the key press 264 * has been canceled. Typically this is used with virtual touch screen 265 * keys, where the user can slide from the virtual key area on to the 266 * display: in that case, the application will receive a canceled up 267 * event and should not perform the action normally associated with the 268 * key. Note that for this to work, the application can not perform an 269 * action for a key until it receives an up or the long press timeout has 270 * expired. 271 */ 272 public static final int FLAG_CANCELED = 0x20; 273 274 /** 275 * This key event was generated by a virtual (on-screen) hard key area. 276 * Typically this is an area of the touchscreen, outside of the regular 277 * display, dedicated to "hardware" buttons. 278 */ 279 public static final int FLAG_VIRTUAL_HARD_KEY = 0x40; 280 281 /** 282 * This flag is set for the first key repeat that occurs after the 283 * long press timeout. 284 */ 285 public static final int FLAG_LONG_PRESS = 0x80; 286 287 /** 288 * Set when a key event has {@link #FLAG_CANCELED} set because a long 289 * press action was executed while it was down. 290 */ 291 public static final int FLAG_CANCELED_LONG_PRESS = 0x100; 292 293 /** 294 * Set for {@link #ACTION_UP} when this event's key code is still being 295 * tracked from its initial down. That is, somebody requested that tracking 296 * started on the key down and a long press has not caused 297 * the tracking to be canceled. 298 */ 299 public static final int FLAG_TRACKING = 0x200; 300 301 /** 302 * Private control to determine when an app is tracking a key sequence. 303 * @hide 304 */ 305 public static final int FLAG_START_TRACKING = 0x40000000; 306 307 /** 308 * Returns the maximum keycode. 309 */ getMaxKeyCode()310 public static int getMaxKeyCode() { 311 return LAST_KEYCODE; 312 } 313 314 /** 315 * Get the character that is produced by putting accent on the character 316 * c. 317 * For example, getDeadChar('`', 'e') returns è. 318 */ getDeadChar(int accent, int c)319 public static int getDeadChar(int accent, int c) { 320 return KeyCharacterMap.getDeadChar(accent, c); 321 } 322 323 static final boolean DEBUG = false; 324 static final String TAG = "KeyEvent"; 325 326 private int mMetaState; 327 private int mAction; 328 private int mKeyCode; 329 private int mScancode; 330 private int mRepeatCount; 331 private int mDeviceId; 332 private int mFlags; 333 private long mDownTime; 334 private long mEventTime; 335 private String mCharacters; 336 337 public interface Callback { 338 /** 339 * Called when a key down event has occurred. If you return true, 340 * you can first call {@link KeyEvent#startTracking() 341 * KeyEvent.startTracking()} to have the framework track the event 342 * through its {@link #onKeyUp(int, KeyEvent)} and also call your 343 * {@link #onKeyLongPress(int, KeyEvent)} if it occurs. 344 * 345 * @param keyCode The value in event.getKeyCode(). 346 * @param event Description of the key event. 347 * 348 * @return If you handled the event, return true. If you want to allow 349 * the event to be handled by the next receiver, return false. 350 */ onKeyDown(int keyCode, KeyEvent event)351 boolean onKeyDown(int keyCode, KeyEvent event); 352 353 /** 354 * Called when a long press has occurred. If you return true, 355 * the final key up will have {@link KeyEvent#FLAG_CANCELED} and 356 * {@link KeyEvent#FLAG_CANCELED_LONG_PRESS} set. Note that in 357 * order to receive this callback, someone in the event change 358 * <em>must</em> return true from {@link #onKeyDown} <em>and</em> 359 * call {@link KeyEvent#startTracking()} on the event. 360 * 361 * @param keyCode The value in event.getKeyCode(). 362 * @param event Description of the key event. 363 * 364 * @return If you handled the event, return true. If you want to allow 365 * the event to be handled by the next receiver, return false. 366 */ onKeyLongPress(int keyCode, KeyEvent event)367 boolean onKeyLongPress(int keyCode, KeyEvent event); 368 369 /** 370 * Called when a key up event has occurred. 371 * 372 * @param keyCode The value in event.getKeyCode(). 373 * @param event Description of the key event. 374 * 375 * @return If you handled the event, return true. If you want to allow 376 * the event to be handled by the next receiver, return false. 377 */ onKeyUp(int keyCode, KeyEvent event)378 boolean onKeyUp(int keyCode, KeyEvent event); 379 380 /** 381 * Called when multiple down/up pairs of the same key have occurred 382 * in a row. 383 * 384 * @param keyCode The value in event.getKeyCode(). 385 * @param count Number of pairs as returned by event.getRepeatCount(). 386 * @param event Description of the key event. 387 * 388 * @return If you handled the event, return true. If you want to allow 389 * the event to be handled by the next receiver, return false. 390 */ onKeyMultiple(int keyCode, int count, KeyEvent event)391 boolean onKeyMultiple(int keyCode, int count, KeyEvent event); 392 } 393 394 /** 395 * Create a new key event. 396 * 397 * @param action Action code: either {@link #ACTION_DOWN}, 398 * {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}. 399 * @param code The key code. 400 */ KeyEvent(int action, int code)401 public KeyEvent(int action, int code) { 402 mAction = action; 403 mKeyCode = code; 404 mRepeatCount = 0; 405 } 406 407 /** 408 * Create a new key event. 409 * 410 * @param downTime The time (in {@link android.os.SystemClock#uptimeMillis}) 411 * at which this key code originally went down. 412 * @param eventTime The time (in {@link android.os.SystemClock#uptimeMillis}) 413 * at which this event happened. 414 * @param action Action code: either {@link #ACTION_DOWN}, 415 * {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}. 416 * @param code The key code. 417 * @param repeat A repeat count for down events (> 0 if this is after the 418 * initial down) or event count for multiple events. 419 */ KeyEvent(long downTime, long eventTime, int action, int code, int repeat)420 public KeyEvent(long downTime, long eventTime, int action, 421 int code, int repeat) { 422 mDownTime = downTime; 423 mEventTime = eventTime; 424 mAction = action; 425 mKeyCode = code; 426 mRepeatCount = repeat; 427 } 428 429 /** 430 * Create a new key event. 431 * 432 * @param downTime The time (in {@link android.os.SystemClock#uptimeMillis}) 433 * at which this key code originally went down. 434 * @param eventTime The time (in {@link android.os.SystemClock#uptimeMillis}) 435 * at which this event happened. 436 * @param action Action code: either {@link #ACTION_DOWN}, 437 * {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}. 438 * @param code The key code. 439 * @param repeat A repeat count for down events (> 0 if this is after the 440 * initial down) or event count for multiple events. 441 * @param metaState Flags indicating which meta keys are currently pressed. 442 */ KeyEvent(long downTime, long eventTime, int action, int code, int repeat, int metaState)443 public KeyEvent(long downTime, long eventTime, int action, 444 int code, int repeat, int metaState) { 445 mDownTime = downTime; 446 mEventTime = eventTime; 447 mAction = action; 448 mKeyCode = code; 449 mRepeatCount = repeat; 450 mMetaState = metaState; 451 } 452 453 /** 454 * Create a new key event. 455 * 456 * @param downTime The time (in {@link android.os.SystemClock#uptimeMillis}) 457 * at which this key code originally went down. 458 * @param eventTime The time (in {@link android.os.SystemClock#uptimeMillis}) 459 * at which this event happened. 460 * @param action Action code: either {@link #ACTION_DOWN}, 461 * {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}. 462 * @param code The key code. 463 * @param repeat A repeat count for down events (> 0 if this is after the 464 * initial down) or event count for multiple events. 465 * @param metaState Flags indicating which meta keys are currently pressed. 466 * @param device The device ID that generated the key event. 467 * @param scancode Raw device scan code of the event. 468 */ KeyEvent(long downTime, long eventTime, int action, int code, int repeat, int metaState, int device, int scancode)469 public KeyEvent(long downTime, long eventTime, int action, 470 int code, int repeat, int metaState, 471 int device, int scancode) { 472 mDownTime = downTime; 473 mEventTime = eventTime; 474 mAction = action; 475 mKeyCode = code; 476 mRepeatCount = repeat; 477 mMetaState = metaState; 478 mDeviceId = device; 479 mScancode = scancode; 480 } 481 482 /** 483 * Create a new key event. 484 * 485 * @param downTime The time (in {@link android.os.SystemClock#uptimeMillis}) 486 * at which this key code originally went down. 487 * @param eventTime The time (in {@link android.os.SystemClock#uptimeMillis}) 488 * at which this event happened. 489 * @param action Action code: either {@link #ACTION_DOWN}, 490 * {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}. 491 * @param code The key code. 492 * @param repeat A repeat count for down events (> 0 if this is after the 493 * initial down) or event count for multiple events. 494 * @param metaState Flags indicating which meta keys are currently pressed. 495 * @param device The device ID that generated the key event. 496 * @param scancode Raw device scan code of the event. 497 * @param flags The flags for this key event 498 */ KeyEvent(long downTime, long eventTime, int action, int code, int repeat, int metaState, int device, int scancode, int flags)499 public KeyEvent(long downTime, long eventTime, int action, 500 int code, int repeat, int metaState, 501 int device, int scancode, int flags) { 502 mDownTime = downTime; 503 mEventTime = eventTime; 504 mAction = action; 505 mKeyCode = code; 506 mRepeatCount = repeat; 507 mMetaState = metaState; 508 mDeviceId = device; 509 mScancode = scancode; 510 mFlags = flags; 511 } 512 513 /** 514 * Create a new key event for a string of characters. The key code, 515 * action, and repeat could will automatically be set to 516 * {@link #KEYCODE_UNKNOWN}, {@link #ACTION_MULTIPLE}, and 0 for you. 517 * 518 * @param time The time (in {@link android.os.SystemClock#uptimeMillis}) 519 * at which this event occured. 520 * @param characters The string of characters. 521 * @param device The device ID that generated the key event. 522 * @param flags The flags for this key event 523 */ KeyEvent(long time, String characters, int device, int flags)524 public KeyEvent(long time, String characters, int device, int flags) { 525 mDownTime = time; 526 mEventTime = time; 527 mCharacters = characters; 528 mAction = ACTION_MULTIPLE; 529 mKeyCode = KEYCODE_UNKNOWN; 530 mRepeatCount = 0; 531 mDeviceId = device; 532 mFlags = flags; 533 } 534 535 /** 536 * Make an exact copy of an existing key event. 537 */ KeyEvent(KeyEvent origEvent)538 public KeyEvent(KeyEvent origEvent) { 539 mDownTime = origEvent.mDownTime; 540 mEventTime = origEvent.mEventTime; 541 mAction = origEvent.mAction; 542 mKeyCode = origEvent.mKeyCode; 543 mRepeatCount = origEvent.mRepeatCount; 544 mMetaState = origEvent.mMetaState; 545 mDeviceId = origEvent.mDeviceId; 546 mScancode = origEvent.mScancode; 547 mFlags = origEvent.mFlags; 548 mCharacters = origEvent.mCharacters; 549 } 550 551 /** 552 * Copy an existing key event, modifying its time and repeat count. 553 * 554 * @deprecated Use {@link #changeTimeRepeat(KeyEvent, long, int)} 555 * instead. 556 * 557 * @param origEvent The existing event to be copied. 558 * @param eventTime The new event time 559 * (in {@link android.os.SystemClock#uptimeMillis}) of the event. 560 * @param newRepeat The new repeat count of the event. 561 */ 562 @Deprecated KeyEvent(KeyEvent origEvent, long eventTime, int newRepeat)563 public KeyEvent(KeyEvent origEvent, long eventTime, int newRepeat) { 564 mDownTime = origEvent.mDownTime; 565 mEventTime = eventTime; 566 mAction = origEvent.mAction; 567 mKeyCode = origEvent.mKeyCode; 568 mRepeatCount = newRepeat; 569 mMetaState = origEvent.mMetaState; 570 mDeviceId = origEvent.mDeviceId; 571 mScancode = origEvent.mScancode; 572 mFlags = origEvent.mFlags; 573 mCharacters = origEvent.mCharacters; 574 } 575 576 /** 577 * Create a new key event that is the same as the given one, but whose 578 * event time and repeat count are replaced with the given value. 579 * 580 * @param event The existing event to be copied. This is not modified. 581 * @param eventTime The new event time 582 * (in {@link android.os.SystemClock#uptimeMillis}) of the event. 583 * @param newRepeat The new repeat count of the event. 584 */ changeTimeRepeat(KeyEvent event, long eventTime, int newRepeat)585 public static KeyEvent changeTimeRepeat(KeyEvent event, long eventTime, 586 int newRepeat) { 587 return new KeyEvent(event, eventTime, newRepeat); 588 } 589 590 /** 591 * Create a new key event that is the same as the given one, but whose 592 * event time and repeat count are replaced with the given value. 593 * 594 * @param event The existing event to be copied. This is not modified. 595 * @param eventTime The new event time 596 * (in {@link android.os.SystemClock#uptimeMillis}) of the event. 597 * @param newRepeat The new repeat count of the event. 598 * @param newFlags New flags for the event, replacing the entire value 599 * in the original event. 600 */ changeTimeRepeat(KeyEvent event, long eventTime, int newRepeat, int newFlags)601 public static KeyEvent changeTimeRepeat(KeyEvent event, long eventTime, 602 int newRepeat, int newFlags) { 603 KeyEvent ret = new KeyEvent(event); 604 ret.mEventTime = eventTime; 605 ret.mRepeatCount = newRepeat; 606 ret.mFlags = newFlags; 607 return ret; 608 } 609 610 /** 611 * Copy an existing key event, modifying its action. 612 * 613 * @param origEvent The existing event to be copied. 614 * @param action The new action code of the event. 615 */ KeyEvent(KeyEvent origEvent, int action)616 private KeyEvent(KeyEvent origEvent, int action) { 617 mDownTime = origEvent.mDownTime; 618 mEventTime = origEvent.mEventTime; 619 mAction = action; 620 mKeyCode = origEvent.mKeyCode; 621 mRepeatCount = origEvent.mRepeatCount; 622 mMetaState = origEvent.mMetaState; 623 mDeviceId = origEvent.mDeviceId; 624 mScancode = origEvent.mScancode; 625 mFlags = origEvent.mFlags; 626 // Don't copy mCharacters, since one way or the other we'll lose it 627 // when changing the action. 628 } 629 630 /** 631 * Create a new key event that is the same as the given one, but whose 632 * action is replaced with the given value. 633 * 634 * @param event The existing event to be copied. This is not modified. 635 * @param action The new action code of the event. 636 */ changeAction(KeyEvent event, int action)637 public static KeyEvent changeAction(KeyEvent event, int action) { 638 return new KeyEvent(event, action); 639 } 640 641 /** 642 * Create a new key event that is the same as the given one, but whose 643 * flags are replaced with the given value. 644 * 645 * @param event The existing event to be copied. This is not modified. 646 * @param flags The new flags constant. 647 */ changeFlags(KeyEvent event, int flags)648 public static KeyEvent changeFlags(KeyEvent event, int flags) { 649 event = new KeyEvent(event); 650 event.mFlags = flags; 651 return event; 652 } 653 654 /** 655 * Don't use in new code, instead explicitly check 656 * {@link #getAction()}. 657 * 658 * @return If the action is ACTION_DOWN, returns true; else false. 659 * 660 * @deprecated 661 * @hide 662 */ isDown()663 @Deprecated public final boolean isDown() { 664 return mAction == ACTION_DOWN; 665 } 666 667 /** 668 * Is this a system key? System keys can not be used for menu shortcuts. 669 * 670 * TODO: this information should come from a table somewhere. 671 * TODO: should the dpad keys be here? arguably, because they also shouldn't be menu shortcuts 672 */ isSystem()673 public final boolean isSystem() { 674 switch (mKeyCode) { 675 case KEYCODE_MENU: 676 case KEYCODE_SOFT_RIGHT: 677 case KEYCODE_HOME: 678 case KEYCODE_BACK: 679 case KEYCODE_CALL: 680 case KEYCODE_ENDCALL: 681 case KEYCODE_VOLUME_UP: 682 case KEYCODE_VOLUME_DOWN: 683 case KEYCODE_MUTE: 684 case KEYCODE_POWER: 685 case KEYCODE_HEADSETHOOK: 686 case KEYCODE_MEDIA_PLAY_PAUSE: 687 case KEYCODE_MEDIA_STOP: 688 case KEYCODE_MEDIA_NEXT: 689 case KEYCODE_MEDIA_PREVIOUS: 690 case KEYCODE_MEDIA_REWIND: 691 case KEYCODE_MEDIA_FAST_FORWARD: 692 case KEYCODE_CAMERA: 693 case KEYCODE_FOCUS: 694 case KEYCODE_SEARCH: 695 return true; 696 default: 697 return false; 698 } 699 } 700 701 702 /** 703 * <p>Returns the state of the meta keys.</p> 704 * 705 * @return an integer in which each bit set to 1 represents a pressed 706 * meta key 707 * 708 * @see #isAltPressed() 709 * @see #isShiftPressed() 710 * @see #isSymPressed() 711 * @see #META_ALT_ON 712 * @see #META_SHIFT_ON 713 * @see #META_SYM_ON 714 */ getMetaState()715 public final int getMetaState() { 716 return mMetaState; 717 } 718 719 /** 720 * Returns the flags for this key event. 721 * 722 * @see #FLAG_WOKE_HERE 723 */ getFlags()724 public final int getFlags() { 725 return mFlags; 726 } 727 728 /** 729 * Returns true if this key code is a modifier key. 730 * 731 * @return whether the provided keyCode is one of 732 * {@link #KEYCODE_SHIFT_LEFT} {@link #KEYCODE_SHIFT_RIGHT}, 733 * {@link #KEYCODE_ALT_LEFT}, {@link #KEYCODE_ALT_RIGHT} 734 * or {@link #KEYCODE_SYM}. 735 */ isModifierKey(int keyCode)736 public static boolean isModifierKey(int keyCode) { 737 return keyCode == KEYCODE_SHIFT_LEFT || keyCode == KEYCODE_SHIFT_RIGHT 738 || keyCode == KEYCODE_ALT_LEFT || keyCode == KEYCODE_ALT_RIGHT 739 || keyCode == KEYCODE_SYM; 740 } 741 742 /** 743 * <p>Returns the pressed state of the ALT meta key.</p> 744 * 745 * @return true if the ALT key is pressed, false otherwise 746 * 747 * @see #KEYCODE_ALT_LEFT 748 * @see #KEYCODE_ALT_RIGHT 749 * @see #META_ALT_ON 750 */ isAltPressed()751 public final boolean isAltPressed() { 752 return (mMetaState & META_ALT_ON) != 0; 753 } 754 755 /** 756 * <p>Returns the pressed state of the SHIFT meta key.</p> 757 * 758 * @return true if the SHIFT key is pressed, false otherwise 759 * 760 * @see #KEYCODE_SHIFT_LEFT 761 * @see #KEYCODE_SHIFT_RIGHT 762 * @see #META_SHIFT_ON 763 */ isShiftPressed()764 public final boolean isShiftPressed() { 765 return (mMetaState & META_SHIFT_ON) != 0; 766 } 767 768 /** 769 * <p>Returns the pressed state of the SYM meta key.</p> 770 * 771 * @return true if the SYM key is pressed, false otherwise 772 * 773 * @see #KEYCODE_SYM 774 * @see #META_SYM_ON 775 */ isSymPressed()776 public final boolean isSymPressed() { 777 return (mMetaState & META_SYM_ON) != 0; 778 } 779 780 /** 781 * Retrieve the action of this key event. May be either 782 * {@link #ACTION_DOWN}, {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}. 783 * 784 * @return The event action: ACTION_DOWN, ACTION_UP, or ACTION_MULTIPLE. 785 */ getAction()786 public final int getAction() { 787 return mAction; 788 } 789 790 /** 791 * For {@link #ACTION_UP} events, indicates that the event has been 792 * canceled as per {@link #FLAG_CANCELED}. 793 */ isCanceled()794 public final boolean isCanceled() { 795 return (mFlags&FLAG_CANCELED) != 0; 796 } 797 798 /** 799 * Call this during {@link Callback#onKeyDown} to have the system track 800 * the key through its final up (possibly including a long press). Note 801 * that only one key can be tracked at a time -- if another key down 802 * event is received while a previous one is being tracked, tracking is 803 * stopped on the previous event. 804 */ startTracking()805 public final void startTracking() { 806 mFlags |= FLAG_START_TRACKING; 807 } 808 809 /** 810 * For {@link #ACTION_UP} events, indicates that the event is still being 811 * tracked from its initial down event as per 812 * {@link #FLAG_TRACKING}. 813 */ isTracking()814 public final boolean isTracking() { 815 return (mFlags&FLAG_TRACKING) != 0; 816 } 817 818 /** 819 * For {@link #ACTION_DOWN} events, indicates that the event has been 820 * canceled as per {@link #FLAG_LONG_PRESS}. 821 */ isLongPress()822 public final boolean isLongPress() { 823 return (mFlags&FLAG_LONG_PRESS) != 0; 824 } 825 826 /** 827 * Retrieve the key code of the key event. This is the physical key that 828 * was pressed, <em>not</em> the Unicode character. 829 * 830 * @return The key code of the event. 831 */ getKeyCode()832 public final int getKeyCode() { 833 return mKeyCode; 834 } 835 836 /** 837 * For the special case of a {@link #ACTION_MULTIPLE} event with key 838 * code of {@link #KEYCODE_UNKNOWN}, this is a raw string of characters 839 * associated with the event. In all other cases it is null. 840 * 841 * @return Returns a String of 1 or more characters associated with 842 * the event. 843 */ getCharacters()844 public final String getCharacters() { 845 return mCharacters; 846 } 847 848 /** 849 * Retrieve the hardware key id of this key event. These values are not 850 * reliable and vary from device to device. 851 * 852 * {@more} 853 * Mostly this is here for debugging purposes. 854 */ getScanCode()855 public final int getScanCode() { 856 return mScancode; 857 } 858 859 /** 860 * Retrieve the repeat count of the event. For both key up and key down 861 * events, this is the number of times the key has repeated with the first 862 * down starting at 0 and counting up from there. For multiple key 863 * events, this is the number of down/up pairs that have occurred. 864 * 865 * @return The number of times the key has repeated. 866 */ getRepeatCount()867 public final int getRepeatCount() { 868 return mRepeatCount; 869 } 870 871 /** 872 * Retrieve the time of the most recent key down event, 873 * in the {@link android.os.SystemClock#uptimeMillis} time base. If this 874 * is a down event, this will be the same as {@link #getEventTime()}. 875 * Note that when chording keys, this value is the down time of the 876 * most recently pressed key, which may <em>not</em> be the same physical 877 * key of this event. 878 * 879 * @return Returns the most recent key down time, in the 880 * {@link android.os.SystemClock#uptimeMillis} time base 881 */ getDownTime()882 public final long getDownTime() { 883 return mDownTime; 884 } 885 886 /** 887 * Retrieve the time this event occurred, 888 * in the {@link android.os.SystemClock#uptimeMillis} time base. 889 * 890 * @return Returns the time this event occurred, 891 * in the {@link android.os.SystemClock#uptimeMillis} time base. 892 */ getEventTime()893 public final long getEventTime() { 894 return mEventTime; 895 } 896 897 /** 898 * Return the id for the keyboard that this event came from. A device 899 * id of 0 indicates the event didn't come from a physical device and 900 * maps to the default keymap. The other numbers are arbitrary and 901 * you shouldn't depend on the values. 902 * 903 * @see KeyCharacterMap#load 904 */ getDeviceId()905 public final int getDeviceId() { 906 return mDeviceId; 907 } 908 909 /** 910 * Renamed to {@link #getDeviceId}. 911 * 912 * @hide 913 * @deprecated 914 */ getKeyboardDevice()915 public final int getKeyboardDevice() { 916 return mDeviceId; 917 } 918 919 /** 920 * Get the primary character for this key. In other words, the label 921 * that is physically printed on it. 922 */ getDisplayLabel()923 public char getDisplayLabel() { 924 return KeyCharacterMap.load(mDeviceId).getDisplayLabel(mKeyCode); 925 } 926 927 /** 928 * <p> 929 * Returns the Unicode character that the key would produce. 930 * </p><p> 931 * Returns 0 if the key is not one that is used to type Unicode 932 * characters. 933 * </p><p> 934 * If the return value has bit 935 * {@link KeyCharacterMap#COMBINING_ACCENT} 936 * set, the key is a "dead key" that should be combined with another to 937 * actually produce a character -- see {@link #getDeadChar} -- 938 * after masking with 939 * {@link KeyCharacterMap#COMBINING_ACCENT_MASK}. 940 * </p> 941 */ getUnicodeChar()942 public int getUnicodeChar() { 943 return getUnicodeChar(mMetaState); 944 } 945 946 /** 947 * <p> 948 * Returns the Unicode character that the key would produce. 949 * </p><p> 950 * Returns 0 if the key is not one that is used to type Unicode 951 * characters. 952 * </p><p> 953 * If the return value has bit 954 * {@link KeyCharacterMap#COMBINING_ACCENT} 955 * set, the key is a "dead key" that should be combined with another to 956 * actually produce a character -- see {@link #getDeadChar} -- after masking 957 * with {@link KeyCharacterMap#COMBINING_ACCENT_MASK}. 958 * </p> 959 */ getUnicodeChar(int meta)960 public int getUnicodeChar(int meta) { 961 return KeyCharacterMap.load(mDeviceId).get(mKeyCode, meta); 962 } 963 964 /** 965 * Get the characters conversion data for the key event.. 966 * 967 * @param results a {@link KeyData} that will be filled with the results. 968 * 969 * @return whether the key was mapped or not. If the key was not mapped, 970 * results is not modified. 971 */ getKeyData(KeyData results)972 public boolean getKeyData(KeyData results) { 973 return KeyCharacterMap.load(mDeviceId).getKeyData(mKeyCode, results); 974 } 975 976 /** 977 * The same as {@link #getMatch(char[],int) getMatch(chars, 0)}. 978 */ getMatch(char[] chars)979 public char getMatch(char[] chars) { 980 return getMatch(chars, 0); 981 } 982 983 /** 984 * If one of the chars in the array can be generated by the keyCode of this 985 * key event, return the char; otherwise return '\0'. 986 * @param chars the characters to try to find 987 * @param modifiers the modifier bits to prefer. If any of these bits 988 * are set, if there are multiple choices, that could 989 * work, the one for this modifier will be set. 990 */ getMatch(char[] chars, int modifiers)991 public char getMatch(char[] chars, int modifiers) { 992 return KeyCharacterMap.load(mDeviceId).getMatch(mKeyCode, chars, modifiers); 993 } 994 995 /** 996 * Gets the number or symbol associated with the key. The character value 997 * is returned, not the numeric value. If the key is not a number, but is 998 * a symbol, the symbol is retuned. 999 */ getNumber()1000 public char getNumber() { 1001 return KeyCharacterMap.load(mDeviceId).getNumber(mKeyCode); 1002 } 1003 1004 /** 1005 * Does the key code of this key produce a glyph? 1006 */ isPrintingKey()1007 public boolean isPrintingKey() { 1008 return KeyCharacterMap.load(mDeviceId).isPrintingKey(mKeyCode); 1009 } 1010 1011 /** 1012 * @deprecated Use {@link #dispatch(Callback, DispatcherState, Object)} instead. 1013 */ 1014 @Deprecated dispatch(Callback receiver)1015 public final boolean dispatch(Callback receiver) { 1016 return dispatch(receiver, null, null); 1017 } 1018 1019 /** 1020 * Deliver this key event to a {@link Callback} interface. If this is 1021 * an ACTION_MULTIPLE event and it is not handled, then an attempt will 1022 * be made to deliver a single normal event. 1023 * 1024 * @param receiver The Callback that will be given the event. 1025 * @param state State information retained across events. 1026 * @param target The target of the dispatch, for use in tracking. 1027 * 1028 * @return The return value from the Callback method that was called. 1029 */ dispatch(Callback receiver, DispatcherState state, Object target)1030 public final boolean dispatch(Callback receiver, DispatcherState state, 1031 Object target) { 1032 switch (mAction) { 1033 case ACTION_DOWN: { 1034 mFlags &= ~FLAG_START_TRACKING; 1035 if (DEBUG) Log.v(TAG, "Key down to " + target + " in " + state 1036 + ": " + this); 1037 boolean res = receiver.onKeyDown(mKeyCode, this); 1038 if (state != null) { 1039 if (res && mRepeatCount == 0 && (mFlags&FLAG_START_TRACKING) != 0) { 1040 if (DEBUG) Log.v(TAG, " Start tracking!"); 1041 state.startTracking(this, target); 1042 } else if (isLongPress() && state.isTracking(this)) { 1043 try { 1044 if (receiver.onKeyLongPress(mKeyCode, this)) { 1045 if (DEBUG) Log.v(TAG, " Clear from long press!"); 1046 state.performedLongPress(this); 1047 res = true; 1048 } 1049 } catch (AbstractMethodError e) { 1050 } 1051 } 1052 } 1053 return res; 1054 } 1055 case ACTION_UP: 1056 if (DEBUG) Log.v(TAG, "Key up to " + target + " in " + state 1057 + ": " + this); 1058 if (state != null) { 1059 state.handleUpEvent(this); 1060 } 1061 return receiver.onKeyUp(mKeyCode, this); 1062 case ACTION_MULTIPLE: 1063 final int count = mRepeatCount; 1064 final int code = mKeyCode; 1065 if (receiver.onKeyMultiple(code, count, this)) { 1066 return true; 1067 } 1068 if (code != KeyEvent.KEYCODE_UNKNOWN) { 1069 mAction = ACTION_DOWN; 1070 mRepeatCount = 0; 1071 boolean handled = receiver.onKeyDown(code, this); 1072 if (handled) { 1073 mAction = ACTION_UP; 1074 receiver.onKeyUp(code, this); 1075 } 1076 mAction = ACTION_MULTIPLE; 1077 mRepeatCount = count; 1078 return handled; 1079 } 1080 return false; 1081 } 1082 return false; 1083 } 1084 1085 /** 1086 * Use with {@link KeyEvent#dispatch(Callback, DispatcherState, Object)} 1087 * for more advanced key dispatching, such as long presses. 1088 */ 1089 public static class DispatcherState { 1090 int mDownKeyCode; 1091 Object mDownTarget; 1092 SparseIntArray mActiveLongPresses = new SparseIntArray(); 1093 1094 /** 1095 * Reset back to initial state. 1096 */ reset()1097 public void reset() { 1098 if (DEBUG) Log.v(TAG, "Reset: " + this); 1099 mDownKeyCode = 0; 1100 mDownTarget = null; 1101 mActiveLongPresses.clear(); 1102 } 1103 1104 /** 1105 * Stop any tracking associated with this target. 1106 */ reset(Object target)1107 public void reset(Object target) { 1108 if (mDownTarget == target) { 1109 if (DEBUG) Log.v(TAG, "Reset in " + target + ": " + this); 1110 mDownKeyCode = 0; 1111 mDownTarget = null; 1112 } 1113 } 1114 1115 /** 1116 * Start tracking the key code associated with the given event. This 1117 * can only be called on a key down. It will allow you to see any 1118 * long press associated with the key, and will result in 1119 * {@link KeyEvent#isTracking} return true on the long press and up 1120 * events. 1121 * 1122 * <p>This is only needed if you are directly dispatching events, rather 1123 * than handling them in {@link Callback#onKeyDown}. 1124 */ startTracking(KeyEvent event, Object target)1125 public void startTracking(KeyEvent event, Object target) { 1126 if (event.getAction() != ACTION_DOWN) { 1127 throw new IllegalArgumentException( 1128 "Can only start tracking on a down event"); 1129 } 1130 if (DEBUG) Log.v(TAG, "Start trackingt in " + target + ": " + this); 1131 mDownKeyCode = event.getKeyCode(); 1132 mDownTarget = target; 1133 } 1134 1135 /** 1136 * Return true if the key event is for a key code that is currently 1137 * being tracked by the dispatcher. 1138 */ isTracking(KeyEvent event)1139 public boolean isTracking(KeyEvent event) { 1140 return mDownKeyCode == event.getKeyCode(); 1141 } 1142 1143 /** 1144 * Keep track of the given event's key code as having performed an 1145 * action with a long press, so no action should occur on the up. 1146 * <p>This is only needed if you are directly dispatching events, rather 1147 * than handling them in {@link Callback#onKeyLongPress}. 1148 */ performedLongPress(KeyEvent event)1149 public void performedLongPress(KeyEvent event) { 1150 mActiveLongPresses.put(event.getKeyCode(), 1); 1151 } 1152 1153 /** 1154 * Handle key up event to stop tracking. This resets the dispatcher state, 1155 * and updates the key event state based on it. 1156 * <p>This is only needed if you are directly dispatching events, rather 1157 * than handling them in {@link Callback#onKeyUp}. 1158 */ handleUpEvent(KeyEvent event)1159 public void handleUpEvent(KeyEvent event) { 1160 final int keyCode = event.getKeyCode(); 1161 if (DEBUG) Log.v(TAG, "Handle key up " + event + ": " + this); 1162 int index = mActiveLongPresses.indexOfKey(keyCode); 1163 if (index >= 0) { 1164 if (DEBUG) Log.v(TAG, " Index: " + index); 1165 event.mFlags |= FLAG_CANCELED | FLAG_CANCELED_LONG_PRESS; 1166 mActiveLongPresses.removeAt(index); 1167 } 1168 if (mDownKeyCode == keyCode) { 1169 if (DEBUG) Log.v(TAG, " Tracking!"); 1170 event.mFlags |= FLAG_TRACKING; 1171 mDownKeyCode = 0; 1172 mDownTarget = null; 1173 } 1174 } 1175 } 1176 toString()1177 public String toString() { 1178 return "KeyEvent{action=" + mAction + " code=" + mKeyCode 1179 + " repeat=" + mRepeatCount 1180 + " meta=" + mMetaState + " scancode=" + mScancode 1181 + " mFlags=" + mFlags + "}"; 1182 } 1183 1184 public static final Parcelable.Creator<KeyEvent> CREATOR 1185 = new Parcelable.Creator<KeyEvent>() { 1186 public KeyEvent createFromParcel(Parcel in) { 1187 return new KeyEvent(in); 1188 } 1189 1190 public KeyEvent[] newArray(int size) { 1191 return new KeyEvent[size]; 1192 } 1193 }; 1194 describeContents()1195 public int describeContents() { 1196 return 0; 1197 } 1198 writeToParcel(Parcel out, int flags)1199 public void writeToParcel(Parcel out, int flags) { 1200 out.writeInt(mAction); 1201 out.writeInt(mKeyCode); 1202 out.writeInt(mRepeatCount); 1203 out.writeInt(mMetaState); 1204 out.writeInt(mDeviceId); 1205 out.writeInt(mScancode); 1206 out.writeInt(mFlags); 1207 out.writeLong(mDownTime); 1208 out.writeLong(mEventTime); 1209 } 1210 KeyEvent(Parcel in)1211 private KeyEvent(Parcel in) { 1212 mAction = in.readInt(); 1213 mKeyCode = in.readInt(); 1214 mRepeatCount = in.readInt(); 1215 mMetaState = in.readInt(); 1216 mDeviceId = in.readInt(); 1217 mScancode = in.readInt(); 1218 mFlags = in.readInt(); 1219 mDownTime = in.readLong(); 1220 mEventTime = in.readLong(); 1221 } 1222 } 1223