diff options
author | 2012-02-03 19:34:47 +0900 | |
---|---|---|
committer | 2012-02-03 20:03:23 +0900 | |
commit | aca8870128caeec74ed4426f3c1e23ab60597453 (patch) | |
tree | 210c0150956a73bc3e4417935bafc0379db48ab3 /java/src | |
parent | 9f491e34ac2c96c3d18f30f9710b1a3ecab173e7 (diff) | |
download | latinime-aca8870128caeec74ed4426f3c1e23ab60597453.tar.gz latinime-aca8870128caeec74ed4426f3c1e23ab60597453.tar.xz latinime-aca8870128caeec74ed4426f3c1e23ab60597453.zip |
Recursively resolve @string/resource reference in key key spec parsing
Change-Id: I9d172605e90e828e00f7c4c8d49548498aa3b50d
Diffstat (limited to 'java/src')
-rw-r--r-- | java/src/com/android/inputmethod/keyboard/internal/KeySpecParser.java | 70 |
1 files changed, 44 insertions, 26 deletions
diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeySpecParser.java b/java/src/com/android/inputmethod/keyboard/internal/KeySpecParser.java index adb5f4759..e3c5da456 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/KeySpecParser.java +++ b/java/src/com/android/inputmethod/keyboard/internal/KeySpecParser.java @@ -43,6 +43,8 @@ import java.util.Arrays; public class KeySpecParser { private static final boolean DEBUG = LatinImeLogger.sDBG; + private static final int MAX_STRING_REFERENCE_INDIRECTION = 10; + // Constants for parsing. private static int COMMA = ','; private static final char ESCAPE_CHAR = '\\'; @@ -274,35 +276,51 @@ public class KeySpecParser { return resId; } - private static String resolveStringResource(String text, Resources res, int packageNameResId) { - final int size = text.length(); - if (size < PREFIX_STRING.length()) { - return text; - } + private static String resolveStringResource(String rawText, Resources res, + int packageNameResId) { + int level = 0; + String text = rawText; + StringBuilder sb; + do { + level++; + if (level >= MAX_STRING_REFERENCE_INDIRECTION) { + throw new RuntimeException("too many @string/resource indirection: " + text); + } - StringBuilder sb = null; - for (int pos = 0; pos < size; pos++) { - final char c = text.charAt(pos); - if (c == PREFIX_AT && text.startsWith(PREFIX_STRING, pos)) { - if (sb == null) { - sb = new StringBuilder(text.substring(0, pos)); - } - final int end = searchResourceNameEnd(text, pos + PREFIX_STRING.length()); - final String resName = text.substring(pos + 1, end); - final int resId = getResourceId(res, resName, packageNameResId); - sb.append(res.getString(resId)); - pos = end - 1; - } else if (c == ESCAPE_CHAR) { - if (sb != null) { - // Append both escape character and escaped character. - sb.append(text.substring(pos, Math.min(pos + 2, size))); + final int size = text.length(); + if (size < PREFIX_STRING.length()) { + return text; + } + + sb = null; + for (int pos = 0; pos < size; pos++) { + final char c = text.charAt(pos); + if (c == PREFIX_AT && text.startsWith(PREFIX_STRING, pos)) { + if (sb == null) { + sb = new StringBuilder(text.substring(0, pos)); + } + final int end = searchResourceNameEnd(text, pos + PREFIX_STRING.length()); + final String resName = text.substring(pos + 1, end); + final int resId = getResourceId(res, resName, packageNameResId); + sb.append(res.getString(resId)); + pos = end - 1; + } else if (c == ESCAPE_CHAR) { + if (sb != null) { + // Append both escape character and escaped character. + sb.append(text.substring(pos, Math.min(pos + 2, size))); + } + pos++; + } else if (sb != null) { + sb.append(c); } - pos++; - } else if (sb != null) { - sb.append(c); } - } - return (sb == null) ? text : sb.toString(); + + if (sb != null) { + text = sb.toString(); + } + } while (sb != null); + + return text; } private static int searchResourceNameEnd(String text, int start) { |