Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why my facebook android sdk login called two times?

I am working with the Facebook SDK, the problem is the FormSubmit function has run two times. It is called by the getView function which is called by onCreateView and by the statusCallback, how to fix it?

public class Home extends Fragment implements LoginListener {
    public View rootView;
    public ImageView HomeBg;
    public ImageView buttonLoginLogout;
    public TextView chi;
    public TextView eng;
    public ColorStateList oldColor;
    public SharedPreferences prefs;
    public EasyTracker tracker = null;

    //Facebook login
    private Session.StatusCallback statusCallback = new SessionStatusCallback();

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        tracker = EasyTracker.getInstance(getActivity());
        prefs =  getActivity().getSharedPreferences("memberData", 0);

        getActivity().getActionBar().hide();

        rootView = inflater.inflate(R.layout.home, container, false);
        buttonLoginLogout = (ImageView) rootView.findViewById(R.id.home_connectFB);
        eng = (TextView) rootView.findViewById(R.id.btn_eng);
        chi = (TextView) rootView.findViewById(R.id.btn_chi);

        if (Utility.getLocale(getActivity()).equals("TC")) {
            chi.setTextColor(getActivity().getResources().getColor(
                    android.R.color.white));
            oldColor = eng.getTextColors();
        } else {
            eng.setTextColor(getActivity().getResources().getColor(
                    android.R.color.white));
            oldColor = chi.getTextColors();

        }

        eng.setOnClickListener(setChangeLangListener("EN"));
        chi.setOnClickListener(setChangeLangListener("TC"));

        //Facebook login
        Settings.addLoggingBehavior(LoggingBehavior.INCLUDE_ACCESS_TOKENS);

        Session session = Session.getActiveSession();
        if (session == null) {
            if (savedInstanceState != null) {
                session = Session.restoreSession(getActivity(), null, statusCallback, savedInstanceState);
            }
            if (session == null) {
                session = new Session(getActivity());
            }
            Session.setActiveSession(session);
            if (session.getState().equals(SessionState.CREATED_TOKEN_LOADED)) {
                session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback));
            }
        }

       updateView();

        return rootView;
    }

    @Override
    public void onStart() {
        super.onStart();
        Session.getActiveSession().addCallback(statusCallback);
        tracker.set(Fields.SCREEN_NAME, "Landing Page " + Utility.getLocale(getActivity()));
        tracker.send(MapBuilder.createAppView().build());
    }

    @Override
    public void onStop() {
        super.onStop();
        Session.getActiveSession().removeCallback(statusCallback);
        EasyTracker.getInstance(getActivity()).activityStop(getActivity());
    }

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

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Session session = Session.getActiveSession();
        Session.saveSession(session, outState);
    }

    private void updateView() {
        Session session = Session.getActiveSession();
        if (session.isOpened()) {
            // get request

            if (!session.getAccessToken().equals(prefs.getString("token", "")))
                new FormSubmit(getActivity(),this,tracker).execute("login", session.getAccessToken());
            else
                onTaskComplete(prefs.getString("token", ""),prefs.getString("memberId", ""));

        } else {
            buttonLoginLogout.setImageResource(R.drawable.landing_btn_connect_facebook);
            buttonLoginLogout.setOnClickListener(new View.OnClickListener() {
                public void onClick(View view) { onClickLogin(); }
            });
        }
    }

    private void onClickLogin() {
        Session session = Session.getActiveSession();
        if (!session.isOpened() && !session.isClosed()) {
            session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback));
        } else {
            Session.openActiveSession(getActivity(), this, true, statusCallback);
        }
    }

    private class SessionStatusCallback implements Session.StatusCallback {
        @Override
        public void call(Session session, SessionState state, Exception exception) {
            updateView();
        }
    }

    public OnClickListener setChangeLangListener(final String lang) {
        OnClickListener changeLangListener = new OnClickListener() {
            @Override
            public void onClick(View arg0) {
                Configuration config = new Configuration(getResources().getConfiguration());

                if (Utility.getLocale(getActivity()).equals("TC") && lang.equals("EN")) {
                    tracker.send(MapBuilder.createEvent("menu_click","language", "switchEN", null).build());
                    config.locale = Locale.ENGLISH;
                    chi.setTextColor(oldColor);
                    eng.setTextColor(getActivity().getResources().getColor(
                            android.R.color.white));
                } else if (Utility.getLocale(getActivity()).equals("EN") && lang.equals("TC")) {
                    tracker.send(MapBuilder.createEvent("menu_click","language", "switchTC", null).build());
                    config.locale = Locale.TRADITIONAL_CHINESE;
                    eng.setTextColor(oldColor);
                    chi.setTextColor(getActivity().getResources().getColor(
                            android.R.color.white));
                }

                getResources().updateConfiguration(config,getResources().getDisplayMetrics());

                onConfigurationChanged(config);
            }
        };
        return changeLangListener;
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
      super.onConfigurationChanged(newConfig);
      Intent intent = getActivity().getIntent();
      intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
      getActivity().finish();
      startActivity(intent);
    }

    @Override
    public void onResume() {
        super.onResume();
        AppEventsLogger.activateApp(getActivity(),getResources().getString(R.string.app_id));
    }

    @Override
    public void onTaskComplete(String token, String memberId) {
        Toast.makeText(getActivity(), "t:" + token + "m:" + memberId, Toast.LENGTH_LONG).show();

        buttonLoginLogout.setImageResource(R.drawable.landing_btn_take_a_selfie);
        buttonLoginLogout.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) { 
                ((LandingPage)getActivity()).tabHost.setCurrentTab(2);
            }
        });
    }

    @Override
    public void onTaskFailure(String errorMsg) {
        Toast.makeText(getActivity(), errorMsg, Toast.LENGTH_LONG).show();
    }

    public void saveMemberInfo(String token, String memberId){
        SharedPreferences.Editor editor = prefs.edit();
        editor.putString("token", token);
        editor.putString("memberId", memberId);
        editor.commit();
    }

}
like image 927
user782104 Avatar asked Feb 13 '14 18:02

user782104


People also ask

What does SDK mean in Facebook?

The Facebook SDK is a set of software components that developers can include in their mobile app to understand how people use the app, run optimized marketing campaigns and enable Facebook login and social sharing.

On which platform does the Facebook SDK works on?

Facebook Android SDK enables mobile developers build Facebook apps for Android.

Is Facebook SDK deprecated?

Below are the deprecated versions of the Facebook Platform SDKs and associated dates: June 15, 2022: iOS & Android SDK v13 (Deprecated) February 22, 2022: iOS & Android SDK v12 (Deprecated) October 21, 2021: iOS & Android SDK v11 (Deprecated)


1 Answers

Update your SessionStatusCallback() method like below and check the output.

And if it works, then mark this as accepted answer.

private class SessionStatusCallback implements Session.StatusCallback {
    @Override
    public void call(Session session, SessionState state, Exception exception) {
        if (session.isOpened()) {
            updateView();
        }
    }
}

SessionStatusCallback() method will called everytime when your session is getting changed from one state to another.

Before getting login in Facebook, your SessionState is SessionState.CLOSED. When you are trying to get login in Facebook and authentication step is succeeded, then your session change into SessionState.OPENING and this time your SessionStatusCallback() method get executed.

But in current situation your session is not opened completely, it is in process of opening. So, after this when your session is getting open completely, session state changed to SessionState.OPENED and thus your SessionStatusCallback() method is called once again.

Thats why changed your SessionStatusCallback() method as I described above and it will work perfectly.

like image 84
Vivek Bansal Avatar answered Sep 18 '22 15:09

Vivek Bansal