Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Requires IMMUTABLE tag crash on API 31 #1999

Closed
dorianpavetic opened this issue Sep 2, 2021 · 20 comments
Closed

Requires IMMUTABLE tag crash on API 31 #1999

dorianpavetic opened this issue Sep 2, 2021 · 20 comments

Comments

@dorianpavetic
Copy link

Step 2: Describe your environment

  • Android device: Google Pixel 4 emulator
  • Android OS version: Api 31
  • Google Play Services version: 4.3.10
  • Firebase/Play Services SDK version: Firebase BOM 28.3.1
  • FirebaseUI version: 8.0.0

Step 3: Describe the problem:

Steps to reproduce:

Clicking on button to open Auth activity crashes app

Observed Results:

  • 2021-09-01 19:52:52.192 8005-8005/hr.pavetic.simplify.debug E/AndroidRuntime: FATAL EXCEPTION: main
    Process: hr.pavetic.simplify.debug, PID: 8005
    java.lang.IllegalArgumentException: hr.pavetic.simplify.debug: Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent.
    Strongly consider using FLAG_IMMUTABLE, only use FLAG_MUTABLE if some functionality depends on the PendingIntent being mutable, e.g. if it needs to be used with inline replies or bubbles.
    at android.app.PendingIntent.checkFlags(PendingIntent.java:375)
    at android.app.PendingIntent.getActivityAsUser(PendingIntent.java:458)
    at android.app.PendingIntent.getActivity(PendingIntent.java:444)
    at android.app.PendingIntent.getActivity(PendingIntent.java:408)
    at com.google.android.gms.internal.auth-api.zzr.zzc(com.google.android.gms:play-services-auth@@19.0.0:19)
    at com.google.android.gms.auth.api.credentials.CredentialsClient.getHintPickerIntent(com.google.android.gms:play-services-auth@@19.0.0:10)
    at com.firebase.ui.auth.ui.phone.CheckPhoneHandler.fetchCredential(CheckPhoneHandler.java:28)
    at com.firebase.ui.auth.ui.phone.CheckPhoneNumberFragment.setDefaultCountryForSpinner(CheckPhoneNumberFragment.java:238)
    at com.firebase.ui.auth.ui.phone.CheckPhoneNumberFragment.onActivityCreated(CheckPhoneNumberFragment.java:127)
    at androidx.fragment.app.Fragment.performActivityCreated(Fragment.java:2994)
    at androidx.fragment.app.FragmentStateManager.activityCreated(FragmentStateManager.java:559)
    at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:262)
    at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1797)
    at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1715)
    at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1658)
    at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2780)
    at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:2715)
    at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:262)
    at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:478)
    at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:246)
    at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1455)
    at android.app.Activity.performStart(Activity.java:8076)
    at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3653)
    at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221)
    at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201)
    at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2203)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loopOnce(Looper.java:201)
    at android.os.Looper.loop(Looper.java:288)
    at android.app.ActivityThread.main(ActivityThread.java:7822)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)

Expected Results:

  • Opening activity

Relevant Code:

I was opening activity with ActivityResultLauncher, but after this error tried different approach with PendingIntent but still crashes.

`final Intent phoneAuthIntent =
AuthUI.getInstance()
.createSignInIntentBuilder()
.setAvailableProviders(providers)
.setLogo(R.drawable.simplify_logo)
.setTheme(R.style.FirebaseAuthTheme)
.setTosAndPrivacyPolicyUrls(
getResources().getString(R.string.terms_and_conditions_url),
getResources().getString(R.string.privacy_url))
.setIsSmartLockEnabled(!BuildConfig.DEBUG /* credentials /, true / hints */)
.build();

    PendingIntent pendingIntent = PendingIntent.getActivity(requireActivity().getApplicationContext(),
            123, phoneAuthIntent,
            /* flags */ PendingIntent.FLAG_IMMUTABLE);

    //binding.authenticationAcceptButton.setOnClickListener(button -> signInLauncher.launch(phoneAuthIntent));
    binding.authenticationAcceptButton.setOnClickListener(button -> {
        try {
            pendingIntent.send(123);
        } catch (PendingIntent.CanceledException e) {
            e.printStackTrace();
        }
    });`
@dorianpavetic dorianpavetic changed the title Requires IMMUTABLE tag on API 31 Requires IMMUTABLE tag crash on API 31 Sep 2, 2021
@farooqahmadm1
Copy link

