/*
* Copyright (C) 2014 Arpit Khurana <arpitkh96@gmail.com>, Vishal Nehra <vishalmeham2@gmail.com>
*
* This file is part of Amaze File Manager.
*
* Amaze File Manager is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.amaze.filemanager.ui.icons;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.util.SparseArray;
import com.amaze.filemanager.R;
import com.amaze.filemanager.utils.CryptUtil;
import java.io.File;
import java.util.HashMap;
public class Icons {
// construct a with an approximation of the capacity
private static HashMap<String, Integer> sMimeIconIds = new HashMap<>(1 + (int)(114 / 0.75));
private static SparseArray<Bitmap> sMimeIcons = new SparseArray<>();
private static void add(String mimeType, int resId) {
if (sMimeIconIds.put(mimeType, resId) != null) {
throw new RuntimeException(mimeType + " already registered!");
}
}
private static void add(int resId, String... mimeTypes) {
for (String type : mimeTypes) {
add(type, resId);
}
}
static {
// Package
add(R.drawable.ic_doc_apk_white,
"application/vnd.android.package-archive"
);
// Audio
add(R.drawable.ic_doc_audio_am,
"application/ogg",
"application/x-flac"
);
// Certificate
add(R.drawable.ic_doc_certificate,
"application/pgp-keys",
"application/pgp-signature",
"application/x-pkcs12",
"application/x-pkcs7-certreqresp",
"application/x-pkcs7-crl",
"application/x-x509-ca-cert",
"application/x-x509-user-cert",
"application/x-pkcs7-certificates",
"application/x-pkcs7-mime",
"application/x-pkcs7-signature"
);
// Source code
add(R.drawable.ic_doc_codes,
"application/rdf+xml",
"application/rss+xml",
"application/x-object",
"application/xhtml+xml",
"text/css",
"text/html",
"text/xml",
"text/x-c++hdr",
"text/x-c++src",
"text/x-chdr",
"text/x-csrc",
"text/x-dsrc",
"text/x-csh",
"text/x-haskell",
"text/x-java",
"text/x-literate-haskell",
"text/x-pascal",
"text/x-tcl",
"text/x-tex",
"application/x-latex",
"application/x-texinfo",
"application/atom+xml",
"application/ecmascript",
"application/json",
"application/javascript",
"application/xml",
"text/javascript",
"application/x-javascript"
);
// Compressed
add(R.drawable.ic_zip_box_white_36dp,
"application/mac-binhex40",
"application/rar",
"application/zip",
"application/java-archive",
"application/x-apple-diskimage",
"application/x-debian-package",
"application/x-gtar",
"application/x-iso9660-image",
"application/x-lha",
"application/x-lzh",
"application/x-lzx",
"application/x-stuffit",
"application/x-tar",
"application/x-webarchive",
"application/x-webarchive-xml",
"application/gzip",
"application/x-7z-compressed",
"application/x-deb",
"application/x-rar-compressed"
);
// Contact
add(R.drawable.ic_doc_contact_am,
"text/x-vcard",
"text/vcard"
);
// Event
add(R.drawable.ic_doc_event_am,
"text/calendar",
"text/x-vcalendar"
);
// Font
add(R.drawable.ic_doc_font,
"application/x-font",
"application/font-woff",
"application/x-font-woff",
"application/x-font-ttf"
);
// Image
add(R.drawable.ic_doc_image,
"application/vnd.oasis.opendocument.graphics",
"application/vnd.oasis.opendocument.graphics-template",
"application/vnd.oasis.opendocument.image",
"application/vnd.stardivision.draw",
"application/vnd.sun.xml.draw",
"application/vnd.sun.xml.draw.template",
"image/jpeg",
"image/png"
);
// PDF
add(R.drawable.ic_doc_pdf,
"application/pdf"
);
// Presentation
add(R.drawable.ic_doc_presentation,
"application/vnd.ms-powerpoint",
"application/vnd.openxmlformats-officedocument.presentationml.presentation",
"application/vnd.openxmlformats-officedocument.presentationml.template",
"application/vnd.openxmlformats-officedocument.presentationml.slideshow",
"application/vnd.stardivision.impress",
"application/vnd.sun.xml.impress",
"application/vnd.sun.xml.impress.template",
"application/x-kpresenter",
"application/vnd.oasis.opendocument.presentation"
);
// Spreadsheet
add(R.drawable.ic_doc_spreadsheet_am,
"application/vnd.oasis.opendocument.spreadsheet",
"application/vnd.oasis.opendocument.spreadsheet-template",
"application/vnd.ms-excel",
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
"application/vnd.openxmlformats-officedocument.spreadsheetml.template",
"application/vnd.stardivision.calc",
"application/vnd.sun.xml.calc",
"application/vnd.sun.xml.calc.template",
"application/x-kspread",
"text/comma-separated-values"
);
// Doc
add(R.drawable.ic_doc_doc_am,
"application/msword",
"application/vnd.openxmlformats-officedocument.wordprocessingml.document",
"application/vnd.openxmlformats-officedocument.wordprocessingml.template",
"application/vnd.oasis.opendocument.text",
"application/vnd.oasis.opendocument.text-master",
"application/vnd.oasis.opendocument.text-template",
"application/vnd.oasis.opendocument.text-web",
"application/vnd.stardivision.writer",
"application/vnd.stardivision.writer-global",
"application/vnd.sun.xml.writer",
"application/vnd.sun.xml.writer.global",
"application/vnd.sun.xml.writer.template",
"application/x-abiword",
"application/x-kword",
"text/markdown"
);
// Text
add(R.drawable.ic_doc_text_am,
"text/plain"
);
// Video
add(R.drawable.ic_doc_video_am,
"application/x-quicktimeplayer",
"application/x-shockwave-flash"
);
}
public static boolean isText(String name) {
String mimeType = MimeTypes.getMimeType(new File(name));
Integer res = sMimeIconIds.get(mimeType);
if (res != null && res == R.drawable.ic_doc_text_am) return true;
if (mimeType != null && mimeType.contains("/")) {
final String typeOnly = mimeType.split("/")[0];
if ("text".equals(typeOnly)) {
return true;
}
}
return false;
}
public static boolean isVideo(String name) {
String mimeType = MimeTypes.getMimeType(new File(name));
Integer res = sMimeIconIds.get(mimeType);
if (res != null && res == R.drawable.ic_doc_video_am) return true;
if (mimeType != null && mimeType.contains("/")) {
final String typeOnly = mimeType.split("/")[0];
if ("video".equals(typeOnly)) {
return true;
}
}
return false;
}
public static boolean isEncrypted(String name) {
return name.endsWith(CryptUtil.CRYPT_EXTENSION);
}
public static boolean isAudio(String name) {
String mimeType = MimeTypes.getMimeType(new File(name));
Integer res = sMimeIconIds.get(mimeType);
if (res != null && res == R.drawable.ic_doc_audio_am) return true;
if (mimeType != null && mimeType.contains("/")) {
final String typeOnly = mimeType.split("/")[0];
if ("audio".equals(typeOnly)) {
return true;
}
}
return false;
}
public static boolean isCode(String name) {
Integer res = sMimeIconIds.get(MimeTypes.getMimeType(new File(name)));
return res != null && res == R.drawable.ic_doc_codes;
}
public static boolean isArchive(String name) {
Integer res = sMimeIconIds.get(MimeTypes.getMimeType(new File(name)));
return res != null && res == R.drawable.ic_zip_box_white_36dp;
}
public static boolean isApk(String name) {
Integer res = sMimeIconIds.get(MimeTypes.getMimeType(new File(name)));
return res != null && res == R.drawable.ic_doc_apk_white;
}
public static boolean isPdf(String name) {
Integer res = sMimeIconIds.get(MimeTypes.getMimeType(new File(name)));
return res != null && res == R.drawable.ic_doc_pdf;
}
public static boolean isPicture(String name) {
Integer res = sMimeIconIds.get(MimeTypes.getMimeType(new File(name)));
return res != null && res == R.drawable.ic_doc_image;
}
public static boolean isGeneric(String name) {
String mimeType = MimeTypes.getMimeType(new File(name));
if (mimeType == null) {
return true;
}
Integer resId = sMimeIconIds.get(mimeType);
return resId == null;
}
public static BitmapDrawable loadMimeIcon(String path, boolean grid, final Resources res) {
String mimeType = MimeTypes.getMimeType(new File(path));
if (mimeType == null) {
/* if(grid) return loadBitmapDrawableById(res, R.drawable.ic_doc_generic_am_grid);*/
return loadBitmapDrawableById(res, R.drawable.ic_doc_generic_am);
}
// Look for exact match first
Integer resId = sMimeIconIds.get(mimeType);
if (resId != null) {
switch (resId) {
case R.drawable.ic_doc_apk_white:
if (grid) resId = R.drawable.ic_doc_apk_grid;
break;/*
case R.drawable.ic_doc_audio_am: if(grid)resId=R.drawable.ic_doc_audio_am_grid;
break;
case R.drawable.ic_doc_certificate: if(grid)resId=R.drawable.ic_doc_certificate_grid;
break;
case R.drawable.ic_doc_codes: if(grid)resId=R.drawable.ic_doc_codes_grid;
break;
case R.drawable.ic_doc_font: if(grid)resId=R.drawable.ic_doc_font_grid;
break;
case R.drawable.ic_doc_generic_am: if(grid)resId=R.drawable.ic_doc_generic_am_grid;
break;
*/
case R.drawable.ic_doc_image:
if (grid) resId = R.drawable.ic_doc_image_grid;
break;
}
/*case R.drawable.ic_doc_pdf: if(grid)resId=R.drawable.ic_doc_pdf_grid;
break;
case R.drawable.ic_doc_video_am: if(grid)resId=R.drawable.ic_doc_video_am_grid;
break;
case R.drawable.ic_doc_text_am: if(grid)resId=R.drawable.ic_doc_text_am_grid;
break;
}*/
return loadBitmapDrawableById(res, resId);
}
// Otherwise look for partial match
final String typeOnly = mimeType.split("/")[0];
if ("audio".equals(typeOnly)) {
/* if (grid) resId = R.drawable.ic_doc_audio_am_grid; else*/
resId = R.drawable.ic_doc_audio_am;
} else if ("image".equals(typeOnly)) {
if (grid) resId = R.drawable.ic_doc_image_grid;
else resId = R.drawable.ic_doc_image;
} else if ("text".equals(typeOnly)) {
/*if (grid) resId = R.drawable.ic_doc_text_am_grid; else*/
resId = R.drawable.ic_doc_text_am;
} else if ("video".equals(typeOnly)) {
/*if (grid) resId = R.drawable.ic_doc_video_am_grid; else*/
resId = R.drawable.ic_doc_video_am;
} else if (path.endsWith(CryptUtil.CRYPT_EXTENSION)) {
resId = R.drawable.ic_file_lock_white_36dp;
}
if (resId == null) {
/*if (grid) resId = R.drawable.ic_doc_generic_am_grid; else*/
resId = R.drawable.ic_doc_generic_am;
}
return loadBitmapDrawableById(res, resId);
}
private static BitmapDrawable loadBitmapDrawableById(Resources res, int resId) {
Bitmap bitmap = sMimeIcons.get(resId);
if (bitmap == null) {
bitmap = BitmapFactory.decodeResource(res, resId);
sMimeIcons.put(resId, bitmap);
}
return new BitmapDrawable(res, bitmap);
}
}