Search code examples
androidfacebook-logingigya

Gigya - Notify I've logged wih Facebook


Answered on the comment below: Gigya - Notify I've logged wih Facebook

I'm using the Gigya service to offer social login in my client Android application. The problem is that the Facebook one has to be native, so I've edited a little bit the data flow.

First steps: Add to my AndroidManifest.xml the Gigya and Facebook activities:

<activity
    android:name="com.gigya.socialize.android.ui.HostActivity"
    android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
    android:theme="@android:style/Theme.Translucent.NoTitleBar" />
<activity
    android:name="com.gigya.socialize.android.login.providers.WebLoginActivity"
    android:theme="@android:style/Theme.Translucent.NoTitleBar"
    android:launchMode="singleTask"
    android:allowTaskReparenting="true" >
    <intent-filter>
       <action android:name="android.intent.action.VIEW" />
       <category android:name="android.intent.category.DEFAULT" />
       <category android:name="android.intent.category.BROWSABLE" />
       <data android:scheme="com.company.appname" android:host="gsapi" />
    </intent-filter>
</activity>
<activity android:name="com.facebook.FacebookActivity"
    android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
    android:theme="@android:style/Theme.Translucent.NoTitleBar"
    android:label="@string/app_name" />
<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="{myFacebookAppId}"/>

After that, in my MainActivity.java I initialize Gigya:

GSAPI.getInstance().initialize(MainActivity.this, gigyaApiKey, gigyaServer);
GSAPI.getInstance().setSocializeEventListener(new GigyaSocializeListener(MainActivity.this));
GSAPI.getInstance().setAccountsEventListener(new GigyaAccountsListener());

Then in my LoginGigyaWebViewFragment I load in a WebView an url where is the Gigya webView (email and password EditText and Social Plugin), intercepting the request url and doing the native Facebook login.

public class LoginGigyaWebViewFragment extends Fragment {

    private final static String TAG = LoginGigyaWebViewFragment.class.getSimpleName();

    private WebView webView;
    private CallbackManager callbackManager;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_login_gigya_webview, container, false);
        webView = (WebView) view.findViewById(R.id.login_gigya_webView);
        setupWebView();
        webView.loadUrl("http://www.mywebpagedomain.com/gigya/tablet.html");
        return view;
    }

    private void setupWebView() {
        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webSettings.setSupportZoom(false);
        webSettings.setAllowFileAccess(true);
        webSettings.setAllowContentAccess(true);
        webSettings.setDatabaseEnabled(true);
        webSettings.setAppCacheEnabled(true);
        webSettings.setSaveFormData(true);

        webView.setWebChromeClient(new WebChromeClient());

        webView.setWebViewClient(new WebViewClient() {            
            @Override
            public boolean shouldOverrideUrlLoading(WebView webView, String url) {
                Uri uri = Uri.parse(url);
                String provider = uri.getQueryParameter("x_provider");
                if (provider != null && !provider.isEmpty()) {
                    switch (provider) {
                        case "facebook":
                            webView.stopLoading();
                            makeFacebookStuff();
                            return false;
                        default:
                            return GSWebBridge.handleUrl(webView, url);
                    }
                }
                return false;
            }
        });
        GSWebBridge.attach(getActivity(), webView, new GSWebBridgeListener() {
            @Override
            public void beforeLogin(WebView webView, GSLoginRequest.LoginRequestType requestType, GSObject params) {
                Log.d(TAG, "beforeLogin");
            }

            @Override
            public void onLoginResponse(WebView webView, GSResponse response) {
                Log.d(TAG, "onLoginResponse");
            }

            @Override
            public void onPluginEvent(WebView webView, GSObject gsObject, String s) {
                Log.d(TAG, "onPluginEvent");
            }
        });
    }

    private void makeFacebookStuff() {
        FacebookSdk.sdkInitialize(this.getContext().getApplicationContext());
        FacebookSdk.setApplicationId(AppConfig.getInstance().getFacebookAppId());
        LoginManager.getInstance().setLoginBehavior(LoginBehavior.NATIVE_WITH_FALLBACK);
        callbackManager = CallbackManager.Factory.create();

        LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(LoginResult loginResult) {
                Log.d("Facebook", loginResult.toString());
            }

            @Override
            public void onCancel() {
                Log.d("Facebook", "onCancel");
            }

            @Override
            public void onError(FacebookException error) {
                Log.d("Facebook", error.toString());
            }
        });
        LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("public_profile", "email"));
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        callbackManager.onActivityResult(requestCode, resultCode, data);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (GSAPI.getInstance().handleAndroidPermissionsResult(requestCode, permissions, grantResults)) {
            return;
        }
    }
}

The problem is that even the Facebook login succes, I don't know how to notify Gigya that happened. Another solution I've been thinking about is login in Gigya manually with the Facebook userId or Facebook email, but I don't know how to do that.

Any suggestion?


Solution

  • Facebook native login is supported. In order to use Facebook native login with Gigya, you need to to install the Facebook SDK for Android into your app as a dependency and recompile it. You can see detailed instructions here: http://developers.gigya.com/display/GD/Android#Android-AddingFacebookNativeLogin