diff options
Diffstat (limited to 'sdk_common/src/com/android/ide/common/resources/FrameworkResources.java')
-rwxr-xr-x | sdk_common/src/com/android/ide/common/resources/FrameworkResources.java | 237 |
1 files changed, 0 insertions, 237 deletions
diff --git a/sdk_common/src/com/android/ide/common/resources/FrameworkResources.java b/sdk_common/src/com/android/ide/common/resources/FrameworkResources.java deleted file mode 100755 index fbf5926..0000000 --- a/sdk_common/src/com/android/ide/common/resources/FrameworkResources.java +++ /dev/null @@ -1,237 +0,0 @@ -/* - * Copyright (C) 2011 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.SdkConstants; -import com.android.annotations.NonNull; -import com.android.annotations.Nullable; -import com.android.io.IAbstractFile; -import com.android.io.IAbstractFolder; -import com.android.resources.ResourceType; -import com.android.utils.ILogger; - -import org.kxml2.io.KXmlParser; -import org.xmlpull.v1.XmlPullParser; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.Reader; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.EnumMap; -import java.util.List; -import java.util.Map; - -/** - * Framework resources repository. - * - * This behaves the same as {@link ResourceRepository} except that it differentiates between - * resources that are public and non public. - * {@link #getResources(ResourceType)} and {@link #hasResourcesOfType(ResourceType)} only return - * public resources. This is typically used to display resource lists in the UI. - * - * {@link #getConfiguredResources(com.android.ide.eclipse.adt.internal.resources.configurations.FolderConfiguration)} - * returns all resources, even the non public ones so that this can be used for rendering. - */ -public class FrameworkResources extends ResourceRepository { - - /** - * Map of {@link ResourceType} to list of items. It is guaranteed to contain a list for all - * possible values of ResourceType. - */ - protected final Map<ResourceType, List<ResourceItem>> mPublicResourceMap = - new EnumMap<ResourceType, List<ResourceItem>>(ResourceType.class); - - public FrameworkResources() { - super(true /*isFrameworkRepository*/); - } - - /** - * Returns a {@link Collection} (always non null, but can be empty) of <b>public</b> - * {@link ResourceItem} matching a given {@link ResourceType}. - * - * @param type the type of the resources to return - * @return a collection of items, possible empty. - */ - @Override - @NonNull - public List<ResourceItem> getResourceItemsOfType(@NonNull ResourceType type) { - return mPublicResourceMap.get(type); - } - - /** - * Returns whether the repository has <b>public</b> resources of a given {@link ResourceType}. - * @param type the type of resource to check. - * @return true if the repository contains resources of the given type, false otherwise. - */ - @Override - public boolean hasResourcesOfType(@NonNull ResourceType type) { - return mPublicResourceMap.get(type).size() > 0; - } - - @Override - @NonNull - protected ResourceItem createResourceItem(@NonNull String name) { - return new FrameworkResourceItem(name); - } - - /** - * Reads the public.xml file in data/res/values/ for a given resource folder and builds up - * a map of public resources. - * - * This map is a subset of the full resource map that only contains framework resources - * that are public. - * - * @param resFolder The root folder of the resources - * @param logger a logger to report issues to - */ - public void loadPublicResources(@NonNull IAbstractFolder resFolder, @Nullable ILogger logger) { - IAbstractFolder valueFolder = resFolder.getFolder(SdkConstants.FD_RES_VALUES); - if (valueFolder.exists() == false) { - return; - } - - IAbstractFile publicXmlFile = valueFolder.getFile("public.xml"); //$NON-NLS-1$ - if (publicXmlFile.exists()) { - Reader reader = null; - try { - reader = new BufferedReader(new InputStreamReader(publicXmlFile.getContents(), - "UTF-8")); //$NON-NLS-1$ - KXmlParser parser = new KXmlParser(); - parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); - parser.setInput(reader); - - ResourceType lastType = null; - String lastTypeName = ""; - while (true) { - int event = parser.next(); - if (event == XmlPullParser.START_TAG) { - // As of API 15 there are a number of "java-symbol" entries here - if (!parser.getName().equals("public")) { //$NON-NLS-1$ - continue; - } - - String name = null; - String typeName = null; - for (int i = 0, n = parser.getAttributeCount(); i < n; i++) { - String attribute = parser.getAttributeName(i); - - if (attribute.equals("name")) { //$NON-NLS-1$ - name = parser.getAttributeValue(i); - if (typeName != null) { - // Skip id attribute processing - break; - } - } else if (attribute.equals("type")) { //$NON-NLS-1$ - typeName = parser.getAttributeValue(i); - } - } - - if (name != null && typeName != null) { - ResourceType type = null; - if (typeName.equals(lastTypeName)) { - type = lastType; - } else { - type = ResourceType.getEnum(typeName); - lastType = type; - lastTypeName = typeName; - } - if (type != null) { - ResourceItem match = null; - Map<String, ResourceItem> map = mResourceMap.get(type); - if (map != null) { - match = map.get(name); - } - - if (match != null) { - List<ResourceItem> publicList = mPublicResourceMap.get(type); - if (publicList == null) { - // Pick initial size for the list to hold the public - // resources. We could just use map.size() here, - // but they're usually much bigger; for example, - // in one platform version, there are 1500 drawables - // and 1200 strings but only 175 and 25 public ones - // respectively. - int size; - switch (type) { - case STYLE: size = 500; break; - case ATTR: size = 1000; break; - case DRAWABLE: size = 200; break; - case ID: size = 50; break; - case LAYOUT: - case COLOR: - case STRING: - case ANIM: - case INTERPOLATOR: - size = 30; - break; - default: - size = 10; - break; - } - publicList = new ArrayList<ResourceItem>(size); - mPublicResourceMap.put(type, publicList); - } - - publicList.add(match); - } else { - // log that there's a public resource that doesn't actually - // exist? - } - } else { - // log that there was a reference to a typo that doesn't actually - // exist? - } - } - } else if (event == XmlPullParser.END_DOCUMENT) { - break; - } - } - } catch (Exception e) { - if (logger != null) { - logger.error(e, "Can't read and parse public attribute list"); - } - } finally { - if (reader != null) { - try { - reader.close(); - } catch (IOException e) { - // Nothing to be done here - we don't care if it closed or not. - } - } - } - } - - // put unmodifiable list for all res type in the public resource map - // this will simplify access - for (ResourceType type : ResourceType.values()) { - List<ResourceItem> list = mPublicResourceMap.get(type); - if (list == null) { - list = Collections.emptyList(); - } else { - list = Collections.unmodifiableList(list); - } - - // put the new list in the map - mPublicResourceMap.put(type, list); - } - } -} - |