Fix broken navigation after clear history with transition

Resolves #1948
This commit is contained in:
Rossen Hristov
2016-04-20 14:53:10 +03:00
parent c7918c51ce
commit 56065ae601
13 changed files with 175 additions and 66 deletions

View File

@@ -431,6 +431,17 @@ export class Frame extends CustomLayoutView implements definition.Frame {
public _removeViewFromNativeVisualTree(child: View): void {
child._isAddedToNativeVisualTree = false;
}
public _printFrameBackStack() {
var length = this.backStack.length;
var i = length - 1;
console.log("---------------------------");
console.log("Frame Back Stack (" + length + ")");
while (i >= 0) {
var backstackEntry = <definition.BackstackEntry>this.backStack[i--];
console.log("[ " + backstackEntry.resolvedPage.id + " ]");
}
}
}
var _topmost = function (): Frame {

View File

@@ -65,8 +65,9 @@ function onFragmentHidden(fragment: FragmentClass) {
trace.write(`HIDDEN ${fragment.getTag()}`, trace.categories.NativeLifecycle);
if (fragment[CLEARING_HISTORY]) {
trace.write(`${fragment.getTag()} has been hidden, but we are currently clearing history. Returning.`, trace.categories.NativeLifecycle);
return null;
trace.write(`${fragment.getTag()} has been hidden, but we are currently clearing history. Clearing any existing transitions.`, trace.categories.NativeLifecycle);
transitionModule._clearBackwardTransitions(fragment);
transitionModule._clearForwardTransitions(fragment);
}
var isBack = fragment.entry[IS_BACK];
@@ -188,10 +189,10 @@ export class Frame extends frameCommon.Frame {
if (currentFragment) {
// There might be transitions left over from previous forward navigations from the current page.
transitionModule._clearForwardTransitions(currentFragment);
}
if (animated && navigationTransition) {
transitionModule._setAndroidFragmentTransitions(navigationTransition, currentFragment, newFragment, fragmentTransaction);
if (animated && navigationTransition) {
transitionModule._setAndroidFragmentTransitions(navigationTransition, currentFragment, newFragment, fragmentTransaction);
}
}
newFragment.frame = this;
@@ -328,17 +329,6 @@ export class Frame extends frameCommon.Frame {
}
}
public _printFrameBackStack() {
var length = this.backStack.length;
var i = length - 1;
console.log("---------------------------");
console.log("Frame Back Stack (" + length + ")");
while (i >= 0) {
var backstackEntry = <definition.BackstackEntry>this.backStack[i--];
console.log("[ " + backstackEntry.resolvedPage.id + " ]");
}
}
public _getNavBarVisible(page: pages.Page): boolean {
if (types.isDefined(page.actionBarHidden)) {
return !page.actionBarHidden;

View File

@@ -25,6 +25,26 @@ export module AndroidTransitionType {
export var popExit: string = "popExit";
}
export function _clearBackwardTransitions(fragment: any): void {
if (fragment[ENTER_POPEXIT_TRANSITION]) {
trace.write(`Cleared ENTER_POPEXIT_TRANSITION ${fragment[ENTER_POPEXIT_TRANSITION]} for ${fragment.getTag()}`, trace.categories.Transition);
fragment[ENTER_POPEXIT_TRANSITION] = undefined;
}
if (_sdkVersion >= 21) {
var enterTransition = (<any>fragment).getEnterTransition();
if (enterTransition) {
trace.write(`Cleared Enter ${enterTransition.getClass().getSimpleName()} transition for ${fragment.getTag()}`, trace.categories.Transition);
(<any>fragment).setEnterTransition(null);
}
var returnTransition = (<any>fragment).getReturnTransition();
if (returnTransition) {
trace.write(`Cleared Pop Exit ${returnTransition.getClass().getSimpleName()} transition for ${fragment.getTag()}`, trace.categories.Transition);
(<any>fragment).setReturnTransition(null);
}
}
}
export function _clearForwardTransitions(fragment: any): void {
if (fragment[EXIT_POPENTER_TRANSITION]) {
trace.write(`Cleared EXIT_POPENTER_TRANSITION ${fragment[EXIT_POPENTER_TRANSITION]} for ${fragment.getTag()}`, trace.categories.Transition);
@@ -265,9 +285,11 @@ function _completePageRemoval(fragment: android.app.Fragment, force: boolean = f
if (page.frame) {
frame._removeView(page);
page.onNavigatedFrom(isBack);
trace.write(`REMOVAL of ${page} completed`, trace.categories.Transition);
}
else {
trace.write(`REMOVAL of ${page} has already been done`, trace.categories.Transition);
}
trace.write(`REMOVAL of ${page} completed`, trace.categories.Transition);
}
}

View File

@@ -18,6 +18,7 @@
}
//@private
export function _clearBackwardTransitions(fragment: any): void;
export function _clearForwardTransitions(fragment: any): void;
export function _setAndroidFragmentTransitions(navigationTransition: frame.NavigationTransition, currentFragment: any, newFragment: any, fragmentTransaction: any): void;
export function _onFragmentCreateAnimator(fragment: any, nextAnim: number): any;