Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e0952029 authored by Tadashi G. Takaoka's avatar Tadashi G. Takaoka Committed by Android (Google) Code Review
Browse files

Merge "Make KeySpecParser case sensitive again" into jb-dev

parents 7fe18b62 0a3362d2
Loading
Loading
Loading
Loading
+9 −11
Original line number Diff line number Diff line
@@ -83,13 +83,13 @@ public class KeySpecParser {
    }

    private static boolean hasIcon(String moreKeySpec) {
        return moreKeySpec.regionMatches(true, 0, PREFIX_ICON, 0, PREFIX_ICON.length());
        return moreKeySpec.startsWith(PREFIX_ICON);
    }

    private static boolean hasCode(String moreKeySpec) {
        final int end = indexOfLabelEnd(moreKeySpec, 0);
        if (end > 0 && end + 1 < moreKeySpec.length() && moreKeySpec.regionMatches(
                true, end + 1, PREFIX_CODE, 0, PREFIX_CODE.length())) {
        if (end > 0 && end + 1 < moreKeySpec.length() && moreKeySpec.startsWith(
                PREFIX_CODE, end + 1)) {
            return true;
        }
        return false;
@@ -210,9 +210,9 @@ public class KeySpecParser {

    public static int parseCode(String text, KeyboardCodesSet codesSet, int defCode) {
        if (text == null) return defCode;
        if (text.regionMatches(true, 0, PREFIX_CODE, 0, PREFIX_CODE.length())) {
        if (text.startsWith(PREFIX_CODE)) {
            return codesSet.getCode(text.substring(PREFIX_CODE.length()));
        } else if (text.regionMatches(true, 0, PREFIX_HEX, 0, PREFIX_HEX.length())) {
        } else if (text.startsWith(PREFIX_HEX)) {
            return Integer.parseInt(text.substring(PREFIX_HEX.length()), 16);
        } else {
            return Integer.parseInt(text);
@@ -359,8 +359,7 @@ public class KeySpecParser {
            sb = null;
            for (int pos = 0; pos < size; pos++) {
                final char c = text.charAt(pos);
                if (text.regionMatches(true, pos, PREFIX_TEXT, 0, prefixLen)
                        && textsSet != null) {
                if (text.startsWith(PREFIX_TEXT, pos) && textsSet != null) {
                    if (sb == null) {
                        sb = new StringBuilder(text.substring(0, pos));
                    }
@@ -392,8 +391,7 @@ public class KeySpecParser {
        for (int pos = start; pos < size; pos++) {
            final char c = text.charAt(pos);
            // Label name should be consisted of [a-zA-Z_0-9].
            if ((c >= 'a' && c <= 'z') || c == '_' || (c >= '0' && c <= '9')
                    || (c >= 'A' && c <= 'Z')) {
            if ((c >= 'a' && c <= 'z') || c == '_' || (c >= '0' && c <= '9')) {
                continue;
            }
            return pos;
@@ -449,7 +447,7 @@ public class KeySpecParser {
        int value = defaultValue;
        for (int i = 0; i < moreKeys.length; i++) {
            final String moreKeySpec = moreKeys[i];
            if (moreKeySpec == null || !moreKeySpec.regionMatches(true, 0, key, 0, keyLen)) {
            if (moreKeySpec == null || !moreKeySpec.startsWith(key)) {
                continue;
            }
            moreKeys[i] = null;
@@ -473,7 +471,7 @@ public class KeySpecParser {
        boolean value = false;
        for (int i = 0; i < moreKeys.length; i++) {
            final String moreKeySpec = moreKeys[i];
            if (moreKeySpec == null || !moreKeySpec.equalsIgnoreCase(key)) {
            if (moreKeySpec == null || !moreKeySpec.equals(key)) {
                continue;
            }
            moreKeys[i] = null;
+4 −8
Original line number Diff line number Diff line
@@ -34,9 +34,8 @@ public class KeyboardIconsSet {
    private static final HashMap<Integer, Integer> ATTR_ID_TO_ICON_ID
            = new HashMap<Integer, Integer>();

    // Lower case icon name to icon id map.
    private static final HashMap<String, Integer> sLowerCaseNameToIdsMap =
            new HashMap<String, Integer>();
    // Icon name to icon id map.
    private static final HashMap<String, Integer> sNameToIdsMap = new HashMap<String, Integer>();

    private static final Object[] NAMES_AND_ATTR_IDS = {
        "undefined",                    ATTR_UNDEFINED,
@@ -70,7 +69,7 @@ public class KeyboardIconsSet {
            if (attrId != ATTR_UNDEFINED) {
                ATTR_ID_TO_ICON_ID.put(attrId,  iconId);
            }
            sLowerCaseNameToIdsMap.put(name, iconId);
            sNameToIdsMap.put(name, iconId);
            ICON_NAMES[iconId] = name;
            iconId++;
        }
@@ -100,10 +99,7 @@ public class KeyboardIconsSet {
    }

    static int getIconId(final String name) {
        Integer iconId = sLowerCaseNameToIdsMap.get(name);
        if (iconId == null) {
            iconId = sLowerCaseNameToIdsMap.get(name.toLowerCase());
        }
        Integer iconId = sNameToIdsMap.get(name);
        if (iconId != null) {
            return iconId;
        }
+3 −11
Original line number Diff line number Diff line
@@ -47,7 +47,7 @@ public final class KeyboardTextsSet {
    // Language to texts map.
    private static final HashMap<String, String[]> sLocaleToTextsMap =
            new HashMap<String, String[]>();
    private static final HashMap<String, Integer> sLowerCaseNameToIdsMap =
    private static final HashMap<String, Integer> sNameToIdsMap =
            new HashMap<String, Integer>();

    private String[] mTexts;
@@ -77,19 +77,11 @@ public final class KeyboardTextsSet {
    }

    public String getText(final String name) {
        String lowerCaseName = null;
        String text = mResourceNameToTextsMap.get(name);
        if (text == null) {
            lowerCaseName = name.toLowerCase();
            text = mResourceNameToTextsMap.get(lowerCaseName);
        }
        if (text != null) {
            return text;
        }
        Integer id = sLowerCaseNameToIdsMap.get(name);
        if (id == null) {
            id = sLowerCaseNameToIdsMap.get(lowerCaseName); // lowerCaseName != null
        }
        final Integer id = sNameToIdsMap.get(name);
        if (id == null) throw new RuntimeException("Unknown label: " + name);
        text = (id < mTexts.length) ? mTexts[id] : null;
        return (text == null) ? LANGUAGE_DEFAULT[id] : text;
@@ -2484,7 +2476,7 @@ public final class KeyboardTextsSet {
    static {
        int id = 0;
        for (final String name : NAMES) {
            sLowerCaseNameToIdsMap.put(name, id++);
            sNameToIdsMap.put(name, id++);
        }

        for (int i = 0; i < LANGUAGES_AND_TEXTS.length; i += 2) {
+61 −52
Original line number Diff line number Diff line
@@ -206,15 +206,11 @@ public class KeySpecParserCsvTests extends AndroidTestCase {
    public void testParseCsvResourceZero() {
        assertTextArray("Empty string",
                "!text/empty_string");
        assertTextArray("EMPTY STRING",
                "!TEXT/EMPTY_STRING");
    }

    public void testParseCsvResourceSingle() {
        assertTextArray("Single char",
                "!text/single_char", "a");
        assertTextArray("SINGLE CHAR",
                "!TEXT/SINGLE_CHAR", "a");
        assertTextArray("Space",
                "!text/space", " ");
        assertTextArray("Single label",
@@ -232,8 +228,6 @@ public class KeySpecParserCsvTests extends AndroidTestCase {

        assertTextArray("Escape and single char",
                "\\\\!text/single_char", "\\\\a");
        assertTextArray("Escape and SINGLE CHAR",
                "\\\\!TEXT/SINGLE_CHAR", "\\\\a");
    }

    public void testParseCsvResourceSingleEscaped() {
@@ -266,8 +260,6 @@ public class KeySpecParserCsvTests extends AndroidTestCase {
    public void testParseCsvResourceMulti() {
        assertTextArray("Multiple chars",
                "!text/multiple_chars", "a", "b", "c");
        assertTextArray("MULTIPLE CHARS",
                "!TEXT/MULTIPLE_CHARS", "a", "b", "c");
        assertTextArray("Multiple chars surrounded by spaces",
                "!text/multiple_chars_surrounded_by_spaces",
                " a ", " b ", " c ");
@@ -301,8 +293,6 @@ public class KeySpecParserCsvTests extends AndroidTestCase {
    public void testParseMultipleResources() {
        assertTextArray("Literals and resources",
                "1,!text/multiple_chars,z", "1", "a", "b", "c", "z");
        assertTextArray("Literals and RESOURCES",
                "1,!TEXT/MULTIPLE_CHARS,z", "1", "a", "b", "c", "z");
        assertTextArray("Literals and resources and escape at end",
                "\\1,!text/multiple_chars,z\\", "\\1", "a", "b", "c", "z\\");
        assertTextArray("Multiple single resource chars and labels",
@@ -311,9 +301,6 @@ public class KeySpecParserCsvTests extends AndroidTestCase {
        assertTextArray("Multiple single resource chars and labels 2",
                "!text/single_char,!text/single_label,!text/escaped_comma_escape",
                "a", "abc", "a\\,\\");
        assertTextArray("Multiple single RESOURCE chars and LABELS 2",
                "!TEXT/SINGLE_CHAR,!TEXT/SINGLE_LABEL,!TEXT/ESCAPED_COMMA_ESCAPE",
                "a", "abc", "a\\,\\");
        assertTextArray("Multiple multiple resource chars and labels",
                "!text/multiple_chars,!text/multiple_labels,!text/multiple_chars_with_comma",
                "a", "b", "c", "abc", "def", "ghi", "a", "\\,", "c");
@@ -332,66 +319,88 @@ public class KeySpecParserCsvTests extends AndroidTestCase {
                "1,!text/indirect_string_with_literal,2", "1", "x", "a", "b", "c", "y", "2");
        assertTextArray("Indirect2",
                "!text/indirect2_string", "a", "b", "c");

        assertTextArray("INDIRECT",
                "!TEXT/INDIRECT_STRING", "a", "b", "c");
        assertTextArray("INDIRECT with literal",
                "1,!TEXT/INDIRECT_STRING_WITH_LITERAL,2", "1", "x", "a", "b", "c", "y", "2");
        assertTextArray("INDIRECT2",
                "!TEXT/INDIRECT2_STRING", "a", "b", "c");

        assertTextArray("Upper indirect",
                "!text/upper_indirect_string", "a", "b", "c");
        assertTextArray("Upper indirect with literal",
                "1,!text/upper_indirect_string_with_literal,2", "1", "x", "a", "b", "c", "y", "2");
        assertTextArray("Upper indirect2",
                "!text/upper_indirect2_string", "a", "b", "c");

        assertTextArray("UPPER INDIRECT",
                "!TEXT/upper_INDIRECT_STRING", "a", "b", "c");
        assertTextArray("Upper INDIRECT with literal",
                "1,!TEXT/upper_INDIRECT_STRING_WITH_LITERAL,2", "1", "x", "a", "b", "c", "y", "2");
        assertTextArray("Upper INDIRECT2",
                "!TEXT/upper_INDIRECT2_STRING", "a", "b", "c");
    }

    public void testParseInfiniteIndirectReference() {
        assertError("Infinite indirection",
                "1,!text/infinite_indirection,2", "1", "infinite", "<infinite>", "loop", "2");
        assertError("INFINITE INDIRECTION",
                "1,!TEXT/INFINITE_INDIRECTION,2", "1", "infinite", "<infinite>", "loop", "2");

        assertError("Upper infinite indirection",
                "1,!text/upper_infinite_indirection,2",
                "1", "infinite", "<infinite>", "loop", "2");
        assertError("Upper INFINITE INDIRECTION",
                "1,!TEXT/UPPER_INFINITE_INDIRECTION,2",
                "1", "infinite", "<infinite>", "loop", "2");
    }

    public void testLabelReferece() {
        assertTextArray("Label time am", "!text/label_time_am", "AM");
        assertTextArray("LABEL TIME AM", "!TEXT/LABEL_TIME_AM", "AM");

        assertTextArray("More keys for am pm", "!text/more_keys_for_am_pm",
                "!fixedColumnOrder!2", "!hasLabels!", "AM", "PM");
        assertTextArray("MORE KEYS FOR AM OM", "!TEXT/MORE_KEYS_FOR_AM_PM",
                "!fixedColumnOrder!2", "!hasLabels!", "AM", "PM");

        assertTextArray("Settings as more key", "!text/settings_as_more_key",
                "!icon/settings_key|!code/key_settings");
        assertTextArray("SETTINGS AS MORE KEY", "!TEXT/SETTINGS_AS_MORE_KEY",
                "!icon/settings_key|!code/key_settings");

        assertTextArray("Indirect naviagte actions as more key",
                "!text/indirect_navigate_actions_as_more_key",
                "!fixedColumnOrder!2",
                "!hasLabels!", "Prev|!code/key_action_previous",
                "!hasLabels!", "Next|!code/key_action_next");
    }

    public void testUselessUpperCaseSpecifier() {
        assertTextArray("EMPTY STRING",
                "!TEXT/EMPTY_STRING", "!TEXT/EMPTY_STRING");

        assertTextArray("SINGLE CHAR",
                "!TEXT/SINGLE_CHAR", "!TEXT/SINGLE_CHAR");
        assertTextArray("Escape and SINGLE CHAR",
                "\\\\!TEXT/SINGLE_CHAR", "\\\\!TEXT/SINGLE_CHAR");

        assertTextArray("MULTIPLE CHARS",
                "!TEXT/MULTIPLE_CHARS", "!TEXT/MULTIPLE_CHARS");

        assertTextArray("Literals and RESOURCES",
                "1,!TEXT/MULTIPLE_CHARS,z", "1", "!TEXT/MULTIPLE_CHARS", "z");
        assertTextArray("Multiple single RESOURCE chars and LABELS 2",
                "!TEXT/SINGLE_CHAR,!TEXT/SINGLE_LABEL,!TEXT/ESCAPED_COMMA_ESCAPE",
                "!TEXT/SINGLE_CHAR", "!TEXT/SINGLE_LABEL", "!TEXT/ESCAPED_COMMA_ESCAPE");

        assertTextArray("INDIRECT",
                "!TEXT/INDIRECT_STRING", "!TEXT/INDIRECT_STRING");
        assertTextArray("INDIRECT with literal",
                "1,!TEXT/INDIRECT_STRING_WITH_LITERAL,2",
                "1", "!TEXT/INDIRECT_STRING_WITH_LITERAL", "2");
        assertTextArray("INDIRECT2",
                "!TEXT/INDIRECT2_STRING", "!TEXT/INDIRECT2_STRING");

        assertTextArray("Upper indirect",
                "!text/upper_indirect_string", "!TEXT/MULTIPLE_CHARS");
        assertTextArray("Upper indirect with literal",
                "1,!text/upper_indirect_string_with_literal,2",
                "1", "x", "!TEXT/MULTIPLE_CHARS", "y", "2");
        assertTextArray("Upper indirect2",
                "!text/upper_indirect2_string", "!TEXT/UPPER_INDIRECT_STRING");

        assertTextArray("UPPER INDIRECT",
                "!TEXT/upper_INDIRECT_STRING", "!TEXT/upper_INDIRECT_STRING");
        assertTextArray("Upper INDIRECT with literal",
                "1,!TEXT/upper_INDIRECT_STRING_WITH_LITERAL,2",
                "1", "!TEXT/upper_INDIRECT_STRING_WITH_LITERAL", "2");
        assertTextArray("Upper INDIRECT2",
                "!TEXT/upper_INDIRECT2_STRING", "!TEXT/upper_INDIRECT2_STRING");

        assertTextArray("INFINITE INDIRECTION",
                "1,!TEXT/INFINITE_INDIRECTION,2", "1", "!TEXT/INFINITE_INDIRECTION", "2");

        assertTextArray("Upper infinite indirection",
                "1,!text/upper_infinite_indirection,2",
                "1", "infinite", "!TEXT/INFINITE_INDIRECTION", "loop", "2");
        assertTextArray("Upper INFINITE INDIRECTION",
                "1,!TEXT/UPPER_INFINITE_INDIRECTION,2",
                "1", "!TEXT/UPPER_INFINITE_INDIRECTION", "2");

        assertTextArray("LABEL TIME AM", "!TEXT/LABEL_TIME_AM", "!TEXT/LABEL_TIME_AM");
        assertTextArray("MORE KEYS FOR AM OM", "!TEXT/MORE_KEYS_FOR_AM_PM",
                "!TEXT/MORE_KEYS_FOR_AM_PM");
        assertTextArray("SETTINGS AS MORE KEY", "!TEXT/SETTINGS_AS_MORE_KEY",
                "!TEXT/SETTINGS_AS_MORE_KEY");
        assertTextArray("INDIRECT NAVIGATE ACTIONS AS MORE KEY",
                "!TEXT/INDIRECT_NAVIGATE_ACTIONS_AS_MORE_KEY",
                "!fixedColumnOrder!2",
                "!hasLabels!", "Prev|!code/key_action_previous",
                "!hasLabels!", "Next|!code/key_action_next");
                "!TEXT/INDIRECT_NAVIGATE_ACTIONS_AS_MORE_KEY");
     }
}
+55 −44

File changed.

Preview size limit exceeded, changes collapsed.

Loading