package com.baumblatt.capacitor.firebase.auth.handlers; import android.content.Intent; import android.util.Log; import com.baumblatt.capacitor.firebase.auth.CapacitorFirebaseAuth; import com.facebook.AccessToken; import com.facebook.CallbackManager; import com.facebook.FacebookCallback; import com.facebook.FacebookException; import com.facebook.login.LoginManager; import com.facebook.login.LoginResult; import com.facebook.login.widget.LoginButton; import com.getcapacitor.JSObject; import com.getcapacitor.PluginCall; import com.google.firebase.auth.AuthCredential; import com.google.firebase.auth.FacebookAuthProvider; public class FacebookProviderHandler implements ProviderHandler { private static final String FACEBOOK_TAG = "FacebookProviderHandler"; public static final int RC_FACEBOOK_LOGIN = 0xface; private CapacitorFirebaseAuth plugin; private CallbackManager mCallbackManager; private LoginButton loginButton; @Override public void init(final CapacitorFirebaseAuth plugin) { this.plugin = plugin; try { this.loginButton = new LoginButton(this.plugin.getContext()); this.loginButton.setPermissions("email", "public_profile"); this.mCallbackManager = CallbackManager.Factory.create(); this.loginButton.registerCallback(mCallbackManager, new FacebookCallback<LoginResult>() { @Override public void onSuccess(LoginResult loginResult) { Log.d(FACEBOOK_TAG, "facebook:onSuccess:" + loginResult); handleFacebookAccessToken(loginResult.getAccessToken()); } @Override public void onCancel() { Log.d(FACEBOOK_TAG, "facebook:onCancel"); plugin.handleFailure("Facebook Sign In cancel.", null); } @Override public void onError(FacebookException error) { Log.d(FACEBOOK_TAG, "facebook:onError", error); plugin.handleFailure("Facebook Sign In failure.", error); } }); } catch (FacebookException error) { Log.w(FACEBOOK_TAG, "Facebook initialization error, review your configs", error); } } private void handleFacebookAccessToken(AccessToken token) { AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken()); this.plugin.handleAuthCredentials(credential); } @Override public void signIn(PluginCall call) { this.loginButton.performClick(); } @Override public void signOut() { LoginManager.getInstance().logOut(); } @Override public int getRequestCode() { return FacebookProviderHandler.RC_FACEBOOK_LOGIN; } @Override public void handleOnActivityResult(int requestCode, int resultCode, Intent data) { // Pass the activity result back to the Facebook SDK mCallbackManager.onActivityResult(requestCode, resultCode, data); } @Override public boolean isAuthenticated() { AccessToken accessToken = AccessToken.getCurrentAccessToken(); return accessToken != null && !accessToken.isExpired(); } @Override public void fillResult(AuthCredential credential, JSObject jsResult) { AccessToken accessToken = AccessToken.getCurrentAccessToken(); if(accessToken != null && !accessToken.isExpired()) { jsResult.put("idToken", accessToken.getToken()); } } }