IDEA-89679 correctly resolve resources from library modules

This commit is contained in:
Eugene Kudelevsky
2012-08-23 19:49:56 +04:00
parent 62f2a68cd0
commit 0edeab9890
2 changed files with 60 additions and 19 deletions
@@ -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<Pair<ResourceType, String>>();
private int myDynamicSeed = DYNAMIC_ID_SEED_START;
public ProjectResources() {
private final List<ProjectResources> myLibResources;
public ProjectResources(@NotNull List<ProjectResources> libResources) {
super(false);
myLibResources = libResources;
}
@Nullable
@@ -89,6 +95,30 @@ public class ProjectResources extends ResourceRepository {
return new ResourceItem(name);
}
@Override
public Map<ResourceType, Map<String, ResourceValue>> getConfiguredResources(FolderConfiguration referenceConfig) {
final Map<ResourceType, Map<String, ResourceValue>> result = new HashMap<ResourceType, Map<String, ResourceValue>>();
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<ResourceType, Map<String, ResourceValue>> result,
Map<ResourceType, Map<String, ResourceValue>> from) {
for (Map.Entry<ResourceType, Map<String, ResourceValue>> entry : from.entrySet()) {
Map<String, ResourceValue> map = result.get(entry.getKey());
if (map == null) {
map = new HashMap<String, ResourceValue>();
result.put(entry.getKey(), map);
}
map.putAll(entry.getValue());
}
}
private int getDynamicId(ResourceType type, String name) {
synchronized (myName2DynamicIdMap) {
if (myName2DynamicIdMap.containsKey(name)) {
@@ -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<AndroidFacet> allLibraries = AndroidUtils.getAllAndroidDependencies(module, true);
final List<ProjectResources> libResources = new ArrayList<ProjectResources>();
final List<ProjectResources> 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<ProjectResources> 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<FixableIssueMessage> warnMessages,
@NotNull Map<String, Throwable> 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,