Home | History | Annotate | Download | only in documentsui
      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 
     17 package com.android.documentsui;
     18 
     19 import android.content.Context;
     20 import android.content.pm.PackageManager;
     21 import android.content.pm.ProviderInfo;
     22 import android.content.res.Resources;
     23 import android.graphics.drawable.Drawable;
     24 import android.provider.DocumentsContract.Document;
     25 import android.util.TypedValue;
     26 
     27 import com.google.android.collect.Maps;
     28 
     29 import java.util.HashMap;
     30 
     31 public 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