package org.aisen.weibo.sina.ui.fragment.settings;
import android.content.DialogInterface;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceClickListener;
import com.afollestad.materialdialogs.AlertDialogWrapper;
import com.afollestad.materialdialogs.GravityEnum;
import com.afollestad.materialdialogs.MaterialDialog;
import com.umeng.analytics.MobclickAgent;
import org.aisen.android.common.utils.DateUtils;
import org.aisen.android.common.utils.Logger;
import org.aisen.android.network.task.TaskException;
import org.aisen.android.network.task.WorkTask;
import org.aisen.android.ui.fragment.ABaseFragment;
import org.aisen.weibo.sina.R;
import org.aisen.weibo.sina.base.MyApplication;
import java.io.File;
import java.text.DecimalFormat;
/**
* 清理缓存
*
* @author wangdan
*
*/
public class CacheClearFragment extends ABaseFragment implements OnPreferenceClickListener {
private static final int RETAIN_TIME = 24 * 60 * 60 * 1000;
private Preference clearCachePref;
// private ProgressDialog mProgressDialog;
private MaterialDialog materialDialog;
private long cacheSize = 0;
private int cacheCount = 0;
private String cachePath;
@Override
public int inflateContentView() {
return -1;
}
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 AlertDialogWrapper.Builder(getActivity()).setTitle("清理建议")
.setMessage("【确定】将清理掉SD卡中所有的图片缓存,建议保留近期缓存节省流量开销")
.setNeutralButton("取消", null)
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
clearCache(true);
}
})
.setNegativeButton("保留最新", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
clearCache(false);
}
})
.show();
}
return true;
}
private void clearCache(final boolean all) {
MobclickAgent.onEvent(getActivity(), all ? "clear_cache_all" : "clear_cache_outofdate");
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天,删除该缓存");
}
else {
file.delete();
}
// if (clear && file.delete())
// SystemUtils.scanPhoto(file);
}
}
}
@Override
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
if (values != null && values.length > 0 && materialDialog != null && getActivity() != null) {
int value = Integer.parseInt(values[0]);
// materialDialog.incrementProgress(value / 1024);
materialDialog.incrementProgress(1);
// if (value * 1.0f / 1024 / 1024 > 1)
// materialDialog.setContent(String.format("%s M", new DecimalFormat("#.00").format(value * 1.0d / 1024 / 1024)));
// else
// materialDialog.setContent(String.format("%d Kb", value / 1024));
}
}
protected void onFinished() {
if (materialDialog != null && materialDialog.isShowing())
materialDialog.dismiss();
};
}.execute();
materialDialog = new MaterialDialog.Builder(getActivity())
.title(R.string.settings_cache_clear)
// .content(R.string.please_wait)
.contentGravity(GravityEnum.CENTER)
.dismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
task.cancel(true);
calculateCacheFileSize();
}
})
.positiveText(R.string.cancel)
// .progress(false, ((int) (cacheSize / 1024)), true)
.progress(false, cacheCount, true)
.show();
}
private void calculateCacheFileSize() {
cacheSize = 0;
cacheCount = 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();
cacheCount += 1;
}
}
}.execute();
}
public static void clearCompress() {
new WorkTask<Void, Void, Void>() {
@Override
public Void workInBackground(Void... params) throws TaskException {
File cacheRootFile = new File(MyApplication.getImagePath());
deleteFile(cacheRootFile, false);
return null;
}
void deleteFile(File file, boolean all) {
if (!file.exists())
return;
if (!isCancelled()) {
if (file.isDirectory()) {
File[] childFiles = file.listFiles();
for (File childFile : childFiles)
deleteFile(childFile, all);
} else {
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", "缓存超过1天,删除该缓存");
file.delete();
}
}
else {
file.delete();
}
}
}
}
}.execute();
}
}