KeyEvent.java revision 4fedd80c1d3997d62073518973b1fe09862ebaa5
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.view;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable;
218d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackbornimport android.util.Log;
2283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackbornimport android.util.SparseIntArray;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyCharacterMap;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyCharacterMap.KeyData;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Contains constants for key events.
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class KeyEvent implements Parcelable {
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // key codes
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_UNKNOWN         = 0;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_SOFT_LEFT       = 1;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_SOFT_RIGHT      = 2;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_HOME            = 3;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_BACK            = 4;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_CALL            = 5;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_ENDCALL         = 6;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_0               = 7;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_1               = 8;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_2               = 9;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_3               = 10;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_4               = 11;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_5               = 12;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_6               = 13;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_7               = 14;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_8               = 15;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_9               = 16;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_STAR            = 17;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_POUND           = 18;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_DPAD_UP         = 19;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_DPAD_DOWN       = 20;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_DPAD_LEFT       = 21;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_DPAD_RIGHT      = 22;
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_DPAD_CENTER     = 23;
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_VOLUME_UP       = 24;
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_VOLUME_DOWN     = 25;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_POWER           = 26;
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_CAMERA          = 27;
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_CLEAR           = 28;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_A               = 29;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_B               = 30;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_C               = 31;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_D               = 32;
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_E               = 33;
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_F               = 34;
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_G               = 35;
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_H               = 36;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_I               = 37;
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_J               = 38;
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_K               = 39;
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_L               = 40;
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_M               = 41;
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_N               = 42;
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_O               = 43;
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_P               = 44;
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_Q               = 45;
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_R               = 46;
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_S               = 47;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_T               = 48;
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_U               = 49;
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_V               = 50;
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_W               = 51;
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_X               = 52;
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_Y               = 53;
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_Z               = 54;
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_COMMA           = 55;
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_PERIOD          = 56;
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_ALT_LEFT        = 57;
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_ALT_RIGHT       = 58;
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_SHIFT_LEFT      = 59;
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_SHIFT_RIGHT     = 60;
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_TAB             = 61;
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_SPACE           = 62;
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_SYM             = 63;
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_EXPLORER        = 64;
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_ENVELOPE        = 65;
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_ENTER           = 66;
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_DEL             = 67;
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_GRAVE           = 68;
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_MINUS           = 69;
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_EQUALS          = 70;
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_LEFT_BRACKET    = 71;
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_RIGHT_BRACKET   = 72;
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_BACKSLASH       = 73;
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_SEMICOLON       = 74;
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_APOSTROPHE      = 75;
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_SLASH           = 76;
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_AT              = 77;
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_NUM             = 78;
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_HEADSETHOOK     = 79;
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_FOCUS           = 80;   // *Camera* focus
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_PLUS            = 81;
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_MENU            = 82;
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_NOTIFICATION    = 83;
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_SEARCH          = 84;
116935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn    public static final int KEYCODE_MEDIA_PLAY_PAUSE= 85;
117935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn    public static final int KEYCODE_MEDIA_STOP      = 86;
118935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn    public static final int KEYCODE_MEDIA_NEXT      = 87;
119935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn    public static final int KEYCODE_MEDIA_PREVIOUS  = 88;
120935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn    public static final int KEYCODE_MEDIA_REWIND    = 89;
121935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn    public static final int KEYCODE_MEDIA_FAST_FORWARD = 90;
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEYCODE_MUTE            = 91;
1234fedd80c1d3997d62073518973b1fe09862ebaa5Chih-Wei Huang    public static final int KEYCODE_PAGE_UP         = 92;
1244fedd80c1d3997d62073518973b1fe09862ebaa5Chih-Wei Huang    public static final int KEYCODE_PAGE_DOWN       = 93;
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // NOTE: If you add a new keycode here you must also add it to:
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //  isSystem()
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //  frameworks/base/include/ui/KeycodeLabels.h
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //  tools/puppet_master/PuppetMaster/nav_keys.py
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //  frameworks/base/core/res/res/values/attrs.xml
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //  commands/monkey/Monkey.java
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //  emulator?
133935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn    //
134935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn    //  Also Android currently does not reserve code ranges for vendor-
135935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn    //  specific key codes.  If you have new key codes to have, you
136935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn    //  MUST contribute a patch to the open source project to define
137935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn    //  those new codes.  This is intended to maintain a consistent
138935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn    //  set of key code definitions across all Android devices.
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1404fedd80c1d3997d62073518973b1fe09862ebaa5Chih-Wei Huang    private static final int LAST_KEYCODE           = KEYCODE_PAGE_DOWN;
141935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @deprecated There are now more than MAX_KEYCODE keycodes.
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use {@link #getMaxKeyCode()} instead.
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Deprecated
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int MAX_KEYCODE             = 84;
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getAction} value: the key has been pressed down.
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ACTION_DOWN             = 0;
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getAction} value: the key has been released.
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ACTION_UP               = 1;
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getAction} value: multiple duplicate key events have
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * occurred in a row, or a complex string is being delivered.  If the
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * key code is not {#link {@link #KEYCODE_UNKNOWN} then the
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {#link {@link #getRepeatCount()} method returns the number of times
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the given key code should be executed.
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Otherwise, if the key code {@link #KEYCODE_UNKNOWN}, then
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this is a sequence of characters as returned by {@link #getCharacters}.
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int ACTION_MULTIPLE         = 2;
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This mask is used to check whether one of the ALT meta keys is pressed.</p>
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isAltPressed()
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getMetaState()
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_ALT_LEFT
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_ALT_RIGHT
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int META_ALT_ON = 0x02;
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This mask is used to check whether the left ALT meta key is pressed.</p>
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isAltPressed()
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getMetaState()
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_ALT_LEFT
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int META_ALT_LEFT_ON = 0x10;
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This mask is used to check whether the right the ALT meta key is pressed.</p>
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isAltPressed()
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getMetaState()
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_ALT_RIGHT
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int META_ALT_RIGHT_ON = 0x20;
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This mask is used to check whether one of the SHIFT meta keys is pressed.</p>
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isShiftPressed()
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getMetaState()
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_SHIFT_LEFT
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_SHIFT_RIGHT
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int META_SHIFT_ON = 0x1;
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This mask is used to check whether the left SHIFT meta key is pressed.</p>
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isShiftPressed()
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getMetaState()
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_SHIFT_LEFT
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int META_SHIFT_LEFT_ON = 0x40;
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This mask is used to check whether the right SHIFT meta key is pressed.</p>
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isShiftPressed()
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getMetaState()
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_SHIFT_RIGHT
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int META_SHIFT_RIGHT_ON = 0x80;
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This mask is used to check whether the SYM meta key is pressed.</p>
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isSymPressed()
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getMetaState()
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int META_SYM_ON = 0x4;
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This mask is set if the device woke because of this key event.
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FLAG_WOKE_HERE = 0x1;
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This mask is set if the key event was generated by a software keyboard.
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FLAG_SOFT_KEYBOARD = 0x2;
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This mask is set if we don't want the key event to cause us to leave
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * touch mode.
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FLAG_KEEP_TOUCH_MODE = 0x4;
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
249105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * This mask is set if an event was known to come from a trusted part
250105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * of the system.  That is, the event is known to come from the user,
251105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * and could not have been spoofed by a third party component.
252105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
253105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public static final int FLAG_FROM_SYSTEM = 0x8;
254105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
255105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
256105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * This mask is used for compatibility, to identify enter keys that are
257105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * coming from an IME whose enter key has been auto-labelled "next" or
258105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * "done".  This allows TextView to dispatch these as normal enter keys
259105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * for old applications, but still do the appropriate action when
260105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * receiving them.
261105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
262105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public static final int FLAG_EDITOR_ACTION = 0x10;
263105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
264105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
265ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * When associated with up key events, this indicates that the key press
266ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * has been canceled.  Typically this is used with virtual touch screen
267ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * keys, where the user can slide from the virtual key area on to the
268ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * display: in that case, the application will receive a canceled up
269ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * event and should not perform the action normally associated with the
270ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * key.  Note that for this to work, the application can not perform an
271ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * action for a key until it receives an up or the long press timeout has
272ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * expired.
273ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     */
274ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn    public static final int FLAG_CANCELED = 0x20;
275ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn
276ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn    /**
277ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * This key event was generated by a virtual (on-screen) hard key area.
278ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * Typically this is an area of the touchscreen, outside of the regular
279ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * display, dedicated to "hardware" buttons.
280ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     */
281ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn    public static final int FLAG_VIRTUAL_HARD_KEY = 0x40;
282ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn
283ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn    /**
28483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * This flag is set for the first key repeat that occurs after the
28583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * long press timeout.
28683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     */
28783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public static final int FLAG_LONG_PRESS = 0x80;
28883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
28983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    /**
29083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * Set when a key event has {@link #FLAG_CANCELED} set because a long
29183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * press action was executed while it was down.
29283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     */
29383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public static final int FLAG_CANCELED_LONG_PRESS = 0x100;
29483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
29583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    /**
29683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * Set for {@link #ACTION_UP} when this event's key code is still being
29783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * tracked from its initial down.  That is, somebody requested that tracking
29883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * started on the key down and a long press has not caused
29983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * the tracking to be canceled.
30083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     */
30183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public static final int FLAG_TRACKING = 0x200;
30283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
30383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    /**
30483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * Private control to determine when an app is tracking a key sequence.
30583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * @hide
30683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     */
30783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public static final int FLAG_START_TRACKING = 0x40000000;
30883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
30983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    /**
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the maximum keycode.
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static int getMaxKeyCode() {
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return LAST_KEYCODE;
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Get the character that is produced by putting accent on the character
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * c.
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * For example, getDeadChar('`', 'e') returns &egrave;.
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static int getDeadChar(int accent, int c) {
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return KeyCharacterMap.getDeadChar(accent, c);
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3258d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn    static final boolean DEBUG = false;
3268d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn    static final String TAG = "KeyEvent";
3278d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mMetaState;
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mAction;
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mKeyCode;
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mScancode;
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mRepeatCount;
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mDeviceId;
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mFlags;
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private long mDownTime;
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private long mEventTime;
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String mCharacters;
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public interface Callback {
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
34183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * Called when a key down event has occurred.  If you return true,
34283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * you can first call {@link KeyEvent#startTracking()
34383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * KeyEvent.startTracking()} to have the framework track the event
34483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * through its {@link #onKeyUp(int, KeyEvent)} and also call your
34583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * {@link #onKeyLongPress(int, KeyEvent)} if it occurs.
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param keyCode The value in event.getKeyCode().
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param event Description of the key event.
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return If you handled the event, return true.  If you want to allow
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *         the event to be handled by the next receiver, return false.
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean onKeyDown(int keyCode, KeyEvent event);
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
35683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * Called when a long press has occurred.  If you return true,
35783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * the final key up will have {@link KeyEvent#FLAG_CANCELED} and
35883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * {@link KeyEvent#FLAG_CANCELED_LONG_PRESS} set.  Note that in
35983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * order to receive this callback, someone in the event change
36083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * <em>must</em> return true from {@link #onKeyDown} <em>and</em>
36183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * call {@link KeyEvent#startTracking()} on the event.
36283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         *
36383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * @param keyCode The value in event.getKeyCode().
36483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * @param event Description of the key event.
36583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         *
36683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * @return If you handled the event, return true.  If you want to allow
36783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         *         the event to be handled by the next receiver, return false.
36883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         */
36983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        boolean onKeyLongPress(int keyCode, KeyEvent event);
37083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
37183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        /**
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Called when a key up event has occurred.
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param keyCode The value in event.getKeyCode().
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param event Description of the key event.
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return If you handled the event, return true.  If you want to allow
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *         the event to be handled by the next receiver, return false.
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean onKeyUp(int keyCode, KeyEvent event);
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Called when multiple down/up pairs of the same key have occurred
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * in a row.
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param keyCode The value in event.getKeyCode().
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param count Number of pairs as returned by event.getRepeatCount().
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param event Description of the key event.
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return If you handled the event, return true.  If you want to allow
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *         the event to be handled by the next receiver, return false.
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean onKeyMultiple(int keyCode, int count, KeyEvent event);
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new key event.
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param action Action code: either {@link #ACTION_DOWN},
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param code The key code.
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public KeyEvent(int action, int code) {
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAction = action;
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mKeyCode = code;
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRepeatCount = 0;
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new key event.
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param downTime The time (in {@link android.os.SystemClock#uptimeMillis})
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * at which this key code originally went down.
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param eventTime The time (in {@link android.os.SystemClock#uptimeMillis})
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * at which this event happened.
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param action Action code: either {@link #ACTION_DOWN},
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param code The key code.
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param repeat A repeat count for down events (> 0 if this is after the
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * initial down) or event count for multiple events.
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public KeyEvent(long downTime, long eventTime, int action,
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int code, int repeat) {
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDownTime = downTime;
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mEventTime = eventTime;
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAction = action;
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mKeyCode = code;
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRepeatCount = repeat;
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new key event.
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param downTime The time (in {@link android.os.SystemClock#uptimeMillis})
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * at which this key code originally went down.
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param eventTime The time (in {@link android.os.SystemClock#uptimeMillis})
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * at which this event happened.
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param action Action code: either {@link #ACTION_DOWN},
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param code The key code.
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param repeat A repeat count for down events (> 0 if this is after the
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * initial down) or event count for multiple events.
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param metaState Flags indicating which meta keys are currently pressed.
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public KeyEvent(long downTime, long eventTime, int action,
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int code, int repeat, int metaState) {
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDownTime = downTime;
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mEventTime = eventTime;
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAction = action;
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mKeyCode = code;
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRepeatCount = repeat;
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMetaState = metaState;
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new key event.
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param downTime The time (in {@link android.os.SystemClock#uptimeMillis})
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * at which this key code originally went down.
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param eventTime The time (in {@link android.os.SystemClock#uptimeMillis})
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * at which this event happened.
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param action Action code: either {@link #ACTION_DOWN},
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param code The key code.
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param repeat A repeat count for down events (> 0 if this is after the
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * initial down) or event count for multiple events.
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param metaState Flags indicating which meta keys are currently pressed.
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param device The device ID that generated the key event.
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param scancode Raw device scan code of the event.
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public KeyEvent(long downTime, long eventTime, int action,
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int code, int repeat, int metaState,
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int device, int scancode) {
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDownTime = downTime;
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mEventTime = eventTime;
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAction = action;
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mKeyCode = code;
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRepeatCount = repeat;
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMetaState = metaState;
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDeviceId = device;
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScancode = scancode;
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new key event.
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param downTime The time (in {@link android.os.SystemClock#uptimeMillis})
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * at which this key code originally went down.
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param eventTime The time (in {@link android.os.SystemClock#uptimeMillis})
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * at which this event happened.
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param action Action code: either {@link #ACTION_DOWN},
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param code The key code.
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param repeat A repeat count for down events (> 0 if this is after the
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * initial down) or event count for multiple events.
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param metaState Flags indicating which meta keys are currently pressed.
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param device The device ID that generated the key event.
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param scancode Raw device scan code of the event.
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param flags The flags for this key event
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public KeyEvent(long downTime, long eventTime, int action,
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int code, int repeat, int metaState,
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int device, int scancode, int flags) {
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDownTime = downTime;
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mEventTime = eventTime;
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAction = action;
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mKeyCode = code;
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRepeatCount = repeat;
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMetaState = metaState;
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDeviceId = device;
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScancode = scancode;
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFlags = flags;
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new key event for a string of characters.  The key code,
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * action, and repeat could will automatically be set to
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #KEYCODE_UNKNOWN}, {@link #ACTION_MULTIPLE}, and 0 for you.
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param time The time (in {@link android.os.SystemClock#uptimeMillis})
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * at which this event occured.
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param characters The string of characters.
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param device The device ID that generated the key event.
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param flags The flags for this key event
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public KeyEvent(long time, String characters, int device, int flags) {
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDownTime = time;
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mEventTime = time;
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCharacters = characters;
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAction = ACTION_MULTIPLE;
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mKeyCode = KEYCODE_UNKNOWN;
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRepeatCount = 0;
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDeviceId = device;
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFlags = flags;
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
538105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * Make an exact copy of an existing key event.
539105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
540105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public KeyEvent(KeyEvent origEvent) {
541105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mDownTime = origEvent.mDownTime;
542105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mEventTime = origEvent.mEventTime;
543105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mAction = origEvent.mAction;
544105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mKeyCode = origEvent.mKeyCode;
545105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mRepeatCount = origEvent.mRepeatCount;
546105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mMetaState = origEvent.mMetaState;
547105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mDeviceId = origEvent.mDeviceId;
548105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mScancode = origEvent.mScancode;
549105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mFlags = origEvent.mFlags;
550105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mCharacters = origEvent.mCharacters;
551105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
552105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
553105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Copy an existing key event, modifying its time and repeat count.
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
55683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * @deprecated Use {@link #changeTimeRepeat(KeyEvent, long, int)}
55783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * instead.
55883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     *
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param origEvent The existing event to be copied.
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param eventTime The new event time
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * (in {@link android.os.SystemClock#uptimeMillis}) of the event.
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param newRepeat The new repeat count of the event.
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
56483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    @Deprecated
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public KeyEvent(KeyEvent origEvent, long eventTime, int newRepeat) {
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDownTime = origEvent.mDownTime;
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mEventTime = eventTime;
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAction = origEvent.mAction;
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mKeyCode = origEvent.mKeyCode;
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRepeatCount = newRepeat;
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMetaState = origEvent.mMetaState;
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDeviceId = origEvent.mDeviceId;
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScancode = origEvent.mScancode;
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFlags = origEvent.mFlags;
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCharacters = origEvent.mCharacters;
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
579105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * Create a new key event that is the same as the given one, but whose
580105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * event time and repeat count are replaced with the given value.
581105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     *
582105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * @param event The existing event to be copied.  This is not modified.
583105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * @param eventTime The new event time
584105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * (in {@link android.os.SystemClock#uptimeMillis}) of the event.
585105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * @param newRepeat The new repeat count of the event.
586105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
587105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public static KeyEvent changeTimeRepeat(KeyEvent event, long eventTime,
588105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            int newRepeat) {
589105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        return new KeyEvent(event, eventTime, newRepeat);
590105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
591105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
592105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
59383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * Create a new key event that is the same as the given one, but whose
59483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * event time and repeat count are replaced with the given value.
59583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     *
59683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * @param event The existing event to be copied.  This is not modified.
59783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * @param eventTime The new event time
59883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * (in {@link android.os.SystemClock#uptimeMillis}) of the event.
59983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * @param newRepeat The new repeat count of the event.
60083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * @param newFlags New flags for the event, replacing the entire value
60183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * in the original event.
60283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     */
60383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public static KeyEvent changeTimeRepeat(KeyEvent event, long eventTime,
60483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            int newRepeat, int newFlags) {
60583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        KeyEvent ret = new KeyEvent(event);
60683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        ret.mEventTime = eventTime;
60783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        ret.mRepeatCount = newRepeat;
60883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        ret.mFlags = newFlags;
60983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        return ret;
61083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    }
61183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
61283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    /**
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Copy an existing key event, modifying its action.
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param origEvent The existing event to be copied.
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param action The new action code of the event.
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
618105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    private KeyEvent(KeyEvent origEvent, int action) {
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDownTime = origEvent.mDownTime;
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mEventTime = origEvent.mEventTime;
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAction = action;
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mKeyCode = origEvent.mKeyCode;
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRepeatCount = origEvent.mRepeatCount;
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMetaState = origEvent.mMetaState;
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDeviceId = origEvent.mDeviceId;
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScancode = origEvent.mScancode;
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFlags = origEvent.mFlags;
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Don't copy mCharacters, since one way or the other we'll lose it
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // when changing the action.
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
633105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * Create a new key event that is the same as the given one, but whose
634105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * action is replaced with the given value.
635105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     *
636105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * @param event The existing event to be copied.  This is not modified.
637105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * @param action The new action code of the event.
638105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
639105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public static KeyEvent changeAction(KeyEvent event, int action) {
640105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        return new KeyEvent(event, action);
641105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
642105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
643105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
644105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * Create a new key event that is the same as the given one, but whose
645105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * flags are replaced with the given value.
646105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     *
647105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * @param event The existing event to be copied.  This is not modified.
648105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * @param flags The new flags constant.
649105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
650105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public static KeyEvent changeFlags(KeyEvent event, int flags) {
651105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        event = new KeyEvent(event);
652105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        event.mFlags = flags;
653105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        return event;
654105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
655105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
656105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /**
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Don't use in new code, instead explicitly check
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getAction()}.
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return If the action is ACTION_DOWN, returns true; else false.
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @deprecated
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Deprecated public final boolean isDown() {
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mAction == ACTION_DOWN;
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Is this a system key?  System keys can not be used for menu shortcuts.
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * TODO: this information should come from a table somewhere.
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * TODO: should the dpad keys be here?  arguably, because they also shouldn't be menu shortcuts
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final boolean isSystem() {
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (mKeyCode) {
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case KEYCODE_MENU:
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case KEYCODE_SOFT_RIGHT:
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case KEYCODE_HOME:
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case KEYCODE_BACK:
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case KEYCODE_CALL:
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case KEYCODE_ENDCALL:
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case KEYCODE_VOLUME_UP:
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case KEYCODE_VOLUME_DOWN:
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case KEYCODE_MUTE:
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case KEYCODE_POWER:
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case KEYCODE_HEADSETHOOK:
688935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn        case KEYCODE_MEDIA_PLAY_PAUSE:
689935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn        case KEYCODE_MEDIA_STOP:
690935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn        case KEYCODE_MEDIA_NEXT:
691935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn        case KEYCODE_MEDIA_PREVIOUS:
692935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn        case KEYCODE_MEDIA_REWIND:
693935ae463d495d41155e27feb849768ad2b8b16dbDianne Hackborn        case KEYCODE_MEDIA_FAST_FORWARD:
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case KEYCODE_CAMERA:
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case KEYCODE_FOCUS:
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case KEYCODE_SEARCH:
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        default:
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Returns the state of the meta keys.</p>
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return an integer in which each bit set to 1 represents a pressed
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         meta key
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isAltPressed()
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isShiftPressed()
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isSymPressed()
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #META_ALT_ON
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #META_SHIFT_ON
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #META_SYM_ON
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getMetaState() {
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mMetaState;
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the flags for this key event.
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #FLAG_WOKE_HERE
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getFlags() {
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mFlags;
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns true if this key code is a modifier key.
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return whether the provided keyCode is one of
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #KEYCODE_SHIFT_LEFT} {@link #KEYCODE_SHIFT_RIGHT},
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #KEYCODE_ALT_LEFT}, {@link #KEYCODE_ALT_RIGHT}
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * or {@link #KEYCODE_SYM}.
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static boolean isModifierKey(int keyCode) {
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return keyCode == KEYCODE_SHIFT_LEFT || keyCode == KEYCODE_SHIFT_RIGHT
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                || keyCode == KEYCODE_ALT_LEFT || keyCode == KEYCODE_ALT_RIGHT
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                || keyCode == KEYCODE_SYM;
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Returns the pressed state of the ALT meta key.</p>
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the ALT key is pressed, false otherwise
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_ALT_LEFT
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_ALT_RIGHT
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #META_ALT_ON
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final boolean isAltPressed() {
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (mMetaState & META_ALT_ON) != 0;
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Returns the pressed state of the SHIFT meta key.</p>
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the SHIFT key is pressed, false otherwise
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_SHIFT_LEFT
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_SHIFT_RIGHT
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #META_SHIFT_ON
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final boolean isShiftPressed() {
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (mMetaState & META_SHIFT_ON) != 0;
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Returns the pressed state of the SYM meta key.</p>
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the SYM key is pressed, false otherwise
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #KEYCODE_SYM
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #META_SYM_ON
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final boolean isSymPressed() {
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (mMetaState & META_SYM_ON) != 0;
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the action of this key event.  May be either
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #ACTION_DOWN}, {@link #ACTION_UP}, or {@link #ACTION_MULTIPLE}.
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The event action: ACTION_DOWN, ACTION_UP, or ACTION_MULTIPLE.
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getAction() {
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mAction;
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
793ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * For {@link #ACTION_UP} events, indicates that the event has been
794ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     * canceled as per {@link #FLAG_CANCELED}.
795ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn     */
796ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn    public final boolean isCanceled() {
797ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn        return (mFlags&FLAG_CANCELED) != 0;
798ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn    }
799ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn
800ddca3ee3e86fbaa05c1528bd72afd955f0fb4ee6Dianne Hackborn    /**
80183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * Call this during {@link Callback#onKeyDown} to have the system track
80283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * the key through its final up (possibly including a long press).  Note
80383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * that only one key can be tracked at a time -- if another key down
80483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * event is received while a previous one is being tracked, tracking is
80583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * stopped on the previous event.
80683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     */
80783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public final void startTracking() {
80883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        mFlags |= FLAG_START_TRACKING;
80983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    }
81083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
81183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    /**
81283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * For {@link #ACTION_UP} events, indicates that the event is still being
81383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * tracked from its initial down event as per
81483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * {@link #FLAG_TRACKING}.
81583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     */
81683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public final boolean isTracking() {
81783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        return (mFlags&FLAG_TRACKING) != 0;
81883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    }
81983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
82083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    /**
82183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * For {@link #ACTION_DOWN} events, indicates that the event has been
82283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * canceled as per {@link #FLAG_LONG_PRESS}.
82383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     */
82483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public final boolean isLongPress() {
82583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        return (mFlags&FLAG_LONG_PRESS) != 0;
82683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    }
82783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
82883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    /**
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the key code of the key event.  This is the physical key that
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * was pressed, <em>not</em> the Unicode character.
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The key code of the event.
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getKeyCode() {
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mKeyCode;
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * For the special case of a {@link #ACTION_MULTIPLE} event with key
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * code of {@link #KEYCODE_UNKNOWN}, this is a raw string of characters
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * associated with the event.  In all other cases it is null.
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns a String of 1 or more characters associated with
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the event.
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final String getCharacters() {
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mCharacters;
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the hardware key id of this key event.  These values are not
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * reliable and vary from device to device.
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@more}
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Mostly this is here for debugging purposes.
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getScanCode() {
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mScancode;
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the repeat count of the event.  For both key up and key down
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * events, this is the number of times the key has repeated with the first
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * down starting at 0 and counting up from there.  For multiple key
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * events, this is the number of down/up pairs that have occurred.
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The number of times the key has repeated.
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getRepeatCount() {
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mRepeatCount;
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the time of the most recent key down event,
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in the {@link android.os.SystemClock#uptimeMillis} time base.  If this
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is a down event, this will be the same as {@link #getEventTime()}.
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Note that when chording keys, this value is the down time of the
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * most recently pressed key, which may <em>not</em> be the same physical
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * key of this event.
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the most recent key down time, in the
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.os.SystemClock#uptimeMillis} time base
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final long getDownTime() {
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mDownTime;
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the time this event occurred,
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in the {@link android.os.SystemClock#uptimeMillis} time base.
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the time this event occurred,
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in the {@link android.os.SystemClock#uptimeMillis} time base.
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final long getEventTime() {
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mEventTime;
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the id for the keyboard that this event came from.  A device
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * id of 0 indicates the event didn't come from a physical device and
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * maps to the default keymap.  The other numbers are arbitrary and
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * you shouldn't depend on the values.
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see KeyCharacterMap#load
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getDeviceId() {
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mDeviceId;
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Renamed to {@link #getDeviceId}.
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @deprecated
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getKeyboardDevice() {
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mDeviceId;
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Get the primary character for this key.  In other words, the label
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that is physically printed on it.
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public char getDisplayLabel() {
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return KeyCharacterMap.load(mDeviceId).getDisplayLabel(mKeyCode);
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the Unicode character that the key would produce.
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </p><p>
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns 0 if the key is not one that is used to type Unicode
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * characters.
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </p><p>
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If the return value has bit
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link KeyCharacterMap#COMBINING_ACCENT}
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * set, the key is a "dead key" that should be combined with another to
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * actually produce a character -- see {@link #getDeadChar} --
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * after masking with
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link KeyCharacterMap#COMBINING_ACCENT_MASK}.
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </p>
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getUnicodeChar() {
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getUnicodeChar(mMetaState);
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the Unicode character that the key would produce.
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </p><p>
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns 0 if the key is not one that is used to type Unicode
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * characters.
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </p><p>
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If the return value has bit
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link KeyCharacterMap#COMBINING_ACCENT}
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * set, the key is a "dead key" that should be combined with another to
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * actually produce a character -- see {@link #getDeadChar} -- after masking
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * with {@link KeyCharacterMap#COMBINING_ACCENT_MASK}.
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </p>
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getUnicodeChar(int meta) {
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return KeyCharacterMap.load(mDeviceId).get(mKeyCode, meta);
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Get the characters conversion data for the key event..
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param results a {@link KeyData} that will be filled with the results.
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return whether the key was mapped or not.  If the key was not mapped,
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         results is not modified.
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean getKeyData(KeyData results) {
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return KeyCharacterMap.load(mDeviceId).getKeyData(mKeyCode, results);
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The same as {@link #getMatch(char[],int) getMatch(chars, 0)}.
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public char getMatch(char[] chars) {
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getMatch(chars, 0);
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If one of the chars in the array can be generated by the keyCode of this
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * key event, return the char; otherwise return '\0'.
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param chars the characters to try to find
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param modifiers the modifier bits to prefer.  If any of these bits
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                  are set, if there are multiple choices, that could
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                  work, the one for this modifier will be set.
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public char getMatch(char[] chars, int modifiers) {
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return KeyCharacterMap.load(mDeviceId).getMatch(mKeyCode, chars, modifiers);
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the number or symbol associated with the key.  The character value
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is returned, not the numeric value.  If the key is not a number, but is
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a symbol, the symbol is retuned.
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public char getNumber() {
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return KeyCharacterMap.load(mDeviceId).getNumber(mKeyCode);
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Does the key code of this key produce a glyph?
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isPrintingKey() {
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return KeyCharacterMap.load(mDeviceId).isPrintingKey(mKeyCode);
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
101483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * @deprecated Use {@link #dispatch(Callback, DispatcherState, Object)} instead.
101583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     */
101683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    @Deprecated
101783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public final boolean dispatch(Callback receiver) {
101883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        return dispatch(receiver, null, null);
101983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    }
102083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
102183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    /**
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Deliver this key event to a {@link Callback} interface.  If this is
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * an ACTION_MULTIPLE event and it is not handled, then an attempt will
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be made to deliver a single normal event.
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param receiver The Callback that will be given the event.
102783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * @param state State information retained across events.
102883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * @param target The target of the dispatch, for use in tracking.
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The return value from the Callback method that was called.
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
103283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public final boolean dispatch(Callback receiver, DispatcherState state,
103383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            Object target) {
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (mAction) {
103583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            case ACTION_DOWN: {
103683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                mFlags &= ~FLAG_START_TRACKING;
10378d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                if (DEBUG) Log.v(TAG, "Key down to " + target + " in " + state
10388d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                        + ": " + this);
103983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                boolean res = receiver.onKeyDown(mKeyCode, this);
104083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                if (state != null) {
104183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                    if (res && mRepeatCount == 0 && (mFlags&FLAG_START_TRACKING) != 0) {
10428d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                        if (DEBUG) Log.v(TAG, "  Start tracking!");
104383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                        state.startTracking(this, target);
104483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                    } else if (isLongPress() && state.isTracking(this)) {
104583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                        try {
104683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                            if (receiver.onKeyLongPress(mKeyCode, this)) {
10478d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                                if (DEBUG) Log.v(TAG, "  Clear from long press!");
104883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                                state.performedLongPress(this);
104983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                                res = true;
105083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                            }
105183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                        } catch (AbstractMethodError e) {
105283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                        }
105383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                    }
105483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                }
105583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                return res;
105683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            }
10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case ACTION_UP:
10588d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                if (DEBUG) Log.v(TAG, "Key up to " + target + " in " + state
10598d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                        + ": " + this);
106083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                if (state != null) {
106183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                    state.handleUpEvent(this);
106283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                }
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return receiver.onKeyUp(mKeyCode, this);
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case ACTION_MULTIPLE:
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int count = mRepeatCount;
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int code = mKeyCode;
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (receiver.onKeyMultiple(code, count, this)) {
10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return true;
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (code != KeyEvent.KEYCODE_UNKNOWN) {
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAction = ACTION_DOWN;
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mRepeatCount = 0;
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    boolean handled = receiver.onKeyDown(code, this);
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (handled) {
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mAction = ACTION_UP;
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        receiver.onKeyUp(code, this);
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mAction = ACTION_MULTIPLE;
10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mRepeatCount = count;
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return handled;
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
108283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                return false;
10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
108783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    /**
108883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * Use with {@link KeyEvent#dispatch(Callback, DispatcherState, Object)}
108983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * for more advanced key dispatching, such as long presses.
109083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     */
109183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public static class DispatcherState {
109283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        int mDownKeyCode;
109383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        Object mDownTarget;
109483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        SparseIntArray mActiveLongPresses = new SparseIntArray();
109583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
109683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        /**
109783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * Reset back to initial state.
109883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         */
109983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        public void reset() {
11008d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn            if (DEBUG) Log.v(TAG, "Reset: " + this);
110183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            mDownKeyCode = 0;
110283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            mDownTarget = null;
110383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            mActiveLongPresses.clear();
110483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        }
110583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
110683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        /**
110783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * Stop any tracking associated with this target.
110883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         */
110983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        public void reset(Object target) {
111083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            if (mDownTarget == target) {
11118d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                if (DEBUG) Log.v(TAG, "Reset in " + target + ": " + this);
111283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                mDownKeyCode = 0;
111383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                mDownTarget = null;
111483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            }
111583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        }
111683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
111783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        /**
111883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * Start tracking the key code associated with the given event.  This
111983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * can only be called on a key down.  It will allow you to see any
112083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * long press associated with the key, and will result in
112183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * {@link KeyEvent#isTracking} return true on the long press and up
112283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * events.
112383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         *
112483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * <p>This is only needed if you are directly dispatching events, rather
112583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * than handling them in {@link Callback#onKeyDown}.
112683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         */
112783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        public void startTracking(KeyEvent event, Object target) {
112883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            if (event.getAction() != ACTION_DOWN) {
112983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                throw new IllegalArgumentException(
113083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                        "Can only start tracking on a down event");
113183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            }
11328d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn            if (DEBUG) Log.v(TAG, "Start trackingt in " + target + ": " + this);
113383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            mDownKeyCode = event.getKeyCode();
113483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            mDownTarget = target;
113583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        }
113683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
113783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        /**
113883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * Return true if the key event is for a key code that is currently
113983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * being tracked by the dispatcher.
114083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         */
114183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        public boolean isTracking(KeyEvent event) {
114283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            return mDownKeyCode == event.getKeyCode();
114383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        }
114483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
114583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        /**
114683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * Keep track of the given event's key code as having performed an
114783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * action with a long press, so no action should occur on the up.
114883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * <p>This is only needed if you are directly dispatching events, rather
114983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * than handling them in {@link Callback#onKeyLongPress}.
115083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         */
115183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        public void performedLongPress(KeyEvent event) {
115283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            mActiveLongPresses.put(event.getKeyCode(), 1);
115383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        }
115483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
115583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        /**
115683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * Handle key up event to stop tracking.  This resets the dispatcher state,
115783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * and updates the key event state based on it.
115883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * <p>This is only needed if you are directly dispatching events, rather
115983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         * than handling them in {@link Callback#onKeyUp}.
116083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn         */
116183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        public void handleUpEvent(KeyEvent event) {
116283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            final int keyCode = event.getKeyCode();
11638d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn            if (DEBUG) Log.v(TAG, "Handle key up " + event + ": " + this);
116483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            int index = mActiveLongPresses.indexOfKey(keyCode);
116583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            if (index >= 0) {
11668d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                if (DEBUG) Log.v(TAG, "  Index: " + index);
116783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                event.mFlags |= FLAG_CANCELED | FLAG_CANCELED_LONG_PRESS;
116883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                mActiveLongPresses.removeAt(index);
116983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            }
117083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            if (mDownKeyCode == keyCode) {
11718d37426c754e9822feaa8c6cc0b7c13e8523e217Dianne Hackborn                if (DEBUG) Log.v(TAG, "  Tracking!");
117283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                event.mFlags |= FLAG_TRACKING;
117383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                mDownKeyCode = 0;
117483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                mDownTarget = null;
117583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            }
117683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        }
117783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    }
117883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String toString() {
11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return "KeyEvent{action=" + mAction + " code=" + mKeyCode
11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            + " repeat=" + mRepeatCount
11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            + " meta=" + mMetaState + " scancode=" + mScancode
11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            + " mFlags=" + mFlags + "}";
11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final Parcelable.Creator<KeyEvent> CREATOR
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            = new Parcelable.Creator<KeyEvent>() {
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public KeyEvent createFromParcel(Parcel in) {
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new KeyEvent(in);
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public KeyEvent[] newArray(int size) {
11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new KeyEvent[size];
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int describeContents() {
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeToParcel(Parcel out, int flags) {
12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mAction);
12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mKeyCode);
12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mRepeatCount);
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mMetaState);
12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mDeviceId);
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mScancode);
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mFlags);
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mDownTime);
12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mEventTime);
12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private KeyEvent(Parcel in) {
12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAction = in.readInt();
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mKeyCode = in.readInt();
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRepeatCount = in.readInt();
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMetaState = in.readInt();
12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDeviceId = in.readInt();
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScancode = in.readInt();
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFlags = in.readInt();
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDownTime = in.readLong();
12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mEventTime = in.readLong();
12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1225