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?
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