diff --git a/plugins/android/src/org/jetbrains/android/uipreview/RenderService.java b/plugins/android/src/org/jetbrains/android/uipreview/RenderService.java index 59d085777f01..42d0e58e3f10 100644 --- a/plugins/android/src/org/jetbrains/android/uipreview/RenderService.java +++ b/plugins/android/src/org/jetbrains/android/uipreview/RenderService.java @@ -17,12 +17,8 @@ package org.jetbrains.android.uipreview; import com.android.ide.common.rendering.LayoutLibrary; -import com.android.ide.common.rendering.api.ILayoutPullParser; -import com.android.ide.common.rendering.api.IProjectCallback; -import com.android.ide.common.rendering.api.RenderSession; -import com.android.ide.common.rendering.api.SessionParams; +import com.android.ide.common.rendering.api.*; import com.android.ide.common.rendering.api.SessionParams.RenderingMode; -import com.android.ide.common.resources.ResourceResolver; import com.android.ide.common.resources.configuration.*; import com.android.resources.Density; import com.android.resources.ScreenOrientation; @@ -45,7 +41,7 @@ class RenderService { private static final Logger LOG = Logger.getInstance("#org.jetbrains.android.uipreview.RenderService"); private final IProjectCallback myProjectCallback; - private final ResourceResolver myResourceResolver; + private final RenderResources myResourceResolver; private final LayoutLibrary myLayoutLib; private final FolderConfiguration myConfig; private final int myMinSdkVersion; @@ -53,7 +49,7 @@ class RenderService { private final float myYdpi; RenderService(LayoutLibrary layoutLibrary, - @NotNull ResourceResolver resourceResolver, + @NotNull RenderResources resourceResolver, FolderConfiguration config, float xdpi, float ydpi, diff --git a/plugins/android/src/org/jetbrains/android/uipreview/RenderServiceFactory.java b/plugins/android/src/org/jetbrains/android/uipreview/RenderServiceFactory.java index 02371e7d93a0..f9265610bc4f 100644 --- a/plugins/android/src/org/jetbrains/android/uipreview/RenderServiceFactory.java +++ b/plugins/android/src/org/jetbrains/android/uipreview/RenderServiceFactory.java @@ -19,6 +19,7 @@ package org.jetbrains.android.uipreview; import com.android.ide.common.log.ILogger; import com.android.ide.common.rendering.LayoutLibrary; import com.android.ide.common.rendering.api.IProjectCallback; +import com.android.ide.common.rendering.api.RenderResources; import com.android.ide.common.rendering.api.ResourceValue; import com.android.ide.common.resources.FrameworkResources; import com.android.ide.common.resources.ResourceResolver; @@ -73,7 +74,7 @@ public class RenderServiceFactory { return null; } - public ResourceResolver createResourceResolver(final AndroidFacet facet, + public RenderResources createResourceResolver(final AndroidFacet facet, FolderConfiguration config, ProjectResources projectResources, String themeName, @@ -94,10 +95,11 @@ public class RenderServiceFactory { } final Map> configedFrameworkRes = myResources.getConfiguredResources(config); - return ResourceResolver.create(configedProjectRes, configedFrameworkRes, themeName, isProjectTheme); + final ResourceResolver resolver = ResourceResolver.create(configedProjectRes, configedFrameworkRes, themeName, isProjectTheme); + return new ResourceResolverDecorator(resolver); } - public RenderService createService(ResourceResolver resources, + public RenderService createService(RenderResources resources, FolderConfiguration config, float xdpi, float ydpi, diff --git a/plugins/android/src/org/jetbrains/android/uipreview/RenderUtil.java b/plugins/android/src/org/jetbrains/android/uipreview/RenderUtil.java index e04126ea0ec8..94e5e87e3d26 100644 --- a/plugins/android/src/org/jetbrains/android/uipreview/RenderUtil.java +++ b/plugins/android/src/org/jetbrains/android/uipreview/RenderUtil.java @@ -1,5 +1,6 @@ package org.jetbrains.android.uipreview; +import com.android.ide.common.rendering.api.RenderResources; import com.android.ide.common.rendering.api.RenderSession; import com.android.ide.common.rendering.api.Result; import com.android.ide.common.resources.*; @@ -98,7 +99,7 @@ class RenderUtil { missingRClass = true; } - final ResourceResolver resolver = + final RenderResources resolver = factory.createResourceResolver(facet, config, projectResources, theme.getName(), theme.isProjectTheme()); final RenderService renderService = factory.createService(resolver, config, xdpi, ydpi, callback, minSdkVersion); diff --git a/plugins/android/src/org/jetbrains/android/uipreview/ResourceResolverDecorator.java b/plugins/android/src/org/jetbrains/android/uipreview/ResourceResolverDecorator.java new file mode 100644 index 000000000000..37128d9e6825 --- /dev/null +++ b/plugins/android/src/org/jetbrains/android/uipreview/ResourceResolverDecorator.java @@ -0,0 +1,102 @@ +package org.jetbrains.android.uipreview; + +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.ide.common.resources.ResourceResolver; +import com.android.resources.ResourceType; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * @author Eugene.Kudelevsky + */ +public class ResourceResolverDecorator extends RenderResources { + private final ResourceResolver myWrappee; + + public ResourceResolverDecorator(@NotNull ResourceResolver wrappee) { + myWrappee = wrappee; + } + + @Override + public void setFrameworkResourceIdProvider(FrameworkResourceIdProvider provider) { + myWrappee.setFrameworkResourceIdProvider(provider); + } + + @Override + public void setLogger(LayoutLog logger) { + myWrappee.setLogger(logger); + } + + @Override + public StyleResourceValue getCurrentTheme() { + return myWrappee.getCurrentTheme(); + } + + @Override + public StyleResourceValue getTheme(String name, boolean frameworkTheme) { + return myWrappee.getTheme(name, frameworkTheme); + } + + @Override + public boolean themeIsParentOf(StyleResourceValue parentTheme, StyleResourceValue childTheme) { + return myWrappee.themeIsParentOf(parentTheme, childTheme); + } + + @Override + public ResourceValue getFrameworkResource(ResourceType resourceType, String resourceName) { + return myWrappee.getFrameworkResource(resourceType, resourceName); + } + + @Override + public ResourceValue getProjectResource(ResourceType resourceType, String resourceName) { + return myWrappee.getProjectResource(resourceType, resourceName); + } + + @Override + public ResourceValue findItemInTheme(String itemName) { + return myWrappee.findItemInTheme(itemName); + } + + @Override + public ResourceValue findItemInStyle(StyleResourceValue style, String itemName) { + return myWrappee.findItemInStyle(style, itemName); + } + + @Override + public ResourceValue findResValue(String reference, boolean forceFrameworkOnly) { + return myWrappee.findResValue(reference, forceFrameworkOnly); + } + + @Nullable + @Override + public ResourceValue resolveValue(ResourceType type, String name, String value, boolean isFrameworkValue) { + return myWrappee.resolveValue(type, name, value, isFrameworkValue); + } + + @Nullable + @Override + public ResourceValue resolveResValue(ResourceValue value) { + if (value == null) { + return null; + } + final String stringValue = value.getValue(); + + if (stringValue == null) { + return value; + } + final ResourceValue resolvedResValue = myWrappee.findResValue(stringValue, value.isFramework()); + + if (resolvedResValue == null) { + return value; + } + + // avoid infinite recursion (see http://code.google.com/p/android/issues/detail?id=24317) + if (resolvedResValue.equals(value)) { + // use default value + return null; + } + return resolveResValue(resolvedResValue); + } +}