Fix navigatedFrom event raised when Activity is destroyed without actual navigation. (#2100)

This commit is contained in:
Hristo Hristov
2016-05-13 13:11:10 +03:00
parent 3fa46f1911
commit d62f018a55
4 changed files with 20 additions and 2 deletions

View File

@@ -205,6 +205,7 @@ export class Frame extends CustomLayoutView implements definition.Frame {
var backstackEntry: definition.BackstackEntry = { var backstackEntry: definition.BackstackEntry = {
entry: entry, entry: entry,
resolvedPage: page, resolvedPage: page,
isNavigation: true
}; };
var navigationContext: NavigationContext = { var navigationContext: NavigationContext = {

View File

@@ -137,6 +137,11 @@ export class Frame extends frameCommon.Frame {
let manager = activity.getFragmentManager(); let manager = activity.getFragmentManager();
let isFirstNavigation = types.isNullOrUndefined(this._currentEntry); let isFirstNavigation = types.isNullOrUndefined(this._currentEntry);
backstackEntry.isNavigation = true;
if (this._currentEntry) {
this._currentEntry.isNavigation = true;
}
// Clear history // Clear history
if (backstackEntry.entry.clearHistory) { if (backstackEntry.entry.clearHistory) {
let backStackEntryCount = manager.getBackStackEntryCount(); let backStackEntryCount = manager.getBackStackEntryCount();
@@ -260,9 +265,11 @@ export class Frame extends frameCommon.Frame {
public _goBackCore(backstackEntry: definition.BackstackEntry) { public _goBackCore(backstackEntry: definition.BackstackEntry) {
navDepth = backstackEntry[NAV_DEPTH]; navDepth = backstackEntry[NAV_DEPTH];
backstackEntry.isNavigation = true;
if (this._currentEntry) { if (this._currentEntry) {
// We need this information inside onFragmentHidden // We need this information inside onFragmentHidden
this._currentEntry[IS_BACK] = true; this._currentEntry[IS_BACK] = true;
this._currentEntry.isNavigation = true;
} }
trace.write(`${this}._goBackCore(pageId: ${backstackEntry.resolvedPage.id}, backstackVisible: ${this._isEntryBackstackVisible(backstackEntry)}, clearHistory: ${backstackEntry.entry.clearHistory}), navDepth: ${navDepth}`, trace.categories.Navigation); trace.write(`${this}._goBackCore(pageId: ${backstackEntry.resolvedPage.id}, backstackVisible: ${this._isEntryBackstackVisible(backstackEntry)}, clearHistory: ${backstackEntry.entry.clearHistory}), navDepth: ${navDepth}`, trace.categories.Navigation);

4
ui/frame/frame.d.ts vendored
View File

@@ -233,6 +233,10 @@ declare module "ui/frame" {
export interface BackstackEntry { export interface BackstackEntry {
entry: NavigationEntry; entry: NavigationEntry;
resolvedPage: pages.Page; resolvedPage: pages.Page;
//@private
isNavigation: boolean;
//@endprivate
} }
/** /**

View File

@@ -289,6 +289,7 @@ function _completePageAddition(fragment: any, isBack: boolean) {
frame._currentEntry = entry; frame._currentEntry = entry;
page.onNavigatedTo(isBack); page.onNavigatedTo(isBack);
frame._processNavigationQueue(page); frame._processNavigationQueue(page);
entry.isNavigation = undefined;
trace.write(`ADDITION of ${page} completed`, trace.categories.Transition); trace.write(`ADDITION of ${page} completed`, trace.categories.Transition);
} }
@@ -300,7 +301,10 @@ function _completePageRemoval(fragment: any, isBack: boolean) {
var page: pageModule.Page = entry.resolvedPage; var page: pageModule.Page = entry.resolvedPage;
if (page.frame) { if (page.frame) {
frame._removeView(page); frame._removeView(page);
page.onNavigatedFrom(isBack); // This could be undefined if activity is destroyed (e.g. without actual navigation).
if (entry.isNavigation) {
page.onNavigatedFrom(isBack);
}
trace.write(`REMOVAL of ${page} completed`, trace.categories.Transition); trace.write(`REMOVAL of ${page} completed`, trace.categories.Transition);
} }
else { else {
@@ -317,6 +321,8 @@ function _completePageRemoval(fragment: any, isBack: boolean) {
trace.write(`DETACHMENT of ${page} has already been done`, trace.categories.Transition); trace.write(`DETACHMENT of ${page} has already been done`, trace.categories.Transition);
} }
} }
entry.isNavigation = undefined;
} }
function _addNativeTransitionListener(fragment: any, nativeTransition: any/*android.transition.Transition*/) { function _addNativeTransitionListener(fragment: any, nativeTransition: any/*android.transition.Transition*/) {