bd8c5d91f00dadd83be448018382038e645349f8
[pub/Android/ownCloud.git] / src / com / owncloud / android / utils / MimetypeIconUtil.java
1 package com.owncloud.android.utils;
2
3 import android.webkit.MimeTypeMap;
4
5 import com.owncloud.android.R;
6
7 import java.util.ArrayList;
8 import java.util.Arrays;
9 import java.util.Collections;
10 import java.util.HashMap;
11 import java.util.List;
12 import java.util.Map;
13
14 /**
15 * <p>Helper class for detecting the right icon for a file or folder,
16 * based on its mime type and file extension.</p>
17 *
18 * This class maintains all the necessary mappings fot these detections.<br/>
19 * In order to add further mappings, there are up to three look up maps that need further values:
20 * <ol>
21 * <li>
22 * {@link MimetypeIconUtil#FILE_EXTENSION_TO_MIMETYPE_MAPPING}<br/>
23 * to add a new file extension to mime type mapping
24 * </li>
25 * <li>
26 * {@link MimetypeIconUtil#MIMETYPE_TO_ICON_MAPPING}<br/>
27 * to add a new mapping of a mime type to an icon mapping
28 * </li>
29 * <li>
30 * {@link MimetypeIconUtil#MAINMIMETYPE_TO_ICON_MAPPING}<br/>
31 * to add a new mapping for the main part of a mime type.
32 * This is a list of fallback mappings in case there is no mapping for the complete mime type
33 * </li>
34 * </ol>
35 */
36 public class MimetypeIconUtil {
37 /** Mapping: icon for mime type */
38 private static final Map<String, Integer> MIMETYPE_TO_ICON_MAPPING = new HashMap<String, Integer>();
39 /** Mapping: icon for main mime type (first part of a mime type declaration). */
40 private static final Map<String, Integer> MAINMIMETYPE_TO_ICON_MAPPING = new HashMap<String, Integer>();
41 /** Mapping: mime type for file extension. */
42 private static final Map<String, List<String>> FILE_EXTENSION_TO_MIMETYPE_MAPPING =
43 new HashMap<String, List<String>>();
44
45 static {
46 populateFileExtensionMimeTypeMapping();
47 populateMimeTypeIconMapping();
48 populateMainMimeTypeMapping();
49 }
50
51 /**
52 * Returns the resource identifier of an image to use as icon associated to a known MIME type.
53 *
54 * @param mimetype MIME type string; if NULL, the method tries to guess it from the extension in filename
55 * @param filename Name, with extension.
56 * @return Identifier of an image resource.
57 */
58 public static int getFileTypeIconId(String mimetype, String filename) {
59 List<String> possibleMimeTypes;
60 if (mimetype == null) {
61 possibleMimeTypes = determineMimeTypesByFilename(filename);
62 } else {
63 possibleMimeTypes = Collections.singletonList(mimetype);
64 }
65
66 return determineIconIdByMimeTypeList(possibleMimeTypes);
67 }
68
69 /**
70 * Returns the resource identifier of an image to use as icon associated to a type of folder.
71 *
72 * @param isSharedWithUser flag if the folder is shared with the user
73 * @param isShareByLink flag if the folder is shared by link
74 * @return Identifier of an image resource.
75 */
76 public static int getFolderTypeIconId(boolean isSharedWithUser, boolean isShareByLink) {
77 if (isSharedWithUser) {
78 return R.drawable.shared_with_me_folder;
79 } else if (isShareByLink) {
80 return R.drawable.folder_public;
81 }
82
83 return R.drawable.ic_menu_archive;
84 }
85
86 /**
87 * determines the icon based on the mime type.
88 *
89 * @param mimetypes the mimetypes
90 * @return the icon id, R.drawable.file if the mime type could not be matched at all or was {@code null}
91 */
92 private static int determineIconIdByMimeTypeList(List<String> mimetypes) {
93 // no mime type leads to file
94 if (mimetypes == null || mimetypes.size() < 1) {
95 return R.drawable.file;
96 } else {
97
98 // search for full mime type mapping
99 for (String mimetype : mimetypes) {
100 Integer iconId = MIMETYPE_TO_ICON_MAPPING.get(mimetype);
101
102 if (iconId != null) {
103 return iconId;
104 }
105 }
106
107 // fallback to main mime type part mapping
108 for (String mimetype : mimetypes) {
109 String mainMimetypePart = mimetype.split("/")[0];
110
111 Integer iconId = MAINMIMETYPE_TO_ICON_MAPPING.get(mainMimetypePart);
112 if (iconId != null) {
113 return iconId;
114 }
115 }
116 }
117
118 // no match found at all, falling back to file
119 return R.drawable.file;
120 }
121
122 /**
123 * determines the list of possible mime types for the given file, based on its extension.
124 *
125 * @param filename the file name
126 * @return list of possible mime types (ordered), empty list in case no mime types found
127 */
128 private static List<String> determineMimeTypesByFilename(String filename) {
129 String fileExtension = getExtension(filename);
130
131 // try detecting the mimetype based on the web app logic equivalent
132 List<String> mimeTypeList = FILE_EXTENSION_TO_MIMETYPE_MAPPING.get(fileExtension);
133 if (mimeTypeList != null && mimeTypeList.size() > 0) {
134 return mimeTypeList;
135 } else {
136 // try detecting the mime type via android itself
137 String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(fileExtension);
138 if (mimeType != null) {
139 return Collections.singletonList(mimeType);
140 } else {
141 return new ArrayList<String>();
142 }
143 }
144 }
145
146 /**
147 * provides the file extension of a given filename.
148 *
149 * @param filename the filename
150 * @return the file extension
151 */
152 private static String getExtension(String filename) {
153 String extension = filename.substring(filename.lastIndexOf(".") + 1).toLowerCase();
154 return extension;
155 }
156
157 /**
158 * populates the mapping list: full mime type --> icon.
159 */
160 private static void populateMimeTypeIconMapping() {
161 MIMETYPE_TO_ICON_MAPPING.put("application/coreldraw", R.drawable.file_image);
162 MIMETYPE_TO_ICON_MAPPING.put("application/epub+zip", R.drawable.file_text);
163 MIMETYPE_TO_ICON_MAPPING.put("application/font-sfnt", R.drawable.file_image);
164 MIMETYPE_TO_ICON_MAPPING.put("application/font-woff", R.drawable.file_image);
165 MIMETYPE_TO_ICON_MAPPING.put("application/illustrator", R.drawable.file_image);
166 MIMETYPE_TO_ICON_MAPPING.put("application/javascript", R.drawable.file_code);
167 MIMETYPE_TO_ICON_MAPPING.put("application/json", R.drawable.file_code);
168 MIMETYPE_TO_ICON_MAPPING.put("application/msaccess", R.drawable.file);
169 MIMETYPE_TO_ICON_MAPPING.put("application/msexcel", R.drawable.file_xls);
170 MIMETYPE_TO_ICON_MAPPING.put("application/mspowerpoint", R.drawable.file_ppt);
171 MIMETYPE_TO_ICON_MAPPING.put("application/msword", R.drawable.file_doc);
172 MIMETYPE_TO_ICON_MAPPING.put("application/octet-stream", R.drawable.file);
173 MIMETYPE_TO_ICON_MAPPING.put("application/postscript", R.drawable.file_image);
174 MIMETYPE_TO_ICON_MAPPING.put("application/pdf", R.drawable.file_pdf);
175 MIMETYPE_TO_ICON_MAPPING.put("application/rss+xml", R.drawable.file_code);
176 MIMETYPE_TO_ICON_MAPPING.put("application/rtf", R.drawable.file);
177 MIMETYPE_TO_ICON_MAPPING.put("application/vnd.android.package-archive", R.drawable.file_zip);
178 MIMETYPE_TO_ICON_MAPPING.put("application/vnd.ms-excel", R.drawable.file_xls);
179 MIMETYPE_TO_ICON_MAPPING.put("application/vnd.ms-excel.addin.macroEnabled.12", R.drawable.file_xls);
180 MIMETYPE_TO_ICON_MAPPING.put("application/vnd.ms-excel.sheet.binary.macroEnabled.12", R.drawable.file_xls);
181 MIMETYPE_TO_ICON_MAPPING.put("application/vnd.ms-excel.sheet.macroEnabled.12", R.drawable.file_xls);
182 MIMETYPE_TO_ICON_MAPPING.put("application/vnd.ms-excel.template.macroEnabled.12", R.drawable.file_xls);
183 MIMETYPE_TO_ICON_MAPPING.put("application/vnd.ms-fontobject", R.drawable.file_image);
184 MIMETYPE_TO_ICON_MAPPING.put("application/vnd.ms-powerpoint", R.drawable.file_ppt);
185 MIMETYPE_TO_ICON_MAPPING.put("application/vnd.ms-powerpoint.addin.macroEnabled.12", R.drawable.file_ppt);
186 MIMETYPE_TO_ICON_MAPPING.put("application/vnd.ms-powerpoint.presentation.macroEnabled.12", R.drawable.file_ppt);
187 MIMETYPE_TO_ICON_MAPPING.put("application/vnd.ms-powerpoint.slideshow.macroEnabled.12", R.drawable.file_ppt);
188 MIMETYPE_TO_ICON_MAPPING.put("application/vnd.ms-powerpoint.template.macroEnabled.12", R.drawable.file_ppt);
189 MIMETYPE_TO_ICON_MAPPING.put("application/vnd.ms-word.document.macroEnabled.12", R.drawable.file_doc);
190 MIMETYPE_TO_ICON_MAPPING.put("application/vnd.ms-word.template.macroEnabled.12", R.drawable.file_doc);
191 MIMETYPE_TO_ICON_MAPPING.put("application/vnd.oasis.opendocument.presentation", R.drawable.file_ppt);
192 MIMETYPE_TO_ICON_MAPPING.put("application/vnd.oasis.opendocument.presentation-template", R.drawable.file_ppt);
193 MIMETYPE_TO_ICON_MAPPING.put("application/vnd.oasis.opendocument.spreadsheet", R.drawable.file_xls);
194 MIMETYPE_TO_ICON_MAPPING.put("application/vnd.oasis.opendocument.spreadsheet-template", R.drawable.file_xls);
195 MIMETYPE_TO_ICON_MAPPING.put("application/vnd.oasis.opendocument.text", R.drawable.file_doc);
196 MIMETYPE_TO_ICON_MAPPING.put("application/vnd.oasis.opendocument.text-master", R.drawable.file_doc);
197 MIMETYPE_TO_ICON_MAPPING.put("application/vnd.oasis.opendocument.text-template", R.drawable.file_doc);
198 MIMETYPE_TO_ICON_MAPPING.put("application/vnd.oasis.opendocument.text-web", R.drawable.file_doc);
199 MIMETYPE_TO_ICON_MAPPING.put("application/vnd.openxmlformats-officedocument.presentationml.presentation", R.drawable.file_ppt);
200 MIMETYPE_TO_ICON_MAPPING.put("application/vnd.openxmlformats-officedocument.presentationml.slideshow", R.drawable.file_ppt);
201 MIMETYPE_TO_ICON_MAPPING.put("application/vnd.openxmlformats-officedocument.presentationml.template", R.drawable.file_ppt);
202 MIMETYPE_TO_ICON_MAPPING.put("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", R.drawable.file_xls);
203 MIMETYPE_TO_ICON_MAPPING.put("application/vnd.openxmlformats-officedocument.spreadsheetml.template", R.drawable.file_xls);
204 MIMETYPE_TO_ICON_MAPPING.put("application/vnd.openxmlformats-officedocument.wordprocessingml.document", R.drawable.file_doc);
205 MIMETYPE_TO_ICON_MAPPING.put("application/vnd.openxmlformats-officedocument.wordprocessingml.template", R.drawable.file_doc);
206 MIMETYPE_TO_ICON_MAPPING.put("application/x-7z-compressed", R.drawable.file_zip);
207 MIMETYPE_TO_ICON_MAPPING.put("application/x-bin", R.drawable.file_application);
208 MIMETYPE_TO_ICON_MAPPING.put("application/x-cbr", R.drawable.file_text);
209 MIMETYPE_TO_ICON_MAPPING.put("application/x-compressed", R.drawable.file_zip);
210 MIMETYPE_TO_ICON_MAPPING.put("application/x-dcraw", R.drawable.file_image);
211 MIMETYPE_TO_ICON_MAPPING.put("application/x-deb", R.drawable.file_zip);
212 MIMETYPE_TO_ICON_MAPPING.put("application/x-font", R.drawable.file_image);
213 MIMETYPE_TO_ICON_MAPPING.put("application/x-gimp", R.drawable.file_image);
214 MIMETYPE_TO_ICON_MAPPING.put("application/x-gzip", R.drawable.file_zip);
215 MIMETYPE_TO_ICON_MAPPING.put("application/x-ms-dos-executable", R.drawable.file_application);
216 MIMETYPE_TO_ICON_MAPPING.put("application/x-msi", R.drawable.file_application);
217 MIMETYPE_TO_ICON_MAPPING.put("application/x-iwork-numbers-sffnumbers", R.drawable.file_xls);
218 MIMETYPE_TO_ICON_MAPPING.put("application/x-iwork-keynote-sffkey", R.drawable.file_ppt);
219 MIMETYPE_TO_ICON_MAPPING.put("application/x-iwork-pages-sffpages", R.drawable.file_doc);
220 MIMETYPE_TO_ICON_MAPPING.put("application/x-perl", R.drawable.file_code);
221 MIMETYPE_TO_ICON_MAPPING.put("application/x-photoshop", R.drawable.file_image);
222 MIMETYPE_TO_ICON_MAPPING.put("application/x-php", R.drawable.file_code);
223 MIMETYPE_TO_ICON_MAPPING.put("application/x-rar-compressed", R.drawable.file_zip);
224 MIMETYPE_TO_ICON_MAPPING.put("application/x-shockwave-flash", R.drawable.file_application);
225 MIMETYPE_TO_ICON_MAPPING.put("application/x-tar", R.drawable.file_zip);
226 MIMETYPE_TO_ICON_MAPPING.put("application/x-tex", R.drawable.file_text);
227 MIMETYPE_TO_ICON_MAPPING.put("application/xml", R.drawable.file_text);
228 MIMETYPE_TO_ICON_MAPPING.put("application/yaml", R.drawable.file_code);
229 MIMETYPE_TO_ICON_MAPPING.put("application/zip", R.drawable.file_zip);
230 MIMETYPE_TO_ICON_MAPPING.put("database", R.drawable.file);
231 MIMETYPE_TO_ICON_MAPPING.put("httpd/unix-directory", R.drawable.ic_menu_archive);
232 MIMETYPE_TO_ICON_MAPPING.put("image/svg+xml", R.drawable.file_image);
233 MIMETYPE_TO_ICON_MAPPING.put("image/vector", R.drawable.file_image);
234 MIMETYPE_TO_ICON_MAPPING.put("text/calendar", R.drawable.file_calendar);
235 MIMETYPE_TO_ICON_MAPPING.put("text/css", R.drawable.file_code);
236 MIMETYPE_TO_ICON_MAPPING.put("text/csv", R.drawable.file_xls);
237 MIMETYPE_TO_ICON_MAPPING.put("text/html", R.drawable.file_code);
238 MIMETYPE_TO_ICON_MAPPING.put("text/vcard", R.drawable.file_vcard);
239 MIMETYPE_TO_ICON_MAPPING.put("text/x-c", R.drawable.file_code);
240 MIMETYPE_TO_ICON_MAPPING.put("text/x-c++src", R.drawable.file_code);
241 MIMETYPE_TO_ICON_MAPPING.put("text/x-h", R.drawable.file_code);
242 MIMETYPE_TO_ICON_MAPPING.put("text/x-python", R.drawable.file_code);
243 MIMETYPE_TO_ICON_MAPPING.put("text/x-shellscript", R.drawable.file_code);
244 MIMETYPE_TO_ICON_MAPPING.put("web", R.drawable.file_code);
245 MIMETYPE_TO_ICON_MAPPING.put("DIR", R.drawable.ic_menu_archive);
246 }
247
248 /**
249 * populates the mapping list: main mime type --> icon.
250 */
251 private static void populateMainMimeTypeMapping() {
252 MAINMIMETYPE_TO_ICON_MAPPING.put("audio", R.drawable.file_sound);
253 MAINMIMETYPE_TO_ICON_MAPPING.put("database", R.drawable.file);
254 MAINMIMETYPE_TO_ICON_MAPPING.put("httpd", R.drawable.file_zip);
255 MAINMIMETYPE_TO_ICON_MAPPING.put("image", R.drawable.file_image);
256 MAINMIMETYPE_TO_ICON_MAPPING.put("text", R.drawable.file_text);
257 MAINMIMETYPE_TO_ICON_MAPPING.put("video", R.drawable.file_movie);
258 MAINMIMETYPE_TO_ICON_MAPPING.put("web", R.drawable.file_code);
259 }
260
261 /**
262 * populates the mapping list: file extension --> mime type.
263 */
264 private static void populateFileExtensionMimeTypeMapping() {
265 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("3gp", Collections.singletonList("video/3gpp"));
266 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("7z", Collections.singletonList("application/x-7z-compressed"));
267 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("accdb", Collections.singletonList("application/msaccess"));
268 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("ai", Collections.singletonList("application/illustrator"));
269 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("apk", Collections.singletonList("application/vnd.android.package-archive"));
270 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("arw", Collections.singletonList("image/x-dcraw"));
271 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("avi", Collections.singletonList("video/x-msvideo"));
272 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("bash", Collections.singletonList("text/x-shellscript"));
273 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("blend", Collections.singletonList("application/x-blender"));
274 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("bin", Collections.singletonList("application/x-bin"));
275 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("bmp", Collections.singletonList("image/bmp"));
276 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("bpg", Collections.singletonList("image/bpg"));
277 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("cb7", Collections.singletonList("application/x-cbr"));
278 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("cba", Collections.singletonList("application/x-cbr"));
279 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("cbr", Collections.singletonList("application/x-cbr"));
280 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("cbt", Collections.singletonList("application/x-cbr"));
281 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("cbtc", Collections.singletonList("application/x-cbr"));
282 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("cbz", Collections.singletonList("application/x-cbr"));
283 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("cc", Collections.singletonList("text/x-c"));
284 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("cdr", Collections.singletonList("application/coreldraw"));
285 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("cnf", Collections.singletonList("text/plain"));
286 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("conf", Collections.singletonList("text/plain"));
287 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("cpp", Collections.singletonList("text/x-c++src"));
288 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("cr2", Collections.singletonList("image/x-dcraw"));
289 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("css", Collections.singletonList("text/css"));
290 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("csv", Collections.singletonList("text/csv"));
291 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("cvbdl", Collections.singletonList("application/x-cbr"));
292 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("c", Collections.singletonList("text/x-c"));
293 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("c++", Collections.singletonList("text/x-c++src"));
294 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("dcr", Collections.singletonList("image/x-dcraw"));
295 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("deb", Collections.singletonList("application/x-deb"));
296 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("dng", Collections.singletonList("image/x-dcraw"));
297 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("doc", Collections.singletonList("application/msword"));
298 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("docm", Collections.singletonList("application/vnd.ms-word.document.macroEnabled.12"));
299 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("docx", Collections.singletonList("application/vnd.openxmlformats-officedocument.wordprocessingml.document"));
300 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("dot", Collections.singletonList("application/msword"));
301 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("dotx", Collections.singletonList("application/vnd.openxmlformats-officedocument.wordprocessingml.template"));
302 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("dv", Collections.singletonList("video/dv"));
303 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("eot", Collections.singletonList("application/vnd.ms-fontobject"));
304 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("epub", Collections.singletonList("application/epub+zip"));
305 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("eps", Collections.singletonList("application/postscript"));
306 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("erf", Collections.singletonList("image/x-dcraw"));
307 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("exe", Collections.singletonList("application/x-ms-dos-executable"));
308 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("flac", Collections.singletonList("audio/flac"));
309 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("flv", Collections.singletonList("video/x-flv"));
310 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("gif", Collections.singletonList("image/gif"));
311 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("gz", Collections.singletonList("application/x-gzip"));
312 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("gzip", Collections.singletonList("application/x-gzip"));
313 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("h", Collections.singletonList("text/x-h"));
314 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("hh", Collections.singletonList("text/x-h"));
315 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("html", Arrays.asList("text/html", "text/plain"));
316 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("htm", Arrays.asList("text/html", "text/plain"));
317 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("ical", Collections.singletonList("text/calendar"));
318 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("ics", Collections.singletonList("text/calendar"));
319 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("iiq", Collections.singletonList("image/x-dcraw"));
320 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("impress", Collections.singletonList("text/impress"));
321 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("jpeg", Collections.singletonList("image/jpeg"));
322 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("jpg", Collections.singletonList("image/jpeg"));
323 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("jps", Collections.singletonList("image/jpeg"));
324 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("js", Arrays.asList("application/javascript", "text/plain"));
325 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("json", Arrays.asList("application/json", "text/plain"));
326 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("k25", Collections.singletonList("image/x-dcraw"));
327 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("kdc", Collections.singletonList("image/x-dcraw"));
328 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("key", Collections.singletonList("application/x-iwork-keynote-sffkey"));
329 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("keynote", Collections.singletonList("application/x-iwork-keynote-sffkey"));
330 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("kra", Collections.singletonList("application/x-krita"));
331 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("m2t", Collections.singletonList("video/mp2t"));
332 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("m4v", Collections.singletonList("video/mp4"));
333 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("markdown", Collections.singletonList("text/markdown"));
334 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("mdown", Collections.singletonList("text/markdown"));
335 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("md", Collections.singletonList("text/markdown"));
336 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("mdb", Collections.singletonList("application/msaccess"));
337 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("mdwn", Collections.singletonList("text/markdown"));
338 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("mkd", Collections.singletonList("text/markdown"));
339 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("mef", Collections.singletonList("image/x-dcraw"));
340 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("mkv", Collections.singletonList("video/x-matroska"));
341 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("mobi", Collections.singletonList("application/x-mobipocket-ebook"));
342 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("mov", Collections.singletonList("video/quicktime"));
343 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("mp3", Collections.singletonList("audio/mpeg"));
344 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("mp4", Collections.singletonList("video/mp4"));
345 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("mpeg", Collections.singletonList("video/mpeg"));
346 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("mpg", Collections.singletonList("video/mpeg"));
347 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("mpo", Collections.singletonList("image/jpeg"));
348 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("msi", Collections.singletonList("application/x-msi"));
349 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("mts", Collections.singletonList("video/MP2T"));
350 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("mt2s", Collections.singletonList("video/MP2T"));
351 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("nef", Collections.singletonList("image/x-dcraw"));
352 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("numbers", Collections.singletonList("application/x-iwork-numbers-sffnumbers"));
353 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("odf", Collections.singletonList("application/vnd.oasis.opendocument.formula"));
354 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("odg", Collections.singletonList("application/vnd.oasis.opendocument.graphics"));
355 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("odp", Collections.singletonList("application/vnd.oasis.opendocument.presentation"));
356 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("ods", Collections.singletonList("application/vnd.oasis.opendocument.spreadsheet"));
357 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("odt", Collections.singletonList("application/vnd.oasis.opendocument.text"));
358 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("oga", Collections.singletonList("audio/ogg"));
359 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("ogg", Collections.singletonList("audio/ogg"));
360 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("ogv", Collections.singletonList("video/ogg"));
361 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("opus", Collections.singletonList("audio/ogg"));
362 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("orf", Collections.singletonList("image/x-dcraw"));
363 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("otf", Collections.singletonList("application/font-sfnt"));
364 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("pages", Collections.singletonList("application/x-iwork-pages-sffpages"));
365 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("pdf", Collections.singletonList("application/pdf"));
366 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("pfb", Collections.singletonList("application/x-font"));
367 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("pef", Collections.singletonList("image/x-dcraw"));
368 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("php", Collections.singletonList("application/x-php"));
369 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("pl", Collections.singletonList("application/x-perl"));
370 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("png", Collections.singletonList("image/png"));
371 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("pot", Collections.singletonList("application/vnd.ms-powerpoint"));
372 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("potm", Collections.singletonList("application/vnd.ms-powerpoint.template.macroEnabled.12"));
373 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("potx", Collections.singletonList("application/vnd.openxmlformats-officedocument.presentationml.template"));
374 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("ppa", Collections.singletonList("application/vnd.ms-powerpoint"));
375 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("ppam", Collections.singletonList("application/vnd.ms-powerpoint.addin.macroEnabled.12"));
376 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("pps", Collections.singletonList("application/vnd.ms-powerpoint"));
377 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("ppsm", Collections.singletonList("application/vnd.ms-powerpoint.slideshow.macroEnabled.12"));
378 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("ppsx", Collections.singletonList("application/vnd.openxmlformats-officedocument.presentationml.slideshow"));
379 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("ppt", Collections.singletonList("application/vnd.ms-powerpoint"));
380 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("pptm", Collections.singletonList("application/vnd.ms-powerpoint.presentation.macroEnabled.12"));
381 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("pptx", Collections.singletonList("application/vnd.openxmlformats-officedocument.presentationml.presentation"));
382 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("ps", Collections.singletonList("application/postscript"));
383 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("psd", Collections.singletonList("application/x-photoshop"));
384 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("py", Collections.singletonList("text/x-python"));
385 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("raf", Collections.singletonList("image/x-dcraw"));
386 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("rar", Collections.singletonList("application/x-rar-compressed"));
387 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("reveal", Collections.singletonList("text/reveal"));
388 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("rtf", Collections.singletonList("application/rtf"));
389 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("rw2", Collections.singletonList("image/x-dcraw"));
390 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("sgf", Collections.singletonList("application/sgf"));
391 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("sh-lib", Collections.singletonList("text/x-shellscript"));
392 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("sh", Collections.singletonList("text/x-shellscript"));
393 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("srf", Collections.singletonList("image/x-dcraw"));
394 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("sr2", Collections.singletonList("image/x-dcraw"));
395 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("svg", Arrays.asList("image/svg+xml", "text/plain"));
396 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("swf", Arrays.asList("application/x-shockwave-flash", "application/octet-stream"));
397 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("tar", Collections.singletonList("application/x-tar"));
398 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("gz", Collections.singletonList("application/x-compressed"));
399 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("tex", Collections.singletonList("application/x-tex"));
400 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("tgz", Collections.singletonList("application/x-compressed"));
401 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("tiff", Collections.singletonList("image/tiff"));
402 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("tif", Collections.singletonList("image/tiff"));
403 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("ttf", Collections.singletonList("application/font-sfnt"));
404 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("txt", Collections.singletonList("text/plain"));
405 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("vcard", Collections.singletonList("text/vcard"));
406 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("vcf", Collections.singletonList("text/vcard"));
407 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("vob", Collections.singletonList("video/dvd"));
408 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("wav", Collections.singletonList("audio/wav"));
409 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("webm", Collections.singletonList("video/webm"));
410 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("woff", Collections.singletonList("application/font-woff"));
411 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("wmv", Collections.singletonList("video/x-ms-wmv"));
412 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("xcf", Collections.singletonList("application/x-gimp"));
413 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("xla", Collections.singletonList("application/vnd.ms-excel"));
414 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("xlam", Collections.singletonList("application/vnd.ms-excel.addin.macroEnabled.12"));
415 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("xls", Collections.singletonList("application/vnd.ms-excel"));
416 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("xlsb", Collections.singletonList("application/vnd.ms-excel.sheet.binary.macroEnabled.12"));
417 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("xlsm", Collections.singletonList("application/vnd.ms-excel.sheet.macroEnabled.12"));
418 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("xlsx", Collections.singletonList("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"));
419 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("xlt", Collections.singletonList("application/vnd.ms-excel"));
420 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("xltm", Collections.singletonList("application/vnd.ms-excel.template.macroEnabled.12"));
421 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("xltx", Collections.singletonList("application/vnd.openxmlformats-officedocument.spreadsheetml.template"));
422 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("xml", Arrays.asList("application/xml", "text/plain"));
423 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("xrf", Collections.singletonList("image/x-dcraw"));
424 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("yaml", Arrays.asList("application/yaml", "text/plain"));
425 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("yml", Arrays.asList("application/yaml", "text/plain"));
426 FILE_EXTENSION_TO_MIMETYPE_MAPPING.put("zip", Collections.singletonList("application/zip"));
427 }
428 }