diff --git a/java/res/values-ar/donottranslate-more-keys.xml b/java/res/values-ar/donottranslate-more-keys.xml index cde686084..e49677adb 100644 --- a/java/res/values-ar/donottranslate-more-keys.xml +++ b/java/res/values-ar/donottranslate-more-keys.xml @@ -70,10 +70,8 @@ \u066a , , - - \\,,\@icon/3|\@integer/key_settings - - \\,,\@icon/7|\@integer/key_tab + \\,,\@icon/settingsKey|\@integer/key_settings + \\,,\@icon/tabKey|\@integer/key_tab \? ; %,‰ diff --git a/java/res/values/attrs.xml b/java/res/values/attrs.xml index 9892d7835..57930c675 100644 --- a/java/res/values/attrs.xml +++ b/java/res/values/attrs.xml @@ -248,12 +248,10 @@ - - diff --git a/java/res/values/donottranslate-more-keys.xml b/java/res/values/donottranslate-more-keys.xml index 3a3ea1e55..ce1538131 100644 --- a/java/res/values/donottranslate-more-keys.xml +++ b/java/res/values/donottranslate-more-keys.xml @@ -91,10 +91,8 @@ % - - \@icon/3|\@integer/key_settings - - \@icon/7|\@integer/key_tab + \@icon/settingsKey|\@integer/key_settings + \@icon/tabKey|\@integer/key_tab ¿ diff --git a/java/res/xml-sw600dp/kbd_key_styles.xml b/java/res/xml-sw600dp/kbd_key_styles.xml index ab90c9894..abba592b7 100644 --- a/java/res/xml-sw600dp/kbd_key_styles.xml +++ b/java/res/xml-sw600dp/kbd_key_styles.xml @@ -34,7 +34,7 @@ diff --git a/java/src/com/android/inputmethod/keyboard/Key.java b/java/src/com/android/inputmethod/keyboard/Key.java index 6003d9723..3a9423f4b 100644 --- a/java/src/com/android/inputmethod/keyboard/Key.java +++ b/java/src/com/android/inputmethod/keyboard/Key.java @@ -166,7 +166,12 @@ public class Key { } private static Drawable getIcon(Keyboard.Params params, String moreKeySpec) { - return params.mIconsSet.getIconByIconId(MoreKeySpecParser.getIconId(moreKeySpec)); + final int iconAttrId = MoreKeySpecParser.getIconAttrId(moreKeySpec); + if (iconAttrId == KeyboardIconsSet.ICON_UNDEFINED) { + return null; + } else { + return params.mIconsSet.getIconByAttrId(iconAttrId); + } } /** @@ -277,12 +282,15 @@ public class Key { R.styleable.Keyboard_Key_visualInsetsLeft, params.mBaseWidth, 0); mVisualInsetsRight = (int) Keyboard.Builder.getDimensionOrFraction(keyAttr, R.styleable.Keyboard_Key_visualInsetsRight, params.mBaseWidth, 0); - mPreviewIcon = iconsSet.getIconByIconId(style.getInt(keyAttr, + final int previewIconAttrId = KeyboardIconsSet.getIconAttrId(style.getInt(keyAttr, R.styleable.Keyboard_Key_keyIconPreview, KeyboardIconsSet.ICON_UNDEFINED)); - mIcon = iconsSet.getIconByIconId(style.getInt(keyAttr, + mPreviewIcon = iconsSet.getIconByAttrId(previewIconAttrId); + final int iconAttrId = KeyboardIconsSet.getIconAttrId(style.getInt(keyAttr, R.styleable.Keyboard_Key_keyIcon, KeyboardIconsSet.ICON_UNDEFINED)); - mDisabledIcon = iconsSet.getIconByIconId(style.getInt(keyAttr, + mIcon = iconsSet.getIconByAttrId(iconAttrId); + final int disabledIconAttrId = KeyboardIconsSet.getIconAttrId(style.getInt(keyAttr, R.styleable.Keyboard_Key_keyIconDisabled, KeyboardIconsSet.ICON_UNDEFINED)); + mDisabledIcon = iconsSet.getIconByAttrId(disabledIconAttrId); mHintLabel = style.getText(keyAttr, R.styleable.Keyboard_Key_keyHintLabel); mLabel = style.getText(keyAttr, R.styleable.Keyboard_Key_keyLabel); diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardIconsSet.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardIconsSet.java index 6313a61b5..09ecbcaa0 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardIconsSet.java +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardIconsSet.java @@ -31,34 +31,36 @@ public class KeyboardIconsSet { private static final String TAG = KeyboardIconsSet.class.getSimpleName(); public static final int ICON_UNDEFINED = 0; + private static final int ATTR_UNDEFINED = 0; private final Map mIcons = new HashMap(); // The key value should be aligned with the enum value of Keyboard.icon*. private static final Map ICONS_TO_ATTRS_MAP = new HashMap(); + private static final Map NAME_TO_ATTRS_MAP = new HashMap(); private static final Collection VALID_ATTRS; static { - addIconIdMap(1, R.styleable.Keyboard_iconShiftKey); - addIconIdMap(2, R.styleable.Keyboard_iconDeleteKey); - // This is also represented as "@icon/3" in keyboard layout XML. - addIconIdMap(3, R.styleable.Keyboard_iconSettingsKey); - addIconIdMap(4, R.styleable.Keyboard_iconSpaceKey); - addIconIdMap(5, R.styleable.Keyboard_iconReturnKey); - addIconIdMap(6, R.styleable.Keyboard_iconSearchKey); - // This is also represented as "@icon/7" in keyboard layout XML. - addIconIdMap(7, R.styleable.Keyboard_iconTabKey); - addIconIdMap(8, R.styleable.Keyboard_iconShortcutKey); - addIconIdMap(9, R.styleable.Keyboard_iconShortcutForLabel); - addIconIdMap(10, R.styleable.Keyboard_iconSpaceKeyForNumberLayout); - addIconIdMap(11, R.styleable.Keyboard_iconShiftKeyShifted); - addIconIdMap(12, R.styleable.Keyboard_iconDisabledShortcutKey); - addIconIdMap(13, R.styleable.Keyboard_iconPreviewTabKey); + addIconIdMap(1, "shiftKey", R.styleable.Keyboard_iconShiftKey); + addIconIdMap(2, "deleteKey", R.styleable.Keyboard_iconDeleteKey); + addIconIdMap(3, "settingsKey", R.styleable.Keyboard_iconSettingsKey); + addIconIdMap(4, "spaceKey", R.styleable.Keyboard_iconSpaceKey); + addIconIdMap(5, "returnKey", R.styleable.Keyboard_iconReturnKey); + addIconIdMap(6, "searchKey", R.styleable.Keyboard_iconSearchKey); + addIconIdMap(7, "tabKey", R.styleable.Keyboard_iconTabKey); + addIconIdMap(8, "shortcutKey", R.styleable.Keyboard_iconShortcutKey); + addIconIdMap(9, "shortcutForLabel", R.styleable.Keyboard_iconShortcutForLabel); + addIconIdMap(10, "spaceKeyForNumberLayout", + R.styleable.Keyboard_iconSpaceKeyForNumberLayout); + addIconIdMap(11, "shiftKeyShifted", R.styleable.Keyboard_iconShiftKeyShifted); + addIconIdMap(12, "disabledShortcurKey", R.styleable.Keyboard_iconDisabledShortcutKey); + addIconIdMap(13, "previewTabKey", R.styleable.Keyboard_iconPreviewTabKey); VALID_ATTRS = ICONS_TO_ATTRS_MAP.values(); } - private static void addIconIdMap(int iconId, int attrId) { + private static void addIconIdMap(int iconId, String name, Integer attrId) { ICONS_TO_ATTRS_MAP.put(iconId, attrId); + NAME_TO_ATTRS_MAP.put(name, attrId); } public void loadIcons(final TypedArray keyboardAttrs) { @@ -76,18 +78,29 @@ public class KeyboardIconsSet { } } - public Drawable getIconByIconId(final Integer iconId) { + public static int getIconAttrId(final Integer iconId) { if (iconId == ICON_UNDEFINED) { - return null; + return ATTR_UNDEFINED; } final Integer attrId = ICONS_TO_ATTRS_MAP.get(iconId); if (attrId == null) { throw new IllegalArgumentException("icon id is out of range: " + iconId); } - return getIconByAttrId(attrId); + return attrId; + } + + public static int getIconAttrId(final String iconName) { + final Integer attrId = NAME_TO_ATTRS_MAP.get(iconName); + if (attrId == null) { + throw new IllegalArgumentException("unknown icon name: " + iconName); + } + return attrId; } public Drawable getIconByAttrId(final Integer attrId) { + if (attrId == ATTR_UNDEFINED) { + return null; + } if (!VALID_ATTRS.contains(attrId)) { throw new IllegalArgumentException("unknown icon attribute id: " + attrId); } diff --git a/java/src/com/android/inputmethod/keyboard/internal/MoreKeySpecParser.java b/java/src/com/android/inputmethod/keyboard/internal/MoreKeySpecParser.java index 2facf8439..16777733e 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/MoreKeySpecParser.java +++ b/java/src/com/android/inputmethod/keyboard/internal/MoreKeySpecParser.java @@ -18,7 +18,6 @@ package com.android.inputmethod.keyboard.internal; import android.content.res.Resources; import android.text.TextUtils; -import android.util.Log; import com.android.inputmethod.keyboard.Keyboard; import com.android.inputmethod.latin.R; @@ -32,15 +31,13 @@ import java.util.ArrayList; * 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 code (@icon/icon_number|@integer/key_code) + * - Icon followed by keyOutputText or code (@icon/icon_name|@integer/key_code) * 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_number. */ public class MoreKeySpecParser { - private static final String TAG = MoreKeySpecParser.class.getSimpleName(); - private static final char LABEL_END = '|'; private static final String PREFIX_ICON = Utils.PREFIX_AT + "icon" + Utils.SUFFIX_SLASH; private static final String PREFIX_CODE = Utils.PREFIX_AT + "integer" + Utils.SUFFIX_SLASH; @@ -167,16 +164,11 @@ public class MoreKeySpecParser { return Keyboard.CODE_OUTPUT_TEXT; } - public static int getIconId(String moreKeySpec) { + public static int getIconAttrId(String moreKeySpec) { if (hasIcon(moreKeySpec)) { - final int end = moreKeySpec.indexOf(LABEL_END, PREFIX_ICON.length() + 1); - final String iconId = moreKeySpec.substring(PREFIX_ICON.length(), end); - try { - return Integer.valueOf(iconId); - } catch (NumberFormatException e) { - Log.w(TAG, "illegal icon id specified: " + iconId); - return KeyboardIconsSet.ICON_UNDEFINED; - } + final int end = moreKeySpec.indexOf(LABEL_END, PREFIX_ICON.length()); + final String name = moreKeySpec.substring(PREFIX_ICON.length(), end); + return KeyboardIconsSet.getIconAttrId(name); } return KeyboardIconsSet.ICON_UNDEFINED; } diff --git a/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecParserTests.java b/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecParserTests.java index ea11ff73d..74aaf9af8 100644 --- a/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecParserTests.java +++ b/tests/src/com/android/inputmethod/keyboard/internal/MoreKeySpecParserTests.java @@ -25,11 +25,11 @@ import com.android.inputmethod.latin.R; public class MoreKeySpecParserTests extends AndroidTestCase { private Resources mRes; - private static final int ICON_SETTINGS_KEY = 5; + private static final int ICON_SETTINGS_KEY = R.styleable.Keyboard_iconSettingsKey; private static final int ICON_UNDEFINED = KeyboardIconsSet.ICON_UNDEFINED; private static final String CODE_SETTINGS = "@integer/key_settings"; - private static final String ICON_SETTINGS = "@icon/" + ICON_SETTINGS_KEY; + private static final String ICON_SETTINGS = "@icon/settingsKey"; private static final String CODE_NON_EXISTING = "@integer/non_existing"; private static final String ICON_NON_EXISTING = "@icon/non_existing"; @@ -53,7 +53,7 @@ public class MoreKeySpecParserTests extends AndroidTestCase { String actualOutputText = MoreKeySpecParser.getOutputText(moreKeySpec); assertEquals(message + ": ouptputText:", expectedOutputText, actualOutputText); - int actualIcon = MoreKeySpecParser.getIconId(moreKeySpec); + int actualIcon = MoreKeySpecParser.getIconAttrId(moreKeySpec); assertEquals(message + ": icon:", expectedIcon, actualIcon); int actualCode = MoreKeySpecParser.getCode(mRes, moreKeySpec); @@ -201,7 +201,7 @@ public class MoreKeySpecParserTests extends AndroidTestCase { null, null, ICON_UNDEFINED, Keyboard.CODE_UNSPECIFIED); assertParserError("Icon without code", ICON_SETTINGS, null, null, ICON_SETTINGS_KEY, Keyboard.CODE_UNSPECIFIED); - assertParser("Non existing icon", ICON_NON_EXISTING + "|abc", + assertParserError("Non existing icon", ICON_NON_EXISTING + "|abc", null, "abc", ICON_UNDEFINED, Keyboard.CODE_OUTPUT_TEXT); assertParserError("Non existing code", "abc|" + CODE_NON_EXISTING, "abc", null, ICON_UNDEFINED, Keyboard.CODE_UNSPECIFIED);