Skip to main content

Facebook Sdk Callback Mechanism in Android

manages the callbacks into the FacebookSdk from an Acitivity's or Fragment's onActivityResult() method.

This javadoc of  CallbackManager class from facebook sdk doesn't explain very well on how the facebook sdk interacts with our app components. It exposes just one public method : onActivityResult() which is to be called by our app's ui components from their onActivityResult.

We create an instance of class CallbackManager, using CallbackManager Factory which essentially returns a new instance of CallbackManagerImpl, the only implementation of CallbackManager interface in facebook sdk.

CallbackManagerImpl : 
So, this class gets callback from our app components. But what does it do with that? 

Different facebook components such as the LoginManager, AppInviteDialog register themselves with this class to be invoked for their particular case. They do so by the publicly exposed  registerCallback method and register themselve against one of the request codes defined in CallbackManagerImpl.RequestCodeOffset. These two images explain this very well :










But when does these different facebook components register these callbacks?
They do that when we register our callback on these components. Sounds like a cycle, right? It is.

Let's take the example of Login Manager.

When we are using the facebook sdk to let the user log in through facebook, we register a callback on the LoginManager instance through its publicly exposed registerCallback method and with that, pass it the callbackManagerImpl instance that we have created. After this, the LoginManager registers itself on that callbackManagerImpl instance and makes sure that it'll call us when it gets back a callback. The last part, from where does callbackManagerImpl gets the callback? If you don't have an answer for this, I suggest you to read this post again.

I've tried to summarize everything is this final image : 

  

Let me know of any doubts in a comment below.

Comments

Popular posts from this blog

Android : AbsSavedState cannot be cast to $SavedState

Android AbsSavedState cannot be cast to <View>$SavedState I came across a strange crash today. This is the stacktrace : Fatal Exception: java.lang.ClassCastException: android.view.AbsSavedState$1 cannot be cast to android.widget.ScrollView$SavedState at android.widget.ScrollView.onRestoreInstanceState(ScrollView.java:1810) at android.view.View.dispatchRestoreInstanceState(View.java:14768) at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3123) at android.view.View.restoreHierarchyState(View.java:14746) at android.support.v4.app.Fragment.restoreViewState(SourceFile:470) at android.support.v4.app.FragmentManagerImpl.moveToState(SourceFile:1326) at android.support.v4.app.FragmentManagerImpl.moveFragmentsToInvisible(SourceFile:2323) at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(SourceFile:2136) at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(SourceFile:2092)

Android Tip : Handling back button in Fragments

Android Tip : Handling hardware back button in Fragment and DialogFragment This post explains how to handle hardware back button in a Fragment OR DialogFragment . In DialogFragment, it’s quiet straight forward to achieve this. You’ve to get the dialog instance and set onKeyListener on it : if (getDialog() != null ) { getDialog().setOnKeyListener( new DialogInterface.OnKeyListener() { @Override public boolean onKey (DialogInterface dialog, int keyCode, KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) { Timber.i( "hardware back button pressed" ); } } }); } This can be done in the onViewCreated callback. For fragments, this method doesn’t work and fragments doesn’t have a direct callback to catch this event. So in this case, the approach that we follow is : You

DialogFragment : NullPointerException (support library)

Another weird crash this time ! Here’s the stack trace : Fatal Exception: java.lang.RuntimeException: Unable to start activity ComponentInfo{<activity.fully.qualified.path>}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.app.Dialog.setContentView(android.view.View)' on a null object reference at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2659) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2724) at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4524) at android.app.ActivityThread.-wrap19(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1479) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6123) at java.lang.reflect.Method.invoke(Method.java) at com.android