I am trying to check for an entry in my Firebase Database asynchronously using an interface, but I'm not sure how to implement it in the same way I have for password and email.
Example:
if (TextUtils.isEmpty(password) || !isPasswordValid(password)) {
mPasswordView.setError(getString(R.string.error_invalid_password));
focusView = mPasswordView;
cancel = true;
}
private boolean isPasswordValid(String password) {
// Add logic to check for a valid password (minimum 8 characters)
String confirmPassword = mConfirmPasswordView.getText().toString();
return (confirmPassword.equals(password)) && (password.length() > 7) && (password != "12345678") && (password != "password");
}
I am attempting to create a similar method with username that checks for the entered username in Firebase and then returns true if data is found. I've created a method (fetchUsername) to check for the name in Firebase on the background thread, but cannot figure out how to properly pass the result back to the final method and return a boolean. I believe I'm making a silly syntax error, but I can't see it. Here is what I have:
private boolean isUsernameDuplicate(final String username) {
boolean userIsOnFirebase ( boolean isOnFirebase){ ///<----line that won't take, wants semicolon after variable
if (isOnFirebase) {
return true;
} else {
return false;
}
}
fetchUsername(username, new FirebaseSuccessListener() {
@Override
public void onDataFound(boolean isDataFetched) {
if (isDataFetched) {
userIsOnFirebase(true);
} else {
userIsOnFirebase(false);
}
}
});
return userIsOnFirebase;
}
private void fetchUsername(final String username, final FirebaseSuccessListener dataFetched) {
//checks database for username
mReference = FirebaseDatabase.getInstance().getReference().child("users").child("username");
mReference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
dataFetched.onDataFound(true);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
public interface FirebaseSuccessListener {
void onDataFound(boolean isDataFetched);
}
Edit: Here is my solution:
//member Variables
String checkedUsername;
private void attemptRegistration() {
// Reset errors displayed in the form.
mEmailView.setError(null);
mPasswordView.setError(null);
checkedUsername=null;
// Store values at the time of the login attempt.
String email = mEmailView.getText().toString();
String password = mPasswordView.getText().toString();
String username = mUsernameView.getText().toString();
boolean cancel = false;
View focusView = null;
if (TextUtils.isEmpty(username)) {
mUsernameView.setError(getString(R.string.error_field_required));
focusView = mUsernameView;
cancel = true;
}
if (!isUsernameValid(username)) {
mUsernameView.setError("Username is taken");
focusView = mUsernameView;
cancel = true;
}
private boolean isUsernameValid(String username) {
if (!duplicateUsername(username)) {
return true;
} else {
Toast.makeText(this, "Username is taken", Toast.LENGTH_LONG);
return false;
}
}
private boolean duplicateUsername(String username) {
if (fetchUsername(username) != null) {
return true;
}
return false;
}
private String fetchUsername(final String username) {
//checks database for username
mReference = FirebaseDatabase.getInstance().getReference().child("users");
mReference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
User user = new User();
user = dataSnapshot.getValue(User.class);
if (user.getUsername() == username) {
checkedUsername = user.getUsername();
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
return checkedUsername;
}