Move key attribute information into KeyEvent.

This consolidates all of the information that was in the native
KeyEvent and the KeyLayout files into the managed KeyEvent class.

It also moves the definition for all of the key names to the native
side, rather than having them in both places.

Change-Id: I172e3b554e7eb52c79ae2ec406ef4332e8b25ffa
diff --git a/core/java/android/view/KeyEvent.java b/core/java/android/view/KeyEvent.java
index c3f429c..05e202b 100644
--- a/core/java/android/view/KeyEvent.java
+++ b/core/java/android/view/KeyEvent.java
@@ -645,12 +645,11 @@
     // NOTE: If you add a new keycode here you must also add it to:
     //  isSystem()
     //  frameworks/native/include/android/keycodes.h
-    //  frameworks/base/include/androidfw/KeycodeLabels.h
+    //  frameworks/base/include/androidfw/InputEventAttributes.h
     //  external/webkit/WebKit/android/plugins/ANPKeyCodes.h
     //  frameworks/base/core/res/res/values/attrs.xml
     //  emulator?
     //  LAST_KEYCODE
-    //  KEYCODE_SYMBOLIC_NAMES
     //
     //  Also Android currently does not reserve code ranges for vendor-
     //  specific key codes.  If you have new key codes to have, you
@@ -658,237 +657,6 @@
     //  those new codes.  This is intended to maintain a consistent
     //  set of key code definitions across all Android devices.
 
