Merge pull request #2242 from NativeScript/clear-history

Fixed: The exit transition of the current page is not played
This commit is contained in:
Rossen Hristov
2016-06-06 10:03:56 +03:00
3 changed files with 23 additions and 20 deletions

View File

@@ -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) {

View File

@@ -44,8 +44,8 @@ interface ExpandedFragment {
exitPopEnterTransition: definitionTransition;
completePageAdditionWhenTransitionEnds: CompleteOptions;
completePageRemovalWhenTransitionEnds: CompleteOptions;
exitHack: boolean;
isDestroyed: boolean;
reverseNextAnimDirection: boolean;
}
let enterFakeResourceId = -10;
@@ -457,14 +457,22 @@ function _addNativeTransitionListener(fragment: any, nativeTransition: any/*andr
export function _onFragmentCreateAnimator(fragment: any, nextAnim: number): android.animation.Animator {
let expandedFragment = <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;
}
// 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;
@@ -478,10 +486,11 @@ export function _onFragmentCreateAnimator(fragment: any, nextAnim: number): andr
transition = expandedFragment.exitPopEnterTransition;
break;
}
let animator: android.animation.Animator;
if (transition) {
animator = <android.animation.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,19 +536,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 = <ExpandedFragment>fragment;
expandedFragment.reverseNextAnimDirection = true;
expandedFragment.exitHack = true;
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);
}

View File

@@ -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