public void startSignIn()

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."));
        }
    }