firebase / FirebaseUI-Android

Optimized UI components for Firebase
https://firebaseopensource.com/projects/firebase/firebaseui-android/
Apache License 2.0
4.63k stars 1.84k forks source link

Crash if no internet available, Twitter #1057

Closed thomsan closed 6 years ago

thomsan commented 6 years ago

1: Are you in the right place?

yes

Step 2: Describe your environment

Step 3: Describe the problem:

If I'm signed out and don't have internet connection the app crashes on startup. The logs say something related to Twitter can't be found, even though I don't use Twitter authentication. I only use Google and Email authentication.

Steps to reproduce:

  1. Sign out, if previously signed in
  2. Turn on Airplane mode
  3. Start app

Observed Results:

Immediate app crash with following output:

12-15 16:38:18.483 3689-3689/example.com I/art: Rejecting re-init on previously-failed class java.lang.Class<com.firebase.ui.auth.provider.TwitterProvider>: java.lang.NoClassDefFoundError: Failed resolution of: Lcom/twitter/sdk/android/core/Callback;
12-15 16:38:18.483 3689-3689/example.com I/art:     at void com.firebase.ui.auth.AuthUI$IdpConfig$Builder.<init>(java.lang.String) (AuthUI.java:382)
12-15 16:38:18.483 3689-3689/example.com I/art:     at void example.com.MainActivity$3.onAuthStateChanged(com.google.firebase.auth.FirebaseAuth) (MainActivity.java:189)
12-15 16:38:18.483 3689-3689/example.com I/art:     at void com.google.firebase.auth.zzi.run() ((null):-1)
12-15 16:38:18.483 3689-3689/example.com I/art:     at void android.os.Handler.handleCallback(android.os.Message) (Handler.java:751)
12-15 16:38:18.483 3689-3689/example.com I/art:     at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:95)
12-15 16:38:18.483 3689-3689/example.com I/art:     at void android.os.Looper.loop() (Looper.java:154)
12-15 16:38:18.483 3689-3689/example.com I/art:     at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6682)
12-15 16:38:18.483 3689-3689/example.com I/art:     at java.lang.Object java.lang.reflect.Method.invoke!(java.lang.Object, java.lang.Object[]) (Method.java:-2)
12-15 16:38:18.483 3689-3689/example.com I/art:     at void com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run() (ZygoteInit.java:1520)
12-15 16:38:18.483 3689-3689/example.com I/art:     at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:1410)
12-15 16:38:18.483 3689-3689/example.com I/art: Caused by: java.lang.ClassNotFoundException: Didn't find class "com.twitter.sdk.android.core.Callback" on path: DexPathList[[zip file "/data/app/example.com-1/base.apk", zip file "/data/app/example.com-1/split_lib_dependencies_apk.apk", zip file "/data/app/example.com-1/split_lib_slice_0_apk.apk", zip file "/data/app/example.com-1/split_lib_slice_1_apk.apk", zip file "/data/app/example.com-1/split_lib_slice_2_apk.apk", zip file "/data/app/example.com-1/split_lib_slice_3_apk.apk", zip file "/data/app/example.com-1/split_lib_slice_4_apk.apk", zip file "/data/app/example.com-1/split_lib_slice_5_apk.apk", zip file "/data/app/example.com-1/split_lib_slice_6_apk.apk", zip file "/data/app/example.com-1/split_lib_slice_7_apk.apk", zip file "/data/app/example.com-1/split_lib_slice_8_apk.apk", zip file
12-15 16:38:18.483 3689-3689/example.com I/art:     at java.lang.Class dalvik.system.BaseDexClassLoader.findClass(java.lang.String) (BaseDexClassLoader.java:56)
12-15 16:38:18.483 3689-3689/example.com I/art:     at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String, boolean) (ClassLoader.java:380)
12-15 16:38:18.483 3689-3689/example.com I/art:     at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String) (ClassLoader.java:312)
12-15 16:38:18.483 3689-3689/example.com I/art:     at void com.firebase.ui.auth.AuthUI$IdpConfig$Builder.<init>(java.lang.String) (AuthUI.java:382)
12-15 16:38:18.483 3689-3689/example.com I/art:     at void example.com.MainActivity$3.onAuthStateChanged(com.google.firebase.auth.FirebaseAuth) (MainActivity.java:189)
12-15 16:38:18.483 3689-3689/example.com I/art:     at void com.google.firebase.auth.zzi.run() ((null):-1)
12-15 16:38:18.483 3689-3689/example.com I/art:     at void android.os.Handler.handleCallback(android.os.Message) (Handler.java:751)
12-15 16:38:18.483 3689-3689/example.com I/art:     at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:95)
12-15 16:38:18.483 3689-3689/example.com I/art:     at void android.os.Looper.loop() (Looper.java:154)
12-15 16:38:18.483 3689-3689/example.com I/art:     at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6682)
12-15 16:38:18.483 3689-3689/example.com I/art:     at java.lang.Object java.lang.reflect.Method.invoke!(java.lang.Object, java.lang.Object[]) (Method.java:-2)
12-15 16:38:18.483 3689-3689/example.com I/art:     at void com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run() (ZygoteInit.java:1520)
12-15 16:38:18.483 3689-3689/example.com I/art:     at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:1410)

