package com.beacon.crawlers; import java.io.File; import java.util.List; import com.holo.actions.AbortionFlag; import com.holo.actions.FileActions; import com.holo.fileexplorer.R; import com.holo.fileexplorer.MainActivity; import android.app.ProgressDialog; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.os.AsyncTask; import android.util.Log; import android.widget.Toast; public class Trasher extends AsyncTask<Object, Void, Integer> { private static final String TAG = Trasher.class.getName(); private MainActivity caller; private AbortionFlag flag; private ProgressDialog deleteProgressDialog; private static final int success = 0; private static final int err_deleting_folder = 1; private static final int err_deleting_child_file = 2; private static final int err_deleting_file = 3; private File errorFile; public Trasher(MainActivity activity) { caller = activity; flag = new AbortionFlag(); } @Override protected void onPreExecute() { caller.runOnUiThread(new Runnable() { @Override public void run() { String message = caller.getString(R.string.deleting_path); deleteProgressDialog = new ProgressDialog(caller); deleteProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); deleteProgressDialog.setMessage(message); deleteProgressDialog.setButton(caller.getString(R.string.run_in_background), new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); deleteProgressDialog.setButton2(caller.getString(R.string.cancel), new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); Trasher.this.flag.abort(); } }); deleteProgressDialog.show(); } }); } @Override protected Integer doInBackground(Object... params) { Log.v(TAG, "Started doInBackground"); Object files = params[0]; if (files instanceof List<?>) { for (File file : (List<File>) files) { int result = recursiveDelete(file); if (result != success) return result; } return success; } else return recursiveDelete((File) files); } @Override protected void onPostExecute(Integer result) { if (result == success) { caller.runOnUiThread(new Runnable() { @Override public void run() { if (deleteProgressDialog.isShowing()) { deleteProgressDialog.dismiss(); } caller.refreshCurrentPage(); } }); Toast.makeText(caller, R.string.file_deleted, Toast.LENGTH_SHORT).show(); } else { final int resultCopy = result; caller.runOnUiThread(new Runnable() { @Override public void run() { if (deleteProgressDialog.isShowing()) { deleteProgressDialog.dismiss(); } switch (resultCopy) { case err_deleting_folder: Toast.makeText(caller, caller.getString(R.string.error_deleting_folder, errorFile.getAbsolutePath()), Toast.LENGTH_LONG).show(); break; case err_deleting_child_file: Toast.makeText(caller, caller.getString(R.string.error_deleting_child_file, errorFile.getAbsolutePath()), Toast.LENGTH_SHORT).show(); break; case err_deleting_file: Toast.makeText(caller, caller.getString(R.string.error_deleting_file, errorFile.getAbsolutePath()), Toast.LENGTH_LONG).show(); break; } } }); } } /** * Recursively delete a file or directory and all of its children. * * @returns 0 if successful, error value otherwise. */ private int recursiveDelete(File file) { if (file.isDirectory() && file.listFiles() != null) for (File childFile : file.listFiles()) { if (childFile.isDirectory()) { int result = recursiveDelete(childFile); if (result > 0) { return result; } } else { if (!childFile.delete()) { errorFile = childFile; return err_deleting_child_file; } } } if (!file.delete()) { errorFile = file; return file.isFile() ? err_deleting_file : err_deleting_folder; } return success; } }