mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
IDEA-89679 correctly resolve resources from library modules
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user