package com.gettingmobile.goodnews.settings; import android.content.Context; import android.preference.EditTextPreference; import android.text.Editable; import android.text.TextWatcher; import android.util.AttributeSet; import android.view.View; import android.widget.EditText; import android.widget.Toast; import com.gettingmobile.goodnews.R; public class EditTagNamePreference extends EditTextPreference { private static final char[] INVALID_CHARACTERS = { '"', '<', '>', '?', '&', '/', '\\', '^', ','}; private static final String INVALID_CHARACTERS_LIST; static { final StringBuilder sb = new StringBuilder("\""); for (char c : INVALID_CHARACTERS) { sb.append(' ').append(c); } INVALID_CHARACTERS_LIST = sb.toString(); } public EditTagNamePreference(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public EditTagNamePreference(Context context, AttributeSet attrs) { super(context, attrs); } public EditTagNamePreference(Context context) { super(context); } @Override protected void onAddEditTextToDialogView(View dialogView, EditText editText) { super.onAddEditTextToDialogView(dialogView, editText); editText.addTextChangedListener(new TagNameWatcher()); } protected void toastInputError() { final String text = String.format( getContext().getText(R.string.invalid_tag_name_characters).toString(), INVALID_CHARACTERS_LIST); Toast.makeText(getContext(), text, Toast.LENGTH_LONG).show(); } /* * inner classes */ class TagNameWatcher implements TextWatcher { private boolean inTextChange = false; @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { // nothing to be done } @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { // nothing to be done } @Override public void afterTextChanged(Editable editable) { final boolean topLevelCall = !inTextChange; inTextChange = true; try { /* * find first invalid character position and delete it. This will trigger the method again, so that all * invalid characters will be deleted. */ final String text = editable.toString(); for (char c : INVALID_CHARACTERS) { final int index = text.indexOf(c); if (index > -1) { editable.delete(index, index + 1); if (topLevelCall) { toastInputError(); } break; } } } finally { inTextChange = false; } } } }