Add a functional test that renders all the layouts of ApiDemos
This commit is contained in:
@@ -52,13 +52,13 @@ public final class ResourceManager implements IProjectListener, IFolderListener,
|
||||
|
||||
/** List of the qualifier object helping for the parsing of folder names */
|
||||
private final ResourceQualifier[] mQualifiers;
|
||||
|
||||
|
||||
/**
|
||||
* Map associating project resource with project objects.
|
||||
*/
|
||||
private final HashMap<IProject, ProjectResources> mMap =
|
||||
new HashMap<IProject, ProjectResources>();
|
||||
|
||||
|
||||
/**
|
||||
* Sets up the resource manager with the global resource monitor.
|
||||
* @param monitor The global resource monitor
|
||||
@@ -68,10 +68,10 @@ public final class ResourceManager implements IProjectListener, IFolderListener,
|
||||
int mask = IResourceDelta.ADDED | IResourceDelta.REMOVED | IResourceDelta.CHANGED;
|
||||
monitor.addFolderListener(sThis, mask);
|
||||
monitor.addFileListener(sThis, mask);
|
||||
|
||||
|
||||
CompiledResourcesMonitor.setupMonitor(monitor);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the singleton instance.
|
||||
*/
|
||||
@@ -87,15 +87,15 @@ public final class ResourceManager implements IProjectListener, IFolderListener,
|
||||
public ProjectResources getProjectResources(IProject project) {
|
||||
return mMap.get(project);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Processes folder event.
|
||||
*/
|
||||
public void folderChanged(IFolder folder, int kind) {
|
||||
ProjectResources resources;
|
||||
|
||||
|
||||
final IProject project = folder.getProject();
|
||||
|
||||
|
||||
try {
|
||||
if (project.hasNature(AndroidConstants.NATURE) == false) {
|
||||
return;
|
||||
@@ -104,18 +104,18 @@ public final class ResourceManager implements IProjectListener, IFolderListener,
|
||||
// can't get the project nature? return!
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
switch (kind) {
|
||||
case IResourceDelta.ADDED:
|
||||
// checks if the folder is under res.
|
||||
IPath path = folder.getFullPath();
|
||||
|
||||
|
||||
// the path will be project/res/<something>
|
||||
if (path.segmentCount() == 3) {
|
||||
if (isInResFolder(path)) {
|
||||
// get the project and its resource object.
|
||||
resources = mMap.get(project);
|
||||
|
||||
|
||||
// if it doesn't exist, we create it.
|
||||
if (resources == null) {
|
||||
resources = new ProjectResources(false /* isFrameworkRepository */);
|
||||
@@ -146,23 +146,23 @@ public final class ResourceManager implements IProjectListener, IFolderListener,
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* (non-Javadoc)
|
||||
* Sent when a file changed. Depending on the file being changed, and the type of change (ADDED,
|
||||
* REMOVED, CHANGED), the file change is processed to update the resource manager data.
|
||||
*
|
||||
*
|
||||
* @param file The file that changed.
|
||||
* @param markerDeltas The marker deltas for the file.
|
||||
* @param kind The change kind. This is equivalent to
|
||||
* {@link IResourceDelta#accept(IResourceDeltaVisitor)}
|
||||
*
|
||||
*
|
||||
* @see IFileListener#fileChanged
|
||||
*/
|
||||
public void fileChanged(IFile file, IMarkerDelta[] markerDeltas, int kind) {
|
||||
ProjectResources resources;
|
||||
|
||||
|
||||
final IProject project = file.getProject();
|
||||
|
||||
|
||||
try {
|
||||
if (project.hasNature(AndroidConstants.NATURE) == false) {
|
||||
return;
|
||||
@@ -171,22 +171,22 @@ public final class ResourceManager implements IProjectListener, IFolderListener,
|
||||
// can't get the project nature? return!
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
switch (kind) {
|
||||
case IResourceDelta.ADDED:
|
||||
// checks if the file is under res/something.
|
||||
IPath path = file.getFullPath();
|
||||
|
||||
|
||||
if (path.segmentCount() == 4) {
|
||||
if (isInResFolder(path)) {
|
||||
// get the project and its resources
|
||||
resources = mMap.get(project);
|
||||
|
||||
|
||||
IContainer container = file.getParent();
|
||||
if (container instanceof IFolder && resources != null) {
|
||||
|
||||
|
||||
ResourceFolder folder = resources.getResourceFolder((IFolder)container);
|
||||
|
||||
|
||||
if (folder != null) {
|
||||
processFile(new IFileWrapper(file), folder);
|
||||
}
|
||||
@@ -201,7 +201,7 @@ public final class ResourceManager implements IProjectListener, IFolderListener,
|
||||
IContainer container = file.getParent();
|
||||
if (container instanceof IFolder) {
|
||||
ResourceFolder resFolder = resources.getResourceFolder((IFolder)container);
|
||||
|
||||
|
||||
// we get the delete on the folder before the file, so it is possible
|
||||
// the associated ResourceFolder doesn't exist anymore.
|
||||
if (resFolder != null) {
|
||||
@@ -221,7 +221,7 @@ public final class ResourceManager implements IProjectListener, IFolderListener,
|
||||
IContainer container = file.getParent();
|
||||
if (container instanceof IFolder) {
|
||||
ResourceFolder resFolder = resources.getResourceFolder((IFolder)container);
|
||||
|
||||
|
||||
// we get the delete on the folder before the file, so it is possible
|
||||
// the associated ResourceFolder doesn't exist anymore.
|
||||
if (resFolder != null) {
|
||||
@@ -249,7 +249,7 @@ public final class ResourceManager implements IProjectListener, IFolderListener,
|
||||
public void projectOpenedWithWorkspace(IProject project) {
|
||||
createProject(project);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the {@link ResourceFolder} for the given file or <code>null</code> if none exists.
|
||||
*/
|
||||
@@ -258,62 +258,85 @@ public final class ResourceManager implements IProjectListener, IFolderListener,
|
||||
if (container.getType() == IResource.FOLDER) {
|
||||
IFolder parent = (IFolder)container;
|
||||
IProject project = file.getProject();
|
||||
|
||||
|
||||
ProjectResources resources = getProjectResources(project);
|
||||
if (resources != null) {
|
||||
return resources.getResourceFolder(parent);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Loads and returns the resources for a given {@link IAndroidTarget}
|
||||
* @param androidTarget the target from which to load the framework resources
|
||||
*/
|
||||
public ProjectResources loadFrameworkResources(IAndroidTarget androidTarget) {
|
||||
String osResourcesPath = androidTarget.getPath(IAndroidTarget.RESOURCES);
|
||||
|
||||
|
||||
File frameworkRes = new File(osResourcesPath);
|
||||
if (frameworkRes.isDirectory()) {
|
||||
ProjectResources resources = new ProjectResources(true /* isFrameworkRepository */);
|
||||
|
||||
try {
|
||||
File[] files = frameworkRes.listFiles();
|
||||
for (File file : files) {
|
||||
if (file.isDirectory()) {
|
||||
ResourceFolder resFolder = processFolder(new FolderWrapper(file),
|
||||
resources);
|
||||
|
||||
if (resFolder != null) {
|
||||
// now we process the content of the folder
|
||||
File[] children = file.listFiles();
|
||||
|
||||
for (File childRes : children) {
|
||||
if (childRes.isFile()) {
|
||||
processFile(new FileWrapper(childRes), resFolder);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// now that we have loaded the files, we need to force load the resources from them
|
||||
resources.loadAll();
|
||||
|
||||
loadResources(resources, frameworkRes);
|
||||
return resources;
|
||||
|
||||
} catch (IOException e) {
|
||||
// since we test that folders are folders, and files are files, this shouldn't
|
||||
// happen. We can ignore it.
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Loads the resources from a folder, and fills the given {@link ProjectResources}.
|
||||
* <p/>
|
||||
* This is mostly a utility method that should not be used to process actual Eclipse projects
|
||||
* (Those are loaded with {@link #createProject(IProject)} for new project or
|
||||
* {@link #processFolder(IAbstractFolder, ProjectResources)} and
|
||||
* {@link #processFile(IAbstractFile, ResourceFolder)} for folder/file modifications)<br>
|
||||
* This method will process files/folders with implementations of {@link IAbstractFile} and
|
||||
* {@link IAbstractFolder} based on {@link File} instead of {@link IFile} and {@link IFolder}
|
||||
* respectively. This is not proper for handling {@link IProject}s.
|
||||
* </p>
|
||||
* This is used to load the framework resources, or to do load project resources when
|
||||
* setting rendering tests.
|
||||
*
|
||||
*
|
||||
* @param resources The {@link ProjectResources} files to load. It is expected that the
|
||||
* framework flag has been properly setup. This is filled up with the content of the folder.
|
||||
* @param folder The folder to read the resources from. This is the top level resource folder
|
||||
* (res/)
|
||||
* @throws IOException
|
||||
*/
|
||||
public void loadResources(ProjectResources resources, File folder) throws IOException {
|
||||
File[] files = folder.listFiles();
|
||||
for (File file : files) {
|
||||
if (file.isDirectory()) {
|
||||
ResourceFolder resFolder = processFolder(new FolderWrapper(file),
|
||||
resources);
|
||||
|
||||
if (resFolder != null) {
|
||||
// now we process the content of the folder
|
||||
File[] children = file.listFiles();
|
||||
|
||||
for (File childRes : children) {
|
||||
if (childRes.isFile()) {
|
||||
processFile(new FileWrapper(childRes), resFolder);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// now that we have loaded the files, we need to force load the resources from them
|
||||
resources.loadAll();
|
||||
}
|
||||
|
||||
/**
|
||||
* Initial project parsing to gather resource info.
|
||||
* @param project
|
||||
@@ -328,33 +351,33 @@ public final class ResourceManager implements IProjectListener, IFolderListener,
|
||||
// can't check the nature of the project? ignore it.
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
IFolder resourceFolder = project.getFolder(SdkConstants.FD_RESOURCES);
|
||||
|
||||
|
||||
ProjectResources projectResources = mMap.get(project);
|
||||
if (projectResources == null) {
|
||||
projectResources = new ProjectResources(false /* isFrameworkRepository */);
|
||||
mMap.put(project, projectResources);
|
||||
}
|
||||
|
||||
|
||||
if (resourceFolder != null && resourceFolder.exists()) {
|
||||
try {
|
||||
IResource[] resources = resourceFolder.members();
|
||||
|
||||
|
||||
for (IResource res : resources) {
|
||||
if (res.getType() == IResource.FOLDER) {
|
||||
IFolder folder = (IFolder)res;
|
||||
ResourceFolder resFolder = processFolder(new IFolderWrapper(folder),
|
||||
projectResources);
|
||||
|
||||
|
||||
if (resFolder != null) {
|
||||
// now we process the content of the folder
|
||||
IResource[] files = folder.members();
|
||||
|
||||
|
||||
for (IResource fileRes : files) {
|
||||
if (fileRes.getType() == IResource.FILE) {
|
||||
IFile file = (IFile)fileRes;
|
||||
|
||||
|
||||
processFile(new IFileWrapper(file), resFolder);
|
||||
}
|
||||
}
|
||||
@@ -383,10 +406,10 @@ public final class ResourceManager implements IProjectListener, IFolderListener,
|
||||
// Because the order of the qualifier is fixed, we do not reset the first qualifier
|
||||
// after each sucessful segment.
|
||||
// If we run out of qualifier before processing all the segments, we fail.
|
||||
|
||||
|
||||
int qualifierIndex = 0;
|
||||
int qualifierCount = mQualifiers.length;
|
||||
|
||||
|
||||
for (int i = 1 ; i < folderSegments.length; i++) {
|
||||
String seg = folderSegments[i];
|
||||
if (seg.length() > 0) {
|
||||
@@ -394,12 +417,12 @@ public final class ResourceManager implements IProjectListener, IFolderListener,
|
||||
mQualifiers[qualifierIndex].checkAndSet(seg, config) == false) {
|
||||
qualifierIndex++;
|
||||
}
|
||||
|
||||
|
||||
// if we reached the end of the qualifier we didn't find a matching qualifier.
|
||||
if (qualifierIndex == qualifierCount) {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
@@ -407,7 +430,7 @@ public final class ResourceManager implements IProjectListener, IFolderListener,
|
||||
|
||||
return config;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Processes a folder and adds it to the list of the project resources.
|
||||
* @param folder the folder to process
|
||||
@@ -420,18 +443,18 @@ public final class ResourceManager implements IProjectListener, IFolderListener,
|
||||
|
||||
// get the enum for the resource type.
|
||||
ResourceFolderType type = ResourceFolderType.getTypeByName(folderSegments[0]);
|
||||
|
||||
|
||||
if (type != null) {
|
||||
// get the folder configuration.
|
||||
FolderConfiguration config = getConfig(folderSegments);
|
||||
|
||||
|
||||
if (config != null) {
|
||||
ResourceFolder configuredFolder = project.add(type, config, folder);
|
||||
|
||||
return configuredFolder;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -443,16 +466,16 @@ public final class ResourceManager implements IProjectListener, IFolderListener,
|
||||
private void processFile(IAbstractFile file, ResourceFolder folder) {
|
||||
// get the type of the folder
|
||||
ResourceFolderType type = folder.getType();
|
||||
|
||||
|
||||
// look for this file if it's already been created
|
||||
ResourceFile resFile = folder.getFile(file);
|
||||
|
||||
|
||||
if (resFile != null) {
|
||||
// invalidate the file
|
||||
resFile.touch();
|
||||
} else {
|
||||
// create a ResourceFile for it.
|
||||
|
||||
|
||||
// check if that's a single or multi resource type folder. For now we define this by
|
||||
// the number of possible resource type output by files in the folder. This does
|
||||
// not make the difference between several resource types from a single file or
|
||||
@@ -460,13 +483,13 @@ public final class ResourceManager implements IProjectListener, IFolderListener,
|
||||
// resource. The former is handled by MultiResourceFile properly while we don't
|
||||
// handle the latter. If we were to add this behavior we'd have to change this call.
|
||||
ResourceType[] types = FolderTypeRelationship.getRelatedResourceTypes(type);
|
||||
|
||||
|
||||
if (types.length == 1) {
|
||||
resFile = new SingleResourceFile(file, folder);
|
||||
} else {
|
||||
resFile = new MultiResourceFile(file, folder);
|
||||
}
|
||||
|
||||
|
||||
// add it to the folder
|
||||
folder.addFile(resFile);
|
||||
}
|
||||
@@ -480,7 +503,7 @@ public final class ResourceManager implements IProjectListener, IFolderListener,
|
||||
private boolean isInResFolder(IPath path) {
|
||||
return SdkConstants.FD_RESOURCES.equalsIgnoreCase(path.segment(1));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Private constructor to enforce singleton design.
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user