/*
* Geopaparazzi - Digital field mapping on Android based devices
* Copyright (C) 2016 HydroloGIS (www.hydrologis.com)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package eu.geopaparazzi.library.util;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.view.Window;
/**
* An simple {@link AsyncTask} string based wrapper.
* <p/>
* <p>example usage:</p>
* <pre>
* StringAsyncTask task = new StringAsyncTask(this) {
* protected String doBackgroundWork() {
* try {
* int index = 0;
* for (...){
* // do stuff
* publishProgress(index);
* }
* } catch (Exception e) {
* return "ERROR: " + e.getLocalizedMessage();
* }
* return "";
* }
*
* protected void doUiPostWork(String response) {
* dispose();
* if (response.length() != 0) {
* GPDialogs.warningDialog(YourActivity.this, response, null);
* }
* // do UI stuff
* }
* };
* task.setProgressDialog("TITLE", "Process...", false, progressCount);
* task.execute();
* </pre>
*
* <p>Remember to dispose the progressdialog in the activity destroy method.</p>
*
* @author Andrea Antonello (www.hydrologis.com)
*/
public abstract class StringAsyncTask extends AsyncTask<String, Integer, String> {
private Context context;
private ProgressDialog progressDialog;
private String title;
private String message;
private boolean cancelable;
private Integer max;
private boolean doProgress = false;
/**
* @param context the context to use.
*/
public StringAsyncTask(Context context) {
this.context = context;
}
/**
* Also create a {@link ProgressDialog} and start it.
*
* @param title a title.
* @param message a message.
* @param cancelable if it is cancelable.
* @param max the max progress. If <code>null</code>, indeterminate is used.
*/
public void setProgressDialog(String title, String message, boolean cancelable, Integer max) {
this.title = title;
this.message = message;
this.cancelable = cancelable;
this.max = max;
doProgress = true;
}
@Override
protected void onPreExecute() {
if (doProgress) {
progressDialog = new ProgressDialog(context);
if (title == null) {
progressDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
} else {
progressDialog.setTitle(title);
}
progressDialog.setMessage(message);
progressDialog.setCancelable(cancelable);
if (max == null) {
progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progressDialog.setIndeterminate(true);
} else {
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setIndeterminate(false);
progressDialog.setProgress(0);
progressDialog.setMax(max);
}
progressDialog.show();
}
}
protected String doInBackground(String... params) {
return doBackgroundWork();
}
protected void onProgressUpdate(Integer... progress) {
if (progressIsOk()) {
progressDialog.setProgress(progress[0]);
}
}
protected void onPostExecute(String response) {
dismissProgressDialog();
doUiPostWork(response);
}
private boolean progressIsOk() {
return progressDialog != null && progressDialog.isShowing();
}
/**
* Dispose any connected resource.
*/
public void dispose() {
dismissProgressDialog();
}
private void dismissProgressDialog() {
if (context instanceof Activity) {
Activity activity = (Activity) context;
if (activity.isDestroyed()){
return;
}
}
if (progressIsOk()) {
progressDialog.dismiss();
}
}
/**
* Do the background work (non UI).
* <p/>
* <p>To update progress:
* <code>
* publishProgress(1);
* // and to escape early if cancel() is called
* if (isCancelled())
* break;
* </code>
*
* @return the result of the work.
*/
protected abstract String doBackgroundWork();
/**
* Do the UI work after the {@link #doBackgroundWork()}.
*
* @param response the response coming from the {@link #doBackgroundWork()}.
*/
protected abstract void doUiPostWork(String response);
}