• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2007 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.resources;
18 
19 
20 import java.util.ArrayList;
21 import java.util.Collections;
22 import java.util.HashMap;
23 import java.util.List;
24 import java.util.Map;
25 
26 /**
27  * This class gives access to the bidirectional relationship between {@link ResourceType} and
28  * {@link ResourceFolderType}.
29  */
30 public final class FolderTypeRelationship {
31 
32     private final static Map<ResourceType, List<ResourceFolderType>> mTypeToFolderMap =
33         new HashMap<ResourceType, List<ResourceFolderType>>();
34 
35     private final static Map<ResourceFolderType, List<ResourceType>> mFolderToTypeMap =
36         new HashMap<ResourceFolderType, List<ResourceType>>();
37 
38     static {
39         // generate the relationships in a temporary map
add(ResourceType.ANIM, ResourceFolderType.ANIM)40         add(ResourceType.ANIM, ResourceFolderType.ANIM);
add(ResourceType.ANIMATOR, ResourceFolderType.ANIMATOR)41         add(ResourceType.ANIMATOR, ResourceFolderType.ANIMATOR);
add(ResourceType.ARRAY, ResourceFolderType.VALUES)42         add(ResourceType.ARRAY, ResourceFolderType.VALUES);
add(ResourceType.ATTR, ResourceFolderType.VALUES)43         add(ResourceType.ATTR, ResourceFolderType.VALUES);
add(ResourceType.BOOL, ResourceFolderType.VALUES)44         add(ResourceType.BOOL, ResourceFolderType.VALUES);
add(ResourceType.COLOR, ResourceFolderType.VALUES)45         add(ResourceType.COLOR, ResourceFolderType.VALUES);
add(ResourceType.COLOR, ResourceFolderType.COLOR)46         add(ResourceType.COLOR, ResourceFolderType.COLOR);
add(ResourceType.DECLARE_STYLEABLE, ResourceFolderType.VALUES)47         add(ResourceType.DECLARE_STYLEABLE, ResourceFolderType.VALUES);
add(ResourceType.DIMEN, ResourceFolderType.VALUES)48         add(ResourceType.DIMEN, ResourceFolderType.VALUES);
add(ResourceType.DRAWABLE, ResourceFolderType.VALUES)49         add(ResourceType.DRAWABLE, ResourceFolderType.VALUES);
add(ResourceType.DRAWABLE, ResourceFolderType.DRAWABLE)50         add(ResourceType.DRAWABLE, ResourceFolderType.DRAWABLE);
add(ResourceType.FRACTION, ResourceFolderType.VALUES)51         add(ResourceType.FRACTION, ResourceFolderType.VALUES);
add(ResourceType.ID, ResourceFolderType.VALUES)52         add(ResourceType.ID, ResourceFolderType.VALUES);
add(ResourceType.INTEGER, ResourceFolderType.VALUES)53         add(ResourceType.INTEGER, ResourceFolderType.VALUES);
add(ResourceType.INTERPOLATOR, ResourceFolderType.INTERPOLATOR)54         add(ResourceType.INTERPOLATOR, ResourceFolderType.INTERPOLATOR);
add(ResourceType.LAYOUT, ResourceFolderType.LAYOUT)55         add(ResourceType.LAYOUT, ResourceFolderType.LAYOUT);
add(ResourceType.ID, ResourceFolderType.LAYOUT)56         add(ResourceType.ID, ResourceFolderType.LAYOUT);
add(ResourceType.MENU, ResourceFolderType.MENU)57         add(ResourceType.MENU, ResourceFolderType.MENU);
add(ResourceType.ID, ResourceFolderType.MENU)58         add(ResourceType.ID, ResourceFolderType.MENU);
add(ResourceType.MIPMAP, ResourceFolderType.MIPMAP)59         add(ResourceType.MIPMAP, ResourceFolderType.MIPMAP);
add(ResourceType.PLURALS, ResourceFolderType.VALUES)60         add(ResourceType.PLURALS, ResourceFolderType.VALUES);
add(ResourceType.PUBLIC, ResourceFolderType.VALUES)61         add(ResourceType.PUBLIC, ResourceFolderType.VALUES);
add(ResourceType.RAW, ResourceFolderType.RAW)62         add(ResourceType.RAW, ResourceFolderType.RAW);
add(ResourceType.STRING, ResourceFolderType.VALUES)63         add(ResourceType.STRING, ResourceFolderType.VALUES);
add(ResourceType.STYLE, ResourceFolderType.VALUES)64         add(ResourceType.STYLE, ResourceFolderType.VALUES);
add(ResourceType.STYLEABLE, ResourceFolderType.VALUES)65         add(ResourceType.STYLEABLE, ResourceFolderType.VALUES);
add(ResourceType.XML, ResourceFolderType.XML)66         add(ResourceType.XML, ResourceFolderType.XML);
67 
makeSafe()68         makeSafe();
69     }
70 
71     /**
72      * Returns a list of {@link ResourceType}s that can be generated from files inside a folder
73      * of the specified type.
74      * @param folderType The folder type.
75      * @return a list of {@link ResourceType}, possibly empty but never null.
76      */
getRelatedResourceTypes(ResourceFolderType folderType)77     public static List<ResourceType> getRelatedResourceTypes(ResourceFolderType folderType) {
78         List<ResourceType> list = mFolderToTypeMap.get(folderType);
79         if (list != null) {
80             return list;
81         }
82 
83         return Collections.emptyList();
84     }
85 
86     /**
87      * Returns a list of {@link ResourceFolderType} that can contain files generating resources
88      * of the specified type.
89      * @param resType the type of resource.
90      * @return a list of {@link ResourceFolderType}, possibly empty but never null.
91      */
getRelatedFolders(ResourceType resType)92     public static List<ResourceFolderType> getRelatedFolders(ResourceType resType) {
93         List<ResourceFolderType> list = mTypeToFolderMap.get(resType);
94         if (list != null) {
95             return list;
96         }
97 
98         return Collections.emptyList();
99     }
100 
101     /**
102      * Returns true if the {@link ResourceType} and the {@link ResourceFolderType} values match.
103      * @param resType the resource type.
104      * @param folderType the folder type.
105      * @return true if files inside the folder of the specified {@link ResourceFolderType}
106      * could generate a resource of the specified {@link ResourceType}
107      */
match(ResourceType resType, ResourceFolderType folderType)108     public static boolean match(ResourceType resType, ResourceFolderType folderType) {
109         List<ResourceFolderType> list = mTypeToFolderMap.get(resType);
110 
111         if (list != null) {
112             return list.contains(folderType);
113         }
114 
115         return false;
116     }
117 
118     /**
119      * Adds a {@link ResourceType} - {@link ResourceFolderType} relationship. this indicates that
120      * a file in the folder can generate a resource of the specified type.
121      * @param type The resourceType
122      * @param folder The {@link ResourceFolderType}
123      */
add(ResourceType type, ResourceFolderType folder)124     private static void add(ResourceType type, ResourceFolderType folder) {
125         // first we add the folder to the list associated with the type.
126         List<ResourceFolderType> folderList = mTypeToFolderMap.get(type);
127         if (folderList == null) {
128             folderList = new ArrayList<ResourceFolderType>();
129             mTypeToFolderMap.put(type, folderList);
130         }
131         if (folderList.indexOf(folder) == -1) {
132             folderList.add(folder);
133         }
134 
135         // now we add the type to the list associated with the folder.
136         List<ResourceType> typeList = mFolderToTypeMap.get(folder);
137         if (typeList == null) {
138             typeList = new ArrayList<ResourceType>();
139             mFolderToTypeMap.put(folder, typeList);
140         }
141         if (typeList.indexOf(type) == -1) {
142             typeList.add(type);
143         }
144     }
145 
146     /**
147      * Makes the maps safe by replacing the current list values with unmodifiable lists.
148      */
makeSafe()149     private static void makeSafe() {
150         for (ResourceType type : ResourceType.values()) {
151             List<ResourceFolderType> list = mTypeToFolderMap.get(type);
152             if (list != null) {
153                 // replace with a unmodifiable list wrapper around the current list.
154                 mTypeToFolderMap.put(type, Collections.unmodifiableList(list));
155             }
156         }
157 
158         for (ResourceFolderType folder : ResourceFolderType.values()) {
159             List<ResourceType> list = mFolderToTypeMap.get(folder);
160             if (list != null) {
161                 // replace with a unmodifiable list wrapper around the current list.
162                 mFolderToTypeMap.put(folder, Collections.unmodifiableList(list));
163             }
164         }
165     }
166 }
167