-    // Symbolic names of all key codes.
-    private static final SparseArray<String> KEYCODE_SYMBOLIC_NAMES = new SparseArray<String>();
-    private static void populateKeycodeSymbolicNames() {
-        SparseArray<String> names = KEYCODE_SYMBOLIC_NAMES;
-        names.append(KEYCODE_UNKNOWN, "KEYCODE_UNKNOWN");
-        names.append(KEYCODE_SOFT_LEFT, "KEYCODE_SOFT_LEFT");
-        names.append(KEYCODE_SOFT_RIGHT, "KEYCODE_SOFT_RIGHT");
-        names.append(KEYCODE_HOME, "KEYCODE_HOME");
-        names.append(KEYCODE_BACK, "KEYCODE_BACK");
-        names.append(KEYCODE_CALL, "KEYCODE_CALL");
-        names.append(KEYCODE_ENDCALL, "KEYCODE_ENDCALL");
-        names.append(KEYCODE_0, "KEYCODE_0");
-        names.append(KEYCODE_1, "KEYCODE_1");
-        names.append(KEYCODE_2, "KEYCODE_2");
-        names.append(KEYCODE_3, "KEYCODE_3");
-        names.append(KEYCODE_4, "KEYCODE_4");
-        names.append(KEYCODE_5, "KEYCODE_5");
-        names.append(KEYCODE_6, "KEYCODE_6");
-        names.append(KEYCODE_7, "KEYCODE_7");
-        names.append(KEYCODE_8, "KEYCODE_8");
-        names.append(KEYCODE_9, "KEYCODE_9");
-        names.append(KEYCODE_STAR, "KEYCODE_STAR");
-        names.append(KEYCODE_POUND, "KEYCODE_POUND");
-        names.append(KEYCODE_DPAD_UP, "KEYCODE_DPAD_UP");
-        names.append(KEYCODE_DPAD_DOWN, "KEYCODE_DPAD_DOWN");
-        names.append(KEYCODE_DPAD_LEFT, "KEYCODE_DPAD_LEFT");
-        names.append(KEYCODE_DPAD_RIGHT, "KEYCODE_DPAD_RIGHT");
-        names.append(KEYCODE_DPAD_CENTER, "KEYCODE_DPAD_CENTER");
-        names.append(KEYCODE_VOLUME_UP, "KEYCODE_VOLUME_UP");
-        names.append(KEYCODE_VOLUME_DOWN, "KEYCODE_VOLUME_DOWN");
-        names.append(KEYCODE_POWER, "KEYCODE_POWER");
-        names.append(KEYCODE_CAMERA, "KEYCODE_CAMERA");
-        names.append(KEYCODE_CLEAR, "KEYCODE_CLEAR");
-        names.append(KEYCODE_A, "KEYCODE_A");
-        names.append(KEYCODE_B, "KEYCODE_B");
-        names.append(KEYCODE_C, "KEYCODE_C");
-        names.append(KEYCODE_D, "KEYCODE_D");
-        names.append(KEYCODE_E, "KEYCODE_E");
-        names.append(KEYCODE_F, "KEYCODE_F");
-        names.append(KEYCODE_G, "KEYCODE_G");
-        names.append(KEYCODE_H, "KEYCODE_H");
-        names.append(KEYCODE_I, "KEYCODE_I");
-        names.append(KEYCODE_J, "KEYCODE_J");
-        names.append(KEYCODE_K, "KEYCODE_K");
-        names.append(KEYCODE_L, "KEYCODE_L");
-        names.append(KEYCODE_M, "KEYCODE_M");
-        names.append(KEYCODE_N, "KEYCODE_N");
-        names.append(KEYCODE_O, "KEYCODE_O");
-        names.append(KEYCODE_P, "KEYCODE_P");
-        names.append(KEYCODE_Q, "KEYCODE_Q");
-        names.append(KEYCODE_R, "KEYCODE_R");
-        names.append(KEYCODE_S, "KEYCODE_S");
-        names.append(KEYCODE_T, "KEYCODE_T");
-        names.append(KEYCODE_U, "KEYCODE_U");
-        names.append(KEYCODE_V, "KEYCODE_V");
-        names.append(KEYCODE_W, "KEYCODE_W");
-        names.append(KEYCODE_X, "KEYCODE_X");
-        names.append(KEYCODE_Y, "KEYCODE_Y");
-        names.append(KEYCODE_Z, "KEYCODE_Z");
-        names.append(KEYCODE_COMMA, "KEYCODE_COMMA");
-        names.append(KEYCODE_PERIOD, "KEYCODE_PERIOD");
-        names.append(KEYCODE_ALT_LEFT, "KEYCODE_ALT_LEFT");
-        names.append(KEYCODE_ALT_RIGHT, "KEYCODE_ALT_RIGHT");
-        names.append(KEYCODE_SHIFT_LEFT, "KEYCODE_SHIFT_LEFT");
-        names.append(KEYCODE_SHIFT_RIGHT, "KEYCODE_SHIFT_RIGHT");
-        names.append(KEYCODE_TAB, "KEYCODE_TAB");
-        names.append(KEYCODE_SPACE, "KEYCODE_SPACE");
-        names.append(KEYCODE_SYM, "KEYCODE_SYM");
-        names.append(KEYCODE_EXPLORER, "KEYCODE_EXPLORER");
-        names.append(KEYCODE_ENVELOPE, "KEYCODE_ENVELOPE");
-        names.append(KEYCODE_ENTER, "KEYCODE_ENTER");
-        names.append(KEYCODE_DEL, "KEYCODE_DEL");
-        names.append(KEYCODE_GRAVE, "KEYCODE_GRAVE");
-        names.append(KEYCODE_MINUS, "KEYCODE_MINUS");
-        names.append(KEYCODE_EQUALS, "KEYCODE_EQUALS");
-        names.append(KEYCODE_LEFT_BRACKET, "KEYCODE_LEFT_BRACKET");
-        names.append(KEYCODE_RIGHT_BRACKET, "KEYCODE_RIGHT_BRACKET");
-        names.append(KEYCODE_BACKSLASH, "KEYCODE_BACKSLASH");
-        names.append(KEYCODE_SEMICOLON, "KEYCODE_SEMICOLON");
-        names.append(KEYCODE_APOSTROPHE, "KEYCODE_APOSTROPHE");
-        names.append(KEYCODE_SLASH, "KEYCODE_SLASH");
-        names.append(KEYCODE_AT, "KEYCODE_AT");
-        names.append(KEYCODE_NUM, "KEYCODE_NUM");
-        names.append(KEYCODE_HEADSETHOOK, "KEYCODE_HEADSETHOOK");
-        names.append(KEYCODE_FOCUS, "KEYCODE_FOCUS");
-        names.append(KEYCODE_PLUS, "KEYCODE_PLUS");
-        names.append(KEYCODE_MENU, "KEYCODE_MENU");
-        names.append(KEYCODE_NOTIFICATION, "KEYCODE_NOTIFICATION");
-        names.append(KEYCODE_SEARCH, "KEYCODE_SEARCH");
-        names.append(KEYCODE_MEDIA_PLAY_PAUSE, "KEYCODE_MEDIA_PLAY_PAUSE");
-        names.append(KEYCODE_MEDIA_STOP, "KEYCODE_MEDIA_STOP");
-        names.append(KEYCODE_MEDIA_NEXT, "KEYCODE_MEDIA_NEXT");
-        names.append(KEYCODE_MEDIA_PREVIOUS, "KEYCODE_MEDIA_PREVIOUS");
-        names.append(KEYCODE_MEDIA_REWIND, "KEYCODE_MEDIA_REWIND");
-        names.append(KEYCODE_MEDIA_FAST_FORWARD, "KEYCODE_MEDIA_FAST_FORWARD");
-        names.append(KEYCODE_MUTE, "KEYCODE_MUTE");
-        names.append(KEYCODE_PAGE_UP, "KEYCODE_PAGE_UP");
-        names.append(KEYCODE_PAGE_DOWN, "KEYCODE_PAGE_DOWN");
-        names.append(KEYCODE_PICTSYMBOLS, "KEYCODE_PICTSYMBOLS");
-        names.append(KEYCODE_SWITCH_CHARSET, "KEYCODE_SWITCH_CHARSET");
-        names.append(KEYCODE_BUTTON_A, "KEYCODE_BUTTON_A");
-        names.append(KEYCODE_BUTTON_B, "KEYCODE_BUTTON_B");
-        names.append(KEYCODE_BUTTON_C, "KEYCODE_BUTTON_C");
-        names.append(KEYCODE_BUTTON_X, "KEYCODE_BUTTON_X");
-        names.append(KEYCODE_BUTTON_Y, "KEYCODE_BUTTON_Y");
-        names.append(KEYCODE_BUTTON_Z, "KEYCODE_BUTTON_Z");
-        names.append(KEYCODE_BUTTON_L1, "KEYCODE_BUTTON_L1");
-        names.append(KEYCODE_BUTTON_R1, "KEYCODE_BUTTON_R1");
-        names.append(KEYCODE_BUTTON_L2, "KEYCODE_BUTTON_L2");
-        names.append(KEYCODE_BUTTON_R2, "KEYCODE_BUTTON_R2");
-        names.append(KEYCODE_BUTTON_THUMBL, "KEYCODE_BUTTON_THUMBL");
-        names.append(KEYCODE_BUTTON_THUMBR, "KEYCODE_BUTTON_THUMBR");
-        names.append(KEYCODE_BUTTON_START, "KEYCODE_BUTTON_START");
-        names.append(KEYCODE_BUTTON_SELECT, "KEYCODE_BUTTON_SELECT");
-        names.append(KEYCODE_BUTTON_MODE, "KEYCODE_BUTTON_MODE");
-        names.append(KEYCODE_ESCAPE, "KEYCODE_ESCAPE");
-        names.append(KEYCODE_FORWARD_DEL, "KEYCODE_FORWARD_DEL");
-        names.append(KEYCODE_CTRL_LEFT, "KEYCODE_CTRL_LEFT");
-        names.append(KEYCODE_CTRL_RIGHT, "KEYCODE_CTRL_RIGHT");
-        names.append(KEYCODE_CAPS_LOCK, "KEYCODE_CAPS_LOCK");
-        names.append(KEYCODE_SCROLL_LOCK, "KEYCODE_SCROLL_LOCK");
-        names.append(KEYCODE_META_LEFT, "KEYCODE_META_LEFT");
-        names.append(KEYCODE_META_RIGHT, "KEYCODE_META_RIGHT");
-        names.append(KEYCODE_FUNCTION, "KEYCODE_FUNCTION");
-        names.append(KEYCODE_SYSRQ, "KEYCODE_SYSRQ");
-        names.append(KEYCODE_BREAK, "KEYCODE_BREAK");
-        names.append(KEYCODE_MOVE_HOME, "KEYCODE_MOVE_HOME");
-        names.append(KEYCODE_MOVE_END, "KEYCODE_MOVE_END");
-        names.append(KEYCODE_INSERT, "KEYCODE_INSERT");
-        names.append(KEYCODE_FORWARD, "KEYCODE_FORWARD");
-        names.append(KEYCODE_MEDIA_PLAY, "KEYCODE_MEDIA_PLAY");
-        names.append(KEYCODE_MEDIA_PAUSE, "KEYCODE_MEDIA_PAUSE");
-        names.append(KEYCODE_MEDIA_CLOSE, "KEYCODE_MEDIA_CLOSE");
-        names.append(KEYCODE_MEDIA_EJECT, "KEYCODE_MEDIA_EJECT");
-        names.append(KEYCODE_MEDIA_RECORD, "KEYCODE_MEDIA_RECORD");
-        names.append(KEYCODE_F1, "KEYCODE_F1");
-        names.append(KEYCODE_F2, "KEYCODE_F2");
-        names.append(KEYCODE_F3, "KEYCODE_F3");
-        names.append(KEYCODE_F4, "KEYCODE_F4");
-        names.append(KEYCODE_F5, "KEYCODE_F5");
-        names.append(KEYCODE_F6, "KEYCODE_F6");
-        names.append(KEYCODE_F7, "KEYCODE_F7");
-        names.append(KEYCODE_F8, "KEYCODE_F8");
-        names.append(KEYCODE_F9, "KEYCODE_F9");
-        names.append(KEYCODE_F10, "KEYCODE_F10");
-        names.append(KEYCODE_F11, "KEYCODE_F11");
-        names.append(KEYCODE_F12, "KEYCODE_F12");
-        names.append(KEYCODE_NUM_LOCK, "KEYCODE_NUM_LOCK");
-        names.append(KEYCODE_NUMPAD_0, "KEYCODE_NUMPAD_0");
-        names.append(KEYCODE_NUMPAD_1, "KEYCODE_NUMPAD_1");
-        names.append(KEYCODE_NUMPAD_2, "KEYCODE_NUMPAD_2");
-        names.append(KEYCODE_NUMPAD_3, "KEYCODE_NUMPAD_3");
-        names.append(KEYCODE_NUMPAD_4, "KEYCODE_NUMPAD_4");
-        names.append(KEYCODE_NUMPAD_5, "KEYCODE_NUMPAD_5");
-        names.append(KEYCODE_NUMPAD_6, "KEYCODE_NUMPAD_6");
-        names.append(KEYCODE_NUMPAD_7, "KEYCODE_NUMPAD_7");
-        names.append(KEYCODE_NUMPAD_8, "KEYCODE_NUMPAD_8");
-        names.append(KEYCODE_NUMPAD_9, "KEYCODE_NUMPAD_9");
-        names.append(KEYCODE_NUMPAD_DIVIDE, "KEYCODE_NUMPAD_DIVIDE");
-        names.append(KEYCODE_NUMPAD_MULTIPLY, "KEYCODE_NUMPAD_MULTIPLY");
-        names.append(KEYCODE_NUMPAD_SUBTRACT, "KEYCODE_NUMPAD_SUBTRACT");
-        names.append(KEYCODE_NUMPAD_ADD, "KEYCODE_NUMPAD_ADD");
-        names.append(KEYCODE_NUMPAD_DOT, "KEYCODE_NUMPAD_DOT");
-        names.append(KEYCODE_NUMPAD_COMMA, "KEYCODE_NUMPAD_COMMA");
-        names.append(KEYCODE_NUMPAD_ENTER, "KEYCODE_NUMPAD_ENTER");
-        names.append(KEYCODE_NUMPAD_EQUALS, "KEYCODE_NUMPAD_EQUALS");
-        names.append(KEYCODE_NUMPAD_LEFT_PAREN, "KEYCODE_NUMPAD_LEFT_PAREN");
-        names.append(KEYCODE_NUMPAD_RIGHT_PAREN, "KEYCODE_NUMPAD_RIGHT_PAREN");
-        names.append(KEYCODE_VOLUME_MUTE, "KEYCODE_VOLUME_MUTE");
-        names.append(KEYCODE_INFO, "KEYCODE_INFO");
-        names.append(KEYCODE_CHANNEL_UP, "KEYCODE_CHANNEL_UP");
-        names.append(KEYCODE_CHANNEL_DOWN, "KEYCODE_CHANNEL_DOWN");
-        names.append(KEYCODE_ZOOM_IN, "KEYCODE_ZOOM_IN");
-        names.append(KEYCODE_ZOOM_OUT, "KEYCODE_ZOOM_OUT");
-        names.append(KEYCODE_TV, "KEYCODE_TV");
-        names.append(KEYCODE_WINDOW, "KEYCODE_WINDOW");
-        names.append(KEYCODE_GUIDE, "KEYCODE_GUIDE");
-        names.append(KEYCODE_DVR, "KEYCODE_DVR");
-        names.append(KEYCODE_BOOKMARK, "KEYCODE_BOOKMARK");
-        names.append(KEYCODE_CAPTIONS, "KEYCODE_CAPTIONS");
-        names.append(KEYCODE_SETTINGS, "KEYCODE_SETTINGS");
-        names.append(KEYCODE_TV_POWER, "KEYCODE_TV_POWER");
-        names.append(KEYCODE_TV_INPUT, "KEYCODE_TV_INPUT");
-        names.append(KEYCODE_STB_INPUT, "KEYCODE_STB_INPUT");
-        names.append(KEYCODE_STB_POWER, "KEYCODE_STB_POWER");
-        names.append(KEYCODE_AVR_POWER, "KEYCODE_AVR_POWER");
-        names.append(KEYCODE_AVR_INPUT, "KEYCODE_AVR_INPUT");
-        names.append(KEYCODE_PROG_RED, "KEYCODE_PROG_RED");
-        names.append(KEYCODE_PROG_GREEN, "KEYCODE_PROG_GREEN");
-        names.append(KEYCODE_PROG_YELLOW, "KEYCODE_PROG_YELLOW");
-        names.append(KEYCODE_PROG_BLUE, "KEYCODE_PROG_BLUE");
-        names.append(KEYCODE_APP_SWITCH, "KEYCODE_APP_SWITCH");
-        names.append(KEYCODE_BUTTON_1, "KEYCODE_BUTTON_1");
-        names.append(KEYCODE_BUTTON_2, "KEYCODE_BUTTON_2");
-        names.append(KEYCODE_BUTTON_3, "KEYCODE_BUTTON_3");
-        names.append(KEYCODE_BUTTON_4, "KEYCODE_BUTTON_4");
-        names.append(KEYCODE_BUTTON_5, "KEYCODE_BUTTON_5");
-        names.append(KEYCODE_BUTTON_6, "KEYCODE_BUTTON_6");
-        names.append(KEYCODE_BUTTON_7, "KEYCODE_BUTTON_7");
-        names.append(KEYCODE_BUTTON_8, "KEYCODE_BUTTON_8");
-        names.append(KEYCODE_BUTTON_9, "KEYCODE_BUTTON_9");
-        names.append(KEYCODE_BUTTON_10, "KEYCODE_BUTTON_10");
-        names.append(KEYCODE_BUTTON_11, "KEYCODE_BUTTON_11");
-        names.append(KEYCODE_BUTTON_12, "KEYCODE_BUTTON_12");
-        names.append(KEYCODE_BUTTON_13, "KEYCODE_BUTTON_13");
-        names.append(KEYCODE_BUTTON_14, "KEYCODE_BUTTON_14");
-        names.append(KEYCODE_BUTTON_15, "KEYCODE_BUTTON_15");
-        names.append(KEYCODE_BUTTON_16, "KEYCODE_BUTTON_16");
-        names.append(KEYCODE_LANGUAGE_SWITCH, "KEYCODE_LANGUAGE_SWITCH");
-        names.append(KEYCODE_MANNER_MODE, "KEYCODE_MANNER_MODE");
-        names.append(KEYCODE_3D_MODE, "KEYCODE_3D_MODE");
-        names.append(KEYCODE_CONTACTS, "KEYCODE_CONTACTS");
-        names.append(KEYCODE_CALENDAR, "KEYCODE_CALENDAR");
-        names.append(KEYCODE_MUSIC, "KEYCODE_MUSIC");
-        names.append(KEYCODE_CALCULATOR, "KEYCODE_CALCULATOR");
-        names.append(KEYCODE_ZENKAKU_HANKAKU, "KEYCODE_ZENKAKU_HANKAKU");
-        names.append(KEYCODE_EISU, "KEYCODE_EISU");
-        names.append(KEYCODE_MUHENKAN, "KEYCODE_MUHENKAN");
-        names.append(KEYCODE_HENKAN, "KEYCODE_HENKAN");
-        names.append(KEYCODE_KATAKANA_HIRAGANA, "KEYCODE_KATAKANA_HIRAGANA");
-        names.append(KEYCODE_YEN, "KEYCODE_YEN");
-        names.append(KEYCODE_RO, "KEYCODE_RO");
-        names.append(KEYCODE_KANA, "KEYCODE_KANA");
-        names.append(KEYCODE_ASSIST, "KEYCODE_ASSIST");
-        names.append(KEYCODE_BRIGHTNESS_DOWN, "KEYCODE_BRIGHTNESS_DOWN");
-        names.append(KEYCODE_BRIGHTNESS_UP, "KEYCODE_BRIGHTNESS_UP");
-        names.append(KEYCODE_MEDIA_AUDIO_TRACK, "KEYCODE_MEDIA_AUDIO_TRACK");
-        names.append(KEYCODE_SLEEP, "KEYCODE_SLEEP");
-        names.append(KEYCODE_WAKEUP, "KEYCODE_WAKEUP");
-    };
-
     // Symbolic names of all metakeys in bit order from least significant to most significant.
     // Accordingly there are exactly 32 values in this table.
     private static final String[] META_SYMBOLIC_NAMES = new String[] {
@@ -926,6 +694,8 @@
         "0x80000000",
     };
 
