package com.smartisanos.sidebar.util;
import android.content.ClipDescription;
import android.os.Environment;
import android.system.ErrnoException;
import android.text.TextUtils;
import android.util.Log;
import android.webkit.MimeTypeMap;
import java.io.File;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import libcore.io.Libcore;
public class FileInfo implements Comparable<FileInfo> {
public static final String[] MIMETYPE_BLACKLIST = new String[] { "image/*" };
private static final String[] BLACKLIST = new String[] {
Environment.getExternalStorageDirectory().getAbsolutePath()
+ "/smartisan/textboom",
Environment.getExternalStorageDirectory().getAbsolutePath()
+ "/OpenMaster/plugins/",
Environment.getExternalStorageDirectory().getAbsolutePath()
+ "/tencent/"};
private static final String[] WHITELIST = new String[] {
Environment.getExternalStorageDirectory().getAbsolutePath()
+ "/tencent/QQfile_recv/",
Environment.getExternalStorageDirectory().getAbsolutePath()
+ "/tencent/MicroMsg/Download/"};
private static final Set<String> PATH_MASK;
static {
PATH_MASK = new HashSet<String>();
PATH_MASK.add("backup");
PATH_MASK.add("crash");
PATH_MASK.add("cache");
PATH_MASK.add("textboom");
PATH_MASK.add("config");
PATH_MASK.add("install");
PATH_MASK.add("applog_bak");
PATH_MASK.add("map");
PATH_MASK.add("manifest");// like this -> /storage/emulated0/0/smartisan/bak/manifest/manifest.txt
PATH_MASK.add("logs");
PATH_MASK.add("log");
PATH_MASK.add("baidumap");
PATH_MASK.add("appstore");
PATH_MASK.add("plugins");
PATH_MASK.add("com.pinguo.edit.sdk");
PATH_MASK.add("yysdk");
PATH_MASK.add("ycmedia");
PATH_MASK.add("sohudownload");
PATH_MASK.add("com.zcool.community");
PATH_MASK.add("qbiz");//storage/emulated/0/qqmusic/qbiz
PATH_MASK.add("app_style");//storage/emulated/0/ZAKER/DataStr/app_style/app_style.txt
PATH_MASK.add("zaker");///storage/emulated/0/ZAKER/DataStr/interaction/interaction.txt
PATH_MASK.add("emotion");///storage/emulated/0/Android/data/com.eg.android.AlipayGphone/files/emotion/magic/1788303168490637619/1788303168490637619.zip
}
private static final Set<String> WANTED_MIMETYPE;
private static final Set<String> WANTED_SUFFIX;
private static final Map<String, String> sExtensionToMimeTypeMap;
static {
WANTED_MIMETYPE = new HashSet<String>();
WANTED_MIMETYPE.add("application/zip");
WANTED_MIMETYPE.add("application/msword");
WANTED_MIMETYPE.add("application/vnd.ms-powerpoint");
WANTED_MIMETYPE.add("application/vnd.ms-excel");
WANTED_MIMETYPE.add("application/pdf");
WANTED_MIMETYPE.add("text/plain");
WANTED_MIMETYPE.add("video/*");
WANTED_MIMETYPE.add("audio/*");
WANTED_SUFFIX = new HashSet<String>();
WANTED_SUFFIX.add("rar");
WANTED_SUFFIX.add("zip");
WANTED_SUFFIX.add("7z");
WANTED_SUFFIX.add("apk");
WANTED_SUFFIX.add("pptx");
WANTED_SUFFIX.add("ppt");
WANTED_SUFFIX.add("key");
WANTED_SUFFIX.add("numbers");
WANTED_SUFFIX.add("xlsx");
WANTED_SUFFIX.add("doc");
WANTED_SUFFIX.add("docx");
WANTED_SUFFIX.add("pages");
WANTED_SUFFIX.add("pdf");
sExtensionToMimeTypeMap = new HashMap<String, String>();
sExtensionToMimeTypeMap.put("pages", "application/x-iwork-numbers-sffnumbers");
sExtensionToMimeTypeMap.put("numbers", "application/x-iwork-pages-sffpages");
sExtensionToMimeTypeMap.put("key", "application/x-iwork-keynote-sffkey");
sExtensionToMimeTypeMap.put("docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document");
sExtensionToMimeTypeMap.put("7z", "application/x-7z-compressed");
for (String suffix : WANTED_SUFFIX) {
if (TextUtils.isEmpty(getMimeTypeBySuffix(suffix))) {
throw new IllegalArgumentException(
"we can't get correct mimetype for some wanted suffix ! like -> " + suffix);
}
}
}
private static final Map<File, Set<String>> sTypeInSpeDir;
private static final String[] SpeDir = new String[] { "qqmusic/song" };
private static final String[] SpeType = new String[] { "txt" };
static {
sTypeInSpeDir = new HashMap<File, Set<String>>();
if (SpeDir.length != SpeType.length) {
Log.e(FileInfo.class.getName(), "SpeDir.length != SpeType.length !");
} else {
for (int i = 0; i < SpeDir.length; ++i) {
File dir = new File(Environment.getExternalStorageDirectory(), SpeDir[i]);
Set<String> set = new HashSet<String>();
String[] types = SpeType[i].split(",");
if (types != null) {
for (String type : types) {
set.add(type);
}
}
sTypeInSpeDir.put(dir, set);
}
}
}
public String filePath = "";
public String mimeType;
public long lastTime;
public FileInfo(String path){
this(path, null);
}
public FileInfo(String path, String mimeType){
if (TextUtils.isEmpty(mimeType)) {
mimeType = getMimeTypeByFilePath(path);
}
this.filePath = path;
this.mimeType = mimeType;
this.lastTime = getLastTime(filePath);
}
public void refresh(){
this.lastTime = getLastTime(filePath);
}
/*
* do not modify this method !!!!!!
* we mark fileinfo uselss by hashkey, if this is modified, the database will be invalid :(
*/
public int getHashKey() {
return (int) (filePath.hashCode() * 13 + lastTime);
}
public int getIconId() {
String name = new File(filePath).getName();
return MimeUtils.getResId(mimeType, getSuffix(name));
}
public boolean valid() {
if (!isMimeTypeAndFilePathValid(mimeType, filePath)) {
return false;
}
for (int i = 0; i < BLACKLIST.length; i++) {
if (filePath.startsWith(BLACKLIST[i])) {
boolean ok = false;
for (int j = 0; j < WHITELIST.length; j++) {
if (filePath.startsWith(WHITELIST[j])) {
ok = true;
break;
}
}
if (!ok) {
return false;
}
}
}
return true;
}
private static boolean isMaskFile(File file){
if(file == null){
return false;
}
String name = file.getName();
if(name.startsWith(".") || PATH_MASK.contains(name.toLowerCase())){
return true;
}
return isMaskFile(file.getParentFile());
}
private static boolean isTypeInSpeDir(File file) {
if (sTypeInSpeDir.containsKey(file.getParentFile())) {
if (sTypeInSpeDir.get(file.getParentFile()).contains(getSuffix(file.getName()))) {
return true;
}
}
return false;
}
private static boolean isMimeTypeOrSuffixWanted(String mimeType, String suffix) {
if (WANTED_SUFFIX.contains(suffix)) {
return true;
}
for (String want_mime : WANTED_MIMETYPE) {
if (ClipDescription.compareMimeTypes(mimeType, want_mime)) {
return true;
}
}
return false;
}
public static boolean isMimeTypeAndFilePathValid(String mimeType, String filePath) {
if (TextUtils.isEmpty(filePath) || TextUtils.isEmpty(mimeType)) {
return false;
}
if(!isMimeTypeOrSuffixWanted(mimeType, getSuffix(filePath))) {
return false;
}
File file = new File(filePath);
if (isTypeInSpeDir(file)) {
return false;
}
if (!file.isFile() || isMaskFile(file.getParentFile())) {
return false;
}
if (file.getName().toLowerCase().contains("log")) {
if (!file.getName().toLowerCase().contains("logo")) {
return false;
}
}
return true;
}
public static String getSuffix(String fileName) {
int index = fileName.lastIndexOf(".");
if (index > 0) {
return fileName.substring(index + 1).toLowerCase(Locale.US);
} else {
return "";
}
}
public static String getMimeTypeByFilePath(String filePath) {
String suffix = getSuffix(new File(filePath).getName());
return getMimeTypeBySuffix(suffix);
}
public static String getMimeTypeBySuffix(String suffix) {
String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(suffix);
if (TextUtils.isEmpty(mimeType)) {
mimeType = sExtensionToMimeTypeMap.get(suffix);
}
return mimeType;
}
public static long getLastTime(String path){
long aTime = 0;
long cTime = 0;
long mTime = 0;
try {
aTime = Libcore.os.stat(path).st_atime * 1000L;
cTime = Libcore.os.stat(path).st_ctime * 1000L;
mTime = Libcore.os.stat(path).st_mtime * 1000L;
} catch (ErrnoException e) {
// NA;
}
return Math.max(Math.max(aTime, cTime), mTime);
}
@Override
public int compareTo(FileInfo info) {
if (info == null) {
return -1;
}
if (lastTime != info.lastTime) {
if (info.lastTime > lastTime) {
return 1;
} else {
return -1;
}
}
return filePath.compareTo(info.filePath);
}
}