aboutsummaryrefslogtreecommitdiffstats
path: root/sdk_common/src/com/android/ide/common/resources/ResourceFolder.java
diff options
context:
space:
mode:
Diffstat (limited to 'sdk_common/src/com/android/ide/common/resources/ResourceFolder.java')
-rw-r--r--sdk_common/src/com/android/ide/common/resources/ResourceFolder.java353
1 files changed, 0 insertions, 353 deletions
diff --git a/sdk_common/src/com/android/ide/common/resources/ResourceFolder.java b/sdk_common/src/com/android/ide/common/resources/ResourceFolder.java
deleted file mode 100644
index d6464c8..0000000
--- a/sdk_common/src/com/android/ide/common/resources/ResourceFolder.java
+++ /dev/null
@@ -1,353 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.ide.common.resources;
-
-import com.android.annotations.VisibleForTesting;
-import com.android.annotations.VisibleForTesting.Visibility;
-import com.android.ide.common.resources.configuration.Configurable;
-import com.android.ide.common.resources.configuration.FolderConfiguration;
-import com.android.io.IAbstractFile;
-import com.android.io.IAbstractFolder;
-import com.android.resources.FolderTypeRelationship;
-import com.android.resources.ResourceFolderType;
-import com.android.resources.ResourceType;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Resource Folder class. Contains list of {@link ResourceFile}s,
- * the {@link FolderConfiguration}, and a link to the {@link IAbstractFolder} object.
- */
-public final class ResourceFolder implements Configurable {
- final ResourceFolderType mType;
- final FolderConfiguration mConfiguration;
- IAbstractFolder mFolder;
- List<ResourceFile> mFiles = null;
- Map<String, ResourceFile> mNames = null;
- private final ResourceRepository mRepository;
-
- /**
- * Creates a new {@link ResourceFolder}
- * @param type The type of the folder
- * @param config The configuration of the folder
- * @param folder The associated {@link IAbstractFolder} object.
- * @param repository The associated {@link ResourceRepository}
- */
- protected ResourceFolder(ResourceFolderType type, FolderConfiguration config,
- IAbstractFolder folder, ResourceRepository repository) {
- mType = type;
- mConfiguration = config;
- mFolder = folder;
- mRepository = repository;
- }
-
- /**
- * Processes a file and adds it to its parent folder resource.
- *
- * @param file the underlying resource file.
- * @param kind the file change kind.
- * @param context a context object with state for the current update, such
- * as a place to stash errors encountered
- * @return the {@link ResourceFile} that was created.
- */
- public ResourceFile processFile(IAbstractFile file, ResourceDeltaKind kind,
- ScanningContext context) {
- // look for this file if it's already been created
- ResourceFile resFile = getFile(file, context);
-
- if (resFile == null) {
- if (kind != ResourceDeltaKind.REMOVED) {
- // create a ResourceFile for it.
-
- resFile = createResourceFile(file);
- resFile.load(context);
-
- // add it to the folder
- addFile(resFile);
- }
- } else {
- if (kind == ResourceDeltaKind.REMOVED) {
- removeFile(resFile, context);
- } else {
- resFile.update(context);
- }
- }
-
- return resFile;
- }
-
- private ResourceFile createResourceFile(IAbstractFile file) {
- // 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.
- // We have a special case for layout/menu folders which can also generate IDs.
- // This does
- // not make the difference between several resource types from a single file or
- // the ability to have 2 files in the same folder generating 2 different types of
- // 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.
- List<ResourceType> types = FolderTypeRelationship.getRelatedResourceTypes(mType);
-
- ResourceFile resFile = null;
- if (types.size() == 1) {
- resFile = new SingleResourceFile(file, this);
- } else if (types.contains(ResourceType.LAYOUT)) {
- resFile = new IdGeneratingResourceFile(file, this, ResourceType.LAYOUT);
- } else if (types.contains(ResourceType.MENU)) {
- resFile = new IdGeneratingResourceFile(file, this, ResourceType.MENU);
- } else {
- resFile = new MultiResourceFile(file, this);
- }
- return resFile;
- }
-
- /**
- * Adds a {@link ResourceFile} to the folder.
- * @param file The {@link ResourceFile}.
- */
- @VisibleForTesting(visibility=Visibility.PROTECTED)
- public void addFile(ResourceFile file) {
- if (mFiles == null) {
- int initialSize = 16;
- if (mRepository.isFrameworkRepository()) {
- String name = mFolder.getName();
- // Pick some reasonable initial sizes for framework data structures
- // since they are typically (a) large and (b) their sizes are roughly known
- // in advance
- switch (mType) {
- case DRAWABLE: {
- // See if it's one of the -mdpi, -hdpi etc folders which
- // are large (~1250 items)
- int index = name.indexOf('-');
- if (index == -1) {
- initialSize = 230; // "drawable" folder
- } else {
- index = name.indexOf('-', index + 1);
- if (index == -1) {
- // One of the "drawable-<density>" folders
- initialSize = 1260;
- } else {
- // "drawable-sw600dp-hdpi" etc
- initialSize = 30;
- }
- }
- break;
- }
- case LAYOUT: {
- // The main layout folder has about ~185 layouts in it;
- // the others are small
- if (name.indexOf('-') == -1) {
- initialSize = 200;
- }
- break;
- }
- case VALUES: {
- if (name.indexOf('-') == -1) {
- initialSize = 32;
- } else {
- initialSize = 4;
- }
- break;
- }
- case ANIM: initialSize = 85; break;
- case COLOR: initialSize = 32; break;
- case RAW: initialSize = 4; break;
- default:
- // Stick with the 16 default
- break;
- }
- }
-
- mFiles = new ArrayList<ResourceFile>(initialSize);
- mNames = new HashMap<String, ResourceFile>(initialSize, 2.0f);
- }
-
- mFiles.add(file);
- mNames.put(file.getFile().getName(), file);
- }
-
- protected void removeFile(ResourceFile file, ScanningContext context) {
- file.dispose(context);
- mFiles.remove(file);
- mNames.remove(file.getFile().getName());
- }
-
- protected void dispose(ScanningContext context) {
- if (mFiles != null) {
- for (ResourceFile file : mFiles) {
- file.dispose(context);
- }
-
- mFiles.clear();
- mNames.clear();
- }
- }
-
- /**
- * Returns the {@link IAbstractFolder} associated with this object.
- */
- public IAbstractFolder getFolder() {
- return mFolder;
- }
-
- /**
- * Returns the {@link ResourceFolderType} of this object.
- */
- public ResourceFolderType getType() {
- return mType;
- }
-
- public ResourceRepository getRepository() {
- return mRepository;
- }
-
- /**
- * Returns the list of {@link ResourceType}s generated by the files inside this folder.
- */
- public Collection<ResourceType> getResourceTypes() {
- ArrayList<ResourceType> list = new ArrayList<ResourceType>();
-
- if (mFiles != null) {
- for (ResourceFile file : mFiles) {
- Collection<ResourceType> types = file.getResourceTypes();
-
- // loop through those and add them to the main list,
- // if they are not already present
- for (ResourceType resType : types) {
- if (list.indexOf(resType) == -1) {
- list.add(resType);
- }
- }
- }
- }
-
- return list;
- }
-
- @Override
- public FolderConfiguration getConfiguration() {
- return mConfiguration;
- }
-
- /**
- * Returns whether the folder contains a file with the given name.
- * @param name the name of the file.
- */
- public boolean hasFile(String name) {
- if (mNames != null && mNames.containsKey(name)) {
- return true;
- }
-
- // Note: mNames.containsKey(name) is faster, but doesn't give the same result; this
- // method seems to be called on this ResourceFolder before it has been processed,
- // so we need to use the file system check instead:
- return mFolder.hasFile(name);
- }
-
- /**
- * Returns the {@link ResourceFile} matching a {@link IAbstractFile} object.
- *
- * @param file The {@link IAbstractFile} object.
- * @param context a context object with state for the current update, such
- * as a place to stash errors encountered
- * @return the {@link ResourceFile} or null if no match was found.
- */
- private ResourceFile getFile(IAbstractFile file, ScanningContext context) {
- assert mFolder.equals(file.getParentFolder());
-
- if (mNames != null) {
- ResourceFile resFile = mNames.get(file.getName());
- if (resFile != null) {
- return resFile;
- }
- }
-
- // If the file actually exists, the resource folder may not have been
- // scanned yet; add it lazily
- if (file.exists()) {
- ResourceFile resFile = createResourceFile(file);
- resFile.load(context);
- addFile(resFile);
- return resFile;
- }
-
- return null;
- }
-
- /**
- * Returns the {@link ResourceFile} matching a given name.
- * @param filename The name of the file to return.
- * @return the {@link ResourceFile} or <code>null</code> if no match was found.
- */
- public ResourceFile getFile(String filename) {
- if (mNames != null) {
- ResourceFile resFile = mNames.get(filename);
- if (resFile != null) {
- return resFile;
- }
- }
-
- // If the file actually exists, the resource folder may not have been
- // scanned yet; add it lazily
- IAbstractFile file = mFolder.getFile(filename);
- if (file != null && file.exists()) {
- ResourceFile resFile = createResourceFile(file);
- resFile.load(new ScanningContext(mRepository));
- addFile(resFile);
- return resFile;
- }
-
- return null;
- }
-
- /**
- * Returns whether a file in the folder is generating a resource of a specified type.
- * @param type The {@link ResourceType} being looked up.
- */
- public boolean hasResources(ResourceType type) {
- // Check if the folder type is able to generate resource of the type that was asked.
- // this is a first check to avoid going through the files.
- List<ResourceFolderType> folderTypes = FolderTypeRelationship.getRelatedFolders(type);
-
- boolean valid = false;
- for (ResourceFolderType rft : folderTypes) {
- if (rft == mType) {
- valid = true;
- break;
- }
- }
-
- if (valid) {
- if (mFiles != null) {
- for (ResourceFile f : mFiles) {
- if (f.hasResources(type)) {
- return true;
- }
- }
- }
- }
- return false;
- }
-
- @Override
- public String toString() {
- return mFolder.toString();
- }
-}