package com.m.ui.fragment;
import java.io.File;
import java.text.DecimalFormat;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceClickListener;
import com.m.common.settings.SettingUtility;
import com.m.common.utils.DateUtils;
import com.m.common.utils.Logger;
import com.m.common.utils.SystemUtility;
import com.m.support.task.TaskException;
import com.m.support.task.WorkTask;
/**
* 清理缓存
*
* @author wangdan
*
*/
public class CacheClearFragment extends ABaseFragment implements OnPreferenceClickListener {
private static final int RETAIN_TIME = 2 * 24 * 60 * 60 * 1000;
private Preference clearCachePref;
private ProgressDialog mProgressDialog;
private long cacheSize = 0;
private String cachePath;
@Override
protected int inflateContentView() {
return 0;
}
public void setPreference(Preference pref, String path) {
this.clearCachePref = pref;
this.cachePath = path;
clearCachePref.setSummary("0 Kb");
clearCachePref.setOnPreferenceClickListener(this);
calculateCacheFileSize();
}
@Override
public boolean onPreferenceClick(Preference preference) {
if (clearCachePref.getKey().equals(preference.getKey())) {
new AlertDialog.Builder(getActivity()).setTitle("清理建议")
.setMessage("【确定】将清理掉SD卡中所有的图片缓存,建议保留近期缓存节省流量开销")
.setNegativeButton("取消", null)
.setNeutralButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
clearCache(true);
}
})
.setPositiveButton("保留最新", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
clearCache(false);
}
})
.show();
}
return true;
}
private void clearCache(final boolean all) {
final WorkTask<Void, String, Void> task = new WorkTask<Void, String, Void>() {
@Override
public Void workInBackground(Void... params) throws TaskException {
File cacheRootFile = new File(cachePath);
deleteFile(cacheRootFile, all);
return null;
}
void deleteFile(File file, boolean all) {
if (!file.exists())
return;
// try {
// Thread.sleep(10);
// } catch (Exception e) {
// }
if (!isCancelled()) {
if (file.isDirectory()) {
File[] childFiles = file.listFiles();
for (File childFile : childFiles)
deleteFile(childFile, all);
} else {
publishProgress(String.valueOf(file.length()));
boolean clear = all;
if (!clear) {
Logger.v("ClearCache", String.format("文件最后修改时间是%s", DateUtils.formatDate(file.lastModified(), DateUtils.TYPE_01)));
clear = System.currentTimeMillis() - file.lastModified() >= RETAIN_TIME;
if (clear)
Logger.v("ClearCache", "缓存超过2天,删除该缓存");
}
if (clear && file.delete())
SystemUtility.scanPhoto(file);
}
}
}
@Override
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
if (values != null && values.length > 0) {
int value = Integer.parseInt(values[0]);
mProgressDialog.incrementProgressBy(value / 1024);
}
}
protected void onFinished() {
if (mProgressDialog != null && mProgressDialog.isShowing())
mProgressDialog.dismiss();
};
}.execute();
mProgressDialog = new ProgressDialog(getActivity());
mProgressDialog.setIconAttribute(android.R.attr.alertDialogIcon);
mProgressDialog.setTitle("缓存清理中");
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mProgressDialog.setMax(((int) (cacheSize / 1024)));
mProgressDialog.setCanceledOnTouchOutside(false);
mProgressDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface arg0) {
task.cancel(true);
calculateCacheFileSize();
}
});
mProgressDialog.setButton(DialogInterface.BUTTON_POSITIVE ,"取消", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
task.cancel(true);
}
});
mProgressDialog.show();
}
private void calculateCacheFileSize() {
cacheSize = 0;
new WorkTask<Void, Void, Void>() {
@Override
protected void onPrepare() {
super.onPrepare();
clearCachePref.setEnabled(false);
clearCachePref.setSummary("正在计算...");
};
@Override
public Void workInBackground(Void... params) throws TaskException {
calculateFileSize(cachePath);
return null;
}
@Override
protected void onFinished() {
super.onFinished();
clearCachePref.setEnabled(true);
if (cacheSize * 1.0f / 1024 / 1024 > 1)
clearCachePref.setSummary(String.format("%s M", new DecimalFormat("#.00").format(cacheSize * 1.0d / 1024 / 1024)));
else
clearCachePref.setSummary(String.format("%d Kb", cacheSize / 1024));
};
void calculateFileSize(String path) {
File file = new File(path);
if (file.isDirectory()) {
File[] childFiles = file.listFiles();
for (File childFile : childFiles)
calculateFileSize(childFile.getAbsolutePath());
} else {
cacheSize += file.length();
}
}
}.execute();
}
public static void clearCompress() {
new WorkTask<Void, Void, Void>() {
@Override
public Void workInBackground(Void... params) throws TaskException {
String appPath = SystemUtility.getSdcardPath() + File.separator + SettingUtility.getStringSetting("root_path");
String cachePath = appPath + File.separator + SettingUtility.getStringSetting("com_m_common_image") + File.separator +
"compression";
File cacheRootFile = new File(cachePath);
deleteFile(cacheRootFile);
return null;
}
void deleteFile(File file) {
if (!isCancelled()) {
if (file.isDirectory()) {
File[] childFiles = file.listFiles();
for (File childFile : childFiles)
deleteFile(childFile);
} else {
if (file.delete())
SystemUtility.scanPhoto(file);
}
}
}
}.execute();
}
}