package com.orgzly.android.prefs; import android.annotation.TargetApi; import android.app.AlertDialog; import android.content.Context; import android.os.Bundle; import android.preference.DialogPreference; import android.support.design.widget.TextInputLayout; import android.text.Editable; import android.text.TextWatcher; import android.util.AttributeSet; import android.view.View; import android.widget.Button; import android.widget.EditText; import com.orgzly.R; import com.orgzly.org.OrgStatesWorkflow; import com.orgzly.org.utils.ArrayListSpaceSeparated; import java.util.HashSet; import java.util.Set; public class StatesPreference extends DialogPreference { private TextInputLayout todoLayout; private EditText todoStates; private TextInputLayout doneLayout; private EditText doneStates; @TargetApi(21) public StatesPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); setDialogLayoutResource(R.layout.pref_dialog_states); } public StatesPreference(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); setDialogLayoutResource(R.layout.pref_dialog_states); } public StatesPreference(Context context, AttributeSet attrs) { super(context, attrs); setDialogLayoutResource(R.layout.pref_dialog_states); } @TargetApi(21) public StatesPreference(Context context) { super(context); setDialogLayoutResource(R.layout.pref_dialog_states); } @Override protected void onBindDialogView(View view) { super.onBindDialogView(view); todoStates = (EditText) view.findViewById(R.id.todo_states); todoLayout = (TextInputLayout) view.findViewById(R.id.todo_states_layout); doneStates = (EditText) view.findViewById(R.id.done_states); doneLayout = (TextInputLayout) view.findViewById(R.id.done_states_layout); TextWatcher watcher = new 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) { } @Override public void afterTextChanged(Editable editable) { validateAndUpdateButton(); } }; todoStates.addTextChangedListener(watcher); doneStates.addTextChangedListener(watcher); StateWorkflows value = new StateWorkflows(AppPreferences.states(getContext())); if (value.size() > 0) { todoStates.setText(value.get(0).getTodoKeywords().toString()); doneStates.setText(value.get(0).getDoneKeywords().toString()); } } @Override protected void showDialog(Bundle state) { super.showDialog(state); /* Validate states when dialog is displayed for the first time. */ validateAndUpdateButton(); } private void validateAndUpdateButton() { AlertDialog d = (AlertDialog) getDialog(); if (d != null) { Button button = d.getButton(AlertDialog.BUTTON_POSITIVE); if (button != null) { button.setEnabled(isValid()); } } } /** * Check for duplicate state keywords. */ private boolean isValid() { todoLayout.setError(null); doneLayout.setError(null); Set<String> keywords = new HashSet<>(); for (String k: new ArrayListSpaceSeparated(todoStates.getText().toString())) { if (keywords.contains(k)) { todoLayout.setError(getContext().getString(R.string.duplicate_keywords_not_allowed, k)); return false; } keywords.add(k); } for (String k: new ArrayListSpaceSeparated(doneStates.getText().toString())) { if (keywords.contains(k)) { doneLayout.setError(getContext().getString(R.string.duplicate_keywords_not_allowed, k)); return false; } keywords.add(k); } return true; } @Override protected void onDialogClosed(boolean positiveResult) { super.onDialogClosed(positiveResult); if (positiveResult) { OrgStatesWorkflow workflow = new OrgStatesWorkflow( new ArrayListSpaceSeparated(todoStates.getText().toString()), new ArrayListSpaceSeparated(doneStates.getText().toString()) ); String value = workflow.toString(); AppPreferences.states(getContext(), value); setSummary(value); } } @Override public CharSequence getSummary() { String s = AppPreferences.states(getContext()).trim(); if ("|".equals(s)) { s = getContext().getString(R.string.no_states_defined); } return s; } }