package org.commcare.dalvik.dialogs;
/**
* @author amstone326
*
* Any progress dialog associated with a CommCareTask should use
* this class to implement the dialog. Any class that launches such a task
* should implement the generateProgressDialog() method of the DialogController
* interface, and create the dialog in that method. The rest of the dialog's
* lifecycle is handled by methods of the DialogController interface that are
* fully implemented in CommCareActivity
*/
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.view.ContextThemeWrapper;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.app.AlertDialog;
import android.app.Dialog;
import org.commcare.android.framework.CommCareActivity;
import org.commcare.dalvik.R;
public class CustomProgressDialog extends DialogFragment {
//keys for onSaveInstanceState
private final static String KEY_TITLE = "title";
private final static String KEY_MESSAGE = "message";
private final static String KEY_USING_CB = "using_checkbox";
private final static String KEY_IS_CHECKED = "is_checked";
private final static String KEY_CB_TEXT = "checkbox_text";
private final static String KEY_USING_BUTTON = "using_cancel_buton";
private final static String KEY_TASK_ID = "task_id";
private final static String KEY_CANCELABLE = "is_cancelable";
//id of the task that spawned this dialog, -1 if not associated with a CommCareTask
private int taskId;
//for all dialogs
private String title;
private String message;
private boolean isCancelable; //default is false, only set to true if setCancelable() is explicitly called
//for checkboxes
private boolean usingCheckbox;
private boolean isChecked;
private String checkboxText;
//for cancel button
private boolean usingCancelButton;
public static CustomProgressDialog newInstance(String title, String message, int taskId) {
CustomProgressDialog frag = new CustomProgressDialog();
frag.setTitle(title);
frag.setMessage(message);
frag.setTaskId(taskId);
return frag;
}
public void addCheckbox(String text, boolean isChecked) {
this.usingCheckbox = true;
this.checkboxText = text;
this.isChecked = isChecked;
}
public void addCancelButton() {
usingCancelButton = true;
}
public void setCancelable() {
this.isCancelable = true;
}
private void setTaskId(int id) {
this.taskId = id;
}
public int getTaskId() {
return taskId;
}
private void setTitle(String s) {
this.title = s;
}
private void setMessage(String s) {
this.message = s;
}
public boolean isChecked() {
return isChecked;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
restoreFields(savedInstanceState);
}
private void restoreFields(Bundle savedInstanceState) {
if (savedInstanceState != null) {
this.title = savedInstanceState.getString(KEY_TITLE);
this.message = savedInstanceState.getString(KEY_MESSAGE);
this.usingCheckbox = savedInstanceState.getBoolean(KEY_USING_CB);
this.isChecked = savedInstanceState.getBoolean(KEY_IS_CHECKED);
this.checkboxText = savedInstanceState.getString(KEY_CB_TEXT);
this.usingCancelButton = savedInstanceState.getBoolean(KEY_USING_BUTTON);
this.taskId = savedInstanceState.getInt(KEY_TASK_ID);
this.isCancelable = savedInstanceState.getBoolean(KEY_CANCELABLE);
}
}
@Override
public void onDestroyView() {
if (getDialog() != null && getRetainInstance()) {
getDialog().setDismissMessage(null);
}
super.onDestroyView();
}
/* Creates the dialog that will reside within the fragment */
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
restoreFields(savedInstanceState);
ContextThemeWrapper wrapper = new ContextThemeWrapper(getActivity(), R.style.DialogBaseTheme);
AlertDialog.Builder builder = new AlertDialog.Builder(wrapper);
builder.setTitle(title);
builder.setCancelable(isCancelable);
View view = LayoutInflater.from(wrapper).inflate(R.layout.fragment_progress_dialog, null);
TextView tv = (TextView) view.findViewById(R.id.progress_dialog_message);
tv.setText(message);
//All logic for if this dialog uses a checkbox
if (usingCheckbox) {
CheckBox cb = (CheckBox) view.findViewById(R.id.progress_dialog_checkbox);
cb.setVisibility(View.VISIBLE);
cb.setText(checkboxText);
cb.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
isChecked = ((CheckBox)v).isChecked();
}
});
if (isChecked) {
cb.toggle();
}
}
//Logic for cancel button
if (usingCancelButton) {
Button b = (Button) view.findViewById(R.id.dialog_cancel_button);
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
((CommCareActivity)getActivity()).cancelCurrentTask();
}
});
b.setVisibility(View.VISIBLE);
}
builder.setView(view);
Dialog d = builder.create();
d.setCanceledOnTouchOutside(isCancelable);
return d;
}
public void updateMessage(String text) {
this.message = text;
AlertDialog pd = (AlertDialog) getDialog();
if (pd != null) {
TextView tv = (TextView) pd.findViewById(R.id.progress_dialog_message);
tv.setText(this.message);
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString(KEY_TITLE, this.title);
outState.putString(KEY_MESSAGE, this.message);
outState.putBoolean(KEY_USING_CB, this.usingCheckbox);
outState.putBoolean(KEY_IS_CHECKED, this.isChecked);
outState.putString(KEY_CB_TEXT, this.checkboxText);
outState.putBoolean(KEY_USING_BUTTON, this.usingCancelButton);
outState.putInt(KEY_TASK_ID, this.taskId);
outState.putBoolean(KEY_CANCELABLE, this.isCancelable);
}
}