package de.tum.in.tumcampusapp.activities.generic;
import android.os.AsyncTask;
import android.support.v4.widget.SwipeRefreshLayout;
/**
* Generic class which handles can handle a long running background task
*/
public abstract class ActivityForLoadingInBackground<S, T> extends ProgressActivity {
private AsyncTask<S, Void, T> asyncTask;
private S[] lastArg;
/**
* Called in separate thread after {@link #startLoading(Object[])} gets called.
* Should do all loading and return the result.
* @param arg Parameters given to {@link #startLoading(Object[])}
* @return Result of the loading task
*/
@SuppressWarnings("unchecked")
protected abstract T onLoadInBackground(S... arg);
/**
* Gets called from the UI thread after background task has finished.
* @param result Result returned by {@link #onLoadInBackground(Object[])}
*/
protected abstract void onLoadFinished(T result);
/**
* Standard constructor for ActivityForLoadingInBackground.
* The given layout must include a progress_layout and an error_layout.
* If the Activity should support Pull-To-Refresh it can also contain a
* {@link SwipeRefreshLayout} named ptr_layout
*
* @param layoutId Resource id of the xml layout that should be used to inflate the activity
*/
public ActivityForLoadingInBackground(int layoutId) {
super(layoutId);
}
/**
* Starts a new background task.
* The work that should be done in background must be specified in the {@link #onLoadInBackground(Object[])} method.
* @param arg Arguments passed to {@link #onLoadInBackground(Object[])}
*/
@SafeVarargs
@SuppressWarnings("varargs")
protected final void startLoading(final S... arg) {
if (asyncTask != null) {
asyncTask.cancel(true);
}
lastArg = arg;
asyncTask = new AsyncTask<S, Void, T>() {
@Override
protected void onPreExecute() {
showLoadingStart();
}
@SafeVarargs
@Override
protected final T doInBackground(S... arg) {
return onLoadInBackground(arg);
}
@Override
protected void onPostExecute(T result) {
showLoadingEnded();
onLoadFinished(result);
asyncTask = null;
}
};
asyncTask.execute(arg);
}
@Override
protected void onDestroy() {
super.onDestroy();
if (asyncTask!=null) {
asyncTask.cancel(true);
}
}
@Override
public void onRefresh() {
startLoading(lastArg);
}
/**
* Shows error layout and toasts the given message.
* Hides any progress indicator.
*
* @param errorReason Resource id of the error text
*/
@Override
protected void showError(int errorReason) {
showError(getString(errorReason));
}
/**
* Shows error layout and toasts the given message.
* Hides any progress indicator.
*
* @param errorReason Error text
*/
@Override
protected void showError(final String errorReason) {
runOnUiThread(new Runnable() {
@Override
public void run() {
ActivityForLoadingInBackground.super.showError(errorReason);
}
});
}
/**
* Shows error layout.
* Hides any progress indicator.
*/
@Override
protected void showErrorLayout() {
runOnUiThread(new Runnable() {
@Override
public void run() {
ActivityForLoadingInBackground.super.showErrorLayout();
}
});
}
/**
* Shows failed layout
* @param error Error Text to be toasted
*/
@Override
protected void showFailedTokenLayout(final String error) {
runOnUiThread(new Runnable() {
@Override
public void run() {
ActivityForLoadingInBackground.super.showFailedTokenLayout(error);
}
});
}
/**
* Shows failed layout
*/
@Override
protected void showNoTokenLayout() {
runOnUiThread(new Runnable() {
@Override
public void run() {
ActivityForLoadingInBackground.super.showNoTokenLayout();
}
});
}
/**
* Shows failed layout
*/
@Override
protected void showNoInternetLayout() {
runOnUiThread(new Runnable() {
@Override
public void run() {
ActivityForLoadingInBackground.super.showNoInternetLayout();
}
});
}
}