diff --git a/apps/perf-tests/nav-page.ts b/apps/perf-tests/nav-page.ts index ccaf0fe25..9ee3f9b7f 100644 --- a/apps/perf-tests/nav-page.ts +++ b/apps/perf-tests/nav-page.ts @@ -40,9 +40,9 @@ export class NavPage extends Page implements definition.ControlsPage { var that = this; that.on(View.loadedEvent, (args) => { console.log(`${args.object}.loadedEvent`); - if (topmostFrame().android) { - topmostFrame().android.cachePagesOnNavigate = true; - } + //if (topmostFrame().android) { + // topmostFrame().android.cachePagesOnNavigate = true; + //} }); that.on(View.unloadedEvent, (args) => { console.log(`${args.object}.unloadedEvent`); diff --git a/ui/frame/frame.android.ts b/ui/frame/frame.android.ts index 88c77fe08..00e662da5 100644 --- a/ui/frame/frame.android.ts +++ b/ui/frame/frame.android.ts @@ -61,7 +61,7 @@ function onFragmentShown(fragment: FragmentClass) { transitionModule._onFragmentShown(fragment, isBack); } -function onFragmentHidden(fragment: FragmentClass) { +function onFragmentHidden(fragment: FragmentClass, destroyed: boolean) { trace.write(`HIDDEN ${fragment.getTag()}`, trace.categories.NativeLifecycle); if (fragment[CLEARING_HISTORY]) { @@ -74,7 +74,7 @@ function onFragmentHidden(fragment: FragmentClass) { fragment.entry[IS_BACK] = undefined; // Handle page transitions. - transitionModule._onFragmentHidden(fragment, isBack); + transitionModule._onFragmentHidden(fragment, isBack, destroyed); } export class Frame extends frameCommon.Frame { @@ -580,7 +580,7 @@ class FragmentClass extends android.app.Fragment { trace.write(`${this.getTag()}.onHiddenChanged(${hidden})`, trace.categories.NativeLifecycle); super.onHiddenChanged(hidden); if (hidden) { - onFragmentHidden(this); + onFragmentHidden(this, false); } else { onFragmentShown(this); @@ -644,14 +644,8 @@ class FragmentClass extends android.app.Fragment { public onDestroyView(): void { trace.write(`${this.getTag()}.onDestroyView()`, trace.categories.NativeLifecycle); super.onDestroyView(); - onFragmentHidden(this); - - // When Fragment is destroyed we detach page even if cachePagesOnNavigate is true. - let entry = this.entry; - let page = entry.resolvedPage; - if (page._context) { - page._onDetached(true); - } + // Detaching the page has been move in onFragmentHidden due to transitions. + onFragmentHidden(this, true); } public onDestroy(): void { diff --git a/ui/transition/transition.android.ts b/ui/transition/transition.android.ts index 010bb7b48..0a69e9b46 100644 --- a/ui/transition/transition.android.ts +++ b/ui/transition/transition.android.ts @@ -13,6 +13,7 @@ var ENTER_POPEXIT_TRANSITION = "ENTER_POPEXIT_TRANSITION"; var EXIT_POPENTER_TRANSITION = "EXIT_POPENTER_TRANSITION"; var COMPLETE_PAGE_ADDITION_WHEN_TRANSITION_ENDS = "COMPLETE_PAGE_ADDITION_WHEN_TRANSITION_ENDS"; var COMPLETE_PAGE_REMOVAL_WHEN_TRANSITION_ENDS = "COMPLETE_PAGE_REMOVAL_WHEN_TRANSITION_ENDS"; +var DESTROYED = "DESTROYED"; var enterFakeResourceId = -10; var exitFakeResourceId = -20; var popEnterFakeResourceId = -30; @@ -241,7 +242,7 @@ export function _onFragmentShown(fragment: android.app.Fragment, isBack: boolean } } -export function _onFragmentHidden(fragment: android.app.Fragment, isBack: boolean) { +export function _onFragmentHidden(fragment: android.app.Fragment, isBack: boolean, destroyed: boolean) { var transitionType = isBack ? "Pop Exit" : "Exit"; var relevantTransition = isBack ? ENTER_POPEXIT_TRANSITION : EXIT_POPENTER_TRANSITION; if (fragment[relevantTransition]) { @@ -256,6 +257,8 @@ export function _onFragmentHidden(fragment: android.app.Fragment, isBack: boolea } } + fragment[DESTROYED] = destroyed; + if (fragment[COMPLETE_PAGE_REMOVAL_WHEN_TRANSITION_ENDS] === undefined) { // This might be a second call if the fragment is hidden and then destroyed. _completePageRemoval(fragment, true, isBack); @@ -291,6 +294,17 @@ function _completePageRemoval(fragment: android.app.Fragment, force: boolean = f trace.write(`REMOVAL of ${page} has already been done`, trace.categories.Transition); } } + + if (fragment[DESTROYED]) { + fragment[DESTROYED] = undefined; + if (page._context) { + page._onDetached(true); + trace.write(`DETACHMENT of ${page} completed`, trace.categories.Transition); + } + else { + trace.write(`DETACHMENT of ${page} has already been done`, trace.categories.Transition); + } + } } function _addNativeTransitionListener(fragment: android.app.Fragment, nativeTransition: any/*android.transition.Transition*/) { diff --git a/ui/transition/transition.d.ts b/ui/transition/transition.d.ts index 1c5f38bde..0ea3b20f7 100644 --- a/ui/transition/transition.d.ts +++ b/ui/transition/transition.d.ts @@ -23,7 +23,7 @@ export function _setAndroidFragmentTransitions(navigationTransition: frame.NavigationTransition, currentFragment: any, newFragment: any, fragmentTransaction: any): void; export function _onFragmentCreateAnimator(fragment: any, nextAnim: number): any; export function _onFragmentShown(fragment: any, isBack: boolean): void; - export function _onFragmentHidden(fragment: any, isBack: boolean): void; + export function _onFragmentHidden(fragment: any, isBack: boolean, destroyed: boolean): void; export function _createIOSAnimatedTransitioning(navigationTransition: frame.NavigationTransition, nativeCurve: any, operation: number, fromVC: any, toVC: any): any; //@endprivate