Currently I use the latest sdk to implement facebook login, however, it is slightly different from the actual behavior of the offical one
The official behavior: user click on the login button , the permission dialog prompt , if I click cancel, it will close the box, it will login only when I click confirm
My app behavior: user click on the login button , the permission dialog prompt , if I click cancel, it will close the box, but if I click the login button again , it will not show any permission dialog, and will login
I have copied the code from the offical sample so I am confused why it behave differently in my app. How to fix it? Thanks
Facebook sample (I use the offical code to build my login button)
public class SessionLoginFragment extends Fragment {
private static final String URL_PREFIX_FRIENDS = "https://graph.facebook.com/me/friends?access_token=";
private TextView textInstructionsOrLink;
private Button buttonLoginLogout;
private Session.StatusCallback statusCallback = new SessionStatusCallback();
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment, container, false);
buttonLoginLogout = (Button) view.findViewById(R.id.buttonLoginLogout);
textInstructionsOrLink = (TextView) view.findViewById(R.id.instructionsOrLink);
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 view;
}
@Override
public void onStart() {
super.onStart();
Session.getActiveSession().addCallback(statusCallback);
}
@Override
public void onStop() {
super.onStop();
Session.getActiveSession().removeCallback(statusCallback);
}
@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()) {
textInstructionsOrLink.setText(URL_PREFIX_FRIENDS + session.getAccessToken());
buttonLoginLogout.setText(R.string.logout);
buttonLoginLogout.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) { onClickLogout(); }
});
} else {
textInstructionsOrLink.setText(R.string.instructions);
buttonLoginLogout.setText(R.string.login);
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 void onClickLogout() {
Session session = Session.getActiveSession();
if (!session.isClosed()) {
session.closeAndClearTokenInformation();
}
}
private class SessionStatusCallback implements Session.StatusCallback {
@Override
public void call(Session session, SessionState state, Exception exception) {
updateView();
}
}
}
My app (I used the same method name of the offical one, I haven't add additional code for facebook login)
public class Home extends Fragment implements LoginListener {
private final static String TAG = "Home";
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;
public SharedPreferences.Editor editor;
public ArrayList<String> permission;
public ProgressDialog pd;
public Home ctx;
//Facebook login
private Session.StatusCallback statusCallback = new SessionStatusCallback();
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
ctx = this;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
try{
// fix for disable the hiding action bar animation
getActivity().getActionBar().getClass().getDeclaredMethod("setShowHideAnimationEnabled", boolean.class).invoke(getActivity().getActionBar(), false);
} catch (Exception exception){
// animation will be run if not support
}
getActivity().getActionBar().hide();
tracker = EasyTracker.getInstance(getActivity());
if (permission == null) {
permission = new ArrayList<String>();
permission.add("email");
}
prefs = getActivity().getSharedPreferences("userInfo", 0);
editor = prefs.edit();
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);
eng.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0) {
if (!Utility.getLocale(getActivity()).equals("en")) {
tracker.send(MapBuilder.createEvent("menu_click","language", "switchEN", null).build());
chi.setTextColor(oldColor);
eng.setTextColor(getActivity().getResources().getColor(android.R.color.white));
MyApp.updateLanguage(getActivity().getApplicationContext(), "en");
refreshAfterLocaleChanged("en");
}
}
});
chi.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0) {
if (!Utility.getLocale(getActivity()).equals("zh")) {
tracker.send(MapBuilder.createEvent("menu_click","language", "switchTC", null).build());
eng.setTextColor(oldColor);
chi.setTextColor(getActivity().getResources().getColor(android.R.color.white));
MyApp.updateLanguage(getActivity().getApplicationContext(), "zh");
refreshAfterLocaleChanged("zh");
}
}
});
if (Utility.getLocale(getActivity()).equals("zh")) {
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();
}
//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;
}
public void refreshAfterLocaleChanged(String lang){
SharedPreferences langPrefs = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext());
Editor editor = langPrefs.edit();
editor.putString("lang",lang).commit();
Intent intent = getActivity().getIntent();
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
getActivity().finish();
getActivity().overridePendingTransition(0, 0);
startActivity(intent);
}
@Override
public void onStart() {
super.onStart();
Session.getActiveSession().addCallback(statusCallback);
tracker.set(Fields.SCREEN_NAME, "hk7app/CX/" + Utility.getLocale(getActivity()) + "/Landing Page");
tracker.send(MapBuilder.createAppView().build());
}
@Override
public void onStop() {
super.onStop();
if (pd != null)
pd.dismiss();
Session.getActiveSession().removeCallback(statusCallback);
EasyTracker.getInstance(getActivity()).activityStop(getActivity());
}
@SuppressWarnings("deprecation")
private void updateView() {
Session session = Session.getActiveSession();
if (session.isOpened()) {
final String token = session.getAccessToken();
Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {
@Override
public void onCompleted(GraphUser user,Response response) {
// TODO Auto-generated method stub
if (user != null) {
if (!user.getId().equals(prefs.getString("fbId",""))) {
editor.putString("fbId", user.getId());
editor.putString("fName", user.getFirstName());
editor.putString("lName", user.getLastName());
editor.putString("email", user.asMap().get("email").toString());
editor.commit();
}
if (prefs.getString("memId","").equals("") || prefs.getString("token","").equals("") || !user.getId().equals(prefs.getString("fbId",""))){
pd = ProgressDialog.show(getActivity(), getActivity().getResources().getString(R.string.sys_info),getActivity().getResources().getString(R.string.loading));
new APIHandler(getActivity(),tracker,"login",pd).execute(ctx,token);
} else {
onLoginComplete("","");
}
}
}
});
} else {
buttonLoginLogout.setImageResource(R.drawable.landing_btn_connect_facebook);
buttonLoginLogout.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) { onClickLogin(); }
});
}
}
@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 onClickLogin() {
tracker.send(MapBuilder.createEvent("menu_click","Fbconnect","connectFB_" + Utility.getLocale(getActivity()),null).build());
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) {
Log.d(TAG,"SessionStatusCallback");
if (exception != null) {
Log.d(TAG,""+exception);
if (!session.isClosed())
session.closeAndClearTokenInformation(); //reset session
if (exception instanceof FacebookAuthorizationException){
new AlertDialog.Builder(getActivity())
.setTitle(ctx.getResources().getString(R.string.sys_info))
.setMessage(R.string.facebook_permission_missing)
.setPositiveButton(ctx.getResources().getString(R.string.close), null)
.show();
}
} else {
updateView();
}
}
}
@Override
public void onResume() {
super.onResume();
AppEventsLogger.activateApp(getActivity(),getResources().getString(R.string.app_id));
}
@Override
public void onLoginComplete(String memberId, String token) {
if (pd != null)
pd.dismiss();
if (!memberId.equals("") && !token.equals("")) {
editor.putString("memId", memberId);
editor.putString("token", token);
editor.commit();
}
buttonLoginLogout.setImageResource(R.drawable.landing_btn_take_a_selfie);
buttonLoginLogout.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
tracker.send(MapBuilder.createEvent("menu_click","TakeSelfie","Selfie_now_" + Utility.getLocale(getActivity()),null).build());
((LandingPage)getActivity()).tabHost.setCurrentTab(2);
}
});
}
@Override
public void onLoginFailure(String errorMsg) {
if (pd != null)
pd.dismiss();
Toast.makeText(getActivity(), errorMsg, Toast.LENGTH_LONG).show();
}
}