diff options
Diffstat (limited to 'ide_common')
5 files changed, 70 insertions, 44 deletions
diff --git a/ide_common/.classpath b/ide_common/.classpath index 8760b35..9d91c20 100644 --- a/ide_common/.classpath +++ b/ide_common/.classpath @@ -4,5 +4,6 @@ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> <classpathentry combineaccessrules="false" kind="src" path="/layoutlib_api"/> <classpathentry kind="var" path="ANDROID_SRC/prebuilt/common/kxml2/kxml2-2.3.0.jar" sourcepath="/ANDROID_SRC/dalvik/libcore/xml/src/main/java"/> + <classpathentry combineaccessrules="false" kind="src" path="/resources"/> <classpathentry kind="output" path="bin"/> </classpath> diff --git a/ide_common/Android.mk b/ide_common/Android.mk index d3b388c..2cb3f84 100644 --- a/ide_common/Android.mk +++ b/ide_common/Android.mk @@ -20,6 +20,7 @@ LOCAL_SRC_FILES := $(call all-java-files-under,src) LOCAL_JAVA_LIBRARIES := \ layoutlib_api \ + resources \ kxml2-2.3.0 LOCAL_MODULE := ide_common diff --git a/ide_common/src/com/android/ide/common/rendering/LayoutLibrary.java b/ide_common/src/com/android/ide/common/rendering/LayoutLibrary.java index bd72632..6fe7f10 100644 --- a/ide_common/src/com/android/ide/common/rendering/LayoutLibrary.java +++ b/ide_common/src/com/android/ide/common/rendering/LayoutLibrary.java @@ -23,6 +23,7 @@ import com.android.ide.common.rendering.api.ILayoutPullParser; import com.android.ide.common.rendering.api.LayoutLog; import com.android.ide.common.rendering.api.Params; import com.android.ide.common.rendering.api.RenderSession; +import com.android.ide.common.rendering.api.ResourceValue; import com.android.ide.common.rendering.api.Result; import com.android.ide.common.rendering.api.ViewInfo; import com.android.ide.common.rendering.api.Params.RenderingMode; @@ -38,6 +39,7 @@ import com.android.layoutlib.api.IProjectCallback; import com.android.layoutlib.api.IResourceValue; import com.android.layoutlib.api.IXmlPullParser; import com.android.layoutlib.api.ILayoutResult.ILayoutViewInfo; +import com.android.resources.ResourceType; import java.io.File; import java.lang.reflect.Constructor; @@ -46,7 +48,9 @@ import java.net.URI; import java.net.URL; import java.net.URLClassLoader; import java.util.ArrayList; +import java.util.HashMap; import java.util.Map; +import java.util.Map.Entry; /** * Class to use the Layout library. @@ -371,12 +375,11 @@ public class LayoutLibrary { // convert the map of ResourceValue into IResourceValue. Super ugly but works. - @SuppressWarnings("unchecked") - Map<String, Map<String, IResourceValue>> projectMap = - (Map<String, Map<String, IResourceValue>>)(Map) resources.getProjectResources(); - @SuppressWarnings("unchecked") - Map<String, Map<String, IResourceValue>> frameworkMap = - (Map<String, Map<String, IResourceValue>>)(Map) resources.getFrameworkResources(); + + Map<String, Map<String, IResourceValue>> projectMap = convertMap( + resources.getProjectResources()); + Map<String, Map<String, IResourceValue>> frameworkMap = convertMap( + resources.getFrameworkResources()); ILayoutResult result = null; @@ -434,6 +437,21 @@ public class LayoutLibrary { return convertToScene(result); } + @SuppressWarnings("unchecked") + private Map<String, Map<String, IResourceValue>> convertMap( + Map<ResourceType, Map<String, ResourceValue>> map) { + Map<String, Map<String, IResourceValue>> result = + new HashMap<String, Map<String, IResourceValue>>(); + + for (Entry<ResourceType, Map<String, ResourceValue>> entry : map.entrySet()) { + // ugly case but works. + result.put(entry.getKey().getName(), + (Map<String, IResourceValue>)(Map) entry.getValue()); + } + + return result; + } + /** * Converts a {@link ILayoutResult} to a {@link RenderSession}. */ diff --git a/ide_common/src/com/android/ide/common/resources/ResourceResolver.java b/ide_common/src/com/android/ide/common/resources/ResourceResolver.java index ddfe2bc..3948ac5 100644 --- a/ide_common/src/com/android/ide/common/resources/ResourceResolver.java +++ b/ide_common/src/com/android/ide/common/resources/ResourceResolver.java @@ -20,6 +20,7 @@ import com.android.ide.common.rendering.api.LayoutLog; import com.android.ide.common.rendering.api.RenderResources; import com.android.ide.common.rendering.api.ResourceValue; import com.android.ide.common.rendering.api.StyleResourceValue; +import com.android.resources.ResourceType; import java.util.Collection; import java.util.HashMap; @@ -27,7 +28,7 @@ import java.util.Map; public class ResourceResolver extends RenderResources { - private final static String REFERENCE_STYLE = RES_STYLE + "/"; + private final static String REFERENCE_STYLE = ResourceType.STYLE.getName() + "/"; private final static String PREFIX_ANDROID_RESOURCE_REF = "@android:"; private final static String PREFIX_RESOURCE_REF = "@"; private final static String PREFIX_ANDROID_THEME_REF = "?android:"; @@ -35,8 +36,8 @@ public class ResourceResolver extends RenderResources { private final static String PREFIX_ANDROID = "android:"; - private final Map<String, Map<String, ResourceValue>> mProjectResources; - private final Map<String, Map<String, ResourceValue>> mFrameworkResources; + private final Map<ResourceType, Map<String, ResourceValue>> mProjectResources; + private final Map<ResourceType, Map<String, ResourceValue>> mFrameworkResources; private final Map<StyleResourceValue, StyleResourceValue> mStyleInheritanceMap = new HashMap<StyleResourceValue, StyleResourceValue>(); @@ -49,8 +50,8 @@ public class ResourceResolver extends RenderResources { private boolean mIsProjectTheme; private ResourceResolver( - Map<String, Map<String, ResourceValue>> projectResources, - Map<String, Map<String, ResourceValue>> frameworkResources) { + Map<ResourceType, Map<String, ResourceValue>> projectResources, + Map<ResourceType, Map<String, ResourceValue>> frameworkResources) { mProjectResources = projectResources; mFrameworkResources = frameworkResources; } @@ -66,8 +67,8 @@ public class ResourceResolver extends RenderResources { * @return */ public static ResourceResolver create( - Map<String, Map<String, ResourceValue>> projectResources, - Map<String, Map<String, ResourceValue>> frameworkResources, + Map<ResourceType, Map<String, ResourceValue>> projectResources, + Map<ResourceType, Map<String, ResourceValue>> frameworkResources, String themeName, boolean isProjectTheme) { ResourceResolver resolver = new ResourceResolver( @@ -88,11 +89,11 @@ public class ResourceResolver extends RenderResources { return mIsProjectTheme; } - public Map<String, Map<String, ResourceValue>> getProjectResources() { + public Map<ResourceType, Map<String, ResourceValue>> getProjectResources() { return mProjectResources; } - public Map<String, Map<String, ResourceValue>> getFrameworkResources() { + public Map<ResourceType, Map<String, ResourceValue>> getFrameworkResources() { return mFrameworkResources; } @@ -118,12 +119,13 @@ public class ResourceResolver extends RenderResources { ResourceValue theme = null; if (frameworkTheme) { - Map<String, ResourceValue> frameworkStyleMap = mFrameworkResources.get(RES_STYLE); + Map<String, ResourceValue> frameworkStyleMap = mFrameworkResources.get( + ResourceType.STYLE); if (frameworkStyleMap != null) { theme = frameworkStyleMap.get(name); } } else { - Map<String, ResourceValue> projectStyleMap = mProjectResources.get(RES_STYLE); + Map<String, ResourceValue> projectStyleMap = mProjectResources.get(ResourceType.STYLE); if (projectStyleMap != null) { theme = projectStyleMap.get(name); } @@ -149,12 +151,12 @@ public class ResourceResolver extends RenderResources { } @Override - public ResourceValue getFrameworkResource(String resourceType, String resourceName) { + public ResourceValue getFrameworkResource(ResourceType resourceType, String resourceName) { return getResource(resourceType, resourceName, mFrameworkResources); } @Override - public ResourceValue getProjectResource(String resourceType, String resourceName) { + public ResourceValue getProjectResource(ResourceType resourceType, String resourceName) { return getResource(resourceType, resourceName, mProjectResources); } @@ -204,7 +206,7 @@ public class ResourceResolver extends RenderResources { if (segments.length == 2) { // there was a resType in the reference. If it's attr, we ignore it // else, we assert for now. - if (RES_ATTR.equals(segments[0])) { + if (ResourceType.ATTR.getName().equals(segments[0])) { referenceName = segments[1]; } else { // At this time, no support for ?type/name where type is not "attr" @@ -256,7 +258,14 @@ public class ResourceResolver extends RenderResources { segments[1] = segments[1].substring(PREFIX_ANDROID.length()); } - return findResValue(segments[0], segments[1], + ResourceType type = ResourceType.getEnum(segments[0]); + + // unknown type? + if (type == null) { + return null; + } + + return findResValue(type, segments[1], forceFrameworkOnly ? true :frameworkOnly); } @@ -265,7 +274,7 @@ public class ResourceResolver extends RenderResources { } @Override - public ResourceValue resolveValue(String type, String name, String value, + public ResourceValue resolveValue(ResourceType type, String name, String value, boolean isFrameworkValue) { if (value == null) { return null; @@ -317,7 +326,8 @@ public class ResourceResolver extends RenderResources { * @param frameworkOnly if <code>true</code>, the method does not search in the * project resources */ - private ResourceValue findResValue(String resType, String resName, boolean frameworkOnly) { + private ResourceValue findResValue(ResourceType resType, String resName, + boolean frameworkOnly) { // map of ResouceValue for the given type Map<String, ResourceValue> typeMap; @@ -343,7 +353,7 @@ public class ResourceResolver extends RenderResources { // if it was not found and the type is an id, it is possible that the ID was // generated dynamically when compiling the framework resources. // Look for it in the R map. - if (mFrameworkProvider != null && RES_ID.equals(resType)) { + if (mFrameworkProvider != null && resType == ResourceType.ID) { if (mFrameworkProvider.getId(resType, resName) != null) { return new ResourceValue(resType, resName, true); } @@ -351,11 +361,7 @@ public class ResourceResolver extends RenderResources { } // didn't find the resource anywhere. - // This is normal if the resource is an ID that is generated automatically. - // For other resources, we output a warning - if (mLogger != null && - "+id".equals(resType) == false && //$NON-NLS-1$ - "+android:id".equals(resType) == false) { //$NON-NLS-1$ + if (mLogger != null) { mLogger.warning(LayoutLog.TAG_RESOURCES_RESOLVE, "Couldn't resolve resource @" + (frameworkOnly ? "android:" : "") + resType + "/" + resName, @@ -364,8 +370,8 @@ public class ResourceResolver extends RenderResources { return null; } - private ResourceValue getResource(String resourceType, String resourceName, - Map<String, Map<String, ResourceValue>> resourceRepository) { + private ResourceValue getResource(ResourceType resourceType, String resourceName, + Map<ResourceType, Map<String, ResourceValue>> resourceRepository) { Map<String, ResourceValue> typeMap = resourceRepository.get(resourceType); if (typeMap != null) { ResourceValue item = typeMap.get(resourceName); @@ -388,8 +394,8 @@ public class ResourceResolver extends RenderResources { private void computeStyleMaps(String themeName, boolean isProjectTheme) { mThemeName = themeName; mIsProjectTheme = isProjectTheme; - Map<String, ResourceValue> projectStyleMap = mProjectResources.get(RES_STYLE); - Map<String, ResourceValue> frameworkStyleMap = mFrameworkResources.get(RES_STYLE); + Map<String, ResourceValue> projectStyleMap = mProjectResources.get(ResourceType.STYLE); + Map<String, ResourceValue> frameworkStyleMap = mFrameworkResources.get(ResourceType.STYLE); if (projectStyleMap != null && frameworkStyleMap != null) { // first, get the theme diff --git a/ide_common/src/com/android/ide/common/resources/ValueResourceParser.java b/ide_common/src/com/android/ide/common/resources/ValueResourceParser.java index 2e4cf8e..cda6587 100644 --- a/ide_common/src/com/android/ide/common/resources/ValueResourceParser.java +++ b/ide_common/src/com/android/ide/common/resources/ValueResourceParser.java @@ -18,6 +18,7 @@ package com.android.ide.common.resources; import com.android.ide.common.rendering.api.ResourceValue; import com.android.ide.common.rendering.api.StyleResourceValue; +import com.android.resources.ResourceType; import org.xml.sax.Attributes; import org.xml.sax.SAXException; @@ -35,15 +36,11 @@ public final class ValueResourceParser extends DefaultHandler { private final static String ATTR_TYPE = "type"; private final static String ATTR_PARENT = "parent"; - // Resource type definition - private final static String RES_STYLE = "style"; - private final static String RES_ATTR = "attr"; - private final static String DEFAULT_NS_PREFIX = "android:"; private final static int DEFAULT_NS_PREFIX_LEN = DEFAULT_NS_PREFIX.length(); public interface IValueResourceRepository { - void addResourceValue(String resType, ResourceValue value); + void addResourceValue(ResourceType type, ResourceValue value); } private boolean inResources = false; @@ -87,24 +84,27 @@ public final class ValueResourceParser extends DefaultHandler { inResources = true; } } else if (mDepth == 2 && inResources == true) { - String type; + String typeValue; // if the node is <item>, we get the type from the attribute "type" if (NODE_ITEM.equals(qName)) { - type = attributes.getValue(ATTR_TYPE); + typeValue = attributes.getValue(ATTR_TYPE); } else { // the type is the name of the node. - type = qName; + typeValue = qName; } + ResourceType type = ResourceType.getEnum(typeValue); + if (type != null) { - if (RES_ATTR.equals(type) == false) { + if (type != ResourceType.ATTR) { // get the resource name String name = attributes.getValue(ATTR_NAME); if (name != null) { - if (RES_STYLE.equals(type)) { + if (type == ResourceType.STYLE) { String parent = attributes.getValue(ATTR_PARENT); - mCurrentStyle = new StyleResourceValue(type, name, parent, mIsFramework); + mCurrentStyle = new StyleResourceValue(type, name, parent, + mIsFramework); mRepository.addResourceValue(type, mCurrentStyle); } else { mCurrentValue = new ResourceValue(type, name, mIsFramework); |