package eu.ttbox.androgister.ui.core.validator.validate; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import android.content.Context; import android.text.Editable; import android.text.TextWatcher; import android.util.Log; import android.widget.TextView; import eu.ttbox.androgister.ui.core.validator.ValidateField; import eu.ttbox.androgister.ui.core.validator.Validator; import eu.ttbox.androgister.ui.core.validator.ValidatorException; public class ValidateTextView implements ValidateField { private static final String TAG = "ValidateTextView"; /** * Validator chain */ protected ArrayList<Validator> mValidators = new ArrayList<Validator>(); /** * Validation failure messages */ protected String mMessage = ""; protected TextView mSource; private Context mContext; public ValidateTextView(TextView source) { this(source, true); } public ValidateTextView(TextView source, boolean isTextWatcher) { this.mSource = source; this.mContext = source.getContext(); if (isTextWatcher) { this.mSource.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void afterTextChanged(Editable s) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { // Clear on Input if (s != null && s.length() > 0 && mSource.getError() != null) { mSource.setError(null); } // Check On input if (!isValid(s)) { mSource.setError(mMessage); } } }); } } /** * Adds a validator to the end of the chain * * @param validator */ public ValidateTextView addValidator(Validator validator) { this.mValidators.add(validator); return this; } public ValidateTextView addValidator(Validator... validator) { if (validator != null && validator.length > 0) { this.mValidators.addAll(Arrays.asList(validator)); } return this; } @Override public boolean isValid(CharSequence value) { boolean result = true; this.mMessage = ""; Iterator<Validator> it = this.mValidators.iterator(); while (it.hasNext()) { Validator validator = it.next(); try { if (!validator.isValid(value)) { this.mMessage = validator.getMessage(mContext); result = false; break; } } catch (ValidatorException e) { Log.e(TAG, "ValidatorException : " + e.getMessage(), e); this.mMessage = e.getMessage(); result = false; break; } } return result; } public String getMessages() { return this.mMessage; } public TextView getSource() { return this.mSource; } }