package com.beacon.crawlers; import java.io.File; import com.beacon.exceptions.LocationInvalidException; import com.holo.actions.AbortionFlag; import com.holo.actions.ArchiveSupport; 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.app.AlertDialog.Builder; import android.os.AsyncTask; import android.util.Log; public class Archiver extends AsyncTask<File, Integer, String> { private static final String TAG = Archiver.class.getName(); private AbortionFlag flag; private MainActivity caller; private String zipName; private File destinationDir; private ArchiveInstruction instruction; private ProgressDialog zipProgress; private boolean zippedAtleastOne; public Archiver(File destinationDir, String zipName, ArchiveInstruction instruction, MainActivity mContext) { this.flag = new AbortionFlag(); this.caller = mContext; this.zipName = zipName; this.destinationDir = destinationDir; this.instruction = instruction; } @Override protected void onPreExecute() { caller.runOnUiThread(new Runnable() { @Override public void run() { zipProgress = new ProgressDialog(caller); zipProgress.setProgressStyle(ProgressDialog.STYLE_SPINNER); zipProgress.setMessage(caller .getString(R.string.zip_in_progress)); zipProgress.setButton( caller.getString(R.string.run_in_background), new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); zipProgress.setButton2(caller.getString(R.string.cancel), new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { zipProgress.getButton(which).setText("Cancel"); Archiver.this.flag.abort(); } }); zipProgress.show(); } }); } @Override protected String doInBackground(File... params) { try { File zipFile = new File(destinationDir, zipName + ".zip"); zippedAtleastOne = false; for (File fileToBeZipped : instruction.ZIP_FILES) { if (flag.isAborted()) { caller.runOnUiThread(new Runnable() { @Override public void run() { String message = zippedAtleastOne ? caller .getString(R.string.zip_abort_partial) : caller.getString(R.string.zip_aborted); new Builder(caller) .setIcon(android.R.drawable.ic_dialog_alert) .setTitle(caller.getString(R.string.abort)) .setMessage(message) .setPositiveButton(android.R.string.ok, new OnClickListener() { @Override public void onClick( DialogInterface dialog, int which) { dialog.dismiss(); } }).show(); } }); } else { if (fileToBeZipped.isDirectory()) { if (fileToBeZipped.listFiles().length == 0) { caller.runOnUiThread(new Runnable() { @Override public void run() { new Builder(caller) .setIcon( android.R.drawable.ic_dialog_alert) .setTitle( caller.getString(R.string.zip)) .setMessage( caller.getString(R.string.zip_dir_empty)) .setPositiveButton( android.R.string.ok, new OnClickListener() { @Override public void onClick( DialogInterface dialog, int which) { dialog.dismiss(); } }).show(); } }); continue; } else { ArchiveSupport.zipFolder( fileToBeZipped.getAbsolutePath(), zipFile.getAbsolutePath(), flag); zippedAtleastOne = true; } } else { ArchiveSupport.zipFile( fileToBeZipped.getAbsolutePath(), zipFile.getAbsolutePath(), flag); zippedAtleastOne = true; } } } if (zippedAtleastOne) { return zipFile.getAbsolutePath(); } } catch (LocationInvalidException e) { Log.e(TAG, "Zip destination was invalid", e); caller.runOnUiThread(new Runnable() { @Override public void run() { new Builder(caller) .setIcon(android.R.drawable.ic_dialog_alert) .setTitle(caller.getString(R.string.error)) .setMessage( caller.getString(R.string.zip_dest_invalid)) .setPositiveButton(android.R.string.ok, new OnClickListener() { @Override public void onClick( DialogInterface dialog, int which) { dialog.dismiss(); } }).show(); } }); } catch (Exception e) { Log.e(TAG, "An error occured while running in background", e); caller.runOnUiThread(new Runnable() { @Override public void run() { new Builder(caller) .setIcon(android.R.drawable.ic_dialog_alert) .setTitle(caller.getString(R.string.zip)) .setMessage( caller.getString(R.string.zip_dir_empty)) .setPositiveButton(android.R.string.ok, new OnClickListener() { @Override public void onClick( DialogInterface dialog, int which) { dialog.dismiss(); } }).show(); } }); } return null; } @Override protected void onPostExecute(String result) { final String zipFile = result; caller.runOnUiThread(new Runnable() { @Override public void run() { if (zipProgress != null && zipProgress.isShowing()) { zipProgress.dismiss(); } } }); if (zipFile != null) { caller.runOnUiThread(new Runnable() { @Override public void run() { new Builder(caller) .setIcon(android.R.drawable.ic_dialog_info) .setTitle(caller.getString(R.string.success)) .setMessage( caller.getString(R.string.zip_success, zipFile)) .setPositiveButton(android.R.string.ok, new OnClickListener() { @Override public void onClick( DialogInterface dialog, int which) { dialog.dismiss(); } }).show(); } }); } } }