Skip to content

ANR caused by LoginButton and AccessToken.setCurrentAccessToken #1393

@jerrylkc

Description

@jerrylkc

Checklist before submitting a bug report

Java version

17

Android version

Androdi 16

Android SDK version

18.2.3

Installation platform & version

Maven

Package

Core & AppEvents

Goals

      main (waiting):tid=1 systid=26194 
   at jdk.internal.misc.Unsafe.park(Native method)
   at java.util.concurrent.locks.LockSupport.park(LockSupport.java:371)
   at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(AbstractQueuedSynchronizer.java:519)
   at java.util.concurrent.ForkJoinPool.unmanagedBlock(ForkJoinPool.java:3797)
   at java.util.concurrent.ForkJoinPool.managedBlock(ForkJoinPool.java:3738)
   at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1712)
   at java.util.concurrent.LinkedBlockingDeque.takeFirst(LinkedBlockingDeque.java:485)
   at java.util.concurrent.LinkedBlockingDeque.take(LinkedBlockingDeque.java:673)
   at com.facebook.internal.AttributionIdentifiers$GoogleAdServiceConnection.getBinder(AttributionIdentifiers.kt:267)
   at com.facebook.internal.AttributionIdentifiers$Companion.getAndroidIdViaService(AttributionIdentifiers.kt:155)
   at com.facebook.internal.AttributionIdentifiers$Companion.getAndroidId(AttributionIdentifiers.kt:82)
   at com.facebook.internal.AttributionIdentifiers$Companion.getAttributionIdentifiers(AttributionIdentifiers.kt:171)
   at com.facebook.appevents.AppEventCollection.getSessionEventsState(AppEventCollection.kt:63)
   at com.facebook.appevents.AppEventCollection.addPersistedEvents(AppEventCollection.kt:24)
   at com.facebook.appevents.AppEventQueue.flushAndWait(AppEventQueue.kt:96)
   at com.facebook.AccessTokenManager.setCurrentAccessToken(AccessTokenManager.kt:85)
   at com.facebook.AccessTokenManager.setCurrentAccessToken(AccessTokenManager.kt:38)
   at com.facebook.AccessToken$Companion.setCurrentAccessToken(AccessToken.kt:427)
   at com.facebook.login.LoginManager.logOut(LoginManager.kt:359)
   at com.facebook.login.widget.LoginButton$LoginClickListener.performLogout$lambda$2(LoginButton.kt:783)
   at com.facebook.login.widget.LoginButton$LoginClickListener.$r8$lambda$oR4KVtJGGFlEEkP3nShlkqy6KZg(unavailable)
   at com.facebook.login.widget.LoginButton$LoginClickListener$$ExternalSyntheticLambda0.onClick(D8$$SyntheticClass)
   at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:212)
   at android.os.Handler.dispatchMessage(Handler.java:110)
   at android.os.Looper.loopOnce(Looper.java:273)
   at android.os.Looper.loop(Looper.java:363)
   at android.app.ActivityThread.main(ActivityThread.java:10060)
   at java.lang.reflect.Method.invoke(Native method)
   at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:632)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:975)


      main (waiting):tid=1 systid=22590 
   at jdk.internal.misc.Unsafe.park(Native method)
   at java.util.concurrent.locks.LockSupport.park(LockSupport.java:371)
   at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(AbstractQueuedSynchronizer.java:519)
   at java.util.concurrent.ForkJoinPool.unmanagedBlock(ForkJoinPool.java:3797)
   at java.util.concurrent.ForkJoinPool.managedBlock(ForkJoinPool.java:3738)
   at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1712)
   at java.util.concurrent.LinkedBlockingDeque.takeFirst(LinkedBlockingDeque.java:485)
   at java.util.concurrent.LinkedBlockingDeque.take(LinkedBlockingDeque.java:673)
   at com.facebook.internal.AttributionIdentifiers$GoogleAdServiceConnection.getBinder(AttributionIdentifiers.kt:267)
   at com.facebook.internal.AttributionIdentifiers$Companion.getAndroidIdViaService(AttributionIdentifiers.kt:155)
   at com.facebook.internal.AttributionIdentifiers$Companion.getAndroidId(AttributionIdentifiers.kt:82)
   at com.facebook.internal.AttributionIdentifiers$Companion.getAttributionIdentifiers(AttributionIdentifiers.kt:171)
   at com.facebook.appevents.AppEventCollection.getSessionEventsState(AppEventCollection.kt:63)
   at com.facebook.appevents.AppEventCollection.addPersistedEvents(AppEventCollection.kt:24)
   at com.facebook.appevents.AppEventQueue.flushAndWait(AppEventQueue.kt:96)
   at com.facebook.AccessTokenManager.setCurrentAccessToken(AccessTokenManager.kt:85)
   at com.facebook.AccessTokenManager.setCurrentAccessToken(AccessTokenManager.kt:38)
   at com.facebook.AccessToken$Companion.setCurrentAccessToken(AccessToken.kt:427)
   at com.facebook.AccessToken.setCurrentAccessToken(unavailable:2)
   at com.facebook.GraphRequest$Companion.runCallbacks$lambda$2(GraphRequest.kt:1034)
   at com.facebook.GraphRequest$Companion.$r8$lambda$6lN3mypbS0vlDSB7sRa6ltT7WqA(unavailable)
   at com.facebook.GraphRequest$Companion$$ExternalSyntheticLambda2.run(D8$$SyntheticClass)
   at android.os.Handler.handleCallback(Handler.java:995)
   at android.os.Handler.dispatchMessage(Handler.java:103)
   at android.os.Looper.loopOnce(Looper.java:273)
   at android.os.Looper.loop(Looper.java:363)
   at android.app.ActivityThread.main(ActivityThread.java:10060)
   at java.lang.reflect.Method.invoke(Native method)
   at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:632)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:975)

