package org.openintents.filemanager.dialogs; import java.io.File; import org.openintents.filemanager.R; import org.openintents.filemanager.files.FileHolder; import org.openintents.filemanager.lists.FileListFragment; import org.openintents.filemanager.util.MediaScannerUtils; import org.openintents.filemanager.util.UIUtils; import org.openintents.intents.FileManagerIntents; import android.app.AlertDialog; import android.app.Dialog; import android.app.ProgressDialog; import android.content.DialogInterface; import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.DialogFragment; import android.widget.Toast; public class SingleDeleteDialog extends DialogFragment { private FileHolder mFileHolder; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mFileHolder = getArguments().getParcelable(FileManagerIntents.EXTRA_DIALOG_FILE_HOLDER); } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { return new AlertDialog.Builder(getActivity()) .setInverseBackgroundForced(UIUtils.shouldDialogInverseBackground(getActivity())) .setTitle(getString(R.string.really_delete, mFileHolder.getName())) .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { new RecursiveDeleteTask().execute(mFileHolder.getFile()); } }) .setIcon(mFileHolder.getIcon()) .setNegativeButton(android.R.string.cancel, null) .create(); } private class RecursiveDeleteTask extends AsyncTask<File, Void, Void> { /** * If 0 some failed, if 1 all succeeded. */ private int mResult = 1; private ProgressDialog dialog = new ProgressDialog(getActivity()); /** * Recursively delete a file or directory and all of its children. * * @returns 0 if successful, error value otherwise. */ private void recursiveDelete(File file) { File[] files = file.listFiles(); if (files != null && files.length != 0) { // If it's a directory delete all children. for (File childFile : files) { if (childFile.isDirectory()) { recursiveDelete(childFile); } else { mResult *= childFile.delete() ? 1 : 0; } } } // And then delete parent. -- or just delete the file. mResult *= file.delete() ? 1 : 0; } @Override protected void onPreExecute() { dialog.setMessage(getActivity().getString(R.string.deleting)); dialog.setIndeterminate(true); dialog.show(); } @Override protected Void doInBackground(File... params) { recursiveDelete(params[0]); return null; } @Override protected void onPostExecute(Void result) { Toast.makeText(dialog.getContext(), mResult == 0 ? R.string.delete_failure : R.string.delete_success, Toast.LENGTH_LONG).show(); ((FileListFragment) getTargetFragment()).refresh(); dialog.dismiss(); MediaScannerUtils.informFileDeleted(getTargetFragment().getActivity().getApplicationContext(), mFileHolder.getFile()); } } public interface OnDeleteListener{ public void deleted(); } }