Merge pull request #1647 from NativeScript/cankov/fix-android-background-navigate

Frame.navigate while in background
This commit is contained in:
Panayot Cankov
2016-03-01 16:57:52 +02:00
2 changed files with 45 additions and 6 deletions

View File

@ -127,7 +127,7 @@ function pageFromBuilder(moduleNamePath: string, moduleExports: any): Page {
return page; return page;
} }
interface NavigationContext { export interface NavigationContext {
entry: definition.BackstackEntry; entry: definition.BackstackEntry;
isBackNavigation: boolean; isBackNavigation: boolean;
} }
@ -264,7 +264,7 @@ export class Frame extends CustomLayoutView implements definition.Frame {
//trace.write("calling _updateActionBar on Frame", trace.categories.Navigation); //trace.write("calling _updateActionBar on Frame", trace.categories.Navigation);
} }
private _processNavigationContext(navigationContext: NavigationContext) { protected _processNavigationContext(navigationContext: NavigationContext) {
if (navigationContext.isBackNavigation) { if (navigationContext.isBackNavigation) {
this.performGoBack(navigationContext); this.performGoBack(navigationContext);
} }

View File

@ -1,13 +1,13 @@
import definition = require("ui/frame"); import definition = require("ui/frame");
import frameCommon = require("./frame-common"); import frameCommon = require("./frame-common");
import pages = require("ui/page"); import pages = require("ui/page");
import transitionModule = require("ui/transition");
import trace = require("trace");
import {View} from "ui/core/view"; import {View} from "ui/core/view";
import {Observable} from "data/observable"; import {Observable} from "data/observable";
import trace = require("trace"); import * as application from "application";
import application = require("application");
import * as types from "utils/types"; import * as types from "utils/types";
import * as utils from "utils/utils"; import * as utils from "utils/utils";
import transitionModule = require("ui/transition");
global.moduleMerge(frameCommon, exports); global.moduleMerge(frameCommon, exports);
@ -348,6 +348,45 @@ export class Frame extends frameCommon.Frame {
return true; return true;
} }
protected _processNavigationContext(navigationContext: frameCommon.NavigationContext) {
let activity = this._android.activity;
if (activity) {
let isForegroundActivity = activity === application.android.foregroundActivity;
let isPaused = application.android.paused;
if (activity && !isForegroundActivity || (isForegroundActivity && isPaused)) {
let weakActivity = new WeakRef(activity);
let resume = (args: application.AndroidActivityEventData) => {
let weakActivityInstance = weakActivity.get();
let isCurrent = args.activity === weakActivityInstance;
if (!weakActivityInstance) {
trace.write(`Frame _processNavigationContext: Drop For Activity GC-ed`, trace.categories.Navigation);
unsubscribe();
return
}
if (isCurrent) {
trace.write(`Frame _processNavigationContext: Activity.Resumed, Continue`, trace.categories.Navigation);
super._processNavigationContext(navigationContext);
unsubscribe();
}
}
let unsubscribe = () => {
trace.write(`Frame _processNavigationContext: Unsubscribe from Activity.Resumed`, trace.categories.Navigation);
application.android.off(application.AndroidApplication.activityResumedEvent, resume);
application.android.off(application.AndroidApplication.activityStoppedEvent, unsubscribe);
application.android.off(application.AndroidApplication.activityDestroyedEvent, unsubscribe);
}
trace.write(`Frame._processNavigationContext: Subscribe for Activity.Resumed`, trace.categories.Navigation);
application.android.on(application.AndroidApplication.activityResumedEvent, resume);
application.android.on(application.AndroidApplication.activityStoppedEvent, unsubscribe);
application.android.on(application.AndroidApplication.activityDestroyedEvent, unsubscribe);
return;
}
}
super._processNavigationContext(navigationContext);
}
} }
var framesCounter = 0; var framesCounter = 0;
@ -433,7 +472,7 @@ class AndroidFrame extends Observable implements definition.AndroidFrame {
return activity; return activity;
} }
} }
return undefined; return undefined;
} }