in auth/src/main/java/com/firebase/ui/auth/viewmodel/email/WelcomeBackPasswordHandler.java [45:118]
public void startSignIn(@NonNull final String email,
@NonNull final String password,
@NonNull final IdpResponse inputResponse,
@Nullable final AuthCredential credential) {
setResult(Resource.forLoading());
// Store the password before signing in so it can be used for later credential building
mPendingPassword = password;
// Build appropriate IDP response based on inputs
final IdpResponse outputResponse;
if (credential == null) {
// New credential for the email provider
outputResponse = new IdpResponse.Builder(
new User.Builder(EmailAuthProvider.PROVIDER_ID, email).build())
.build();
} else {
// New credential for an IDP (Phone or Social)
outputResponse = new IdpResponse.Builder(inputResponse.getUser())
.setPendingCredential(inputResponse.getCredentialForLinking())
.setToken(inputResponse.getIdpToken())
.setSecret(inputResponse.getIdpSecret())
.build();
}
final AuthOperationManager authOperationManager = AuthOperationManager.getInstance();
if (authOperationManager.canUpgradeAnonymous(getAuth(), getArguments())) {
final AuthCredential credToValidate = EmailAuthProvider.getCredential(email, password);
// Check to see if we need to link (for social providers with the same email)
if (AuthUI.SOCIAL_PROVIDERS.contains(inputResponse.getProviderType())) {
// Add the provider to the same account before triggering a merge failure.
authOperationManager.safeLink(credToValidate, credential, getArguments())
.addOnSuccessListener(result -> handleMergeFailure(credToValidate))
.addOnFailureListener(e -> setResult(Resource.forFailure(e)));
} else {
// The user has not tried to log in with a federated IDP containing the same email.
// In this case, we just need to verify that the credential they provided is valid.
// No linking is done for non-federated IDPs.
// A merge failure occurs because the account exists and the user is anonymous.
authOperationManager.validateCredential(credToValidate, getArguments())
.addOnCompleteListener(
task -> {
if (task.isSuccessful()) {
handleMergeFailure(credToValidate);
} else {
setResult(Resource.forFailure(task.getException()));
}
});
}
} else {
// Kick off the flow including signing in, linking accounts, and saving with SmartLock
getAuth().signInWithEmailAndPassword(email, password)
.continueWithTask(task -> {
// Forward task failure by asking for result
AuthResult result = task.getResult(Exception.class);
// Task succeeded, link user if necessary
if (credential == null) {
return Tasks.forResult(result);
} else {
return result.getUser()
.linkWithCredential(credential)
.continueWithTask(new ProfileMerger(outputResponse))
.addOnFailureListener(new TaskFailureLogger(TAG,
"linkWithCredential+merge failed."));
}
})
.addOnSuccessListener(result -> handleSuccess(outputResponse, result))
.addOnFailureListener(e -> setResult(Resource.forFailure(e)))
.addOnFailureListener(
new TaskFailureLogger(TAG, "signInWithEmailAndPassword failed."));
}
}