aboutsummaryrefslogtreecommitdiffstats
path: root/sdk_common/src/com/android/ide/common/resources/ResourceResolver.java
diff options
context:
space:
mode:
authorTor Norbye <tnorbye@google.com>2013-01-14 11:52:33 -0800
committerTor Norbye <tnorbye@google.com>2013-01-14 12:55:24 -0800
commit7c3a590edd14902d0cca68a435c020ca86331a6c (patch)
tree2526c81563de27a6bf220da65b8769a4748554b4 /sdk_common/src/com/android/ide/common/resources/ResourceResolver.java
parenta737845cdcf443843a3bc112a66f0d560b1e007a (diff)
downloadsdk-7c3a590edd14902d0cca68a435c020ca86331a6c.zip
sdk-7c3a590edd14902d0cca68a435c020ca86331a6c.tar.gz
sdk-7c3a590edd14902d0cca68a435c020ca86331a6c.tar.bz2
39612: Question Mark causes Eclipse Graphical Layout Editor to Freak Out
Handle string values starting with ? and @ even if they do not correspond to actual theme or resource URLs. Also fix the code which handles processing strings read from XML files; apply unescaping rules (for unicode, newlines and tabs, removing quotes, etc). Also make the style warning include the full resource URI (it was only logging the stripped URI). Change-Id: I9b9a87ac4841faeacd1d94a43fa091702e60f4d8
Diffstat (limited to 'sdk_common/src/com/android/ide/common/resources/ResourceResolver.java')
-rw-r--r--sdk_common/src/com/android/ide/common/resources/ResourceResolver.java43
1 files changed, 35 insertions, 8 deletions
diff --git a/sdk_common/src/com/android/ide/common/resources/ResourceResolver.java b/sdk_common/src/com/android/ide/common/resources/ResourceResolver.java
index 756ea53..219c93f 100644
--- a/sdk_common/src/com/android/ide/common/resources/ResourceResolver.java
+++ b/sdk_common/src/com/android/ide/common/resources/ResourceResolver.java
@@ -189,7 +189,8 @@ public class ResourceResolver extends RenderResources {
if (reference == null) {
return null;
}
- if (reference.startsWith(PREFIX_THEME_REF)) {
+ if (reference.startsWith(PREFIX_THEME_REF)
+ && reference.length() > PREFIX_THEME_REF.length()) {
// no theme? no need to go further!
if (mTheme == null) {
return null;
@@ -198,6 +199,7 @@ public class ResourceResolver extends RenderResources {
boolean frameworkOnly = false;
// eliminate the prefix from the string
+ String originalReference = reference;
if (reference.startsWith(ANDROID_THEME_PREFIX)) {
frameworkOnly = true;
reference = reference.substring(ANDROID_THEME_PREFIX.length());
@@ -207,7 +209,7 @@ public class ResourceResolver extends RenderResources {
// at this point, value can contain type/name (drawable/foo for instance).
// split it to make sure.
- String[] segments = reference.split("\\/");
+ String[] segments = reference.split("/");
// we look for the referenced item name.
String referenceName = null;
@@ -224,6 +226,18 @@ public class ResourceResolver extends RenderResources {
} else {
// it's just an item name.
referenceName = segments[0];
+
+ // Make sure it looks like a resource name; if not, it could just be a string
+ // which starts with a ?
+ if (!Character.isJavaIdentifierStart(referenceName.charAt(0))) {
+ return null;
+ }
+ for (int i = 1, n = referenceName.length(); i < n; i++) {
+ char c = referenceName.charAt(i);
+ if (!Character.isJavaIdentifierPart(c) && c != '.') {
+ return null;
+ }
+ }
}
// now we look for android: in the referenceName in order to support format
@@ -241,7 +255,7 @@ public class ResourceResolver extends RenderResources {
mLogger.warning(LayoutLog.TAG_RESOURCES_RESOLVE_THEME_ATTR,
String.format("Couldn't find theme resource %1$s for the current theme",
reference),
- new ResourceValue(ResourceType.ATTR, referenceName, frameworkOnly));
+ new ResourceValue(ResourceType.ATTR, originalReference, frameworkOnly));
}
return item;
@@ -262,16 +276,17 @@ public class ResourceResolver extends RenderResources {
}
// at this point, value contains type/[android:]name (drawable/foo for instance)
- String[] segments = reference.split("\\/");
- if (segments.length <= 1) {
+ String[] segments = reference.split("/");
+ if (segments.length != 2) {
return null;
}
// now we look for android: in the resource name in order to support format
// such as: @drawable/android:name
- if (segments[1].startsWith(PREFIX_ANDROID)) {
+ String referenceName = segments[1];
+ if (referenceName.startsWith(PREFIX_ANDROID)) {
frameworkOnly = true;
- segments[1] = segments[1].substring(PREFIX_ANDROID.length());
+ referenceName = referenceName.substring(PREFIX_ANDROID.length());
}
ResourceType type = ResourceType.getEnum(segments[0]);
@@ -281,7 +296,19 @@ public class ResourceResolver extends RenderResources {
return null;
}
- return findResValue(type, segments[1],
+ // Make sure it looks like a resource name; if not, it could just be a string
+ // which starts with a ?
+ if (!Character.isJavaIdentifierStart(referenceName.charAt(0))) {
+ return null;
+ }
+ for (int i = 1, n = referenceName.length(); i < n; i++) {
+ char c = referenceName.charAt(i);
+ if (!Character.isJavaIdentifierPart(c) && c != '.') {
+ return null;
+ }
+ }
+
+ return findResValue(type, referenceName,
forceFrameworkOnly ? true :frameworkOnly);
}