ring account creation: fix name always registered

Before this patch, the username given in the textfield was always sent
for registration even if the corresponding checkbox is unchecked.

This patch fixes this mainly by checking the state of the checkbox
when initiating the creation of the Ring account.

The checkPassword method is also reworked to be more secure and
clearer with its return type.

Change-Id: I6f4075210b068c2e20e0986ace5a6c64d8710c0a
Reviewed-by: Thibault Wittemberg <thibault.wittemberg@savoirfairelinux.com>
diff --git a/ring-android/app/src/main/java/cx/ring/fragments/RegisterNameDialog.java b/ring-android/app/src/main/java/cx/ring/fragments/RegisterNameDialog.java
index 39b57a1..7fa726b 100644
--- a/ring-android/app/src/main/java/cx/ring/fragments/RegisterNameDialog.java
+++ b/ring-android/app/src/main/java/cx/ring/fragments/RegisterNameDialog.java
@@ -30,6 +30,7 @@
 import android.view.View;
 import android.view.WindowManager;
 import android.view.inputmethod.EditorInfo;
+import android.widget.Button;
 import android.widget.EditText;
 import android.widget.TextView;
 
@@ -83,7 +84,7 @@
     @Override
     public Dialog onCreateDialog(Bundle savedInstanceState) {
 
-        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
+        final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
 
         View view = getActivity().getLayoutInflater().inflate(R.layout.frag_register_name, null);
 
@@ -102,21 +103,36 @@
 
         builder.setMessage(mRegisterMessage)
                 .setTitle(mRegisterTitle)
-                .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
-                    @Override
-                    public void onClick(DialogInterface dialog, int which) {
-                        validate();
-                    }
-                })
+                .setPositiveButton(android.R.string.ok, null) //Set to null. We override the onclick
                 .setNegativeButton(android.R.string.cancel,
-                new DialogInterface.OnClickListener() {
-                    public void onClick(DialogInterface dialog, int whichButton) {
-                        dismiss();
-                    }
-                }
-        );
+                        new DialogInterface.OnClickListener() {
+                            public void onClick(DialogInterface dialog, int whichButton) {
+                                dismiss();
+                            }
+                        }
+                );
 
-        return builder.create();
+        AlertDialog result = builder.create();
+
+        result.setOnShowListener(new DialogInterface.OnShowListener() {
+
+            @Override
+            public void onShow(DialogInterface dialog) {
+
+                Button positiveButton = ((AlertDialog) dialog).getButton(AlertDialog.BUTTON_POSITIVE);
+                positiveButton.setOnClickListener(new View.OnClickListener() {
+
+                    @Override
+                    public void onClick(View view) {
+                        if (validate()) {
+                            dismiss();
+                        }
+                    }
+                });
+            }
+        });
+
+        return result;
     }
 
     @Override
@@ -139,15 +155,25 @@
         return mUsernameTxt.getText().toString();
     }
 
+    private boolean isValidUsername() {
+        return mUsernameTxtBox.getError() == null;
+    }
+
     public boolean checkInput() {
         if (mUsernameTxt.getText().toString().isEmpty()) {
             mUsernameTxtBox.setErrorEnabled(true);
             mUsernameTxtBox.setError(mPromptUsername);
             return false;
-        } else {
-            mUsernameTxtBox.setErrorEnabled(false);
-            mUsernameTxtBox.setError(null);
         }
+
+        if (!isValidUsername()) {
+            mUsernameTxt.requestFocus();
+            return false;
+        }
+
+        mUsernameTxtBox.setErrorEnabled(false);
+        mUsernameTxtBox.setError(null);
+
         if (mPasswordTxt.getText().toString().isEmpty()) {
             mPasswordTxtBox.setErrorEnabled(true);
             mPasswordTxtBox.setError(mPromptPassword);
@@ -163,7 +189,6 @@
         if (checkInput() && mListener != null) {
             final String username = mUsernameTxt.getText().toString();
             final String password = mPasswordTxt.getText().toString();
-            getDialog().dismiss();
             mListener.onRegisterName(username, password);
             return true;
         }
@@ -174,7 +199,12 @@
     public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
         if (v == mPasswordTxt) {
             if (actionId == EditorInfo.IME_ACTION_DONE) {
-                return validate();
+                boolean validationResult = validate();
+                if (validationResult) {
+                    getDialog().dismiss();
+                }
+
+                return validationResult;
             }
         }
         return false;
diff --git a/ring-android/app/src/main/java/cx/ring/fragments/RingAccountCreationFragment.java b/ring-android/app/src/main/java/cx/ring/fragments/RingAccountCreationFragment.java
index 4b99ce3..3ca3eb0 100644
--- a/ring-android/app/src/main/java/cx/ring/fragments/RingAccountCreationFragment.java
+++ b/ring-android/app/src/main/java/cx/ring/fragments/RingAccountCreationFragment.java
@@ -26,6 +26,7 @@
 import android.support.annotation.NonNull;
 import android.support.design.widget.TextInputLayout;
 import android.support.v7.app.ActionBar;
+import android.text.TextUtils;
 import android.text.TextWatcher;
 import android.util.Log;
 import android.view.KeyEvent;
@@ -80,28 +81,36 @@
     @BindView(R.id.ring_username_box)
     ViewGroup mUsernameBox;
 
+    /**
+     * Checks the validity of the given password.
+     *
+     * @param pwd     the first password.
+     * @param confirm the confirmation password.
+     * @return false if there is no error, true otherwise.
+     */
     private boolean checkPassword(@NonNull TextInputLayout pwd, TextInputLayout confirm) {
+        //~ Init
         boolean error = false;
         pwd.setError(null);
-        if (mUsernameSwitch.isChecked()) {
-            if (mUsernameTxt.getText().toString().isEmpty()) {
-                mUsernameTxtBox.setErrorEnabled(true);
-                mUsernameTxtBox.setError(getString(R.string.error_username_empty));
-                return true;
-            }
+        //~ Checking username presence.
+        if (mUsernameSwitch.isChecked() && TextUtils.isEmpty(mUsernameTxt.getText().toString())) {
+            mUsernameTxtBox.setErrorEnabled(true);
+            mUsernameTxtBox.setError(getString(R.string.error_username_empty));
+            return true;
         }
-        if (pwd.getEditText().getText().length() == 0) {
+        //~ Checking initial password.
+        if (pwd.getEditText() == null || TextUtils.isEmpty(pwd.getEditText().getText())) {
+            error = true;
+        } else if (pwd.getEditText().getText().length() < PASSWORD_MIN_LENGTH) {
+            pwd.setError(getString(R.string.error_password_char_count));
             error = true;
         } else {
-            if (pwd.getEditText().getText().length() < PASSWORD_MIN_LENGTH) {
-                pwd.setError(getString(R.string.error_password_char_count));
-                error = true;
-            } else {
-                pwd.setError(null);
-            }
+            pwd.setError(null);
         }
+        //~ Checking confirmation password.
         if (confirm != null) {
-            if (!pwd.getEditText().getText().toString().equals(confirm.getEditText().getText().toString())) {
+            if (confirm.getEditText() == null || !pwd.getEditText().getText().toString()
+                    .equals(confirm.getEditText().getText().toString())) {
                 confirm.setError(getString(R.string.error_passwords_not_equals));
                 error = true;
             } else {
@@ -162,10 +171,33 @@
         return false;
     }
 
+    private boolean isValidUsername() {
+        return mUsernameTxtBox.getError() == null;
+    }
+
     @OnClick(R.id.add_button)
-    public void onAddButtonClick(View view) {
-        if (!checkPassword(mPasswordTxtBox, mPasswordRepeatTxtBox))
-            ((AccountWizard) getActivity()).initAccountCreation(true, mUsernameTxt.getText().toString(), null, mPasswordTxt.getText().toString(), null);
+    public void onAddButtonClick() {
+        if (!checkPassword(mPasswordTxtBox, mPasswordRepeatTxtBox)) {
+            Activity wizardActivity = getActivity();
+            if (wizardActivity != null && wizardActivity instanceof AccountWizard) {
+                AccountWizard wizard = (AccountWizard) wizardActivity;
+                String username = null;
+                if (mUsernameSwitch.isChecked()
+                        && !TextUtils.isEmpty(mUsernameTxt.getText().toString())) {
+                    if (!isValidUsername()) {
+                        mUsernameTxt.requestFocus();
+                        return;
+                    }
+
+                    username = mUsernameTxt.getText().toString();
+                }
+                wizard.initAccountCreation(true,
+                        username,
+                        null,
+                        mPasswordTxt.getText().toString(),
+                        null);
+            }
+        }
     }
 
     @Override