in auth/src/main/java/com/firebase/ui/auth/data/remote/GenericIdpSignInHandler.java [138:200]
private void handleAnonymousUpgradeFlow(final FirebaseAuth auth,
final HelperActivityBase activity,
final OAuthProvider provider,
final FlowParameters flowParameters) {
final boolean useEmulator = activity.getAuthUI().isUseEmulator();
auth.getCurrentUser()
.startActivityForLinkWithProvider(activity, provider)
.addOnSuccessListener(
authResult -> handleSuccess(
useEmulator,
provider.getProviderId(),
authResult.getUser(),
(OAuthCredential) authResult.getCredential(),
authResult.getAdditionalUserInfo().isNewUser()))
.addOnFailureListener(
e -> {
if (!(e instanceof FirebaseAuthUserCollisionException)) {
setResult(Resource.forFailure(e));
return;
}
FirebaseAuthUserCollisionException collisionException =
(FirebaseAuthUserCollisionException) e;
final AuthCredential credential =
collisionException.getUpdatedCredential();
final String email =
collisionException.getEmail();
// Case 1: Anonymous user trying to link with an existing user
// Case 2: Anonymous user trying to link with a provider keyed
// by an email that already belongs to an existing account
// (linking flow)
ProviderUtils.fetchSortedProviders(auth, flowParameters, email)
.addOnSuccessListener(providers -> {
if (providers.isEmpty()) {
String errorMessage =
"Unable to complete the linkingflow -" +
" the user is using " +
"unsupported providers.";
setResult(Resource.forFailure(
new FirebaseUiException(
ErrorCodes.DEVELOPER_ERROR,
errorMessage)));
return;
}
if (providers.contains(provider.getProviderId())) {
// Case 1
handleMergeFailure(credential);
} else {
// Case 2 - linking flow to be handled by
// SocialProviderResponseHandler
setResult(Resource.forFailure(
new FirebaseUiUserCollisionException(
ErrorCodes.ERROR_GENERIC_IDP_RECOVERABLE_ERROR,
"Recoverable error.",
provider.getProviderId(),
email,
credential)));
}
});
});
}