in auth/src/main/java/com/firebase/ui/auth/viewmodel/email/EmailLinkSignInHandler.java [152:199]
private void handleLinkingFlow(final AuthOperationManager authOperationManager,
final EmailLinkPersistenceManager persistenceManager,
final IdpResponse response,
final String link) {
final AuthCredential storedCredentialForLink = ProviderUtils.getAuthCredential
(response);
final AuthCredential emailLinkCredential = EmailAuthProvider.getCredentialWithLink
(response.getEmail(), link);
if (authOperationManager.canUpgradeAnonymous(getAuth(), getArguments())) {
authOperationManager.safeLink(emailLinkCredential,
storedCredentialForLink, getArguments())
.addOnCompleteListener(task -> {
persistenceManager.clearAllData(getApplication());
if (task.isSuccessful()) {
handleMergeFailure(storedCredentialForLink);
} else {
setResult(Resource.forFailure(task.getException()));
}
});
} else {
getAuth().signInWithCredential(emailLinkCredential)
.continueWithTask(task -> {
persistenceManager.clearAllData(getApplication());
if (!task.isSuccessful()) {
return task;
}
return task.getResult().getUser()
.linkWithCredential(storedCredentialForLink)
.continueWithTask(new ProfileMerger(response))
.addOnFailureListener(new TaskFailureLogger(TAG,
"linkWithCredential+merge failed."));
})
.addOnSuccessListener(authResult -> {
FirebaseUser user = authResult.getUser();
IdpResponse response1 = new IdpResponse.Builder(
new User.Builder(EmailAuthProvider
.EMAIL_LINK_SIGN_IN_METHOD,
user.getEmail())
.setName(user.getDisplayName())
.setPhotoUri(user.getPhotoUrl())
.build())
.build();
handleSuccess(response1, authResult);
})
.addOnFailureListener(e -> setResult(Resource.forFailure(e)));
}
}