+    private static final String LABEL_PREFIX = "KEYCODE_";
+
     /**
      * @deprecated There are now more than MAX_KEYCODE keycodes.
      * Use {@link #getMaxKeyCode()} instead.
@@ -1367,9 +1137,8 @@
         boolean onKeyMultiple(int keyCode, int count, KeyEvent event);
     }
 
-    static {
-        populateKeycodeSymbolicNames();
-    }
+    private static native String nativeKeyCodeToString(int keyCode);
+    private static native int nativeKeyCodeFromString(String keyCode);
 
     private KeyEvent() {
     }
@@ -1792,19 +1561,15 @@
         return mAction == ACTION_DOWN;
     }
 
-    /**
-     * Is this a system key?  System keys can not be used for menu shortcuts.
-     *
-     * TODO: this information should come from a table somewhere.
-     * TODO: should the dpad keys be here?  arguably, because they also shouldn't be menu shortcuts
+    /** Is this a system key?  System keys can not be used for menu shortcuts.
      */
     public final boolean isSystem() {
-        return native_isSystemKey(mKeyCode);
+        return isSystemKey(mKeyCode);
     }
 
     /** @hide */
-    public final boolean hasDefaultAction() {
-        return native_hasDefaultAction(mKeyCode);
+    public final boolean isWakeKey() {
+        return isWakeKey(mKeyCode);
     }
 
     /**
@@ -1887,6 +1652,62 @@
         return false;
     }
 
+
+    /** Is this a system key? System keys can not be used for menu shortcuts.
+     * @hide
+     */
+    public static final boolean isSystemKey(int keyCode) {
+        switch (keyCode) {
+            case KeyEvent.KEYCODE_MENU:
+            case KeyEvent.KEYCODE_SOFT_RIGHT:
+            case KeyEvent.KEYCODE_HOME:
+            case KeyEvent.KEYCODE_BACK:
+            case KeyEvent.KEYCODE_CALL:
+            case KeyEvent.KEYCODE_ENDCALL:
+            case KeyEvent.KEYCODE_VOLUME_UP:
+            case KeyEvent.KEYCODE_VOLUME_DOWN:
+            case KeyEvent.KEYCODE_VOLUME_MUTE:
+            case KeyEvent.KEYCODE_MUTE:
+            case KeyEvent.KEYCODE_POWER:
+            case KeyEvent.KEYCODE_HEADSETHOOK:
+            case KeyEvent.KEYCODE_MEDIA_PLAY:
+            case KeyEvent.KEYCODE_MEDIA_PAUSE:
+            case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:
+            case KeyEvent.KEYCODE_MEDIA_STOP:
+            case KeyEvent.KEYCODE_MEDIA_NEXT:
+            case KeyEvent.KEYCODE_MEDIA_PREVIOUS:
+            case KeyEvent.KEYCODE_MEDIA_REWIND:
+            case KeyEvent.KEYCODE_MEDIA_RECORD:
+            case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD:
+            case KeyEvent.KEYCODE_CAMERA:
+            case KeyEvent.KEYCODE_FOCUS:
+            case KeyEvent.KEYCODE_SEARCH:
+            case KeyEvent.KEYCODE_BRIGHTNESS_DOWN:
+            case KeyEvent.KEYCODE_BRIGHTNESS_UP:
+            case KeyEvent.KEYCODE_MEDIA_AUDIO_TRACK:
+            case KeyEvent.KEYCODE_DPAD_UP:
+            case KeyEvent.KEYCODE_DPAD_RIGHT:
+            case KeyEvent.KEYCODE_DPAD_DOWN:
+            case KeyEvent.KEYCODE_DPAD_LEFT:
+                return true;
+        }
+
+        return false;
+    }
+
+    /** @hide */
+    public static final boolean isWakeKey(int keyCode) {
+        switch (keyCode) {
+            case KeyEvent.KEYCODE_BACK:
+            case KeyEvent.KEYCODE_POWER:
+            case KeyEvent.KEYCODE_MENU:
+            case KeyEvent.KEYCODE_SLEEP:
+            case KeyEvent.KEYCODE_WAKEUP:
+                return true;
+        }
+        return false;
+    }
+
     /** {@inheritDoc} */
     @Override
     public final int getDeviceId() {
@@ -2866,8 +2687,8 @@
      * @see KeyCharacterMap#getDisplayLabel
      */
     public static String keyCodeToString(int keyCode) {
-        String symbolicName = KEYCODE_SYMBOLIC_NAMES.get(keyCode);
-        return symbolicName != null ? symbolicName : Integer.toString(keyCode);
+        String symbolicName = nativeKeyCodeToString(keyCode);
+        return symbolicName != null ? LABEL_PREFIX + symbolicName : Integer.toString(keyCode);
     }
 
     /**
@@ -2879,17 +2700,13 @@
      * @see #keycodeToString(int)
      */
     public static int keyCodeFromString(String symbolicName) {
-        if (symbolicName == null) {
-            throw new IllegalArgumentException("symbolicName must not be null");
+        if (symbolicName.startsWith(LABEL_PREFIX)) {
+            symbolicName = symbolicName.substring(LABEL_PREFIX.length());
         }
-
-        final int count = KEYCODE_SYMBOLIC_NAMES.size();
-        for (int i = 0; i < count; i++) {
-            if (symbolicName.equals(KEYCODE_SYMBOLIC_NAMES.valueAt(i))) {
-                return i;
-            }
+        int keyCode = nativeKeyCodeFromString(symbolicName);
+        if (keyCode > 0) {
+            return keyCode;
         }
-
         try {
             return Integer.parseInt(symbolicName, 10);
         } catch (NumberFormatException ex) {
@@ -2977,7 +2794,4 @@
         out.writeLong(mDownTime);
         out.writeLong(mEventTime);
     }
-
-    private native boolean native_isSystemKey(int keyCode);
-    private native boolean native_hasDefaultAction(int keyCode);
 }
diff --git a/core/java/android/view/MotionEvent.java b/core/java/android/view/MotionEvent.java
index 6378ffd..0626ab9 100644
--- a/core/java/android/view/MotionEvent.java
+++ b/core/java/android/view/MotionEvent.java
@@ -167,6 +167,7 @@
  */
 public final class MotionEvent extends InputEvent implements Parcelable {
     private static final long NS_PER_MS = 1000000;
+    private static final String LABEL_PREFIX = "AXIS_";
 
     /**
      * An invalid pointer id.
@@ -1369,6 +1370,9 @@
     private static native long nativeReadFromParcel(long nativePtr, Parcel parcel);
     private static native void nativeWriteToParcel(long nativePtr, Parcel parcel);
 
+    private static native String nativeAxisToString(int axis);
+    private static native int nativeAxisFromString(String label);
+
     private MotionEvent() {
     }
 
@@ -3051,8 +3055,8 @@
      * @return The symbolic name of the specified axis.
      */
     public static String axisToString(int axis) {
-        String symbolicName = AXIS_SYMBOLIC_NAMES.get(axis);
-        return symbolicName != null ? symbolicName : Integer.toString(axis);
+        String symbolicName = nativeAxisToString(axis);
+        return symbolicName != null ? LABEL_PREFIX + symbolicName : Integer.toString(axis);
     }
 
     /**
@@ -3064,17 +3068,13 @@
      * @see KeyEvent#keyCodeToString(int)
      */
     public static int axisFromString(String symbolicName) {
-        if (symbolicName == null) {
-            throw new IllegalArgumentException("symbolicName must not be null");
+        if (symbolicName.startsWith(LABEL_PREFIX)) {
+            symbolicName = symbolicName.substring(LABEL_PREFIX.length());
         }
-
-        final int count = AXIS_SYMBOLIC_NAMES.size();
-        for (int i = 0; i < count; i++) {
-            if (symbolicName.equals(AXIS_SYMBOLIC_NAMES.valueAt(i))) {
-                return i;
-            }
+        int axis = nativeAxisFromString(symbolicName);
+        if (axis >= 0) {
+            return axis;
         }
-
         try {
             return Integer.parseInt(symbolicName, 10);
         } catch (NumberFormatException ex) {
diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java
index c9be54d..c524611 100644
--- a/core/java/android/view/WindowManagerPolicy.java
+++ b/core/java/android/view/WindowManagerPolicy.java
@@ -76,14 +76,7 @@
 public interface WindowManagerPolicy {
     // Policy flags.  These flags are also defined in frameworks/base/include/ui/Input.h.
     public final static int FLAG_WAKE = 0x00000001;
-    public final static int FLAG_WAKE_DROPPED = 0x00000002;
-    public final static int FLAG_SHIFT = 0x00000004;
-    public final static int FLAG_CAPS_LOCK = 0x00000008;
-    public final static int FLAG_ALT = 0x00000010;
-    public final static int FLAG_ALT_GR = 0x00000020;
-    public final static int FLAG_MENU = 0x00000040;
-    public final static int FLAG_LAUNCHER = 0x00000080;
-    public final static int FLAG_VIRTUAL = 0x00000100;
+    public final static int FLAG_VIRTUAL = 0x00000002;
 
     public final static int FLAG_INJECTED = 0x01000000;
     public final static int FLAG_TRUSTED = 0x02000000;
diff --git a/core/jni/android_view_KeyEvent.cpp b/core/jni/android_view_KeyEvent.cpp
index c83541d..7ae21a7 100644
--- a/core/jni/android_view_KeyEvent.cpp
+++ b/core/jni/android_view_KeyEvent.cpp
@@ -22,6 +22,7 @@
 #include <android_runtime/Log.h>
 #include <utils/Log.h>
 #include <input/Input.h>
+#include <ScopedUtfChars.h>
 #include "android_view_KeyEvent.h"
 
 namespace android {
@@ -102,20 +103,25 @@
     return OK;
 }
 
-static jboolean native_isSystemKey(JNIEnv* env, jobject clazz, jint keyCode) {
-    return KeyEvent::isSystemKey(keyCode);
+static jstring android_view_KeyEvent_nativeKeyCodeToString(JNIEnv* env, jobject clazz,
+        jint keyCode) {
+    return env->NewStringUTF(KeyEvent::getLabel(keyCode));
 }
 
-static jboolean native_hasDefaultAction(JNIEnv* env, jobject clazz, jint keyCode) {
-    return KeyEvent::hasDefaultAction(keyCode);
+static jint android_view_KeyEvent_nativeKeyCodeFromString(JNIEnv* env, jobject clazz,
+        jstring label) {
+    ScopedUtfChars keyLabel(env, label);
+    return KeyEvent::getKeyCodeFromLabel(keyLabel.c_str());
 }
 
 
 // ----------------------------------------------------------------------------
 
 static const JNINativeMethod g_methods[] = {
-    { "native_isSystemKey", "(I)Z", (void*)native_isSystemKey },
-    { "native_hasDefaultAction", "(I)Z", (void*)native_hasDefaultAction },
+    { "nativeKeyCodeToString", "(I)Ljava/lang/String;",
+        (void*)android_view_KeyEvent_nativeKeyCodeToString},
+    { "nativeKeyCodeFromString", "(Ljava/lang/String;)I",
+        (void*)android_view_KeyEvent_nativeKeyCodeFromString},
 };
 
 #define FIND_CLASS(var, className) \
diff --git a/core/jni/android_view_MotionEvent.cpp b/core/jni/android_view_MotionEvent.cpp
index 76e145b..6ae02e0 100644
--- a/core/jni/android_view_MotionEvent.cpp
+++ b/core/jni/android_view_MotionEvent.cpp
@@ -23,6 +23,7 @@
 #include <android_runtime/Log.h>
 #include <utils/Log.h>
 #include <input/Input.h>
+#include <ScopedUtfChars.h>
 #include "android_os_Parcel.h"
 #include "android_view_MotionEvent.h"
 #include "android_util_Binder.h"
@@ -724,6 +725,17 @@
     }
 }
 
+static jstring android_view_MotionEvent_nativeAxisToString(JNIEnv* env, jclass clazz,
+        jint axis) {
+    return env->NewStringUTF(MotionEvent::getLabel(static_cast<int32_t>(axis)));
+}
+
+static jint android_view_MotionEvent_nativeAxisFromString(JNIEnv* env, jclass clazz,
+        jstring label) {
+    ScopedUtfChars axisLabel(env, label);
+    return static_cast<jint>(MotionEvent::getAxisFromLabel(axisLabel.c_str()));
+}
+
 // ----------------------------------------------------------------------------
 
 static JNINativeMethod gMotionEventMethods[] = {
@@ -840,6 +852,10 @@
     { "nativeWriteToParcel",
             "(JLandroid/os/Parcel;)V",
             (void*)android_view_MotionEvent_nativeWriteToParcel },
+    { "nativeAxisToString", "(I)Ljava/lang/String;",
+            (void*)android_view_MotionEvent_nativeAxisToString },
+    { "nativeAxisFromString", "(Ljava/lang/String;)I",
+            (void*)android_view_MotionEvent_nativeAxisFromString },
 };
 
 #define FIND_CLASS(var, className) \
diff --git a/data/keyboards/AVRCP.kl b/data/keyboards/AVRCP.kl
index 736b43c..ccd0209 100644
--- a/data/keyboards/AVRCP.kl
+++ b/data/keyboards/AVRCP.kl
@@ -14,10 +14,10 @@
 
 # Key layout used for Bluetooth AVRCP support.
 
-key 200   MEDIA_PLAY          WAKE
-key 201   MEDIA_PAUSE         WAKE
-key 166   MEDIA_STOP          WAKE
-key 163   MEDIA_NEXT          WAKE
-key 165   MEDIA_PREVIOUS      WAKE
-key 168   MEDIA_REWIND        WAKE
-key 208   MEDIA_FAST_FORWARD  WAKE
+key 200   MEDIA_PLAY
+key 201   MEDIA_PAUSE
+key 166   MEDIA_STOP
+key 163   MEDIA_NEXT
+key 165   MEDIA_PREVIOUS
+key 168   MEDIA_REWIND
+key 208   MEDIA_FAST_FORWARD
diff --git a/data/keyboards/Generic.kl b/data/keyboards/Generic.kl
index 0cdcb1c..56423c9 100644
--- a/data/keyboards/Generic.kl
+++ b/data/keyboards/Generic.kl
@@ -135,7 +135,7 @@
 key 113   VOLUME_MUTE
 key 114   VOLUME_DOWN
 key 115   VOLUME_UP
-key 116   POWER             WAKE
+key 116   POWER
 key 117   NUMPAD_EQUALS
 # key 118 "KEY_KPPLUSMINUS"
 key 119   BREAK
@@ -146,7 +146,7 @@
 key 124   YEN
 key 125   META_LEFT
 key 126   META_RIGHT
-key 127   MENU              WAKE_DROPPED
+key 127   MENU
 key 128   MEDIA_STOP
 # key 129 "KEY_AGAIN"
 # key 130 "KEY_PROPS"
@@ -158,11 +158,11 @@
 # key 136 "KEY_FIND"
 # key 137 "KEY_CUT"
 # key 138 "KEY_HELP"
-key 139   MENU              WAKE_DROPPED
+key 139   MENU
 key 140   CALCULATOR
 # key 141 "KEY_SETUP"
-key 142   SLEEP             WAKE
-key 143   WAKEUP            WAKE
+key 142   SLEEP
+key 143   WAKEUP
 # key 144 "KEY_FILE"
 # key 145 "KEY_SENDFILE"
 # key 146 "KEY_DELETEFILE"
@@ -171,13 +171,13 @@
 # key 149 "KEY_PROG2"
 key 150   EXPLORER
 # key 151 "KEY_MSDOS"
-key 152   POWER             WAKE
+key 152   POWER
 # key 153 "KEY_DIRECTION"
 # key 154 "KEY_CYCLEWINDOWS"
 key 155   ENVELOPE
 key 156   BOOKMARK
 # key 157 "KEY_COMPUTER"
-key 158   BACK              WAKE_DROPPED
+key 158   BACK
 key 159   FORWARD
 key 160   MEDIA_CLOSE
 key 161   MEDIA_EJECT
diff --git a/data/keyboards/Vendor_0a5c_Product_8502.kl b/data/keyboards/Vendor_0a5c_Product_8502.kl
index f6dbfd4..2f07328 100644
--- a/data/keyboards/Vendor_0a5c_Product_8502.kl
+++ b/data/keyboards/Vendor_0a5c_Product_8502.kl
@@ -24,7 +24,7 @@
 key 317 BUTTON_THUMBL
 key 318 BUTTON_THUMBR
 
-key 158 BACK            WAKE_DROPPED
+key 158 BACK
 key 172 HOME
 
 axis 0x00 X
diff --git a/data/keyboards/Vendor_18d1_Product_2c40.kl b/data/keyboards/Vendor_18d1_Product_2c40.kl
index 903f13b..6efde4f 100644
--- a/data/keyboards/Vendor_18d1_Product_2c40.kl
+++ b/data/keyboards/Vendor_18d1_Product_2c40.kl
@@ -24,7 +24,7 @@
 key 317 BUTTON_THUMBL
 key 318 BUTTON_THUMBR
 
-key 158 BACK            WAKE_DROPPED
+key 158 BACK
 key 172 HOME
 
 axis 0x00 X
diff --git a/data/keyboards/qwerty.kl b/data/keyboards/qwerty.kl
index f1caacd..58bf654 100644
--- a/data/keyboards/qwerty.kl
+++ b/data/keyboards/qwerty.kl
@@ -30,29 +30,29 @@
 key 9     8
 key 10    9
 key 11    0
-key 158   BACK              WAKE_DROPPED
-key 230   SOFT_RIGHT        WAKE
-key 60    SOFT_RIGHT        WAKE
-key 107   ENDCALL           WAKE_DROPPED
-key 62    ENDCALL           WAKE_DROPPED
-key 229   MENU              WAKE_DROPPED
-key 139   MENU              WAKE_DROPPED
-key 59    MENU              WAKE_DROPPED
-key 127   SEARCH            WAKE_DROPPED
-key 217   SEARCH            WAKE_DROPPED
+key 158   BACK
+key 230   SOFT_RIGHT
+key 60    SOFT_LEFT
+key 107   ENDCALL
+key 62    ENDCALL
+key 229   MENU
+key 139   MENU
+key 59    MENU
+key 127   SEARCH
+key 217   SEARCH
 key 228   POUND
 key 227   STAR
-key 231   CALL              WAKE_DROPPED
-key 61    CALL              WAKE_DROPPED
-key 232   DPAD_CENTER       WAKE_DROPPED
-key 108   DPAD_DOWN         WAKE_DROPPED
-key 103   DPAD_UP           WAKE_DROPPED
-key 102   HOME              WAKE
-key 105   DPAD_LEFT         WAKE_DROPPED
-key 106   DPAD_RIGHT        WAKE_DROPPED
-key 115   VOLUME_UP         WAKE
-key 114   VOLUME_DOWN       WAKE
-key 116   POWER             WAKE
+key 231   CALL
+key 61    CALL
+key 232   DPAD_CENTER
+key 108   DPAD_DOWN
+key 103   DPAD_UP
+key 102   HOME
+key 105   DPAD_LEFT
+key 106   DPAD_RIGHT
+key 115   VOLUME_UP
+key 114   VOLUME_DOWN
+key 116   POWER
 key 212   CAMERA
 
 key 16    Q
@@ -108,5 +108,5 @@
 key 215   AT
 
 # On an AT keyboard: ESC, F10
-key 1     BACK              WAKE_DROPPED
-key 68    MENU              WAKE_DROPPED
+key 1     BACK
+key 68    MENU
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
index 77e2462..8bc669a 100644
--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -3859,12 +3859,6 @@
                                                 mKeyguardDelegate.isShowingAndNotOccluded() :
                                                 mKeyguardDelegate.isShowing()));
 
-        if (keyCode == KeyEvent.KEYCODE_POWER
-                || keyCode == KeyEvent.KEYCODE_SLEEP
-                || keyCode == KeyEvent.KEYCODE_WAKEUP) {
-            policyFlags |= WindowManagerPolicy.FLAG_WAKE;
-        }
-
         if (DEBUG_INPUT) {
             Log.d(TAG, "interceptKeyTq keycode=" + keyCode
                     + " interactive=" + interactive + " keyguardActive=" + keyguardActive
@@ -3878,8 +3872,8 @@
 
         // Basic policy based on interactive state.
         int result;
-        boolean isWakeKey = (policyFlags & (WindowManagerPolicy.FLAG_WAKE
-                | WindowManagerPolicy.FLAG_WAKE_DROPPED)) != 0;
+        boolean isWakeKey = (policyFlags & WindowManagerPolicy.FLAG_WAKE) != 0
+                || event.isWakeKey();
         if (interactive || (isInjected && !isWakeKey)) {
             // When the screen is on or if the key is injected pass the key to the application.
             result = ACTION_PASS_TO_USER;
diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp
index 4085991..34ae8b4 100644
--- a/services/core/jni/com_android_server_input_InputManagerService.cpp
+++ b/services/core/jni/com_android_server_input_InputManagerService.cpp
@@ -870,7 +870,7 @@
     if ((policyFlags & POLICY_FLAG_TRUSTED) && !(policyFlags & POLICY_FLAG_INJECTED)) {
         if (policyFlags & POLICY_FLAG_INTERACTIVE) {
             policyFlags |= POLICY_FLAG_PASS_TO_USER;
-        } else if (policyFlags & (POLICY_FLAG_WAKE | POLICY_FLAG_WAKE_DROPPED)) {
+        } else if (policyFlags & POLICY_FLAG_WAKE) {
             JNIEnv* env = jniEnv();
             jint wmActions = env->CallIntMethod(mServiceObj,
                         gServiceClassInfo.interceptWakeMotionBeforeQueueing,