package com.jasonrobinson.racer.ui.ladder; import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.os.Bundle; import android.support.annotation.NonNull; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.RadioButton; import android.widget.Toast; import com.jasonrobinson.racer.R; import com.jasonrobinson.racer.model.WatchType; import com.jasonrobinson.racer.ui.base.BaseDialogFragment; import com.jasonrobinson.racer.util.RawTypeface; import com.metova.slim.Slim; import com.metova.slim.annotation.Extra; import java.util.regex.Pattern; import butterknife.ButterKnife; import butterknife.InjectView; public class WatchCharacterDialogFragment extends BaseDialogFragment { public static final String EXTRA_NAME = "name"; public static final String EXTRA_TYPE = "type"; private static final Pattern PATTERN_CHARACTER = Pattern.compile("[a-zA-Z_]{3,}"); private static final Pattern PATTERN_ACCOUNT = Pattern.compile("[a-zA-Z_\\d]{3,}"); @InjectView(R.id.name_EditText) EditText mNameEditText; @InjectView(R.id.character_RadioButton) RadioButton mCharacterRadioButton; @InjectView(R.id.account_RadioButton) RadioButton mAccountRadioButton; @Extra(value = EXTRA_NAME, optional = true) String mName; @Extra(value = EXTRA_TYPE, optional = true) WatchType mType; WatchCharacterDialogListener mListener; public static WatchCharacterDialogFragment newInstance(String prepopulatedName, WatchType prepopulatedType) { WatchCharacterDialogFragment fragment = new WatchCharacterDialogFragment(); Bundle args = new Bundle(); args.putString(EXTRA_NAME, prepopulatedName); args.putSerializable(EXTRA_TYPE, prepopulatedType); fragment.setArguments(args); return fragment; } @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { if (mListener == null) { throw new IllegalStateException(WatchCharacterDialogListener.class.getSimpleName() + " has not been set"); } Slim.injectExtras(getArguments(), this); AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setIcon(R.drawable.ic_action_search_dark); builder.setTitle(R.string.watch_character); View v = LayoutInflater.from(getActivity()).inflate(R.layout.watch_character_dialog, null); builder.setView(v); ButterKnife.inject(this, v); mNameEditText.setTypeface(RawTypeface.obtain(getActivity(), R.raw.fontin_regular)); mNameEditText.setText(mName); if (mType != null) { switch (mType) { case ACCOUNT: mAccountRadioButton.setChecked(true); break; case CHARACTER: mCharacterRadioButton.setChecked(true); break; } } builder.setPositiveButton(R.string.watch, null); // Overwritten later builder.setNeutralButton(R.string.remove, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { mListener.onRemove(); } }); builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { mListener.onCancel(); } }); return builder.create(); } @Override public void onStart() { super.onStart(); final AlertDialog dialog = (AlertDialog) getDialog(); // This allows us to do validation before accepting the input Button b = dialog.getButton(AlertDialog.BUTTON_POSITIVE); b.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String name = mNameEditText.getText().toString(); WatchType type = mCharacterRadioButton.isChecked() ? WatchType.CHARACTER : WatchType.ACCOUNT; Pattern pattern = null; switch (type) { case CHARACTER: pattern = PATTERN_CHARACTER; break; case ACCOUNT: pattern = PATTERN_ACCOUNT; break; } if (pattern.matcher(name).matches()) { mListener.onNameSelected(name, type); dialog.dismiss(); } else { Toast.makeText(getActivity(), R.string.watcher_input_error, Toast.LENGTH_LONG).show(); } } }); } public void setWatchCharacterDialogListener(WatchCharacterDialogListener l) { mListener = l; } public interface WatchCharacterDialogListener { public void onNameSelected(String name, WatchType type); public void onRemove(); public void onCancel(); } }