diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml
index d574b9edb..573ec68b7 100644
--- a/java/res/values/attrs.xml
+++ b/java/res/values/attrs.xml
@@ -300,6 +300,7 @@
+
@@ -319,11 +320,13 @@
+
+
diff --git a/java/res/values/donottranslate-more-keys.xml b/java/res/values/donottranslate-more-keys.xml
index 5e97edc1e..14c278af9 100644
--- a/java/res/values/donottranslate-more-keys.xml
+++ b/java/res/values/donottranslate-more-keys.xml
@@ -120,7 +120,7 @@
U+2205: "∅" EMPTY SET -->
ⁿ,∅
!fixedColumnOrder!2,!hasLabels!,\@string/label_time_am,\@string/label_time_pm
- \@icon/settingsKey|!code/key_settings
+ !icon/settingsKey|!code/key_settings
,
!hasLabels!,\@string/label_next_key|!code/key_action_next
diff --git a/java/res/xml-sw600dp/key_styles_common.xml b/java/res/xml-sw600dp/key_styles_common.xml
index 3cec9aab7..b0f610912 100644
--- a/java/res/xml-sw600dp/key_styles_common.xml
+++ b/java/res/xml-sw600dp/key_styles_common.xml
@@ -84,7 +84,7 @@
latin:styleName="zwnjKeyStyle"
latin:code="0x200C"
latin:keyIcon="iconZwnjKey"
- latin:moreKeys="\@icon/zwjKey|"
+ latin:moreKeys="!icon/zwjKey|"
latin:keyLabelFlags="hasPopupHint"
latin:keyActionFlags="noKeyPreview" />
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeySpecParser.java b/java/src/com/android/inputmethod/keyboard/internal/KeySpecParser.java
index 84965bfe7..288fb4556 100644
--- a/java/src/com/android/inputmethod/keyboard/internal/KeySpecParser.java
+++ b/java/src/com/android/inputmethod/keyboard/internal/KeySpecParser.java
@@ -32,10 +32,11 @@ import java.util.Arrays;
* - String resource can be embedded into specification @string/name. This is done before parsing
* comma.
* Each "more key" specification is one of the following:
- * - A single letter (Letter)
* - Label optionally followed by keyOutputText or code (keyLabel|keyOutputText).
- * - Icon followed by keyOutputText or a string representation of codes
- * (@icon/icon_name|!code/key_code)
+ * - Icon followed by keyOutputText or code (!icon/icon_name|!code/code_name)
+ * - Icon should be a string representation of icon (!icon/icon_name).
+ * - Code should be a code point presented by hexadecimal string prefixed with "0x".
+ * Or a string representation of code (!code/code_name).
* Special character, comma ',' backslash '\', and bar '|' can be escaped by '\' character.
* Note that the character '@' and '\' are also parsed by XML parser and CSV parser as well.
* See {@link KeyboardIconsSet} about icon_name.
@@ -52,7 +53,7 @@ public class KeySpecParser {
private static final char SUFFIX_SLASH = '/';
private static final String PREFIX_STRING = PREFIX_AT + "string" + SUFFIX_SLASH;
private static final char LABEL_END = '|';
- private static final String PREFIX_ICON = PREFIX_AT + "icon" + SUFFIX_SLASH;
+ private static final String PREFIX_ICON = "!icon/";
private static final String PREFIX_CODE = "!code/";
private static final String PREFIX_HEX = "0x";
private static final String ADDITIONAL_MORE_KEY_MARKER = "%";
diff --git a/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserTests.java b/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserTests.java
index 856bc105a..58b43d46c 100644
--- a/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserTests.java
+++ b/tests/src/com/android/inputmethod/keyboard/internal/KeySpecParserTests.java
@@ -33,9 +33,9 @@ public class KeySpecParserTests extends AndroidTestCase {
private static final String ICON_SETTINGS_NAME = "settingsKey";
private static final String CODE_SETTINGS = "!code/" + CODE_SETTINGS_NAME;
- private static final String ICON_SETTINGS = "@icon/" + ICON_SETTINGS_NAME;
+ private static final String ICON_SETTINGS = "!icon/" + ICON_SETTINGS_NAME;
private static final String CODE_NON_EXISTING = "!code/non_existing";
- private static final String ICON_NON_EXISTING = "@icon/non_existing";
+ private static final String ICON_NON_EXISTING = "!icon/non_existing";
private int mCodeSettings;
private int mSettingsIconId;