Didn't find any proper solution but solved this issue by adding this latest Work Manager Dependency.
api 'androidx.work:work-runtime-ktx:2.7.0-beta01'

@faizanabidnaqvi
Copy link

I am facing the same issue. As suggested by @farooqahmadm1 and some other solutions I read online, I added the work manager dependency using:
api("androidx.work:work-runtime-ktx:2.7.0-rc01")

That didn't solve the problem for me. The crash occurs right after the auth method returns to the app.

Here is the full stack trace:

2021-09-29 00:12:46.059 25785-25785/com.test.app E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.test.app, PID: 25785
    java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=64206, result=-1, data=Intent { (has extras) }} to activity {com.test.app/com.firebase.ui.auth.ui.idp.SingleSignInActivity}: java.lang.IllegalArgumentException: com.test.app: Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent.
    Strongly consider using FLAG_IMMUTABLE, only use FLAG_MUTABLE if some functionality depends on the PendingIntent being mutable, e.g. if it needs to be used with inline replies or bubbles.
        at android.app.ActivityThread.deliverResults(ActivityThread.java:5293)
        at android.app.ActivityThread.handleSendResult(ActivityThread.java:5332)
        at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:54)
        at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:45)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2203)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loopOnce(Looper.java:201)
        at android.os.Looper.loop(Looper.java:288)
        at android.app.ActivityThread.main(ActivityThread.java:7822)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
     Caused by: java.lang.IllegalArgumentException: com.test.app: Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent.
    Strongly consider using FLAG_IMMUTABLE, only use FLAG_MUTABLE if some functionality depends on the PendingIntent being mutable, e.g. if it needs to be used with inline replies or bubbles.
        at android.app.PendingIntent.checkFlags(PendingIntent.java:375)
        at android.app.PendingIntent.getBroadcastAsUser(PendingIntent.java:645)
        at android.app.PendingIntent.getBroadcast(PendingIntent.java:632)
        at com.facebook.AccessTokenManager.setTokenExpirationBroadcastAlarm(AccessTokenManager.kt:106)
        at com.facebook.AccessTokenManager.setCurrentAccessToken(AccessTokenManager.kt:79)
        at com.facebook.AccessTokenManager.setCurrentAccessToken(AccessTokenManager.kt:47)
        at com.facebook.AccessToken$Companion.setCurrentAccessToken(AccessToken.kt:402)
        at com.facebook.AccessToken.setCurrentAccessToken(Unknown Source:2)
        at com.facebook.login.LoginManager.finishLogin(LoginManager.java:745)
        at com.facebook.login.LoginManager.onActivityResult(LoginManager.java:244)
        at com.facebook.login.LoginManager$1.onActivityResult(LoginManager.java:183)
        at com.facebook.internal.CallbackManagerImpl.onActivityResult(CallbackManagerImpl.kt:44)
        at com.firebase.ui.auth.data.remote.FacebookSignInHandler.onActivityResult(FacebookSignInHandler.java:92)
        at com.firebase.ui.auth.ui.idp.SingleSignInActivity.onActivityResult(SingleSignInActivity.java:144)
        at android.app.Activity.dispatchActivityResult(Activity.java:8382)
        at android.app.ActivityThread.deliverResults(ActivityThread.java:5286)
        	... 13 more
2021-09-29 00:12:50.071 25785-25785/com.test.app E/FirebaseCrashlytics: Error handling uncaught exception
    java.util.concurrent.TimeoutException
        at com.google.firebase.crashlytics.internal.common.Utils.awaitEvenIfOnMainThread(Utils.java:122)
        at com.google.firebase.crashlytics.internal.common.CrashlyticsController.handleUncaughtException(CrashlyticsController.java:232)
        at com.google.firebase.crashlytics.internal.common.CrashlyticsController$1.onUncaughtException(CrashlyticsController.java:155)
        at com.google.firebase.crashlytics.internal.common.CrashlyticsUncaughtExceptionHandler.uncaughtException(CrashlyticsUncaughtExceptionHandler.java:54)
        at com.facebook.internal.instrument.crashreport.CrashHandler.uncaughtException(CrashHandler.kt:42)
        at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1073)
        at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1068)
        at java.lang.Thread.dispatchUncaughtException(Thread.java:2200)

I do notice that the exception occurs somewhere in the Facebook Login Manager, so maybe this fix has to be done on the Facebook SDK side.

