From 9e40f8022b99b14582929f880a28abbc1662122b Mon Sep 17 00:00:00 2001 From: Rossen Hristov Date: Fri, 3 Jun 2016 15:48:02 +0300 Subject: [PATCH 1/2] Fixed: The exit transition of the current page is not played when navigating with clearHistory Resolves #2225 --- tns-core-modules/ui/frame/frame.android.ts | 2 +- .../ui/transition/transition.android.ts | 25 ++++++------------- .../ui/transition/transition.d.ts | 2 +- 3 files changed, 10 insertions(+), 19 deletions(-) diff --git a/tns-core-modules/ui/frame/frame.android.ts b/tns-core-modules/ui/frame/frame.android.ts index 054851fe3..048a9cc3d 100644 --- a/tns-core-modules/ui/frame/frame.android.ts +++ b/tns-core-modules/ui/frame/frame.android.ts @@ -192,7 +192,7 @@ export class Frame extends frameCommon.Frame { // We need to reverse the transitions because Android will ask the current fragment // to create its POP EXIT animator due to popping the back stack, but in reality // we need to create the EXIT animator because we are actually going forward and not back. - transitionModule._reverseTransitionsDirection(currentFragment); + transitionModule._prepareCurrentFragmentForClearHistory(currentFragment); } let firstEntryName = manager.getBackStackEntryAt(0).getName(); if (trace.enabled) { diff --git a/tns-core-modules/ui/transition/transition.android.ts b/tns-core-modules/ui/transition/transition.android.ts index 59ceaac63..f69406da2 100644 --- a/tns-core-modules/ui/transition/transition.android.ts +++ b/tns-core-modules/ui/transition/transition.android.ts @@ -45,7 +45,6 @@ interface ExpandedFragment { completePageAdditionWhenTransitionEnds: CompleteOptions; completePageRemovalWhenTransitionEnds: CompleteOptions; isDestroyed: boolean; - reverseNextAnimDirection: boolean; } let enterFakeResourceId = -10; @@ -457,14 +456,12 @@ function _addNativeTransitionListener(fragment: any, nativeTransition: any/*andr export function _onFragmentCreateAnimator(fragment: any, nextAnim: number): android.animation.Animator { let expandedFragment = fragment; - let noReverse = !expandedFragment.reverseNextAnimDirection; - delete expandedFragment.reverseNextAnimDirection; let transitionType; switch (nextAnim) { - case enterFakeResourceId: transitionType = noReverse ? AndroidTransitionType.enter : AndroidTransitionType.popEnter; break; - case exitFakeResourceId: transitionType = noReverse ? AndroidTransitionType.exit : AndroidTransitionType.popExit; break; - case popEnterFakeResourceId: transitionType = noReverse ? AndroidTransitionType.popEnter : AndroidTransitionType.enter; break; - case popExitFakeResourceId: transitionType = noReverse ? AndroidTransitionType.popExit : AndroidTransitionType.exit; break; + case enterFakeResourceId: transitionType = AndroidTransitionType.enter; break; + case exitFakeResourceId: transitionType = AndroidTransitionType.exit; break; + case popEnterFakeResourceId: transitionType = AndroidTransitionType.popEnter; break; + case popExitFakeResourceId: transitionType = AndroidTransitionType.popExit; break; } let transition; @@ -527,19 +524,13 @@ export function _onFragmentCreateAnimator(fragment: any, nextAnim: number): andr return animator; } -export function _reverseTransitionsDirection(fragment: any): void { - trace.write(`Swapping ${fragment} transitions...`, trace.categories.Transition); +export function _prepareCurrentFragmentForClearHistory(fragment: any): void { + trace.write(`Preparing ${fragment} transitions fro clear history...`, trace.categories.Transition); let expandedFragment = fragment; - expandedFragment.reverseNextAnimDirection = true; + expandedFragment.enterPopExitTransition = expandedFragment.exitPopEnterTransition; if (_sdkVersion() >= 21) { - let enterTransition = fragment.getEnterTransition(); let exitTransition = fragment.getExitTransition(); - let reenterTransition = fragment.getReenterTransition(); - let returnTransition = fragment.getReturnTransition(); - fragment.setEnterTransition(exitTransition); - fragment.setExitTransition(enterTransition); - fragment.setReenterTransition(returnTransition); - fragment.setReturnTransition(reenterTransition); + fragment.setReturnTransition(exitTransition); } _printTransitions(fragment); } diff --git a/tns-core-modules/ui/transition/transition.d.ts b/tns-core-modules/ui/transition/transition.d.ts index c999058f4..29cd04bca 100644 --- a/tns-core-modules/ui/transition/transition.d.ts +++ b/tns-core-modules/ui/transition/transition.d.ts @@ -26,7 +26,7 @@ export function _onFragmentShown(fragment: any, isBack: boolean): void; export function _onFragmentHidden(fragment: any, isBack: boolean, destroyed: boolean): void; export function _removePageNativeViewFromAndroidParent(page: Page): void; - export function _reverseTransitionsDirection(fragment: any): void; + export function _prepareCurrentFragmentForClearHistory(fragment: any): void; export function _createIOSAnimatedTransitioning(navigationTransition: NavigationTransition, nativeCurve: any, operation: number, fromVC: any, toVC: any): any; //@endprivate From 63471fcc3c3b75843742257d76d38574dd4a8780 Mon Sep 17 00:00:00 2001 From: Rossen Hristov Date: Fri, 3 Jun 2016 17:32:40 +0300 Subject: [PATCH 2/2] Fix all possible cases of the current page not playing its exit transition --- .../ui/transition/transition.android.ts | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/tns-core-modules/ui/transition/transition.android.ts b/tns-core-modules/ui/transition/transition.android.ts index f69406da2..cc4fcc38e 100644 --- a/tns-core-modules/ui/transition/transition.android.ts +++ b/tns-core-modules/ui/transition/transition.android.ts @@ -44,6 +44,7 @@ interface ExpandedFragment { exitPopEnterTransition: definitionTransition; completePageAdditionWhenTransitionEnds: CompleteOptions; completePageRemovalWhenTransitionEnds: CompleteOptions; + exitHack: boolean; isDestroyed: boolean; } @@ -464,6 +465,16 @@ export function _onFragmentCreateAnimator(fragment: any, nextAnim: number): andr case popExitFakeResourceId: transitionType = AndroidTransitionType.popExit; break; } + // Clear history hack. + if ((nextAnim === popExitFakeResourceId || !nextAnim) && expandedFragment.exitHack) { + // fragment is the current fragment and was popped due to clear history. + // We have to simulate moving forward with the fragment's exit transition. + // nextAnim can be null if the transaction which brought us to the fragment + // was without a transition and setCustomAnimations was not called. + trace.write(`HACK EXIT FOR ${fragment}`, trace.categories.Transition); + transitionType = AndroidTransitionType.exit; + } + let transition; switch (transitionType) { case AndroidTransitionType.enter: @@ -475,10 +486,11 @@ export function _onFragmentCreateAnimator(fragment: any, nextAnim: number): andr transition = expandedFragment.exitPopEnterTransition; break; } - + let animator: android.animation.Animator; if (transition) { animator = transition.createAndroidAnimator(transitionType); + trace.write(`${transition}.createAndroidAnimator(${transitionType}): ${animator}`, trace.categories.Transition); let transitionListener = new android.animation.Animator.AnimatorListener({ onAnimationStart: function (animator: android.animation.Animator): void { if (trace.enabled) { @@ -527,7 +539,7 @@ export function _onFragmentCreateAnimator(fragment: any, nextAnim: number): andr export function _prepareCurrentFragmentForClearHistory(fragment: any): void { trace.write(`Preparing ${fragment} transitions fro clear history...`, trace.categories.Transition); let expandedFragment = fragment; - expandedFragment.enterPopExitTransition = expandedFragment.exitPopEnterTransition; + expandedFragment.exitHack = true; if (_sdkVersion() >= 21) { let exitTransition = fragment.getExitTransition(); fragment.setReturnTransition(exitTransition);