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

Commit 0a3362d2 authored by Tadashi G. Takaoka's avatar Tadashi G. Takaoka
Browse files

Make KeySpecParser case sensitive again

Partially revert I76c3e917.

Bug: 6561272
Change-Id: I5649a8ecb44bd11c67785ea97ddbb67b0a019ccc
parent 6cc58bed
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