1/*
2 * Copyright (C) 2013 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
17package com.android.documentsui;
18
19import android.content.Context;
20import android.content.pm.PackageManager;
21import android.content.pm.ProviderInfo;
22import android.content.res.Resources;
23import android.graphics.drawable.Drawable;
24import android.provider.DocumentsContract.Document;
25import android.util.TypedValue;
26
27import com.google.android.collect.Maps;
28
29import java.util.HashMap;
30
31public class IconUtils {
32
33    private static HashMap<String, Integer> sMimeIcons = Maps.newHashMap();
34
35    private static void add(String mimeType, int resId) {
36        if (sMimeIcons.put(mimeType, resId) != null) {
37            throw new RuntimeException(mimeType + " already registered!");
38        }
39    }
40
41    static {
42        int icon;
43
44        // Package
45        icon = R.drawable.ic_doc_apk;
46        add("application/vnd.android.package-archive", icon);
47
48        // Audio
49        icon = R.drawable.ic_doc_audio;
50        add("application/ogg", icon);
51        add("application/x-flac", icon);
52
53        // Certificate
54        icon = R.drawable.ic_doc_certificate;
55        add("application/pgp-keys", icon);
56        add("application/pgp-signature", icon);
57        add("application/x-pkcs12", icon);
58        add("application/x-pkcs7-certreqresp", icon);
59        add("application/x-pkcs7-crl", icon);
60        add("application/x-x509-ca-cert", icon);
61        add("application/x-x509-user-cert", icon);
62        add("application/x-pkcs7-certificates", icon);
63        add("application/x-pkcs7-mime", icon);
64        add("application/x-pkcs7-signature", icon);
65
66        // Source code
67        icon = R.drawable.ic_doc_codes;
68        add("application/rdf+xml", icon);
69        add("application/rss+xml", icon);
70        add("application/x-object", icon);
71        add("application/xhtml+xml", icon);
72        add("text/css", icon);
73        add("text/html", icon);
74        add("text/xml", icon);
75        add("text/x-c++hdr", icon);
76        add("text/x-c++src", icon);
77        add("text/x-chdr", icon);
78        add("text/x-csrc", icon);
79        add("text/x-dsrc", icon);
80        add("text/x-csh", icon);
81        add("text/x-haskell", icon);
82        add("text/x-java", icon);
83        add("text/x-literate-haskell", icon);
84        add("text/x-pascal", icon);
85        add("text/x-tcl", icon);
86        add("text/x-tex", icon);
87        add("application/x-latex", icon);
88        add("application/x-texinfo", icon);
89        add("application/atom+xml", icon);
90        add("application/ecmascript", icon);
91        add("application/json", icon);
92        add("application/javascript", icon);
93        add("application/xml", icon);
94        add("text/javascript", icon);
95        add("application/x-javascript", icon);
96
97        // Compressed
98        icon = R.drawable.ic_doc_compressed;
99        add("application/mac-binhex40", icon);
100        add("application/rar", icon);
101        add("application/zip", icon);
102        add("application/x-apple-diskimage", icon);
103        add("application/x-debian-package", icon);
104        add("application/x-gtar", icon);
105        add("application/x-iso9660-image", icon);
106        add("application/x-lha", icon);
107        add("application/x-lzh", icon);
108        add("application/x-lzx", icon);
109        add("application/x-stuffit", icon);
110        add("application/x-tar", icon);
111        add("application/x-webarchive", icon);
112        add("application/x-webarchive-xml", icon);
113        add("application/gzip", icon);
114        add("application/x-7z-compressed", icon);
115        add("application/x-deb", icon);
116        add("application/x-rar-compressed", icon);
117
118        // Contact
119        icon = R.drawable.ic_doc_contact;
120        add("text/x-vcard", icon);
121        add("text/vcard", icon);
122
123        // Event
124        icon = R.drawable.ic_doc_event;
125        add("text/calendar", icon);
126        add("text/x-vcalendar", icon);
127
128        // Font
129        icon = R.drawable.ic_doc_font;
130        add("application/x-font", icon);
131        add("application/font-woff", icon);
132        add("application/x-font-woff", icon);
133        add("application/x-font-ttf", icon);
134
135        // Image
136        icon = R.drawable.ic_doc_image;
137        add("application/vnd.oasis.opendocument.graphics", icon);
138        add("application/vnd.oasis.opendocument.graphics-template", icon);
139        add("application/vnd.oasis.opendocument.image", icon);
140        add("application/vnd.stardivision.draw", icon);
141        add("application/vnd.sun.xml.draw", icon);
142        add("application/vnd.sun.xml.draw.template", icon);
143
144        // PDF
145        icon = R.drawable.ic_doc_pdf;
146        add("application/pdf", icon);
147
148        // Presentation
149        icon = R.drawable.ic_doc_presentation;
150        add("application/vnd.stardivision.impress", icon);
151        add("application/vnd.sun.xml.impress", icon);
152        add("application/vnd.sun.xml.impress.template", icon);
153        add("application/x-kpresenter", icon);
154        add("application/vnd.oasis.opendocument.presentation", icon);
155
156        // Spreadsheet
157        icon = R.drawable.ic_doc_spreadsheet;
158        add("application/vnd.oasis.opendocument.spreadsheet", icon);
159        add("application/vnd.oasis.opendocument.spreadsheet-template", icon);
160        add("application/vnd.stardivision.calc", icon);
161        add("application/vnd.sun.xml.calc", icon);
162        add("application/vnd.sun.xml.calc.template", icon);
163        add("application/x-kspread", icon);
164
165        // Text
166        icon = R.drawable.ic_doc_text;
167        add("application/vnd.oasis.opendocument.text", icon);
168        add("application/vnd.oasis.opendocument.text-master", icon);
169        add("application/vnd.oasis.opendocument.text-template", icon);
170        add("application/vnd.oasis.opendocument.text-web", icon);
171        add("application/vnd.stardivision.writer", icon);
172        add("application/vnd.stardivision.writer-global", icon);
173        add("application/vnd.sun.xml.writer", icon);
174        add("application/vnd.sun.xml.writer.global", icon);
175        add("application/vnd.sun.xml.writer.template", icon);
176        add("application/x-abiword", icon);
177        add("application/x-kword", icon);
178
179        // Video
180        icon = R.drawable.ic_doc_video;
181        add("application/x-quicktimeplayer", icon);
182        add("application/x-shockwave-flash", icon);
183
184        // Word
185        icon = R.drawable.ic_doc_word;
186        add("application/msword", icon);
187        add("application/vnd.openxmlformats-officedocument.wordprocessingml.document", icon);
188        add("application/vnd.openxmlformats-officedocument.wordprocessingml.template", icon);
189
190        // Excel
191        icon = R.drawable.ic_doc_excel;
192        add("application/vnd.ms-excel", icon);
193        add("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", icon);
194        add("application/vnd.openxmlformats-officedocument.spreadsheetml.template", icon);
195
196        // Powerpoint
197        icon = R.drawable.ic_doc_powerpoint;
198        add("application/vnd.ms-powerpoint", icon);
199        add("application/vnd.openxmlformats-officedocument.presentationml.presentation", icon);
200        add("application/vnd.openxmlformats-officedocument.presentationml.template", icon);
201        add("application/vnd.openxmlformats-officedocument.presentationml.slideshow", icon);
202    }
203
204    public static Drawable loadPackageIcon(Context context, String authority, int icon) {
205        if (icon != 0) {
206            if (authority != null) {
207                final PackageManager pm = context.getPackageManager();
208                final ProviderInfo info = pm.resolveContentProvider(authority, 0);
209                if (info != null) {
210                    return pm.getDrawable(info.packageName, icon, info.applicationInfo);
211                }
212            } else {
213                return context.getDrawable(icon);
214            }
215        }
216        return null;
217    }
218
219    public static Drawable loadMimeIcon(
220            Context context, String mimeType, String authority, String docId, int mode) {
221        if (Document.MIME_TYPE_DIR.equals(mimeType)) {
222            // TODO: eventually move these hacky assets into that package
223            if ("com.android.providers.media.documents".equals(authority)
224                    && docId.startsWith("album")) {
225                return context.getDrawable(R.drawable.ic_doc_album);
226            }
227
228            if (mode == DocumentsActivity.State.MODE_GRID) {
229                return context.getDrawable(R.drawable.ic_grid_folder);
230            } else {
231                return context.getDrawable(R.drawable.ic_doc_folder);
232            }
233        }
234
235        return loadMimeIcon(context, mimeType);
236    }
237
238    public static Drawable loadMimeIcon(Context context, String mimeType) {
239        if (Document.MIME_TYPE_DIR.equals(mimeType)) {
240            return context.getDrawable(R.drawable.ic_doc_folder);
241        }
242
243        // Look for exact match first
244        Integer resId = sMimeIcons.get(mimeType);
245        if (resId != null) {
246            return context.getDrawable(resId);
247        }
248
249        if (mimeType == null) {
250            // TODO: generic icon?
251            return null;
252        }
253
254        // Otherwise look for partial match
255        final String typeOnly = mimeType.split("/")[0];
256        if ("audio".equals(typeOnly)) {
257            return context.getDrawable(R.drawable.ic_doc_audio);
258        } else if ("image".equals(typeOnly)) {
259            return context.getDrawable(R.drawable.ic_doc_image);
260        } else if ("text".equals(typeOnly)) {
261            return context.getDrawable(R.drawable.ic_doc_text);
262        } else if ("video".equals(typeOnly)) {
263            return context.getDrawable(R.drawable.ic_doc_video);
264        } else {
265            return context.getDrawable(R.drawable.ic_doc_generic);
266        }
267    }
268
269    public static Drawable applyTintColor(Context context, int drawableId, int tintColorId) {
270        final Drawable icon = context.getDrawable(drawableId);
271        icon.mutate();
272        icon.setTintList(context.getResources().getColorStateList(tintColorId));
273        return icon;
274    }
275
276    public static Drawable applyTintAttr(Context context, int drawableId, int tintAttrId) {
277        final TypedValue outValue = new TypedValue();
278        context.getTheme().resolveAttribute(tintAttrId, outValue, true);
279        return applyTintColor(context, drawableId, outValue.resourceId);
280    }
281}
282