diff --git a/nativescript-core/ui/frame/frame.android.ts b/nativescript-core/ui/frame/frame.android.ts index e06248e64..7e0de46bb 100644 --- a/nativescript-core/ui/frame/frame.android.ts +++ b/nativescript-core/ui/frame/frame.android.ts @@ -87,6 +87,16 @@ function getAttachListener(): android.view.View.OnAttachStateChangeListener { return attachStateChangeListener; } +function nativeArrayIncludes(arr: native.Array, what: T): boolean { + for (let i = 0; i < arr.length; i++) { + if (arr[i] === what) { + return true; + } + } + + return false; +} + export class Frame extends FrameBase { public _originalBackground: any; private _android: AndroidFrame; @@ -264,13 +274,28 @@ export class Frame extends FrameBase { !this._currentEntry.fragment.isAdded()) { return; } + const fragmentManager: androidx.fragment.app.FragmentManager = this._getFragmentManager(); - const manager: androidx.fragment.app.FragmentManager = this._getFragmentManager(); - const transaction = manager.beginTransaction(); + // Check if manager contains the fragment to be removed + // This might happen when a dialog is already closed with android back btn const fragment = this._currentEntry.fragment; + const fragmentFound = nativeArrayIncludes(fragmentManager.getFragments().toArray(), fragment); + + if (traceEnabled()) { + const message = fragmentFound ? + `Frame.disposeCurrentFragment - fragment(${fragment}) found in fragmentManager(${fragmentManager}). Removing ...` : + `Frame.disposeCurrentFragment - fragment(${fragment}) NOT found in fragmentManager(${fragmentManager}). Skipping remove`; + traceWrite(message, traceCategories.NativeLifecycle); + } + + if (!fragmentFound) { + return; + } + + const transaction = fragmentManager.beginTransaction(); const fragmentExitTransition = fragment.getExitTransition(); - // Reset animation to its initial state to prevent mirrorered effect when restore current fragment transitions + // Reset animation to its initial state to prevent mirrored effect when restore current fragment transitions if (fragmentExitTransition && fragmentExitTransition instanceof org.nativescript.widgets.CustomTransition) { fragmentExitTransition.setResetOnTransitionEnd(true); } diff --git a/nativescript-core/utils/utils.ios.ts b/nativescript-core/utils/utils.ios.ts index 17474fd8d..c01e04f39 100644 --- a/nativescript-core/utils/utils.ios.ts +++ b/nativescript-core/utils/utils.ios.ts @@ -6,8 +6,6 @@ import { export { ios }; export * from "./utils-common"; -let mainScreenScale; - export function openFile(filePath: string): boolean { try { const appPath = ios.getCurrentAppPath(); @@ -47,5 +45,3 @@ export function openUrl(location: string): boolean { return false; } - -mainScreenScale = UIScreen.mainScreen.scale;