Search code examples
javaandroidsyntaxandroid-credential-manager

Struggling with java syntax while making android app with Credential Manager


package com.coding.studentsparks;

import static android.content.ContentValues.TAG;

import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;
import androidx.credentials.Credential;
import androidx.credentials.CredentialManager;
import androidx.credentials.CredentialManagerCallback;
import androidx.credentials.CustomCredential;
import androidx.credentials.GetCredentialRequest;
import androidx.credentials.GetCredentialResponse;
import androidx.credentials.PasswordCredential;
import androidx.credentials.PublicKeyCredential;
import androidx.credentials.exceptions.GetCredentialException;

import com.google.android.libraries.identity.googleid.GetGoogleIdOption;
import com.google.android.libraries.identity.googleid.GoogleIdTokenCredential;


public class Login extends AppCompatActivity {

    Context context = getApplicationContext();


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        // Use your app or activity context to instantiate a client instance of
// CredentialManager.
        CredentialManager credentialManager = CredentialManager.create(context);
        GetGoogleIdOption googleIdOption = new GetGoogleIdOption.Builder()
                .setFilterByAuthorizedAccounts(true)
                .setServerClientId("505459091506-bsdgueokr5s2rtoc08bkvj7s5qg4284s.apps.googleusercontent.com")
                .build();
        GetCredentialRequest request = new GetCredentialRequest.Builder()
                .addCredentialOption(googleIdOption)
                .build();

// Launch sign in flow and do getCredential Request to retrieve the credentials
        credentialManager.getCredentialAsync(context, request, new CredentialManagerCallback<GetCredentialResponse, GetCredentialException>() {

            @Override
            public void onResult(GetCredentialResponse result) {
                handleSignIn(result);
            }

            @Override
            public void onError(GetCredentialException e) {
                handleFailure(e);
            }
        });


    }

    private void handleFailure(GetCredentialException e) {
        Toast.makeText(getApplicationContext(), "Failure", Toast.LENGTH_SHORT).show();
    }

    public void handleSignIn(GetCredentialResponse result) {
        // Handle the successfully returned credential.
        Credential credential = result.getCredential();

        if (credential instanceof PublicKeyCredential) {
            String responseJson = ((PublicKeyCredential) credential).getAuthenticationResponseJson();
            // Share responseJson i.e. a GetCredentialResponse on your server to validate and authenticate
        } else if (credential instanceof PasswordCredential) {
            String username = ((PasswordCredential) credential).getId();
            String password = ((PasswordCredential) credential).getPassword();
            // Use id and password to send to your server to validate and authenticate
        } else if (credential instanceof CustomCredential) {
            if (GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL.equals(credential.getType())) {
                // Use googleIdTokenCredential and extract id to validate and
                // authenticate on your server
                GoogleIdTokenCredential googleIdTokenCredential = GoogleIdTokenCredential.createFrom(((CustomCredential) credential).getData());
            } else {
                // Catch any unrecognized custom credential type here.
                Log.e(TAG, "Unexpected type of credential");
            }
        } else {
            // Catch any unrecognized credential type here.
            Log.e(TAG, "Unexpected type of credential");
        }
    }

}

This is my code, it has an error in these lines:

credentialManager.getCredentialAsync(context, request, new CredentialManagerCallback<GetCredentialResponse, GetCredentialException>() {

            @Override
            public void onResult(GetCredentialResponse result) {
                handleSignIn(result);
            }

            @Override
            public void onError(GetCredentialException e) {
                handleFailure(e);
            }
        });

I need help as I am a beginner and I do not know how to solve this problem, the error says 'cannot resolve method'

I have tried many things, and Android studio suggested adding parentheses and whatnot. This has not helped much. I would appreciate any help with any of the code.


Solution

  • credentialManager.getCredentialAsync() has 5 parameters:

    (activity, getCredentialRequest, cancellationSignal, executor, credentialManagerCallback) (See [here]) while you only provide three parameters.

    Try the following method by adding the two parameters you missed before:

    credentialManager.getCredentialAsync(
        context,
        request,
        new CancellationSignal(),
        Executors.newSingleThreadExecutor(),
        new CredentialManagerCallback<GetCredentialResponse, GetCredentialException>() {
            @Override
            public void onResult(GetCredentialResponse result) {
                handleSignIn(result);
            }
    
            @Override
            public void onError(GetCredentialException e) {
                handleFailure(e);
            }
        }
    );
    

    I hope this helps