package br.com.concretesolutions.canarinho.watcher;
import android.text.Editable;
import android.text.InputFilter;
import br.com.concretesolutions.canarinho.formatador.Formatador;
import br.com.concretesolutions.canarinho.validator.Validador;
import br.com.concretesolutions.canarinho.validator.ValidadorCPFCNPJ;
import br.com.concretesolutions.canarinho.watcher.evento.EventoDeValidacao;
/**
* {@link android.text.TextWatcher} responsável por formatar e validar um
* {@link android.widget.EditText} para CPF / CNPJ.
* Para usar este componente basta criar uma instância e chamar
* {@link android.widget.EditText#addTextChangedListener(android.text.TextWatcher)}.
*/
public class CPFCNPJTextWatcher extends BaseCanarinhoTextWatcher {
private static final char[] CPF = "###.###.###-##".toCharArray();
private static final char[] CNPJ = "##.###.###/####-##".toCharArray();
private static final InputFilter[] FILTRO_CPF_CNPJ = new InputFilter[]{new InputFilter.LengthFilter(CNPJ.length)};
private final Validador validador = ValidadorCPFCNPJ.getInstance();
private final Validador.ResultadoParcial resultadoParcial = new Validador.ResultadoParcial();
/**
* TODO Javadoc pendente
*/
public CPFCNPJTextWatcher() {
}
/**
* TODO Javadoc pendente
*
* @param callbackErros a descrever
*/
public CPFCNPJTextWatcher(EventoDeValidacao callbackErros) {
setEventoDeValidacao(callbackErros);
}
@Override
public void afterTextChanged(final Editable s) {
if (isMudancaInterna()) {
return;
}
s.setFilters(FILTRO_CPF_CNPJ);
final char[] mascara = ehCpf(s) ? CPF : CNPJ;
final StringBuilder builder = trataAdicaoRemocaoDeCaracter(s, mascara);
atualizaTexto(validador, resultadoParcial, s, builder);
}
// Verifica se o valor informado é cpf
private boolean ehCpf(Editable e) {
return Formatador.Padroes.PADRAO_SOMENTE_NUMEROS.matcher(e).replaceAll("").length() < 12;
}
}