/* * Copyright (c) 2012 Hai Bison * * See the file LICENSE at the root directory of this project for copying * permission. */ package group.pals.android.lib.ui.filechooser.utils.ui; import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.os.AsyncTask; import android.os.Handler; import android.util.Log; /** * An {@link AsyncTask}, used to show {@link ProgressDialog} while doing some * background tasks.<br> * * @author Hai Bison * @since v2.1 alpha */ public abstract class LoadingDialog extends AsyncTask<Void, Void, Object> { public static final String _ClassName = LoadingDialog.class.getName(); private final ProgressDialog mDialog; /** * Default is {@code 500}ms */ private int mDelayTime = 500; /** * Flag to use along with {@link #mDelayTime} */ private boolean mFinished = false; private Throwable mLastException; /** * Creates new {@link LoadingDialog} * * @param context * {@link Context} * @param msg * message will be shown in the dialog. * @param cancelable * as the name means. */ public LoadingDialog(Context context, String msg, boolean cancelable) { mDialog = new ProgressDialog(context); mDialog.setMessage(msg); mDialog.setIndeterminate(true); mDialog.setCancelable(cancelable); if (cancelable) { mDialog.setCanceledOnTouchOutside(true); mDialog.setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { cancel(true); } }); } }// LoadingDialog /** * Creates new {@link LoadingDialog} * * @param context * {@link Context} * @param msgId * resource id of the message will be shown in the dialog. * @param cancelable * as the name means. */ public LoadingDialog(Context context, int msgId, boolean cancelable) { this(context, context.getString(msgId), cancelable); } /** * If you override this method, you must call {@code super.onPreExecute()} * at very first of the method. */ protected void onPreExecute() { new Handler().postDelayed(new Runnable() { @Override public void run() { if (!mFinished) { try { /* * sometime the activity has been finished before we * show this dialog, it will raise error */ mDialog.show(); } catch (Throwable t) { // TODO Log.e(_ClassName, "onPreExecute() - show dialog: " + t); } } } }, getDelayTime()); }// onPreExecute() /** * If you override this method, you must call * {@code super.onPostExecute(result)} at the entry point of the method. */ protected void onPostExecute(Object result) { doFinish(); }// onPostExecute() /** * If you override this method, you must call {@code super.onCancelled()} at * the entry point of the method. */ protected void onCancelled() { doFinish(); super.onCancelled(); }// onCancelled() private void doFinish() { mFinished = true; try { /* * sometime the activity has been finished before we dismiss this * dialog, it will raise error */ mDialog.dismiss(); } catch (Throwable t) { // TODO Log.e(_ClassName, "doFinish() - dismiss dialog: " + t); } }// doFinish() /** * Gets the delay time before showing the dialog. * * @return the delay time */ public int getDelayTime() { return mDelayTime; } /** * Sets the delay time before showing the dialog. * * @param delayTime * the delay time to set * @return {@link LoadingDialog} */ public LoadingDialog setDelayTime(int delayTime) { mDelayTime = delayTime >= 0 ? delayTime : 0; return this; } /** * Sets last exception. This method is useful in case an exception raises * inside {@link #doInBackground(Void...)} * * @param t * {@link Throwable} */ protected void setLastException(Throwable t) { mLastException = t; } /** * Gets last exception. * * @return {@link Throwable} */ protected Throwable getLastException() { return mLastException; } }