package com.jdroid.android.dialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v7.app.AlertDialog;
import android.text.Html;
import android.text.Spanned;
import android.view.View;
import android.widget.Button;
import com.jdroid.java.collections.Maps;
import com.jdroid.java.utils.StringUtils;
import java.io.Serializable;
import java.util.Map;
public class AlertDialogFragment extends AbstractDialogFragment {
private static final String TITLE_EXTRA = "titleExtra";
private static final String MESSAGE_EXTRA = "messageExtra";
private static final String IS_HTML_MESSAGE_EXTRA = "isHtmlMessageExtra";
private static final String NEGATIVE_BUTTON_TEXT_EXTRA = "negativeButtonTextExtra";
private static final String NEUTRAL_BUTTON_TEXT_EXTRA = "neutralButtonTextExtra";
private static final String POSITIVE_BUTTON_TEXT_EXTRA = "positiveButtonTextExtra";
private static final String SCREEN_VIEW_NAME = "screenViewName";
private String title;
private CharSequence message;
private String negativeButtonText;
private String neutralButtonText;
private String positiveButtonText;
private Map<String, Serializable> parameters = Maps.newHashMap();
private String screenViewName = null;
public static void show(Fragment fragment, String title, CharSequence message, String negativeButtonText,
String neutralButtonText, String positiveButtonText, Boolean cancelable) {
show(fragment.getActivity(), new AlertDialogFragment(), title, message, negativeButtonText, neutralButtonText,
positiveButtonText, cancelable);
}
public static void show(FragmentActivity fragmentActivity, AlertDialogFragment alertDialogFragment, String title,
CharSequence message, String negativeButtonText, String neutralButtonText, String positiveButtonText,
Boolean cancelable) {
show(fragmentActivity.getSupportFragmentManager(), alertDialogFragment, null, title, message,
negativeButtonText, neutralButtonText, positiveButtonText, cancelable, null, null);
}
public static void show(FragmentActivity fragmentActivity, AlertDialogFragment alertDialogFragment,
Fragment targetFragment, String title, CharSequence message, String negativeButtonText, String neutralButtonText,
String positiveButtonText, Boolean cancelable, String screenViewName, String tag) {
show(fragmentActivity.getSupportFragmentManager(), alertDialogFragment, targetFragment, title, message,
negativeButtonText, neutralButtonText, positiveButtonText, cancelable, screenViewName, tag);
}
public static void show(FragmentManager fragmentManager, AlertDialogFragment alertDialogFragment,
Fragment targetFragment, String title, CharSequence message, String negativeButtonText, String neutralButtonText,
String positiveButtonText, Boolean cancelable, String screenViewName, String tag) {
Bundle bundle = new Bundle();
bundle.putSerializable(TITLE_EXTRA, title);
if(message instanceof Spanned) {
bundle.putSerializable(MESSAGE_EXTRA, Html.toHtml((Spanned)message));
bundle.putBoolean(IS_HTML_MESSAGE_EXTRA, true);
} else if(message!=null) {
bundle.putSerializable(MESSAGE_EXTRA, message.toString());
}
bundle.putSerializable(NEGATIVE_BUTTON_TEXT_EXTRA, negativeButtonText);
bundle.putSerializable(NEUTRAL_BUTTON_TEXT_EXTRA, neutralButtonText);
bundle.putSerializable(POSITIVE_BUTTON_TEXT_EXTRA, positiveButtonText);
bundle.putSerializable(SCREEN_VIEW_NAME, screenViewName);
for (Map.Entry<String, Serializable> entry : alertDialogFragment.parameters.entrySet()) {
bundle.putSerializable(entry.getKey(), entry.getValue());
}
alertDialogFragment.setArguments(bundle);
alertDialogFragment.setCancelable(cancelable);
if (targetFragment != null) {
alertDialogFragment.setTargetFragment(targetFragment, 0);
}
String dialogTag;
if (StringUtils.isNotBlank(tag)) {
dialogTag = tag;
} else {
dialogTag = alertDialogFragment.getClass().getSimpleName();
}
alertDialogFragment.show(fragmentManager, dialogTag);
}
/**
* @see com.jdroid.android.dialog.AbstractDialogFragment#onCreate(android.os.Bundle)
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
title = getArgument(TITLE_EXTRA);
if (getArgument(IS_HTML_MESSAGE_EXTRA, false)) {
message = StringUtils.removeTrailingWhitespaces(Html.fromHtml((String)getArgument(MESSAGE_EXTRA)));
} else {
message = getArgument(MESSAGE_EXTRA);
}
positiveButtonText = getArgument(POSITIVE_BUTTON_TEXT_EXTRA);
neutralButtonText = getArgument(NEUTRAL_BUTTON_TEXT_EXTRA);
negativeButtonText = getArgument(NEGATIVE_BUTTON_TEXT_EXTRA);
screenViewName = getArgument(SCREEN_VIEW_NAME);
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(getActivity());
dialogBuilder.setTitle(title);
View contentView = createContentView();
if (contentView != null) {
dialogBuilder.setView(contentView);
} else if (message != null) {
dialogBuilder.setMessage(message);
}
if (negativeButtonText != null) {
dialogBuilder.setNegativeButton(negativeButtonText, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int whichButton) {
onNegativeClick();
}
});
}
if (neutralButtonText != null) {
dialogBuilder.setNeutralButton(neutralButtonText, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int whichButton) {
onNeutralClick();
}
});
}
if (positiveButtonText != null) {
dialogBuilder.setPositiveButton(positiveButtonText, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int whichButton) {
onPositiveClick();
}
});
}
AlertDialog dialog = dialogBuilder.create();
if ((positiveButtonText != null) && !dismissOnPositiveButtonClick()) {
// As workaround, to override default dismiss behavior the listener is directly set on the button.
dialog.setOnShowListener(new DialogInterface.OnShowListener() {
@Override
public void onShow(final DialogInterface dialogInterface) {
Button possitiveButton = ((AlertDialog)dialogInterface).getButton(DialogInterface.BUTTON_POSITIVE);
possitiveButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
onPositiveClick();
}
});
}
});
}
return dialog;
}
protected void onNegativeClick() {
// Do nothing by default
}
protected void onPositiveClick() {
// Do nothing by default
}
protected void onNeutralClick() {
// Do nothing by default
}
public void addParameter(String key, Serializable value) {
parameters.put(key, value);
}
protected boolean dismissOnPositiveButtonClick() {
return true;
}
protected View createContentView() {
return null;
}
@Override
public Boolean shouldTrackOnFragmentStart() {
return screenViewName != null;
}
@NonNull
@Override
public String getScreenViewName() {
return screenViewName;
}
}