package org.anddev.andengine.ui.activity;
import java.util.concurrent.Callable;
import org.anddev.andengine.util.AsyncCallable;
import org.anddev.andengine.util.Callback;
import org.anddev.andengine.util.Debug;
import org.anddev.andengine.util.progress.IProgressListener;
import org.anddev.andengine.util.progress.ProgressCallable;
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
/**
* @author Nicolas Gramlich
* @since 18:35:28 - 29.08.2009
*/
public abstract class BaseActivity extends Activity {
// ===========================================================
// Constants
// ===========================================================
// ===========================================================
// Fields
// ===========================================================
// ===========================================================
// Constructors
// ===========================================================
// ===========================================================
// Getter & Setter
// ===========================================================
// ===========================================================
// Methods for/from SuperClass/Interfaces
// ===========================================================
// ===========================================================
// Methods
// ===========================================================
/**
* Performs a task in the background, showing a {@link ProgressDialog},
* while the {@link Callable} is being processed.
*
* @param <T>
* @param pTitleResID
* @param pMessageResID
* @param pErrorMessageResID
* @param pCallable
* @param pCallback
*/
protected <T> void doAsync(final int pTitleResID, final int pMessageResID, final Callable<T> pCallable, final Callback<T> pCallback) {
this.doAsync(pTitleResID, pMessageResID, pCallable, pCallback, null);
}
/**
* Performs a task in the background, showing a indeterminate {@link ProgressDialog},
* while the {@link Callable} is being processed.
*
* @param <T>
* @param pTitleResID
* @param pMessageResID
* @param pErrorMessageResID
* @param pCallable
* @param pCallback
* @param pExceptionCallback
*/
protected <T> void doAsync(final int pTitleResID, final int pMessageResID, final Callable<T> pCallable, final Callback<T> pCallback, final Callback<Exception> pExceptionCallback) {
new AsyncTask<Void, Void, T>() {
private ProgressDialog mPD;
private Exception mException = null;
@Override
public void onPreExecute() {
this.mPD = ProgressDialog.show(BaseActivity.this, BaseActivity.this.getString(pTitleResID), BaseActivity.this.getString(pMessageResID));
super.onPreExecute();
}
@Override
public T doInBackground(final Void... params) {
try {
return pCallable.call();
} catch (final Exception e) {
this.mException = e;
}
return null;
}
@Override
public void onPostExecute(final T result) {
try {
this.mPD.dismiss();
} catch (final Exception e) {
Debug.e("Error", e);
}
if(this.isCancelled()) {
this.mException = new CancelledException();
}
if(this.mException == null) {
pCallback.onCallback(result);
} else {
if(pExceptionCallback == null) {
Debug.e("Error", this.mException);
} else {
pExceptionCallback.onCallback(this.mException);
}
}
super.onPostExecute(result);
}
}.execute((Void[]) null);
}
/**
* Performs a task in the background, showing a {@link ProgressDialog} with an ProgressBar,
* while the {@link AsyncCallable} is being processed.
*
* @param <T>
* @param pTitleResID
* @param pMessageResID
* @param pErrorMessageResID
* @param pAsyncCallable
* @param pCallback
*/
protected <T> void doProgressAsync(final int pTitleResID, final ProgressCallable<T> pCallable, final Callback<T> pCallback) {
this.doProgressAsync(pTitleResID, pCallable, pCallback, null);
}
/**
* Performs a task in the background, showing a {@link ProgressDialog} with a ProgressBar,
* while the {@link AsyncCallable} is being processed.
*
* @param <T>
* @param pTitleResID
* @param pMessageResID
* @param pErrorMessageResID
* @param pAsyncCallable
* @param pCallback
* @param pExceptionCallback
*/
protected <T> void doProgressAsync(final int pTitleResID, final ProgressCallable<T> pCallable, final Callback<T> pCallback, final Callback<Exception> pExceptionCallback) {
new AsyncTask<Void, Integer, T>() {
private ProgressDialog mPD;
private Exception mException = null;
@Override
public void onPreExecute() {
this.mPD = new ProgressDialog(BaseActivity.this);
this.mPD.setTitle(pTitleResID);
this.mPD.setIcon(android.R.drawable.ic_menu_save);
this.mPD.setIndeterminate(false);
this.mPD.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
this.mPD.show();
super.onPreExecute();
}
@Override
public T doInBackground(final Void... params) {
try {
return pCallable.call(new IProgressListener() {
@Override
public void onProgressChanged(final int pProgress) {
onProgressUpdate(pProgress);
}
});
} catch (final Exception e) {
this.mException = e;
}
return null;
}
@Override
public void onProgressUpdate(final Integer... values) {
this.mPD.setProgress(values[0]);
}
@Override
public void onPostExecute(final T result) {
try {
this.mPD.dismiss();
} catch (final Exception e) {
Debug.e("Error", e);
/* Nothing. */
}
if(this.isCancelled()) {
this.mException = new CancelledException();
}
if(this.mException == null) {
pCallback.onCallback(result);
} else {
if(pExceptionCallback == null) {
Debug.e("Error", this.mException);
} else {
pExceptionCallback.onCallback(this.mException);
}
}
super.onPostExecute(result);
}
}.execute((Void[]) null);
}
/**
* Performs a task in the background, showing an indeterminate {@link ProgressDialog},
* while the {@link AsyncCallable} is being processed.
*
* @param <T>
* @param pTitleResID
* @param pMessageResID
* @param pErrorMessageResID
* @param pAsyncCallable
* @param pCallback
* @param pExceptionCallback
*/
protected <T> void doAsync(final int pTitleResID, final int pMessageResID, final AsyncCallable<T> pAsyncCallable, final Callback<T> pCallback, final Callback<Exception> pExceptionCallback) {
final ProgressDialog pd = ProgressDialog.show(BaseActivity.this, this.getString(pTitleResID), this.getString(pMessageResID));
pAsyncCallable.call(new Callback<T>() {
@Override
public void onCallback(final T result) {
try {
pd.dismiss();
} catch (final Exception e) {
Debug.e("Error", e);
/* Nothing. */
}
pCallback.onCallback(result);
}
}, pExceptionCallback);
}
// ===========================================================
// Inner and Anonymous Classes
// ===========================================================
public static class CancelledException extends Exception {
private static final long serialVersionUID = -78123211381435596L;
}
}
|