Expected Results:

Relevant Code:

    private FirebaseAuth.AuthStateListener createAuthStateListener(){
        return new FirebaseAuth.AuthStateListener() {
            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
                FirebaseUser firebaseUser = firebaseAuth.getCurrentUser();
                FirebaseUtils.setFirebaseUser(firebaseUser);
                if(firebaseUser != null){
                    // user is signed in
                    onSignedInInitialize();
                } else {
                    // user is signed out
                    onSignedOutCleanup();
                    // Choose authentication providers
189>>>            List<AuthUI.IdpConfig> providers = Arrays.asList(
                            new AuthUI.IdpConfig.Builder(AuthUI.EMAIL_PROVIDER).build(),
                            new AuthUI.IdpConfig.Builder(AuthUI.GOOGLE_PROVIDER).build());

                    // Create and launch sign-in intent
                    startActivityForResult(
                            AuthUI.getInstance()
                                    .createSignInIntentBuilder()
                                    .setIsSmartLockEnabled(true)
                                    .setAvailableProviders(providers)
                                    .build(),
                            RC_SIGN_IN);
                }
            }
        };
    }
samtstern commented 6 years ago

Hmmm import com.twitter.sdk.android.core.Callback; happens to be the first com.twitter.sdk class we import in TwitterProvider (no idea if order is relevant?) so somehow we're trying to use that class when the Twitter SDK is not included.

Not sure how this relates to being offline, but will try and think about it.

samtstern commented 6 years ago

@thomsan two questions:

eliotstock commented 6 years ago

I can't repro the crash when offline, but I also get the ClassNotFoundException for this class even though I'm not using Twitter for auth.

Android device: Google Pixel 2 XL Android OS version: 8.1 Google Play Services version: 11.8.0 Firebase/Play Services SDK version: 11.8.0 FirebaseUI version: 3.2.1

SUPERCILEX commented 6 years ago

@samtstern I think this issue can probably closed since neither of us can repro and we haven't received more details. @eliotstock if you have extra info (stack trace and code sample), please share! 😄

samtstern commented 6 years ago

Yes I think we can close this due to age and lack of new reports. @thomsan or @eliotstock if you see this again and can help us get more details we will definitely re-open the issue!

objcode commented 6 years ago

I just reproduced this again, with a few more interesting details.

  1. I'm using dagger2 to inject FirebaseAuth into my app.
  2. I am not offline mode, and it's not happening at login, but rather at logout.
  3. I'm seeing log lines about "Notifying auth state listeners. Notified 0 auth state listeners."
Rejecting re-init on previously-failed class java.lang.Class<com.firebase.ui.auth.provider.TwitterProvider>: java.lang.NoClassDefFoundError: Failed resolution of: Lcom/twitter/sdk/android/core/Callback;
              at com.google.android.gms.tasks.Task com.firebase.ui.auth.AuthUI.signOutIdps(android.content.Context) (AuthUI.java:368)
              at com.google.android.gms.tasks.Task com.firebase.ui.auth.AuthUI.signOut(android.content.Context) (AuthUI.java:297)

and the logs:

Notifying auth state listeners.
Notified 0 auth state listeners.
samtstern commented 6 years ago

@objcode fwiw this is a complete mystery to me. Not that it's an actually good solution, but is this fixed by a dependency on twitter-core?

samtstern commented 6 years ago

This issue has been fixed and released in 3.3.0.