package com.pam.codenamehippie.ui; import android.content.Intent; import android.os.Bundle; import android.support.design.widget.Snackbar; import android.view.KeyEvent; import android.view.View; import android.view.inputmethod.EditorInfo; import android.widget.Button; import android.widget.EditText; import android.widget.RadioButton; import android.widget.Spinner; import android.widget.TextView; import com.pam.codenamehippie.HippieApplication; import com.pam.codenamehippie.R; import com.pam.codenamehippie.controleur.validation.Validateur; import com.pam.codenamehippie.controleur.validation.ValidateurCourriel; import com.pam.codenamehippie.controleur.validation.ValidateurDeChampTexte; import com.pam.codenamehippie.controleur.validation.ValidateurDeSpinner; import com.pam.codenamehippie.controleur.validation.ValidateurMotDePasse; import com.pam.codenamehippie.controleur.validation.ValidateurObserver; import com.pam.codenamehippie.modele.UtilisateurModele; import com.pam.codenamehippie.modele.depot.DepotManager; import com.pam.codenamehippie.modele.depot.ObservateurDeDepot; import com.pam.codenamehippie.modele.depot.UtilisateurModeleDepot; import com.pam.codenamehippie.ui.adapter.HippieSpinnerAdapter; import java.io.IOException; import java.util.List; import okhttp3.Call; import okhttp3.Callback; import okhttp3.FormBody; import okhttp3.HttpUrl; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; public class RegisterActivity extends HippieActivity implements ValidateurObserver, EditText.OnEditorActionListener, ObservateurDeDepot<UtilisateurModele> { // Variable static final pour le spinner private static final String SELECTED_SPINNER_TYPE_RUE_POSITION = "position_type_rue"; // Section des informations d'utilisateur private ValidateurDeChampTexte validateurNom; private boolean nomEstValide; private ValidateurDeChampTexte validateurPrenom; private boolean prenomEstValide; private ValidateurDeChampTexte validateurUsername; private boolean usernameEstValide; private ValidateurMotDePasse validateurMotDePasse; private boolean motPasseEstValide; private ValidateurMotDePasse validateurConfirmMotDePasse; private boolean confirmMotdePasseEstValide; // Section des informations sur les moyens de contact private ValidateurCourriel validateurCourriel; private boolean courrielEstValide; private ValidateurDeChampTexte validateurTelephone; private boolean telephoneEstValide; // TODO : Vérifier comment fonctionne les radios button/radio group // Section des informations sur l'adresse de l'organisme private ValidateurDeChampTexte validateurNoCivique; private boolean noCiviqueEstValide; private ValidateurDeSpinner validateurSpinnerTypeRue; private boolean spinnerTypeRueEstValide; private ValidateurDeChampTexte validateurNomRue; private boolean nomRueEstValide; private ValidateurDeChampTexte validateurVille; private boolean villeEstValide; private ValidateurDeChampTexte validateurProvince; private boolean provinceEstValide; private ValidateurDeChampTexte validateurCodePostal; private boolean codePostalEstValide; private ValidateurDeChampTexte validateurPays; private boolean paysEstValide; // Section information sur l'entreprise (no entreprise et/ou osbl) private ValidateurDeChampTexte validateurNoEntreprise; private boolean noEntrepriseEstValide; private ValidateurDeChampTexte validateurNoOsbl; private boolean noOsblEstValide; private Button loginButton; private UtilisateurModele modele; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setContentView(R.layout.activity_register); this.httpClient = ((HippieApplication) this.getApplication()).getHttpClient(); /** * SECTION INFORMATIONS D'UTILISATEUR */ // Validateur pour le nom EditText etInscriptionNom = ((EditText) this.findViewById(R.id.etInscriptionNom)); this.validateurNom = ValidateurDeChampTexte.newInstance(this, etInscriptionNom, true, ValidateurDeChampTexte.NOM_LONGUEUR_MAX ); this.validateurNom.registerObserver(this); // Validateur pour le prénom EditText etInscriptionPrenom = ((EditText) this.findViewById(R.id.etInscriptionPrenom)); this.validateurPrenom = ValidateurDeChampTexte.newInstance(this, etInscriptionPrenom, true, ValidateurDeChampTexte.PRENOM_LONGUEUR_MAX ); this.validateurPrenom.registerObserver(this); // Validateur pour le nom d'utilisateur EditText etUsername = (EditText) this.findViewById(R.id.etUsername); this.validateurUsername = ValidateurDeChampTexte.newInstance(this, etUsername, true, ValidateurDeChampTexte.NOM_LONGUEUR_MAX); // Validateur pour le mot de passe et confirmer le mot de passe EditText etPassword = ((EditText) this.findViewById(R.id.etPassword)); this.validateurMotDePasse = ValidateurMotDePasse.newInstance(this, etPassword); this.validateurMotDePasse.registerObserver(this); EditText etConfirmPassword = ((EditText) this.findViewById(R.id.etConfirmPassword)); etConfirmPassword.setOnEditorActionListener(this); this.validateurConfirmMotDePasse = ValidateurMotDePasse.newInstance(this, etConfirmPassword); this.validateurConfirmMotDePasse.registerObserver(this); // SECTION INFORMATION SUR LES MOYENS DE CONTACT // Validateur pour le courriel EditText etCourriel = ((EditText) this.findViewById(R.id.etCourriel)); this.validateurCourriel = ValidateurCourriel.newInstance(this, etCourriel, true); this.validateurCourriel.registerObserver(this); // Validateur pour le téléphone EditText etTelephone = (EditText) this.findViewById(R.id.etTelephone); this.validateurTelephone = ValidateurDeChampTexte.newInstance(this, etTelephone, true, ValidateurDeChampTexte.NO_TELEPHONE_LONGUEUR_MAX); // Validateur pour le moyen de contact // TODO: Ajouter le validateur pour le radiogroup des moyens de contact // Radio group ID : rgMoyenContact // Radio button ID : rbCourriel, rbTelephone et rbBoth /** * SECTION ADRESSE */ // Validateur pour le numéro civique EditText etNoCivique = (EditText) this.findViewById(R.id.etNoCivique); this.validateurNoCivique = ValidateurDeChampTexte.newInstance(this, etNoCivique, true, ValidateurDeChampTexte.NO_TELEPHONE_LONGUEUR_MAX); // Validateur pour le spinner du type de rue Spinner spinnerTypeRue = (Spinner) this.findViewById(R.id.spinnerTypeRue); this.validateurSpinnerTypeRue = ValidateurDeSpinner.newInstance(spinnerTypeRue); this.validateurSpinnerTypeRue.registerObserver(this); // Binder les type de rues au spinnerTypeRue // TODO : Vérifier si tout est correct UtilisateurModeleDepot utilisateurModeleDepot = DepotManager.getInstance().getUtilisateurModeleDepot(); HippieSpinnerAdapter typeRueAdapter = new HippieSpinnerAdapter(this); spinnerTypeRue.setAdapter(typeRueAdapter); // Validateur pour le nom de rue EditText etNomRue = (EditText) this.findViewById(R.id.etNomRue); this.validateurNomRue = ValidateurDeChampTexte.newInstance(this, etNomRue, true, ValidateurDeChampTexte.NOM_LONGUEUR_MAX); // Validateur pour le nom de la ville EditText etVille = (EditText) this.findViewById(R.id.etVille); this.validateurVille = ValidateurDeChampTexte.newInstance(this, etVille, true, ValidateurDeChampTexte.NOM_LONGUEUR_MAX); // Validateur pour la province EditText etProvince = (EditText) this.findViewById(R.id.etProvince); this.validateurProvince = ValidateurDeChampTexte.newInstance(this, etProvince, true, ValidateurDeChampTexte.NOM_LONGUEUR_MAX); // Validateur pour le code postal EditText etCodePostal = (EditText) this.findViewById(R.id.etCodePostal); this.validateurCodePostal = ValidateurDeChampTexte.newInstance(this, etCodePostal, true, ValidateurDeChampTexte.CODE_POSTAL_LONGUEUR_MAX); // Validateur pour le pays EditText etPays = (EditText) this.findViewById(R.id.etPays); this.validateurPays = ValidateurDeChampTexte.newInstance(this, etPays, true, ValidateurDeChampTexte.NOM_LONGUEUR_MAX); /** * SECTION ENTREPRISE / ORGANISME */ // TODO : Radio button/group, regarder ça. // RadioGroup ID : rgEtesVous // RadioButton ID : rbEntreprise et rbOrganisme RadioButton rbEntreprise = (RadioButton) this.findViewById(R.id.rbEntreprise); RadioButton rbOrganisme = (RadioButton) this.findViewById(R.id.rbOrganisme); // Validateur pour le numéro d'entreprise EditText etNoEntreprise = (EditText) this.findViewById(R.id.etNoEntreprise); this.validateurNoEntreprise = ValidateurDeChampTexte.newInstance(this, etNoEntreprise, true, ValidateurDeChampTexte.NEQ_LONGUEUR_MAX); // Validateur pour le numéro d'OSBL EditText etNoOsbl = (EditText) this.findViewById(R.id.etNoOsbl); this.validateurNoOsbl = ValidateurDeChampTexte.newInstance(this, etNoOsbl, true, ValidateurDeChampTexte.OSBL_LONGUEUR_MAX); // Bouton pour s'inscrire this.loginButton = (Button) this.findViewById(R.id.bLogin); } @Override protected void onPause() { super.onPause(); this.validateurPrenom.onPause(); this.validateurNom.onPause(); this.validateurCourriel.onPause(); this.validateurMotDePasse.onPause(); this.validateurConfirmMotDePasse.onPause(); this.validateurUsername.onPause(); this.validateurNomRue.onPause(); this.validateurVille.onPause(); this.validateurProvince.onPause(); this.validateurCodePostal.onPause(); this.validateurNoCivique.onPause(); this.validateurNoEntreprise.onPause(); this.validateurNoOsbl.onPause(); this.validateurTelephone.onPause(); this.validateurSpinnerTypeRue.onPause(); this.validateurPays.onPause(); } protected void onResume() { super.onResume(); this.validateurPrenom.onResume(); this.validateurNom.onResume(); this.validateurCourriel.onResume(); this.validateurMotDePasse.onResume(); this.validateurConfirmMotDePasse.onResume(); this.validateurUsername.onResume(); this.validateurNomRue.onResume(); this.validateurVille.onResume(); this.validateurProvince.onResume(); this.validateurCodePostal.onResume(); this.validateurNoCivique.onResume(); this.validateurNoEntreprise.onResume(); this.validateurNoOsbl.onResume(); this.validateurTelephone.onResume(); this.validateurSpinnerTypeRue.onResume(); this.validateurPays.onResume(); // FIXME : Peupler les listes de spinners pour le type de rue? } @Override public void enValidant(Validateur validateur, boolean estValide) { if (validateur.equals(this.validateurPrenom)) { this.prenomEstValide = estValide; } else if (validateur.equals(this.validateurNom)) { this.nomEstValide = estValide; } else if (validateur.equals(this.validateurCourriel)) { this.courrielEstValide = estValide; } else if (validateur.equals(this.validateurMotDePasse)) { this.motPasseEstValide = estValide; if ((this.motPasseEstValide && this.confirmMotdePasseEstValide)) { int cmp = this.validateurMotDePasse.getTextString() .compareTo(this.validateurConfirmMotDePasse .getTextString()); if (cmp == 0) { String error = this.getString(R.string.error_confirm_password); this.validateurConfirmMotDePasse.getEditText() .setError(null); } } } else if (validateur.equals(this.validateurConfirmMotDePasse)) { this.confirmMotdePasseEstValide = estValide; if ((this.motPasseEstValide && this.confirmMotdePasseEstValide)) { int cmp = this.validateurMotDePasse.getTextString() .compareTo(this.validateurConfirmMotDePasse .getTextString()); if (cmp != 0) { String error = this.getString(R.string.error_confirm_password); this.validateurConfirmMotDePasse.getEditText() .setError(error); } } } else if (validateur.equals(this.validateurCodePostal)) { this.codePostalEstValide = estValide; } else if (validateur.equals(this.validateurNoCivique)) { this.noCiviqueEstValide = estValide; } else if (validateur.equals(this.validateurNoEntreprise)) { this.noEntrepriseEstValide = estValide; } else if (validateur.equals(this.validateurNomRue)) { this.nomRueEstValide = estValide; } else if (validateur.equals(this.validateurNoOsbl)) { this.noOsblEstValide = estValide; } else if (validateur.equals(this.validateurPays)) { this.paysEstValide = estValide; } else if (validateur.equals(this.validateurSpinnerTypeRue)) { this.spinnerTypeRueEstValide = estValide; } else if (validateur.equals(this.validateurVille)) { this.villeEstValide = estValide; } else if (validateur.equals(this.validateurTelephone)) { this.telephoneEstValide = estValide; } else if (validateur.equals(this.validateurUsername)) { this.usernameEstValide = estValide; } else if (validateur.equals(this.validateurProvince)) { this.provinceEstValide = estValide; } this.loginButton.setEnabled(this.motPasseEstValide && this.confirmMotdePasseEstValide && this.prenomEstValide && this.nomEstValide && this.courrielEstValide && this.codePostalEstValide && this.noCiviqueEstValide && this.noEntrepriseEstValide && this.nomRueEstValide && this.noOsblEstValide && this.paysEstValide && this.spinnerTypeRueEstValide && this.villeEstValide && this.telephoneEstValide && this.usernameEstValide && this.provinceEstValide ); } @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { boolean handled = false; switch (actionId) { case EditorInfo.IME_ACTION_DONE: if (this.loginButton.isEnabled()) { this.soummettreLaConnexion(v); } handled = true; break; default: break; } return handled; } /** * Methode déclechant la connection. * * @param v * un objet view qui est en lien avec l'interaction de connection. */ public void soummettreLaConnexion(final View v) { // TODO: RAJOUTER LES ORGANISMES //FIXME: Utiliser depot RequestBody body = new FormBody.Builder().add("nom", this.validateurNom.getTextString()) .add("prenom", this.validateurPrenom.getTextString()) .add("mot_de_passe", this.validateurMotDePasse.getTextString() ) .add("courriel", this.validateurCourriel.getTextString()) .build(); HttpUrl url = HippieApplication.BASE_URL.newBuilder().addPathSegment("utilisateur").build(); Request request = new Request.Builder().url(url).post(body).build(); this.httpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { RegisterActivity.this.runOnUiThread(new Runnable() { @Override public void run() { Snackbar.make(v, R.string.error_connection, Snackbar.LENGTH_SHORT).show(); } }); // On "déconnecte": on a échoué. RegisterActivity.this.authentificateur.deconnecter(); } @Override public void onResponse(Call call, Response response) { if (!response.isSuccessful()) { switch (response.code()) { case 409: RegisterActivity.this.runOnUiThread(new Runnable() { @Override public void run() { Snackbar.make(v, R.string.error_invalid_email, Snackbar.LENGTH_SHORT ) .show(); // L'adresse est invalide on la supprime RegisterActivity.this.validateurCourriel.setText(null); } }); break; default: RegisterActivity.this.runOnUiThread(new Runnable() { @Override public void run() { Snackbar.make(v, R.string.error_connection, Snackbar.LENGTH_SHORT ) .show(); } }); break; } RegisterActivity.this.authentificateur.deconnecter(); } else { RegisterActivity.this.sauvegarderFormulaire(); RegisterActivity.this.navigueAMainActivity(); } } }); } private void sauvegarderFormulaire() { this.authentificateur.setMotDePasse(this.validateurMotDePasse.getText().toString()); } /** * Methode d'aide pour démarrer sur le main thread la main activity et appeler finish. */ private void navigueAMainActivity() { RegisterActivity.this.runOnUiThread(new Runnable() { @Override public void run() { Intent intent = new Intent(RegisterActivity.this, InfoActivity.class); RegisterActivity.this.startActivity(intent); RegisterActivity.this.finish(); } }); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt(SELECTED_SPINNER_TYPE_RUE_POSITION, this.validateurSpinnerTypeRue.getSelectedItemPosition() ); } @Override public void surDebutDeRequete() { } @Override public void surChangementDeDonnees(List<UtilisateurModele> modeles) { if ((modeles != null) && (modeles.size() != 0)) { this.modele = modeles.get(0); } } @Override public void surFinDeRequete() { } @Override public void surErreur(IOException e) { } }