package org.wikipedia.views; import android.content.Context; import android.content.DialogInterface; import android.support.annotation.LayoutRes; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.StringRes; import android.support.design.widget.TextInputLayout; import android.support.v7.app.AlertDialog; import android.text.Editable; import android.text.TextWatcher; import android.view.LayoutInflater; import android.view.View; import android.widget.EditText; import org.wikipedia.R; import org.wikipedia.util.DeviceUtil; public final class TextInputDialog extends AlertDialog { public interface Callback { void onShow(@NonNull TextInputDialog dialog); void onTextChanged(@NonNull CharSequence text, @NonNull TextInputDialog dialog); void onSuccess(@NonNull CharSequence text); void onCancel(); } @Nullable private Callback callback; private EditText editText; private TextInputLayout editTextContainer; private TextInputWatcher watcher = new TextInputWatcher(); public static TextInputDialog newInstance(@NonNull Context context, @Nullable final Callback callback) { return new TextInputDialog(context) .setView(R.layout.dialog_text_input) .setCallback(callback); } public TextInputDialog setCallback(@Nullable Callback callback) { this.callback = callback; return this; } public TextInputDialog setView(@LayoutRes int id) { View rootView = LayoutInflater.from(getContext()).inflate(id, null); editText = (EditText) rootView.findViewById(R.id.text_input); editTextContainer = (TextInputLayout) rootView.findViewById(R.id.text_input_container); super.setView(rootView); editTextContainer.setErrorEnabled(true); return this; } public void setText(@Nullable CharSequence text) { editText.setText(text); } public void setHint(@StringRes int id) { editTextContainer.setHint(getContext().getResources().getString(id)); } public void selectAll() { editText.selectAll(); } public void setError(@Nullable CharSequence text) { editTextContainer.setError(text); } public void setPositiveButtonEnabled(boolean enabled) { getButton(DialogInterface.BUTTON_POSITIVE).setEnabled(enabled); } @Override public void onAttachedToWindow() { editText.addTextChangedListener(watcher); } @Override public void onDetachedFromWindow() { editText.removeTextChangedListener(watcher); } public static class DefaultCallback implements Callback { @Override public void onShow(@NonNull TextInputDialog dialog) { } @Override public void onTextChanged(@NonNull CharSequence text, @NonNull TextInputDialog dialog) { } @Override public void onSuccess(@NonNull CharSequence text) { } @Override public void onCancel() { } } private TextInputDialog(@NonNull Context context) { super(context); setButton(BUTTON_POSITIVE, getContext().getString(android.R.string.ok), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //DeviceUtil.hideSoftKeyboard(editText); if (callback != null) { callback.onSuccess(editText.getText()); } } }); setButton(BUTTON_NEGATIVE, getContext().getString(android.R.string.cancel), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //DeviceUtil.hideSoftKeyboard(editText); if (callback != null) { callback.onCancel(); } } }); setOnShowListener(new DialogInterface.OnShowListener() { @Override public void onShow(DialogInterface dialogInterface) { editText.requestFocus(); DeviceUtil.showSoftKeyboard(editText); if (callback != null) { callback.onShow(TextInputDialog.this); } } }); setOnDismissListener(new OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { //DeviceUtil.hideSoftKeyboard(editText); } }); } private class TextInputWatcher implements TextWatcher { @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { if (callback != null) { callback.onTextChanged(charSequence, TextInputDialog.this); } } @Override public void afterTextChanged(Editable editable) { } } }