diff --git a/CHANGELOG.md b/CHANGELOG.md index 6f4505f4..a1db7657 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## [55.2.4] +- [Android][Modal] Fixed crash caused by accessing a disposed Java peer when comparing fragments in OnFragmentDestroyed + ## [55.2.3] - [Android][Entry][Editor] Fixed potential crash. diff --git a/src/library/DIPS.Mobile.UI/API/Library/Android/FragmentLifeCycleCallback.cs b/src/library/DIPS.Mobile.UI/API/Library/Android/FragmentLifeCycleCallback.cs index aef9491f..3be484b3 100644 --- a/src/library/DIPS.Mobile.UI/API/Library/Android/FragmentLifeCycleCallback.cs +++ b/src/library/DIPS.Mobile.UI/API/Library/Android/FragmentLifeCycleCallback.cs @@ -46,13 +46,30 @@ public override void OnFragmentDestroyed(FragmentManager fm, Fragment f) { if (s_currentDialogFragmentReferenceStack?.Peek()?.TryGetTarget(out var currentDialogFragment) ?? false) { - if (currentDialogFragment.Equals(dialogFragment)) + // If either Java peer is already disposed, we can't compare via JNI. + // Since this fragment is being destroyed, pop it to avoid a stale entry. + if (currentDialogFragment.Handle == IntPtr.Zero || dialogFragment.Handle == IntPtr.Zero) { s_currentDialogFragmentReferenceStack.Pop(); } + else + { + try + { + if (currentDialogFragment.Equals(dialogFragment)) + { + s_currentDialogFragmentReferenceStack.Pop(); + } + } + catch (ObjectDisposedException) + { + s_currentDialogFragmentReferenceStack.Pop(); + } + } } + + base.OnFragmentDestroyed(fm, f); } - base.OnFragmentDestroyed(fm, f); } public override void OnFragmentStopped(FragmentManager fm, Fragment f)