Skip to content
6 changes: 5 additions & 1 deletion tns-core-modules/timer/timer.ios.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,11 @@ class TimerTargetImpl extends NSObject {

public tick(timer): void {
if (!this.disposed) {
this.callback();
try {
this.callback();
} catch (e) {
// TODO
}
}

if (!this.shouldRepeat) {
Expand Down
58 changes: 32 additions & 26 deletions tns-core-modules/ui/frame/frame-common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ export function reloadPage(): void {
create: currentEntry.create,
moduleName: currentEntry.moduleName,
backstackVisible: currentEntry.backstackVisible
}
};

frame.navigate(newEntry);
}
Expand All @@ -72,7 +72,7 @@ const moduleCreatePage = profile("module.createPage", (moduleNamePath: string, m
if (traceEnabled()) {
traceWrite("Calling createPage()", traceCategories.Navigation);
}
var page = moduleExports.createPage();
const page = moduleExports.createPage();

let cssFileName = resolveFileName(moduleNamePath, "css");
// If there is no cssFile only appCss will be applied at loaded.
Expand Down Expand Up @@ -204,7 +204,7 @@ export class FrameBase extends CustomLayoutView implements FrameDefinition {
const navigationContext: NavigationContext = {
entry: backstackEntry,
isBackNavigation: true
}
};

this._navigationQueue.push(navigationContext);

Expand Down Expand Up @@ -273,7 +273,7 @@ export class FrameBase extends CustomLayoutView implements FrameDefinition {
const navigationContext: NavigationContext = {
entry: backstackEntry,
isBackNavigation: false
}
};

this._navigationQueue.push(navigationContext);

Expand Down Expand Up @@ -367,34 +367,38 @@ export class FrameBase extends CustomLayoutView implements FrameDefinition {

@profile
private performNavigation(navigationContext: NavigationContext) {
let navContext = navigationContext.entry;
if (navigationContext) {
let navContext = navigationContext.entry;

// TODO: This should happen once navigation is completed.
if (navContext && navContext.entry && navContext.entry.clearHistory) {
// Don't clear backstack immediately or we can't remove pages from frame.
} else if (FrameBase._isEntryBackstackVisible(this._currentEntry)) {
this._backStack.push(this._currentEntry);
}

// TODO: This should happen once navigation is completed.
if (navigationContext.entry.entry.clearHistory) {
// Don't clear backstack immediately or we can't remove pages from frame.
} else if (FrameBase._isEntryBackstackVisible(this._currentEntry)) {
this._backStack.push(this._currentEntry);
this._onNavigatingTo(navContext, navigationContext.isBackNavigation);
this._navigateCore(navContext);
}

this._onNavigatingTo(navContext, navigationContext.isBackNavigation);
this._navigateCore(navContext);
}

@profile
private performGoBack(navigationContext: NavigationContext) {
let backstackEntry = navigationContext.entry;
if (!backstackEntry) {
backstackEntry = this._backStack.pop();
navigationContext.entry = backstackEntry;
} else {
const index = this._backStack.indexOf(backstackEntry);
const removed = this._backStack.splice(index + 1);
this._backStack.pop();
this._removeBackstackEntries(removed);
if (navigationContext) {
let backstackEntry = navigationContext.entry;
if (!backstackEntry) {
backstackEntry = this._backStack.pop();
navigationContext.entry = backstackEntry;
} else {
const index = this._backStack.indexOf(backstackEntry);
const removed = this._backStack.splice(index + 1);
this._backStack.pop();
this._removeBackstackEntries(removed);
}

this._onNavigatingTo(backstackEntry, true);
this._goBackCore(backstackEntry);
}

this._onNavigatingTo(backstackEntry, true);
this._goBackCore(backstackEntry);
}

public _goBackCore(backstackEntry: BackstackEntry) {
Expand All @@ -414,7 +418,9 @@ export class FrameBase extends CustomLayoutView implements FrameDefinition {
this.currentPage.onNavigatingFrom(isBack);
}

backstackEntry.resolvedPage.onNavigatingTo(backstackEntry.entry.context, isBack, backstackEntry.entry.bindingContext);
if (backstackEntry && backstackEntry.resolvedPage) {
backstackEntry.resolvedPage.onNavigatingTo(backstackEntry.entry.context, isBack, backstackEntry.entry.bindingContext);
}
}

public get animated(): boolean {
Expand Down
45 changes: 25 additions & 20 deletions tns-core-modules/ui/frame/frame.android.ts
Original file line number Diff line number Diff line change
Expand Up @@ -168,34 +168,39 @@ export class Frame extends FrameBase {
}

transaction.replace(this.containerViewId, newFragment, newFragmentTag);
transaction.commit();
transaction.commitAllowingStateLoss();
}

public _goBackCore(backstackEntry: BackstackEntry) {
super._goBackCore(backstackEntry);
navDepth = backstackEntry.navDepth;

const activity = this._android.activity;
const manager = activity.getFragmentManager();
const transaction = manager.beginTransaction();
if (backstackEntry) {
navDepth = backstackEntry.navDepth;

if (!backstackEntry.fragment) {
// Happens on newer API levels. On older all fragments
// are recreated once activity is created.
// This entry fragment was destroyed by app suspend.
// We need to recreate its animations and then reverse it.
backstackEntry.fragment = this.createFragment(backstackEntry, backstackEntry.fragmentTag);
_updateTransitions(backstackEntry);
}
const activity = this._android.activity;
if (activity) {
const manager = activity.getFragmentManager();
const transaction = manager.beginTransaction();

if (!backstackEntry.fragment) {
// Happens on newer API levels. On older all fragments
// are recreated once activity is created.
// This entry fragment was destroyed by app suspend.
// We need to recreate its animations and then reverse it.
backstackEntry.fragment = this.createFragment(backstackEntry, backstackEntry.fragmentTag);
_updateTransitions(backstackEntry);
}

const transitionReversed = _reverseTransitions(backstackEntry, this._currentEntry);
if (!transitionReversed) {
// If transition were not reversed then use animations.
transaction.setCustomAnimations(AnimationType.popEnterFakeResourceId, AnimationType.popExitFakeResourceId, AnimationType.enterFakeResourceId, AnimationType.exitFakeResourceId);
}
const transitionReversed = _reverseTransitions(backstackEntry, this._currentEntry);
if (!transitionReversed) {
// If transition were not reversed then use animations.
transaction.setCustomAnimations(AnimationType.popEnterFakeResourceId, AnimationType.popExitFakeResourceId, AnimationType.enterFakeResourceId, AnimationType.exitFakeResourceId);
}

transaction.replace(this.containerViewId, backstackEntry.fragment, backstackEntry.fragmentTag);
transaction.commit();
transaction.replace(this.containerViewId, backstackEntry.fragment, backstackEntry.fragmentTag);
transaction.commitAllowingStateLoss();
}
}
}

public _removeBackstackEntries(removed: BackstackEntry[]): void {
Expand Down
Loading