@faizanabidnaqvi
Copy link

Just fixed this by updating to the latest Facebook SDK:
implementation("com.facebook.android:facebook-login:12.0.0")

There is no need to add the work manager dependency.

@KirkBushman
Copy link

This is still happening with the firebase email sign-in, is there a proper workaround?

@KirkBushman
Copy link

firebase-auth need to be updated to latest version

@edenman
Copy link
Contributor

edenman commented Oct 29, 2021

The email stacktrace:

Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent.
Strongly consider using FLAG_IMMUTABLE, only use FLAG_MUTABLE if some functionality depends on the PendingIntent being mutable, e.g. if it needs to be used with inline replies or bubbles.
        at android.app.PendingIntent.checkFlags(PendingIntent.java:375)
        at android.app.PendingIntent.getActivityAsUser(PendingIntent.java:458)
        at android.app.PendingIntent.getActivity(PendingIntent.java:444)
        at android.app.PendingIntent.getActivity(PendingIntent.java:408)
        at com.google.android.gms.internal.auth-api.zzr.zzc(com.google.android.gms:play-services-auth@@19.0.0:19)
        at com.google.android.gms.auth.api.credentials.CredentialsClient.getHintPickerIntent(com.google.android.gms:play-services-auth@@19.0.0:10)
        at com.firebase.ui.auth.ui.email.CheckEmailHandler.fetchCredential(CheckEmailHandler.java:29)
        at com.firebase.ui.auth.ui.email.CheckEmailFragment.onActivityCreated(CheckEmailFragment.java:174)
        at androidx.fragment.app.Fragment.performActivityCreated(Fragment.java:2996)
        at androidx.fragment.app.FragmentStateManager.activityCreated(FragmentStateManager.java:580)
        at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:285)
        at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2189)
        at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2100)
        at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:2002)
        at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3138)
        at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:3072)
        at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:251)
        at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:502)
        at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:246)
        at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1455)
        at android.app.Activity.performStart(Activity.java:8076)
        at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3664)
        at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221)
        at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201)
        at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2214)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loopOnce(Looper.java:201)
        at android.os.Looper.loop(Looper.java:288) 
        at android.app.ActivityThread.main(ActivityThread.java:7842)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)

I can't think of any workaround here except for dropping your targetSdkVersion and waiting for a fix.

@mikehardy
Copy link

I believe this library could be fixed by taking the PendingIntent from CredentialsClient and giving it the flags update current and immutable or'd together

Sort of like so (although this is kotlin) https://github.com/square/leakcanary/pull/2124/files#diff-3165c16e2b07bd1a48c821c2f692a640543f57e5172dc5e9029636120712ec97R182-R185

here

Credentials.getClient(getApplication()).getHintPickerIntent(
new HintRequest.Builder().setPhoneNumberIdentifierSupported(true).build()),

@dorianpavetic
Copy link
Author

Nothing seems to be fixing this issue so eventually it was just less painless to write my own auth ui login system..
Any suggestions for other people stuck with this issue are welcome

@junkuvo
Copy link

junkuvo commented Nov 10, 2021

FYI, I could open activity with default email address to avoid creating PendingIntent

        val emailProvider = AuthUI.IdpConfig.EmailBuilder()
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.S){
            emailProvider.setDefaultEmail("@")
        }

@Surendar7
Copy link

Does anybody found a fix for this?

I'm still facing this issue even with androidx.work:work-runtime-ktx:2.7.1 on api 31 with only phone number provider.

@mikehardy
Copy link

Looks like someone needs to make a PR sorta like #1999 (comment) @Surendar7

@beyondeye
Copy link

updating dependencies (firebase-bom -> 29.0.3, play-services-auth -> 20.0.0, play:core -> 1.10.2) solved the problem for me

@UweTrottmann
Copy link

UweTrottmann commented Feb 4, 2022

