package org.qii.weiciyuan.support.file;
import org.qii.weiciyuan.R;
import org.qii.weiciyuan.support.database.DownloadPicturesDBTask;
import org.qii.weiciyuan.support.debug.AppLogger;
import org.qii.weiciyuan.support.utils.GlobalContext;
import org.qii.weiciyuan.support.utils.Utility;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Environment;
import android.text.TextUtils;
import android.widget.Toast;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* User: qii
* Date: 12-8-3
*/
public class FileManager {
private static final String PICTURE_CACHE = "picture_cache";
private static final String TXT2PIC = "txt2pic";
private static final String WEBVIEW_FAVICON = "favicon";
private static final String LOG = "log";
private static final String WEICIYUAN = "weiciyuan";
/**
* install weiciyuan, open app and login in, Android system will create cache dir.
* then open cache dir (/sdcard dir/Android/data/org.qii.weiciyuan) with Root Explorer,
* uninstall weiciyuan and reinstall it, the new weiciyuan app will have the bug it can't
* read cache dir again, so I have to tell user to delete that cache dir
*/
private static volatile boolean cantReadBecauseOfAndroidBugPermissionProblem = false;
public static String getSdCardPath() {
if (isExternalStorageMounted()) {
File path = GlobalContext.getInstance().getExternalCacheDir();
if (path != null) {
return path.getAbsolutePath();
} else {
if (!cantReadBecauseOfAndroidBugPermissionProblem) {
cantReadBecauseOfAndroidBugPermissionProblem = true;
final Activity activity = GlobalContext.getInstance().getActivity();
if (activity == null || activity.isFinishing()) {
GlobalContext.getInstance().getUIHandler().post(new Runnable() {
@Override
public void run() {
Toast.makeText(GlobalContext.getInstance(),
R.string.please_deleted_cache_dir, Toast.LENGTH_SHORT)
.show();
}
});
return "";
}
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
new AlertDialog.Builder(activity)
.setTitle(R.string.something_error)
.setMessage(R.string.please_deleted_cache_dir)
.setPositiveButton(R.string.ok,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
}
})
.show();
}
});
}
}
} else {
return "";
}
return "";
}
public File getAlbumStorageDir(String albumName) {
File file = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES), albumName);
if (!file.mkdirs()) {
AppLogger.e("Directory not created");
}
return file;
}
public static boolean isExternalStorageMounted() {
boolean canRead = Environment.getExternalStorageDirectory().canRead();
boolean onlyRead = Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED_READ_ONLY);
boolean unMounted = Environment.getExternalStorageState().equals(
Environment.MEDIA_UNMOUNTED);
return !(!canRead || onlyRead || unMounted);
}
public static String getUploadPicTempFile() {
if (!isExternalStorageMounted()) {
return "";
} else {
return getSdCardPath() + File.separator + "upload.jpg";
}
}
public static String getKKConvertPicTempFile() {
if (!isExternalStorageMounted()) {
return "";
} else {
return getSdCardPath() + File.separator + "kk_convert" + System.currentTimeMillis()
+ ".jpg";
}
}
public static String getLogDir() {
if (!isExternalStorageMounted()) {
return "";
} else {
String path = getSdCardPath() + File.separator + LOG;
if (!new File(path).exists()) {
new File(path).mkdirs();
}
return path;
}
}
public static String getFilePathFromUrl(String url, FileLocationMethod method) {
if (!isExternalStorageMounted()) {
return "";
}
if (TextUtils.isEmpty(url)) {
return "";
}
return DownloadPicturesDBTask.get(url);
}
public static String generateDownloadFileName(String url) {
if (!isExternalStorageMounted()) {
return "";
}
if (TextUtils.isEmpty(url)) {
return "";
}
String path = String.valueOf(url.hashCode());
String result = getSdCardPath() + File.separator + PICTURE_CACHE + File.separator + path;
if (url.endsWith(".jpg")) {
result += ".jpg";
} else if (url.endsWith(".gif")) {
result += ".gif";
}
if (!result.endsWith(".jpg") && !result.endsWith(".gif") && !result.endsWith(".png")) {
result = result + ".jpg";
}
return result;
}
public static String getTxt2picPath() {
if (!isExternalStorageMounted()) {
return "";
}
String path = getSdCardPath() + File.separator + TXT2PIC;
File file = new File(path);
if (file.exists()) {
file.mkdirs();
}
return path;
}
public static File createNewFileInSDCard(String absolutePath) {
if (!isExternalStorageMounted()) {
AppLogger.e("sdcard unavailiable");
return null;
}
if (TextUtils.isEmpty(absolutePath)) {
return null;
}
File file = new File(absolutePath);
if (file.exists()) {
return file;
} else {
File dir = file.getParentFile();
if (!dir.exists()) {
dir.mkdirs();
}
try {
if (file.createNewFile()) {
return file;
}
} catch (IOException e) {
AppLogger.d(e.getMessage());
return null;
}
}
return null;
}
public static String getWebViewFaviconDirPath() {
if (!TextUtils.isEmpty(getSdCardPath())) {
String path = getSdCardPath() + File.separator + WEBVIEW_FAVICON + File.separator;
File file = new File(path);
if (!file.exists()) {
file.mkdirs();
}
return path;
}
return "";
}
public static String getCacheSize() {
if (isExternalStorageMounted()) {
String path = getSdCardPath() + File.separator;
FileSize size = new FileSize(new File(path));
return size.toString();
}
return "0MB";
}
public static List<String> getCachePath() {
List<String> path = new ArrayList<String>();
if (isExternalStorageMounted()) {
String thumbnailPath = getSdCardPath() + File.separator + PICTURE_CACHE;
path.add(thumbnailPath);
}
return path;
}
public static String getPictureCacheSize() {
long size = 0L;
if (isExternalStorageMounted()) {
String thumbnailPath = getSdCardPath() + File.separator + PICTURE_CACHE;
size += new FileSize(new File(thumbnailPath)).getLongSize();
}
return FileSize.convertSizeToString(size);
}
public static boolean deleteCache() {
String path = getSdCardPath() + File.separator;
return deleteDirectory(new File(path));
}
public static boolean deletePictureCache() {
String thumbnailPath = getSdCardPath() + File.separator + PICTURE_CACHE;
deleteDirectory(new File(thumbnailPath));
DownloadPicturesDBTask.clearAll();
return true;
}
public static boolean deleteDirectory(File path) {
if (path.exists()) {
File[] files = path.listFiles();
if (files == null) {
return true;
}
for (int i = 0; i < files.length; i++) {
if (files[i].isDirectory()) {
deleteDirectory(files[i]);
} else {
files[i].delete();
}
}
}
return (path.delete());
}
public static boolean saveToPicDir(String path) {
if (!isExternalStorageMounted()) {
return false;
}
File file = new File(path);
String name = file.getName();
String newPath = Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES).getAbsolutePath() + File.separator + WEICIYUAN
+ File.separator + name;
try {
FileManager.createNewFileInSDCard(newPath);
copyFile(file, new File(newPath));
Utility.forceRefreshSystemAlbum(newPath);
return true;
} catch (IOException e) {
return false;
}
}
private static void copyFile(File sourceFile, File targetFile) throws IOException {
BufferedInputStream inBuff = null;
BufferedOutputStream outBuff = null;
try {
inBuff = new BufferedInputStream(new FileInputStream(sourceFile));
outBuff = new BufferedOutputStream(new FileOutputStream(targetFile));
byte[] b = new byte[1024 * 5];
int len;
while ((len = inBuff.read(b)) != -1) {
outBuff.write(b, 0, len);
}
outBuff.flush();
} finally {
if (inBuff != null) {
inBuff.close();
}
if (outBuff != null) {
outBuff.close();
}
}
}
}