package by.istin.android.xcore.ui;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.DialogInterface.OnMultiChoiceClickListener;
import android.os.Build;
import android.os.Handler;
import android.text.InputType;
import android.view.ViewGroup.MarginLayoutParams;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import by.istin.android.xcore.callable.ISuccess;
import by.istin.android.xcore.utils.Log;
import by.istin.android.xcore.utils.StringUtil;
import by.istin.android.xcore.utils.UiUtil;
/**
* @author Uladzimir_Klyshevich
* Class for building simple dialog.
*/
public class DialogBuilder {
private static final String OK = "Ok";
private static final String CANCEL = "cancel";
private static final String TAG = DialogBuilder.class.getSimpleName();
@TargetApi(value = Build.VERSION_CODES.HONEYCOMB)
private static int getTheme() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
return android.R.style.Theme_Dialog;
} else {
return android.R.style.Theme_Holo_Light_Dialog;
}
}
@TargetApi(value = Build.VERSION_CODES.HONEYCOMB)
public static Builder createBuilder(final Context context) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
return new Builder(context);
} else {
return new Builder(context, getTheme());
}
}
public static void simple(final Context context, String message, final OnClickListener listener) {
simple(context, null, message, listener);
}
public static void simple(final Context context, String title, String message, final OnClickListener listener) {
simple(context, title, message, null, listener);
}
/**
* Create simple dialog.
*
* @param context context
* @param message message
* @param listener listener
*/
public static AlertDialog simple(final Context context, String title, String message, String btn, final OnClickListener listener) {
Builder builder = createBuilder(context);
if (title != null) {
builder.setTitle(title);
}
builder.setMessage(message);
builder.setPositiveButton(btn == null ? OK : btn, listener);
AlertDialog alertDialog = builder.create();
applyBackground(alertDialog);
alertDialog.setCancelable(false);
try {
alertDialog.show();
return alertDialog;
} catch (Exception e) {
Log.e(TAG, "quick_back", e);
return null;
}
}
public static void confirm(final Context context, String title, String message, final OnClickListener agreeListener) {
confirm(context, title, message, null, null, null, agreeListener);
}
/**
* Create confirm dialog.
*
* @param context context
* @param message message
*/
public static void confirm(final Context context, String title, String message, String posBtn, String negBtn, final OnClickListener disagreeListener, final OnClickListener agreeListener) {
Builder builder = createBuilder(context);
if (title != null) {
builder.setTitle(title);
}
builder.setMessage(message);
builder.setPositiveButton(posBtn == null ? OK : posBtn, agreeListener);
builder.setNegativeButton(negBtn == null ? StringUtil.getStringResource(CANCEL, context) : negBtn, disagreeListener == null ? new OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
try {
dialog.dismiss();
} catch (Exception e) {
// quick back issue for old android version
}
}
} : disagreeListener);
AlertDialog alertDialog = builder.create();
applyBackground(alertDialog);
alertDialog.setCancelable(false);
try {
alertDialog.show();
} catch (Exception e) {
Log.e(TAG, "quick_back", e);
}
}
public static void applyBackground(AlertDialog alertDialog) {
if (Build.VERSION.SDK_INT > 10) {
alertDialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
}
}
public static void options(final Context context, Integer titleResource, int optionsResource, final OnClickListener listener) {
Builder builder = createBuilder(context);
if (titleResource != null) {
builder.setTitle(titleResource);
}
builder.setItems(optionsResource, listener);
builder.setNegativeButton(StringUtil.getStringResource("cancel", context), new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
try {
AlertDialog alertDialog = builder.create();
applyBackground(alertDialog);
alertDialog.show();
} catch (Exception e) {
Log.e(TAG, "quick_back", e);
}
}
public static void options(final Context context, int titleResource, String[] optionsResource, final OnClickListener listener) {
Builder builder = createBuilder(context);
builder.setTitle(titleResource);
builder.setItems(optionsResource, listener);
builder.setNegativeButton(StringUtil.getStringResource("cancel", context), new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
try {
AlertDialog alertDialog = builder.create();
applyBackground(alertDialog);
alertDialog.show();
} catch (Exception e) {
Log.e(TAG, "quick_back", e);
}
}
public static void singleChooseOption(final Context context, int titleResource, int optionsResource, int defaultOption, final OnClickListener listener) {
String[] stringArray = context.getResources().getStringArray(optionsResource);
singleChooseOption(context, titleResource, stringArray, defaultOption, listener);
}
public static void singleChooseOption(Context context, int titleResource, String[] stringArray, int defaultOption, OnClickListener listener) {
singleChooseOption(context, context.getString(titleResource), stringArray, defaultOption, null, listener);
}
public static void singleChooseOption(Context context, String[] stringArray, int defaultOption, String closeButton, OnClickListener listener) {
singleChooseOption(context, null, stringArray, defaultOption, closeButton, listener);
}
public static void singleChooseOption(Context context, String titleResource, String[] stringArray, int defaultOption, String closeButton, OnClickListener listener) {
Builder builder = createBuilder(context);
if (!StringUtil.isEmpty(titleResource)) {
builder.setTitle(titleResource);
}
builder.setSingleChoiceItems(stringArray, defaultOption, listener);
if (StringUtil.isEmpty(closeButton)) {
closeButton = StringUtil.getStringResource("cancel", context);
}
builder.setNegativeButton(closeButton, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
try {
AlertDialog alertDialog = builder.create();
applyBackground(alertDialog);
alertDialog.show();
} catch (Exception e) {
Log.e(TAG, "quick_back", e);
}
}
public static void multiChooseOption(final Context context, int titleResource, int optionsResource, final boolean[] defaultOption, final ISuccess<boolean[]> success) {
String[] stringArray = context.getResources().getStringArray(optionsResource);
multiChooseOption(context, titleResource, stringArray, defaultOption, success);
}
public static void multiChooseOption(Context context, int titleResource, String[] stringArray, final boolean[] defaultOption, final ISuccess<boolean[]> success) {
Builder builder = createBuilder(context);
builder.setTitle(titleResource);
builder.setMultiChoiceItems(stringArray, defaultOption, new OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
defaultOption[which] = isChecked;
}
});
builder.setNegativeButton(StringUtil.getStringResource("cancel", context), new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.setPositiveButton(OK, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
success.success(defaultOption);
}
});
try {
AlertDialog alertDialog = builder.create();
applyBackground(alertDialog);
alertDialog.show();
} catch (Exception e) {
Log.e(TAG, "quick_back", e);
}
}
public static void input(final Activity activity, String title, String hint, String defaultValue, String positiveButton, boolean isNumber, final ISuccess<String> success) {
final EditText input = new EditText(activity);
if (!StringUtil.isEmpty(defaultValue)) {
input.setText(defaultValue);
}
if (isNumber) {
input.setRawInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL);
input.setSingleLine(true);
}
MarginLayoutParams marginLayoutParams = new MarginLayoutParams(MarginLayoutParams.MATCH_PARENT, MarginLayoutParams.WRAP_CONTENT);
marginLayoutParams.leftMargin = UiUtil.getDp(activity, 8);
marginLayoutParams.rightMargin = UiUtil.getDp(activity, 8);
input.setLayoutParams(marginLayoutParams);
input.setHint(hint);
Builder builder = createBuilder(activity);
builder.setPositiveButton(positiveButton, new OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
// deal with the editable
String message = input.getText().toString();
input.setText(StringUtil.EMPTY);
try {
InputMethodManager imm = (InputMethodManager)activity.getSystemService(
Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(input.getWindowToken(), 0);
dialog.dismiss();
} catch (Exception e) {
//quick back issue
}
if (!StringUtil.isEmpty(message)) {
success.success(message);
}
}
})
.setNegativeButton(StringUtil.getStringResource("cancel", activity), new OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
try {
InputMethodManager imm = (InputMethodManager)activity.getSystemService(
Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(input.getWindowToken(), 0);
dialog.dismiss();
} catch (Exception e) {
// quick back issue for old android version
}
}
});
builder.setTitle(title);
AlertDialog alertDialog = builder.create();
int padding = UiUtil.getDp(activity, 10);
alertDialog.setView(input, padding, padding, padding, padding);
try {
applyBackground(alertDialog);
alertDialog.show();
} catch (Exception e) {
// quick back issue for old android version
}
input.setSelection(input.getText().length());
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
UiUtil.showKeyboard(input);
}
}, 200l);
}
}