diff --git a/plugins/android/src/org/jetbrains/android/uipreview/ProjectResources.java b/plugins/android/src/org/jetbrains/android/uipreview/ProjectResources.java index 5097c90b0653..fa0143bcbf07 100644 --- a/plugins/android/src/org/jetbrains/android/uipreview/ProjectResources.java +++ b/plugins/android/src/org/jetbrains/android/uipreview/ProjectResources.java @@ -1,14 +1,17 @@ package org.jetbrains.android.uipreview; +import com.android.ide.common.rendering.api.ResourceValue; import com.android.ide.common.resources.InlineResourceItem; import com.android.ide.common.resources.IntArrayWrapper; import com.android.ide.common.resources.ResourceItem; import com.android.ide.common.resources.ResourceRepository; +import com.android.ide.common.resources.configuration.FolderConfiguration; import com.android.resources.ResourceType; import com.android.util.Pair; import com.intellij.util.containers.HashMap; import gnu.trove.TIntObjectHashMap; import gnu.trove.TObjectIntHashMap; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; @@ -33,8 +36,11 @@ public class ProjectResources extends ResourceRepository { new TIntObjectHashMap>(); private int myDynamicSeed = DYNAMIC_ID_SEED_START; - public ProjectResources() { + private final List myLibResources; + + public ProjectResources(@NotNull List libResources) { super(false); + myLibResources = libResources; } @Nullable @@ -89,6 +95,30 @@ public class ProjectResources extends ResourceRepository { return new ResourceItem(name); } + @Override + public Map> getConfiguredResources(FolderConfiguration referenceConfig) { + final Map> result = new HashMap>(); + + for (int i = myLibResources.size() - 1; i >= 0; i--) { + putAllResourceEntries(result, myLibResources.get(i).doGetConfiguredResources(referenceConfig)); + } + putAllResourceEntries(result, doGetConfiguredResources(referenceConfig)); + return result; + } + + private static void putAllResourceEntries(Map> result, + Map> from) { + for (Map.Entry> entry : from.entrySet()) { + Map map = result.get(entry.getKey()); + + if (map == null) { + map = new HashMap(); + result.put(entry.getKey(), map); + } + map.putAll(entry.getValue()); + } + } + private int getDynamicId(ResourceType type, String name) { synchronized (myName2DynamicIdMap) { if (myName2DynamicIdMap.containsKey(name)) { diff --git a/plugins/android/src/org/jetbrains/android/uipreview/RenderUtil.java b/plugins/android/src/org/jetbrains/android/uipreview/RenderUtil.java index d790b9b62084..8fa77dda4969 100644 --- a/plugins/android/src/org/jetbrains/android/uipreview/RenderUtil.java +++ b/plugins/android/src/org/jetbrains/android/uipreview/RenderUtil.java @@ -1,6 +1,8 @@ package org.jetbrains.android.uipreview; -import com.android.ide.common.rendering.api.*; +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.ResourceDeltaKind; import com.android.ide.common.resources.ResourceFolder; import com.android.ide.common.resources.ResourceRepository; @@ -100,13 +102,17 @@ public class RenderUtil { if (factory == null) { throw new RenderingException(AndroidBundle.message("android.layout.preview.cannot.load.library.error")); } + final List allLibraries = AndroidUtils.getAllAndroidDependencies(module, true); + final List libResources = new ArrayList(); + final List emptyResList = Collections.emptyList(); - final ProjectResources projectResources = new ProjectResources(); + for (AndroidFacet libFacet : allLibraries) { + if (!libFacet.equals(facet)) { + libResources.add(loadProjectResources(libFacet, null, null, emptyResList)); + } + } + final ProjectResources projectResources = loadProjectResources(facet, layoutXmlText, layoutXmlFile, libResources); - final VirtualFile[] resourceDirs = facet.getLocalResourceManager().getAllResourceDirs(); - final IAbstractFolder[] resFolders = toAbstractFolders(resourceDirs); - - loadResources(projectResources, layoutXmlText, layoutXmlFile, resFolders); final int minSdkVersion = getMinSdkVersion(facet); String missingRClassMessage = null; boolean missingRClass = false; @@ -206,6 +212,23 @@ public class RenderUtil { return new RenderingResult(warnMessages, session); } + @NotNull + private static ProjectResources loadProjectResources(@NotNull AndroidFacet facet, + @Nullable String layoutXmlText, + @Nullable VirtualFile layoutXmlFile, + @NotNull List libResources) + throws IOException, RenderingException { + final ProjectResources projectResources = new ProjectResources(libResources); + final VirtualFile resourceDir = facet.getLocalResourceManager().getResourceDir(); + + if (resourceDir != null) { + final IAbstractFolder resFolder = new BufferingFolderWrapper(new File( + FileUtil.toSystemDependentName(resourceDir.getPath()))); + loadResources(projectResources, layoutXmlText, layoutXmlFile, resFolder); + } + return projectResources; + } + private static void reportBrokenClassesWarning(@NotNull List warnMessages, @NotNull Map brokenClasses) { if (brokenClasses.size() > 0) { @@ -460,18 +483,6 @@ public class RenderUtil { return -1; } - @NotNull - private static IAbstractFolder[] toAbstractFolders(@NotNull VirtualFile[] folders) { - final IAbstractFolder[] result = new IAbstractFolder[folders.length]; - - for (int i = 0; i < folders.length; i++) { - final VirtualFile folder = folders[i]; - final String folderPath = FileUtil.toSystemDependentName(folder.getPath()); - result[i] = new BufferingFolderWrapper(new File(folderPath)); - } - return result; - } - public static void loadResources(@NotNull ResourceRepository repository, @Nullable final String layoutXmlFileText, @Nullable VirtualFile layoutXmlFile,