Я использую PhoneAuthCredential для входа в систему, и все работает нормально, кроме одной вещи. как вы видите в OtpActivity, я проверяю, существует ли пользователь, может ли он go перейти в Home Activity, а если нет, то он будет перенаправлен в Register Activity, и проблема в том, что когда пользователь пытается зарегистрироваться, он регистрируется как новый пользователь с новый токен UID без его PhoneAuthCredential, и я хочу, чтобы, когда пользователь регистрировался, я связывал его информацию с его PhoneAuthCredential, чтобы дать мне одного пользователя, а не двух пользователей, как я получаю сейчас.
public class OtpActivity extends AppCompatActivity {
private static final String TAG = "EmailPassword";
private String verificationid;
private FirebaseAuth mAuth;
private ProgressBar progressBar;
private EditText editText;
DatabaseReference users;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_otp);
mAuth = FirebaseAuth.getInstance();
progressBar = findViewById(R.id.progressbar);
editText = findViewById(R.id.editTextCode);
String phoneNumber = getIntent().getStringExtra("phonenumber");
sendVerificationCode(phoneNumber);
// save phone number
SharedPreferences prefs = getApplicationContext().getSharedPreferences("USER_PREF",
Context.MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putString("phoneNumber", phoneNumber);
editor.apply();
findViewById(R.id.buttonSignIn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String code = editText.getText().toString().trim();
if ((code.isEmpty() || code.length() < 6)){
editText.setError("Enter code...");
editText.requestFocus();
return;
}
verifyCode(code);
}
});
}
private void verifyCode(String code){
PhoneAuthCredential credential = PhoneAuthProvider.getCredential(verificationid, code);
signInWithCredential(credential);
}
private void signInWithCredential(PhoneAuthCredential credential) {
mAuth.signInWithCredential(credential)
.addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
users = FirebaseDatabase.getInstance().getReference( Common.user_rider_tbl );
if (users != null) {
users.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
Intent intent = new Intent(OtpActivity.this, Home.class);
startActivity(intent);
finish();
} else {
Intent gotoUserInfo = new Intent(OtpActivity.this, Register.class);
startActivity(gotoUserInfo);
finish();
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
} else {
}
} else {
Toast.makeText(OtpActivity.this, task.getException().getMessage(), Toast.LENGTH_LONG).show();
progressBar.setVisibility(View.GONE);
}
}
});
}
private void sendVerificationCode(String number){
PhoneAuthProvider.getInstance().verifyPhoneNumber(
number,
60,
TimeUnit.SECONDS,
TaskExecutors.MAIN_THREAD,
mCallBack
);
}
private PhoneAuthProvider.OnVerificationStateChangedCallbacks
mCallBack = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
@Override
public void onCodeSent(String s, PhoneAuthProvider.ForceResendingToken forceResendingToken) {
super.onCodeSent(s, forceResendingToken);
verificationid = s;
}
@Override
public void onVerificationCompleted(PhoneAuthCredential phoneAuthCredential) {
String code = phoneAuthCredential.getSmsCode();
if (code != null){
progressBar.setVisibility(View.VISIBLE);
verifyCode(code);
}
}
@Override
public void onVerificationFailed(FirebaseException e) {
Toast.makeText(OtpActivity.this, e.getMessage(),Toast.LENGTH_LONG).show();
}
};
}
public class Register extends AppCompatActivity implements View.OnClickListener {
private static final String TAG = "EmailPassword";
private EditText mFirstName;
private EditText mLastName;
private EditText mEmail;
private EditText mPassword;
private EditText mPhone;
private EditText mCity;
private ImageView back_btn;
private FirebaseAuth mAuth;
private DatabaseReference users;
private FirebaseDatabase firebaseDatabase;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
back_btn = findViewById( R.id.back_btn );
back_btn.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(Register.this, Home.class));
finish();
}
} );
mFirstName = findViewById(R.id.mFirstName);
mLastName = findViewById(R.id.mLastName);
mEmail = findViewById(R.id.mEmail);
mPassword = findViewById(R.id.mPassword);
mPhone = findViewById(R.id.mPhone);
mCity = findViewById(R.id.mCity);
findViewById(R.id.btn_register).setOnClickListener(this);
mAuth = FirebaseAuth.getInstance();
}
private void goToMainActivity() {
Intent intent = new Intent(Register.this, Home.class);
startActivity(intent);
finish();
}
private void createAccount( EditText email, EditText password) {
Log.d(TAG, "createAccount:" + this.mEmail);
if (!validateForm()) {
return;
}
// [START create_user_with_email]
mAuth.createUserWithEmailAndPassword(this.mEmail.getText().toString(), this.mPassword.getText().toString())
.addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()){
User user = new User();
user.setFirstName(mFirstName.getText().toString());
user.setLastName(mLastName.getText().toString());
user.setEmail(Register.this.mEmail.getText().toString());
user.setPassword(Register.this.mPassword.getText().toString());
user.setPhone(mPhone.getText().toString());
user.setCity(mCity.getText().toString());
users = FirebaseDatabase.getInstance().getReference(Common.user_rider_tbl);
users.child(FirebaseAuth.getInstance().getCurrentUser().getUid())
.setValue(user)
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Toast.makeText(Register.this, "Registered successfully", Toast.LENGTH_SHORT).show();
goToMainActivity();
}
});
}
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(Register.this, "Registered failed", Toast.LENGTH_SHORT).show();
}
});
}
private boolean validateForm() {
boolean valid = true;
String firstName = mFirstName.getText().toString();
if (TextUtils.isEmpty(firstName)) {
mFirstName.setError("Required.");
valid = false;
} else {
mFirstName.setError(null);
}
String lastName = mLastName.getText().toString();
if (TextUtils.isEmpty(lastName)) {
mLastName.setError("Required.");
valid = false;
} else {
mLastName.setError(null);
}
String email = mEmail.getText().toString();
if (TextUtils.isEmpty(email)) {
mEmail.setError("Required.");
valid = false;
} else {
mEmail.setError(null);
}
String password = mPassword.getText().toString();
if (TextUtils.isEmpty(password)) {
mPassword.setError("Required.");
valid = false;
} else {
mPassword.setError(null);
}
String phone = mPhone.getText().toString();
if (TextUtils.isEmpty(phone)) {
mPhone.setError("Required.");
valid = false;
} else {
mPhone.setError(null);
}
String city = mCity.getText().toString();
if (TextUtils.isEmpty(city)) {
mCity.setError("Required.");
valid = false;
} else {
mCity.setError(null);
}
return valid;
}
// [END create_user_with_email]
@Override
public void onClick(View v) {
int i = v.getId();
if (i == R.id.btn_register) {
createAccount( mEmail, mPassword );
}
}
@Override
public void onBackPressed() {
Intent intent = new Intent( Register.this, StartActivity.class );
startActivity( intent );
finish();
}
}