package it.geosolutions.geocollect.android.core.widgets.dialog;
import com.actionbarsherlock.app.SherlockFragment;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.SystemClock;
import android.support.v4.app.Fragment;
import android.util.Log;
/**
* TaskFragment manages a single background task and retains itself across
* configuration changes.
*/
public class TaskFragment extends SherlockFragment {
private static final String TAG = TaskFragment.class.getSimpleName();
private static final boolean DEBUG = true; // Set this to false to disable logs.
/**
* Callback interface through which the fragment can report the task's
* progress and results back to the Activity.
*/
static interface TaskCallbacks {
void onPreExecute();
void onProgressUpdate(int percent);
void onCancelled();
void onPostExecute();
}
private TaskCallbacks mCallbacks;
private AsyncTask mTask;
private boolean mRunning;
/**
* Set the callbacks manually
* @param tc
*/
public void setTaskCallabacks(TaskCallbacks tc){
mCallbacks =tc;
}
/**
* Hold a reference to the parent Activity so we can report the task's current
* progress and results. The Android framework will pass us a reference to the
* newly created Activity after each configuration change.
*/
@Override
public void onAttach(Activity activity) {
if (DEBUG) Log.i(TAG, "onAttach(Activity)");
super.onAttach(activity);
if (activity instanceof TaskCallbacks) {
// Hold a reference to the parent Activity so we can report back the task's
// current progress and results.
mCallbacks = (TaskCallbacks) activity;
}
}
/**
* This method is called once when the Fragment is first created.
*/
@Override
public void onCreate(Bundle savedInstanceState) {
if (DEBUG) Log.i(TAG, "onCreate(Bundle)");
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
/**
* Note that this method is <em>not</em> called when the Fragment is being
* retained across Activity instances. It will, however, be called when its
* parent Activity is being destroyed for good (such as when the user clicks
* the back button, etc.).
*/
@Override
public void onDestroy() {
if (DEBUG) Log.i(TAG, "onDestroy()");
super.onDestroy();
cancel();
}
/*****************************/
/***** TASK FRAGMENT API *****/
/*****************************/
/**
* Start the background task.
*/
public void start() {
if (!mRunning) {
mTask = new DummyTask();
mTask.execute();
mRunning = true;
}
}
/**
* Cancel the background task.
*/
public void cancel() {
if (mRunning) {
mTask.cancel(false);
mTask = null;
mRunning = false;
}
}
/**
* Returns the current state of the background task.
*/
public boolean isRunning() {
return mRunning;
}
/***************************/
/***** BACKGROUND TASK *****/
/***************************/
/**
* A dummy task that performs some (dumb) background work and proxies progress
* updates and results back to the Activity.
*/
private class DummyTask extends AsyncTask<Void, Integer, Void> {
@Override
protected void onPreExecute() {
// Proxy the call to the Activity.
if(mCallbacks!=null){
mCallbacks.onPreExecute();
}
mRunning = true;
}
/**
* Note that we do NOT call the callback object's methods directly from the
* background thread, as this could result in a race condition.
*/
@Override
protected Void doInBackground(Void... ignore) {
for (int i = 0; !isCancelled() && i < 100; i++) {
if (DEBUG) Log.i(TAG, "publishProgress(" + i + "%)");
SystemClock.sleep(100);
publishProgress(i);
}
return null;
}
@Override
protected void onProgressUpdate(Integer... percent) {
// Proxy the call to the Activity.
if(mCallbacks!=null){
mCallbacks.onProgressUpdate(percent[0]);
}
}
@Override
protected void onCancelled() {
// Proxy the call to the Activity.
if(mCallbacks!=null){
mCallbacks.onCancelled();
}
mRunning = false;
}
@Override
protected void onPostExecute(Void ignore) {
// Proxy the call to the Activity.
if(mCallbacks!=null){
mCallbacks.onPostExecute();
}
mRunning = false;
}
}
/************************/
/***** LOGS & STUFF *****/
/************************/
@Override
public void onActivityCreated(Bundle savedInstanceState) {
if (DEBUG) Log.i(TAG, "onActivityCreated(Bundle)");
super.onActivityCreated(savedInstanceState);
}
@Override
public void onStart() {
if (DEBUG) Log.i(TAG, "onStart()");
super.onStart();
}
@Override
public void onResume() {
if (DEBUG) Log.i(TAG, "onResume()");
super.onResume();
}
@Override
public void onPause() {
if (DEBUG) Log.i(TAG, "onPause()");
super.onPause();
}
@Override
public void onStop() {
if (DEBUG) Log.i(TAG, "onStop()");
super.onStop();
}
}