package com.pam.codenamehippie.controleur.validation; import android.content.Context; import android.database.Observable; import android.support.annotation.NonNull; import android.support.annotation.StringRes; import android.text.Editable; import android.text.TextUtils; import android.text.TextWatcher; import android.widget.EditText; import com.pam.codenamehippie.R; /** * Classe de base pour les classes de validation de champ texte */ public class ValidateurDeChampTexte extends Observable<ValidateurObserver> implements TextWatcher, Validateur { /** * Longueur maximale d'un champ courriel */ public static final int COURRIEL_LONGUEUR_MAX = 255; /** * Longueur maximale du champ de mot de passe */ public static final int MOT_PASSE_LONGUEUR_MAX = 255; /** * Longueur maximale du champ nom pour organime/utilisateur */ public static final int NOM_LONGUEUR_MAX = 30; /** * Longueur maximale du champ nom pour alimentaire */ public static final int NOM_ALIMENTAIRE_LONGUEUR_MAX = 50; /** * Longueur maximale du champ description pour alimentaire */ public static final int DESCRIPTION_ALIMENTAIRE_LONGUEUR_MAX = 100; /** * Longueur maximale du champ quantite pour alimentaire */ public static final int QUANTITE_ALIMENTAIRE_LONGUEUR_MAX = 11; /** * Longueur maximale du champ valeur pour alimentaire */ public static final int VALEUR_ALIMENTAIRE_LONGUEUR_MAX = 11; /** * Longueur maximale du champ prenom */ public static final int PRENOM_LONGUEUR_MAX = 30; /** * Longueur maximale du champ code postal */ public static final int CODE_POSTAL_LONGUEUR_MAX = 7; /** * Longueur maximale du champ no telephone */ public static final int NO_TELEPHONE_LONGUEUR_MAX = 10; /** * Longueur maximale du NEQ */ public static final int NEQ_LONGUEUR_MAX = 10; /** * Longueur maximale de l'OSBL */ public static final int OSBL_LONGUEUR_MAX = 15; /** * Longueur maximum pour le champ quantité avec critère ########.## */ private static final int PARTIE_ENTIERE = 8; private static final int PARTIE_FRACTIONNAIRE = 2; /** * {@link Context} pour aller chercher les ressources. */ protected final Context context; /** * Défini la longueure maximale du champ */ protected final int longueurMaximale; /** * {@link EditText} à valider. */ protected final EditText editText; /** * Defini si le champ validé est requis. */ protected final boolean estRequis; /** * Défini si le champ validé est numérique */ protected boolean estNumerique; protected ValidateurDeChampTexte(@NonNull Context context, @NonNull EditText champText, boolean requis, int longueurMaximale) { this.context = context; this.editText = champText; this.estRequis = requis; this.longueurMaximale = longueurMaximale; } public static ValidateurDeChampTexte newInstance(@NonNull Context context, @NonNull EditText champText, boolean requis, int longueurMaximale) { return new ValidateurDeChampTexte(context, champText, requis, longueurMaximale); } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void afterTextChanged(Editable s) { this.notifierLesVoyeurs(this.estValide()); } @Override public boolean estValide() { Editable text = this.getText(); // Si le champ est vide et requis if (TextUtils.isEmpty(text) && (this.estRequis)) { this.editText.setError(this.context.getString(R.string.error_field_required)); return false; // Si la longueur maximal du champ est dépassée } else if (text.length() > this.longueurMaximale) { this.editText.setError(this.context.getString(R.string.error_field_too_long)); return false; // Si le champ est numérique } else if(this.estNumerique) { String parts []= this.getTextString().split("\\."); // Si le nombre d'élément dans le tableau différent de 0 et la longueur de l'élément // à l'indice 0 est plus grand que la partie entière maximale. if ((parts.length != 0) && (parts[0].length() > PARTIE_ENTIERE)) { this.editText.setError(this.context.getString(R.string.error_field_too_long)); return false; // Si le nombre d'élément dans le tableau plus grand que 1 et la longueur de l'élément // à l'indice 1 est plus grand que la partie fractionnaire maximale. } else if ((parts.length > 1) && parts[1].length() > PARTIE_FRACTIONNAIRE){ this.editText.setError(this.context.getString(R.string.error_field_too_long)); return false; } } return true; } @Override public void onPause() { this.editText.removeTextChangedListener(this); } @Override public void onResume() { this.editText.addTextChangedListener(this); this.notifierLesVoyeurs(this.estValide()); } /** * Accesseur du champ observé * * @return le champ observé */ public EditText getEditText() { return this.editText; } /** * Accesseur de comodité pour la valeur du champ observé * * @return la valeur du champ observé. */ public Editable getText() { return this.editText.getText(); } /** * Mutateur de comodité pour la valeur du champ observé * * @see EditText#setText(int) */ public final void setText(@StringRes int resId) { this.editText.setText(resId); this.afterTextChanged(this.editText.getText()); } /** * Mutateur de comodité pour la valeur du champ observé * * @see EditText#setText(CharSequence) */ public final void setText(CharSequence text) { this.editText.setText(text); this.afterTextChanged(this.editText.getText()); } /** * Accesseur de comodité pour la valeur du champ observé * * @return la valeur du champ observé. */ public String getTextString() { return this.getText().toString(); } /** * Accesseur de la longueur maximale du champ * * @return la longueur maximale du champ */ public int getLongueurMaximale() { return this.longueurMaximale; } /** * Accesseur du champ est requis * * @return vrai si le champ est requis */ public boolean estRequis() { return this.estRequis; } public boolean estNumerique() { return this.estNumerique; } public void setEstNumerique(boolean estNumerique) { this.estNumerique = estNumerique; } /** * Notifie les observateur. * * @param estValide * valeur à envoyer à ceux-ci */ protected void notifierLesVoyeurs(boolean estValide) { synchronized (this.mObservers) { if (!this.mObservers.isEmpty()) { for (ValidateurObserver observer : this.mObservers) { observer.enValidant(this, estValide); } } } } }