thunderbird-android
thunderbird-android copied to clipboard
App crashes when moving away from app while crypto provider selection dialog is showing
Checklist
- [X] I have used the search function to see if someone else has already submitted the same bug report.
- [X] I will describe the problem with as much detail as possible.
App version
c1a8f3a9c7c0f6bb03df0da01a9d5f6bc0f9e172
Where did you get the app from?
Other
Android version
Android 14
Device model
Pixel 8
Steps to reproduce
- Install two versions of OpenKeychain, e.g. the release version and a debug version built from source.
- Go to Settings → [Account] → End-to-end encryption.
- Tap Enable OpenPGP support.
- Switch to the home screen or another app.
Expected behavior
No crash
Actual behavior
App crashes with the following stack trace:
java.lang.RuntimeException: Unable to stop activity {com.fsck.k9.debug/com.fsck.k9.ui.settings.account.OpenPgpAppSelectDialog}: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.app.ActivityThread.callActivityOnStop(ActivityThread.java:5658)
at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:5630)
at android.app.ActivityThread.handleStopActivity(ActivityThread.java:5695)
at android.app.servertransaction.StopActivityItem.execute(StopActivityItem.java:43)
at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:60)
at android.app.servertransaction.TransactionExecutor.executeLifecycleItem(TransactionExecutor.java:282)
at android.app.servertransaction.TransactionExecutor.executeTransactionItems(TransactionExecutor.java:150)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:93)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2595)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loopOnce(Looper.java:232)
at android.os.Looper.loop(Looper.java:317)
at android.app.ActivityThread.main(ActivityThread.java:8592)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:580)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:878)
Caused by: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at androidx.fragment.app.FragmentManager.checkStateLoss(FragmentManager.java:1840)
at androidx.fragment.app.FragmentManager.enqueueAction(FragmentManager.java:1880)
at androidx.fragment.app.BackStackRecord.commitInternal(BackStackRecord.java:341)
at androidx.fragment.app.BackStackRecord.commit(BackStackRecord.java:306)
at androidx.fragment.app.DialogFragment.dismissInternal(DialogFragment.java:616)
at androidx.fragment.app.DialogFragment.dismiss(DialogFragment.java:550)
at com.fsck.k9.ui.settings.account.OpenPgpAppSelectDialog$OpenPgpAppSelectFragment.onStop(OpenPgpAppSelectDialog.java:159)
at androidx.fragment.app.Fragment.performStop(Fragment.java:3342)
at androidx.fragment.app.FragmentStateManager.stop(FragmentStateManager.java:692)
at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:316)
at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:114)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1663)
at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3247)
at androidx.fragment.app.FragmentManager.dispatchStop(FragmentManager.java:3189)
at androidx.fragment.app.FragmentController.dispatchStop(FragmentController.java:307)
at androidx.fragment.app.FragmentActivity.onStop(FragmentActivity.java:373)
at androidx.appcompat.app.AppCompatActivity.onStop(AppCompatActivity.java:257)
at com.fsck.k9.ui.settings.account.OpenPgpAppSelectDialog.onStop(OpenPgpAppSelectDialog.java:89)
at android.app.Instrumentation.callActivityOnStop(Instrumentation.java:1742)
at android.app.Activity.performStop(Activity.java:9213)
at android.app.ActivityThread.callActivityOnStop(ActivityThread.java:5650)
at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:5630)
at android.app.ActivityThread.handleStopActivity(ActivityThread.java:5695)
at android.app.servertransaction.StopActivityItem.execute(StopActivityItem.java:43)
at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:60)
at android.app.servertransaction.TransactionExecutor.executeLifecycleItem(TransactionExecutor.java:282)
at android.app.servertransaction.TransactionExecutor.executeTransactionItems(TransactionExecutor.java:150)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:93)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2595)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loopOnce(Looper.java:232)
at android.os.Looper.loop(Looper.java:317)
at android.app.ActivityThread.main(ActivityThread.java:8592)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:580)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:878)
The problem seems to be that OpenPgpAppSelectFragment overrides onStop() and tries to dismiss the dialog when that method is called. We can fix this by calling dismissAllowingStateLoss() instead of dismiss().
Note: OpenKeychainInfoFragment seems to have the same issue.
Logs
No response