thunderbird-android icon indicating copy to clipboard operation
thunderbird-android copied to clipboard

App crashes when moving away from app while crypto provider selection dialog is showing

Open cketti opened this issue 1 year ago • 0 comments

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

  1. Install two versions of OpenKeychain, e.g. the release version and a debug version built from source.
  2. Go to Settings → [Account] → End-to-end encryption.
  3. Tap Enable OpenPGP support.
  4. 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

cketti avatar Aug 20 '24 13:08 cketti