package com.erakk.lnreader.task; import android.os.AsyncTask; import android.util.Log; import com.erakk.lnreader.callback.CallbackEventData; import com.erakk.lnreader.callback.ICallbackEventData; import com.erakk.lnreader.callback.IExtendedCallbackNotifier; import com.erakk.lnreader.helper.Util; import java.io.File; import java.util.ArrayList; public class DeleteFilesTask extends AsyncTask<Void, ICallbackEventData, AsyncTaskResult<Integer>> { private static final String TAG = DeleteFilesTask.class.toString(); public IExtendedCallbackNotifier<AsyncTaskResult<?>> owner; private final String source; private final String filename; public DeleteFilesTask(IExtendedCallbackNotifier<AsyncTaskResult<?>> owner, String filename, String source) { this.owner = owner; if (Util.isStringNullOrEmpty(source)) { this.source = TAG + ":" + filename; } else { this.source = source; } this.filename = filename; } @Override protected AsyncTaskResult<Integer> doInBackground(Void... params) { try { Log.d(TAG, "Start deleting: " + filename); File f = new File(filename); int count = 0; if (f.exists()) { count = delete(f, count); } return new AsyncTaskResult<Integer>(count, Integer.class); } catch (Exception e) { Log.e(TAG, "Failed to delete: " + filename, e); return new AsyncTaskResult<Integer>(0, Integer.class, e); } } private int delete(File f, int count) { ArrayList<File> list = new ArrayList<File>(); ArrayList<File> dirs = new ArrayList<File>(); if (f.isFile()) list.add(f); else if (f.isDirectory()) { publishProgress(new CallbackEventData("Getting file list...", source)); addAll(dirs, f.listFiles()); for (int i = 0; i < dirs.size(); ++i) { File temp = dirs.get(i); if (temp.isDirectory()) { list.add(temp); addAll(dirs, temp.listFiles()); // dirs keep appeding until reach files } else list.add(temp); } } for (File file : list) { publishProgress(new CallbackEventData("Deleting: " + file.getName(), source)); if (file.delete()) ++count; } return count; } private void addAll(ArrayList<File> dirs, File[] fs) { for (File file : fs) { dirs.add(file); } } @Override protected void onProgressUpdate(ICallbackEventData... values) { // Log.d(TAG, values[0].getMessage()); if (owner != null) owner.onProgressCallback(values[0]); } @Override protected void onPostExecute(AsyncTaskResult<Integer> result) { if (owner != null) { CallbackEventData message = new CallbackEventData("Delete completed", source); owner.onCompleteCallback(message, result); } } }