Expected results

successfully logout

Actual results

ANR

Steps to reproduce

repeat login and logout

login
click the com.facebook.login.widget.LoginButton

logout
call AccessToken.setCurrentAccessToken(null);

sometimes click the login, ANR appears when click the facebooklogin LoginButton

and logout also ANR, when AccessToken.setCurrentAccessToken(null) is called;

Code samples & details

    //login ui

    private View btn_fbLogin;
    private LoginButton fb_login_button;
    private CallbackManager callbackManager;

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        callbackManager = CallbackManager.Factory.create();
            btn_fbLogin = view.findViewById(R.id.btn_fbLogin);
         fb_login_button = view.findViewById(R.id.fb_login_button);
        fb_login_button.setFragment(this);
        fb_login_button.setPermissions("public_profile", "email");

        LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(LoginResult loginResult) {
            }

            @Override
            public void onCancel() {
            }

            @Override
            public void onError(FacebookException error) {
            
            }
        });

        fb_login_button.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(final LoginResult loginResult) {
                GraphRequest request = GraphRequest.newMeRequest(loginResult.getAccessToken(), new   GraphRequest.GraphJSONObjectCallback() {
                    @Override
                    public void onCompleted(JSONObject object, GraphResponse response) {
                     }
                    }
                });
                Bundle bundle = new Bundle();
                bundle.putString("fields", "id,name,email");
                request.setParameters(bundle);
                request.executeAsync();
            }

            @Override
            public void onCancel() {
            }

            @Override
            public void onError(FacebookException error) {
            }
        });
        btn_fbLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                fb_login_button.performClick();
            }
        });

}

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

//Logout function
  private void logout(){
    AccessToken fbAccessToken = AccessToken.getCurrentAccessToken();
        if (fbAccessToken != null) {
            new GraphRequest(fbAccessToken, "/me/permissions/", null, HttpMethod.DELETE, new GraphRequest.Callback() {
                @Override
                public void onCompleted(GraphResponse response) {
                    AccessToken.setCurrentAccessToken(null);
                }
            }).executeAsync();
        }
}

Metadata

Metadata

Assignees

No one assigned

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions