0
votes

Sorry for my bad english.

I want to combine these 2 methods

private void firebaseAuthWithGoogle(GoogleSignInAccount acct) {
    Log.d(TAG, "firebaseAuthWithGoogle:" + acct.getId());
    AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
    mAuth.signInWithCredential(credential)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    Log.d(TAG, "signInWithCredential:onComplete:" + task.isSuccessful());

                    // If sign in fails, display a message to the user. If sign in succeeds
                    // the auth state listener will be notified and logic to handle the
                    // signed in user can be handled in the listener.
                    if (!task.isSuccessful()) {
                        Log.w(TAG, "signInWithCredential", task.getException());
                        Toast.makeText(MainActivity.this, "Authentication failed.", Toast.LENGTH_SHORT).show();
                    }
                }
            });
}

private void firebaseAuthWithFacebook(AccessToken token) {
    Log.d(TAG, "handleFacebookAccessToken:" + token);
    AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
    mAuth.signInWithCredential(credential)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    Log.d(TAG, "signInWithCredential:onComplete:" + task.isSuccessful());
                    // If sign in fails, display a message to the user. If sign in succeeds
                    // the auth state listener will be notified and logic to handle the
                    // signed in user can be handled in the listener.
                    if (!task.isSuccessful()) {
                        Log.w(TAG, "signInWithCredential", task.getException());
                        Toast.makeText(MainActivity.this, "Authentication failed.",
                                Toast.LENGTH_SHORT).show();
                    }

                    // ...
                }
            });
}

Only this line change AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null); FacebookAuthProvider.getCredential(token.getToken());

I take this from FireBase documentation.

I am new on Android Programmation (I'm little C# game dev) so don't blame me.

And I don't enderstind this :https://firebase.google.com/docs/auth/android/account-linking#link-auth-provider-credentials-to-a-user-account

Please can I Have Help ?

Thank's in advance.

1

1 Answers

0
votes

You can add both parameters acct and token in one method and check if each of them is null like this private void firebaseAuth(GoogleSignInAccount acct,AccessToken token).If acct is null then the user should be sign in using facebook Given that you checked that the request code is the one you provide when you sign in using Google in OnActivityResult(int requestCode, int resultCode, Intent data) and the result you got from Auth.GoogleSignInApi.getSignInResultFromIntent(data) is result.isSuccess().Same for Facebook as you pass the AccessToken from onSuccess() method of the FacebookCallback<LoginResult>() so you may do some thing like this:

CallbackManager mCallbackManager = CallbackManager.Factory.create();
        LoginManager.getInstance().registerCallback(mCallbackManager,
                new FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(LoginResult loginResult) {
                Log.d(TAG, "facebook:onSuccess:" + loginResult);

                firebaseAuth(null,loginResult.getAccessToken);
               //null here is the google account as you sign in using facebook            
            }

            @Override
            public void onCancel() {
                //Something to do with user cancel login
            }

            @Override
            public void onError(FacebookException error) {
                //Something to do with FacebookException
            }
        });

and in case of Google Sign in :

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...);
        if (requestCode == GOOGLE_SIGN_IN) {

        /* request code you pass to 
         * startActivityForResult(intent, GOOGLE_SIGN_IN)
         * where intent is what you get from intent = 
         * Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient)
         */ 

        GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);    

            if (result.isSuccess()) {
                // Google Sign In was successful, authenticate with Firebase
                GoogleSignInAccount account = result.getSignInAccount();
                firebaseAuth(account,null);
                /* null here is the facebook token 
                 * as you sign in using Google
                 */

            } else if(result.getStatus().isInterrupted()){
                // Google Sign In failed, update UI appropriately
            }

       }
}