Basically two options:

  1. Look for where the PendingIntent is built, then find the library that adds this code and update to a version that supports Android 12.

    For the original reported crash the Intent is built here:

    at com.google.android.gms.internal.auth-api.zzr.zzc(com.google.android.gms:play-services-auth@@19.0.0:19
    at com.google.android.gms.auth.api.credentials.CredentialsClient.getHintPickerIntent(com.google.android.gms:play-services-auth@@19.0.0:10)
    

    So in that case it is enough to explicitly add a newer version of play-services-auth to your dependencies:
    implementation("com.google.android.gms:play-services-auth:20.0.1")

    If possible, test the sign-in flow on an Android 12 emulator or device to be sure.

  2. Do not target Android 12 (e.g. if not all your libraries that use PendingIntent are updated for Android 12).

@thatfiredev
Copy link
Member

Closing this. See UweTrottmann's comment for the general solution.

@haluzpav
Copy link

@thatfiredev How is that a solution? That's just a work-around. Your library should work out of the box, without needing to update any of its dependencies manually.

@thatfiredev
Copy link
Member

@haluzpav thanks for the call out! I've opened #2063 to fix that.

@thatfiredev
Copy link
Member

This should be fixed in version 8.0.2 of FirebaseUI for Android

@zjamshidi
Copy link

I was facing this crash, so I updated the related dependencies:

implementation platform('com.google.firebase:firebase-bom:30.5.0')
implementation 'com.firebaseui:firebase-ui-auth:8.0.2'
implementation 'com.google.android.gms:play-services-auth:20.4.0'
implementation 'com.facebook.android:facebook-login:15.2.0'
implementation 'com.google.android.play:core:1.10.3'

Now I'm facing another crash:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.storyshots.android/com.firebase.ui.auth.ui.idp.AuthMethodPickerActivity}: The SDK has not been initialized, make sure to call FacebookSdk.sdkInitialize() first.
                 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3769)
                 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3936)
                 	at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)
                 	at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
                 	at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
                 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2289)
                 	at android.os.Handler.dispatchMessage(Handler.java:106)
                 	at android.os.Looper.loopOnce(Looper.java:211)
                 	at android.os.Looper.loop(Looper.java:300)
                 	at android.app.ActivityThread.main(ActivityThread.java:8301)
                 	at java.lang.reflect.Method.invoke(Native Method)
                 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:556)
                 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1043)
                 Caused by: The SDK has not been initialized, make sure to call FacebookSdk.sdkInitialize() first.
                 	at com.facebook.internal.Validate.sdkInitialized(Validate.kt:117)
                 	at com.facebook.login.LoginManager.<init>(LoginManager.kt:1386)
                 	at com.facebook.login.LoginManager$Companion.getInstance(LoginManager.kt:1307)
                 	at com.facebook.login.LoginManager.getInstance(Unknown Source:2)
                 	at com.firebase.ui.auth.data.remote.FacebookSignInHandler.onCreate(FacebookSignInHandler.java:79)
                 	at com.firebase.ui.auth.viewmodel.ViewModelBase.init(ViewModelBase.java:24)
                 	at com.firebase.ui.auth.viewmodel.ProviderSignInBase.initWith(ProviderSignInBase.java:53)
                 	at com.firebase.ui.auth.ui.idp.AuthMethodPickerActivity.handleSignInOperation(AuthMethodPickerActivity.java:303)
                 	at com.firebase.ui.auth.ui.idp.AuthMethodPickerActivity.populateIdpListCustomLayout(AuthMethodPickerActivity.java:236)
                 	at com.firebase.ui.auth.ui.idp.AuthMethodPickerActivity.onCreate(AuthMethodPickerActivity.java:107)
                 	at android.app.Activity.performCreate(Activity.java:8176)
                 	at android.app.Activity.performCreate(Activity.java:8143)
                 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1330)
                 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3742)
                 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3936) 
                 	at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103) 
                 	at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
                 	at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
                 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2289) 
                 	at android.os.Handler.dispatchMessage(Handler.java:106) 
                 	at android.os.Looper.loopOnce(Looper.java:211) 
                 	at android.os.Looper.loop(Looper.java:300) 
                 	at android.app.ActivityThread.main(ActivityThread.java:8301) 
                 	at java.lang.reflect.Method.invoke(Native Method) 
                 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:556) 
                 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1043) 

@thatfiredev What's missing?

@mikehardy
Copy link

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.storyshots.android/com.firebase.ui.auth.ui.idp.AuthMethodPickerActivity}: The SDK has not been initialized, make sure to call FacebookSdk.sdkInitialize() first.

@zjamshidi your very error message gives you the clue to get you on the path. New Facebook SDKs have breaking changes in initialization sequence. You must adapt to them. Has nothing to do with this module + this issue

@zjamshidi
Copy link

Thanks, @mikehardy. I found the issue. The developers of this module need to update their documentation

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests