I get some information from users during the registration process. I want to register each username to be unique. I call my methods as follows.
if(!nameRegister.isEmpty() && !surnameRegister.isEmpty()
&& !usernameRegister.isEmpty() && !emailRegister.isEmpty()
&& !passwordRegister.isEmpty() && !passwordConfirmRegister.isEmpty()){
if (passwordRegister.equals(passwordConfirmRegister)) {
isUsernameTaken = checkUsernameIsExist(nameRegister, surnameRegister, usernameRegister, emailRegister, passwordRegister);
if(!isUsernameTaken)
isMailAuthenticationSuccess = createUserWithEmailAndPassword(nameRegister, surnameRegister, usernameRegister, emailRegister, passwordRegister);
}else{
passwordConfirm.setError("Passwords does not match.");
passwordConfirm.requestFocus();
}
if(isMailAuthenticationSuccess)
saveUserToFirebase(newUser);
}
Its contents are as follows.
private boolean checkUsernameIsExist(final String nameRegister, final String surnameRegister, final String usernameRegister, final String emailRegister, final String passwordRegister) {
FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
DocumentReference docIdRef = rootRef.collection("users").document(usernameRegister);
docIdRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
DocumentSnapshot document = task.getResult();
if (document.exists()) {
isUsernameTaken = true;
Log.d(TAG, "Document exists!");
Toast.makeText(Register.this, "User name already taken", Toast.LENGTH_LONG).show();
} else {
Log.d(TAG, "Document does not exist!");
Toast.makeText(Register.this, "User can be taken", Toast.LENGTH_LONG).show();
}
} else {
Log.d(TAG, "Failed with: ", task.getException());
}
}
});
return isUsernameTaken;
}
private boolean createUserWithEmailAndPassword(final String nameRegister, final String surnameRegister, final String usernameRegister, final String emailRegister, String passwordRegister) {
auth.createUserWithEmailAndPassword(emailRegister, passwordRegister)
.addOnCompleteListener(Register.this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if(!task.isSuccessful()){
email.setError("Mail is already taken");
email.requestFocus();
}else{
newUser = new User(nameRegister, surnameRegister, usernameRegister, emailRegister);
isMailAuthenticationSuccess = true;
auth.signOut();
startActivity(new Intent(Register.this, Login.class));
finish();
}
}
});
return isMailAuthenticationSuccess;
}
private static void saveUserToFirebase(User newUser) {
FirebaseFirestore firebaseFirestore = FirebaseFirestore.getInstance();
firebaseFirestore.collection("users").document(newUser.getUsername())
.set(newUser)
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Log.d(TAG, "User add success.");
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.w(TAG, "user can not be added.", e);
}
});
}
Method can not add true boolean value to my variables. I think, addOnCompleteListener did not end before when assign to value my booleans.
However, if the user name can be obtained after user name control, user authentication is successful, but writing to Firebase does not take place. What could be the reason for this? I am waiting for your help.