package org.acra;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.text.InputType;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;
/**
* This is the dialog Activity used by ACRA to get authorization from the user
* to send reports. Requires android:launchMode="singleInstance" in your
* AndroidManifest to work properly.
**/
public class CrashReportDialog extends BaseCrashReportDialog implements DialogInterface.OnClickListener, DialogInterface.OnDismissListener {
private static final String STATE_EMAIL = "email";
private static final String STATE_COMMENT = "comment";
private EditText userCommentView;
private EditText userEmailView;
AlertDialog mDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
final int titleResourceId = ACRA.getConfig().resDialogTitle();
if (titleResourceId != 0) {
dialogBuilder.setTitle(titleResourceId);
}
final int iconResourceId = ACRA.getConfig().resDialogIcon();
if (iconResourceId != 0) {
dialogBuilder.setIcon(iconResourceId);
}
dialogBuilder.setView(buildCustomView(savedInstanceState));
dialogBuilder.setPositiveButton(getText(ACRA.getConfig().resDialogPositiveButtonText()), CrashReportDialog.this);
dialogBuilder.setNegativeButton(getText(ACRA.getConfig().resDialogNegativeButtonText()), CrashReportDialog.this);
mDialog = dialogBuilder.create();
mDialog.setCanceledOnTouchOutside(false);
mDialog.setOnDismissListener(this);
mDialog.show();
}
protected View buildCustomView(Bundle savedInstanceState) {
final LinearLayout root = new LinearLayout(this);
root.setOrientation(LinearLayout.VERTICAL);
root.setPadding(10, 10, 10, 10);
root.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
root.setFocusable(true);
root.setFocusableInTouchMode(true);
final ScrollView scroll = new ScrollView(this);
root.addView(scroll, new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT, 1.0f));
final LinearLayout scrollable = new LinearLayout(this);
scrollable.setOrientation(LinearLayout.VERTICAL);
scroll.addView(scrollable);
final TextView text = new TextView(this);
final int dialogTextId = ACRA.getConfig().resDialogText();
if (dialogTextId != 0) {
text.setText(getText(dialogTextId));
}
scrollable.addView(text);
// Add an optional prompt for user comments
final int commentPromptId = ACRA.getConfig().resDialogCommentPrompt();
if (commentPromptId != 0) {
final TextView label = new TextView(this);
label.setText(getText(commentPromptId));
label.setPadding(label.getPaddingLeft(), 10, label.getPaddingRight(), label.getPaddingBottom());
scrollable.addView(label, new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
userCommentView = new EditText(this);
userCommentView.setLines(2);
if (savedInstanceState != null) {
String savedValue = savedInstanceState.getString(STATE_COMMENT);
if (savedValue != null) {
userCommentView.setText(savedValue);
}
}
scrollable.addView(userCommentView);
}
// Add an optional user email field
final int emailPromptId = ACRA.getConfig().resDialogEmailPrompt();
if (emailPromptId != 0) {
final TextView label = new TextView(this);
label.setText(getText(emailPromptId));
label.setPadding(label.getPaddingLeft(), 10, label.getPaddingRight(), label.getPaddingBottom());
scrollable.addView(label);
userEmailView = new EditText(this);
userEmailView.setSingleLine();
userEmailView.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS);
String savedValue = null;
if (savedInstanceState != null) {
savedValue = savedInstanceState.getString(STATE_EMAIL);
}
if (savedValue != null) {
userEmailView.setText(savedValue);
} else {
final SharedPreferences prefs = ACRA.getACRASharedPreferences();
userEmailView.setText(prefs.getString(ACRA.PREF_USER_EMAIL_ADDRESS, ""));
}
scrollable.addView(userEmailView);
}
return root;
}
@Override
public void onClick(DialogInterface dialog, int which) {
if (which == DialogInterface.BUTTON_POSITIVE) {
// Retrieve user comment
final String comment = userCommentView != null ? userCommentView.getText().toString() : "";
// Store the user email
final String userEmail;
final SharedPreferences prefs = ACRA.getACRASharedPreferences();
if (userEmailView != null) {
userEmail = userEmailView.getText().toString();
final SharedPreferences.Editor prefEditor = prefs.edit();
prefEditor.putString(ACRA.PREF_USER_EMAIL_ADDRESS, userEmail);
prefEditor.commit();
} else {
userEmail = prefs.getString(ACRA.PREF_USER_EMAIL_ADDRESS, "");
}
sendCrash(comment, userEmail);
} else {
cancelReports();
}
finish();
}
@Override
public void onDismiss(DialogInterface dialog) {
finish();
}
/*
* (non-Javadoc)
*
* @see android.app.Activity#onSaveInstanceState(android.os.Bundle)
*/
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (userCommentView != null && userCommentView.getText() != null) {
outState.putString(STATE_COMMENT, userCommentView.getText().toString());
}
if (userEmailView != null && userEmailView.getText() != null) {
outState.putString(STATE_EMAIL, userEmailView.getText().toString());
}
}
}