Skip to content

Commit 91d90cc

Browse files
authored
fix: navigation b/n single and nested frame pages (#7011)
1 parent 62913bd commit 91d90cc

10 files changed

Lines changed: 170 additions & 6 deletions

File tree

‎e2e/nested-frame-navigation/app/home/home-page.ts‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,16 @@ export function onNavigateToTabsTopRoot(args: EventData) {
3737
export function onNavigateToTabsBottomRoot(args: EventData) {
3838
application._resetRootView({ moduleName: "tab-root/tab-bottom-root" });
3939
}
40+
41+
export function onFrameToNestedFrame(args: EventData) {
42+
const button = <Button>args.object;
43+
button.page.frame.navigate({
44+
moduleName: "frame-root/frame-home-page",
45+
animated: true,
46+
transition: {
47+
name: "slide",
48+
duration: 300,
49+
curve: "easeIn"
50+
}
51+
});
52+
}

‎e2e/nested-frame-navigation/app/home/home-page.xml‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
<Button text="Page w/ tabs (bottom)" tap="onNavigateToTabsBottomPage" />
1515
<Button text="Root tabs (top)" tap="onNavigateToTabsTopRoot" />
1616
<Button text="Root tabs (bottom)" tap="onNavigateToTabsBottomRoot" />
17+
<Button text="Frame to NestedFrame (non-default transition)" tap="onFrameToNestedFrame" />
1718
</StackLayout>
1819
</GridLayout>
1920
</Page>

‎e2e/nested-frame-navigation/app/some-page/some-page.ts‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,16 @@ export function onBackButtonTap(args: EventData): void {
55
const button = <Button>args.object;
66
button.page.frame.goBack();
77
}
8+
9+
export function onNavigateSlide(args: EventData) {
10+
const button = <Button>args.object;
11+
button.page.frame.navigate({
12+
moduleName: "still-other-page/still-other-page",
13+
animated: true,
14+
transition: {
15+
name: "slide",
16+
duration: 300,
17+
curve: "easeIn"
18+
}
19+
});
20+
}

‎e2e/nested-frame-navigation/app/some-page/some-page.xml‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66
</ActionBar>
77

88
<GridLayout>
9-
9+
<StackLayout>
10+
<Button text="navigate to still other page (slide transition)" tap="onNavigateSlide" />
11+
</StackLayout>
1012
</GridLayout>
1113

1214
</Page>
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { EventData } from "tns-core-modules/ui/page";
2+
import { Button } from "tns-core-modules/ui/button";
3+
4+
export function onBackButtonTap(args: EventData): void {
5+
const button = <Button>args.object;
6+
button.page.frame.goBack();
7+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<Page xmlns="http://schemas.nativescript.org/tns.xsd" class="page">
2+
3+
<ActionBar class="action-bar">
4+
<NavigationButton text="stillOtherPageBack" tap="onBackButtonTap" android.systemIcon="ic_menu_back" />
5+
<Label class="action-bar-title" text="still other page" />
6+
</ActionBar>
7+
8+
<GridLayout>
9+
10+
</GridLayout>
11+
12+
</Page>

‎e2e/nested-frame-navigation/e2e/frame-root.e2e-spec.ts‎

Lines changed: 90 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { AppiumDriver, createDriver, logWarn } from "nativescript-dev-appium";
22

3-
import { Screen, playersData, teamsData, driverDefaultWaitTime, Item } from "./screen";
3+
import { Screen, playersData, somePage, teamsData, driverDefaultWaitTime, Item, stillOtherPage } from "./screen";
44
import { suspendTime, appSuspendResume, dontKeepActivities, transitions } from "./config";
55
import * as shared from "./shared.e2e-spec";
66

@@ -297,5 +297,93 @@ describe(rootType, () => {
297297
await screen.loadedHome();
298298
});
299299
});
300-
};
300+
}
301+
302+
describe("frame to nested frame with non-default transition", () => {
303+
const playerOne = playersData["playerOneSlide"];
304+
305+
it("loaded home page", async () => {
306+
await screen.loadedHome();
307+
});
308+
309+
it("loaded frame root with nested frame non-default transition", async () => {
310+
await screen.navigateToPageWithFrameNonDefaultTransition();
311+
await screen.loadedPageWithFrame();
312+
});
313+
314+
it ("go back to home page again", async () => {
315+
if (appSuspendResume) {
316+
await driver.backgroundApp(suspendTime);
317+
await driver.waitForElement(playerOne.name); // wait for players list
318+
}
319+
320+
await screen.goBackFromFrameHome();
321+
await screen.loadedHome();
322+
});
323+
});
324+
325+
describe("nested frame to frame with non-default transition", () => {
326+
it("loaded home page", async () => {
327+
await screen.loadedHome();
328+
});
329+
330+
it("loaded frame root with nested frame", async () => {
331+
await screen.navigateToPageWithFrame();
332+
await screen.loadedPageWithFrame();
333+
});
334+
335+
it("navigate to some page with slide transition", async () => {
336+
shared.testSomePageNavigatedSlide(screen);
337+
338+
if (appSuspendResume) {
339+
await driver.backgroundApp(suspendTime);
340+
await driver.waitForElement(somePage); // wait for some page
341+
}
342+
});
343+
344+
it("navigate to still other page and go back twice", async () => {
345+
shared.testStillOtherPageNavigatedSlide(screen);
346+
347+
if (appSuspendResume) {
348+
await driver.backgroundApp(suspendTime);
349+
await driver.waitForElement(stillOtherPage); // wait for still other page
350+
}
351+
352+
if (driver.isAndroid) {
353+
await driver.navBack(); // some page back navigation
354+
} else {
355+
await screen.goBackFromStillOtherPage();
356+
}
357+
358+
await screen.loadedSomePage();
359+
360+
if (appSuspendResume) {
361+
await driver.backgroundApp(suspendTime);
362+
await driver.waitForElement(somePage); // wait for some page
363+
}
364+
365+
shared.testStillOtherPageNavigatedSlide(screen);
366+
367+
if (appSuspendResume) {
368+
await driver.backgroundApp(suspendTime);
369+
await driver.waitForElement(stillOtherPage); // wait for still other page
370+
}
371+
372+
if (driver.isAndroid) {
373+
await driver.navBack(); // some page back navigation
374+
} else {
375+
await screen.goBackFromStillOtherPage();
376+
}
377+
378+
await screen.loadedSomePage();
379+
});
380+
381+
it("go back to home page again", async () => {
382+
await screen.goBackFromSomePage();
383+
384+
await screen.goBackFromFrameHome();
385+
386+
await screen.loadedHome();
387+
});
388+
});
301389
});

‎e2e/nested-frame-navigation/e2e/screen.ts‎

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { assert } from "chai";
44
const layoutWithFrame = "Layout w/ frame";
55
const layoutWithMultiFrame = "Layout w/ multi frame";
66
const pageWithFrame = "Page w/ frame";
7+
const pageWithFrameNonDefaultTransition = "Frame to NestedFrame (non-default transition)";
78
const pageWithMultiFrame = "Page w/ multi frame";
89
const pageTabTopWithFrames = "Page w/ tabs (top)";
910
const pageTabBottomWithFrames = "Page w/ tabs (bottom)";
@@ -17,6 +18,7 @@ const tabTopHome = "tab top page";
1718
const tabBottomHome = "tab bottom page";
1819
const tabRootTopHome = "tab root top home";
1920
const tabRootBottomHome = "tab root bottom home";
21+
const navigateToStillOtherPageSlide = "navigate to still other page (slide transition)";
2022
const navigateToSomePageDefault = "navigate to some page (default transition)";
2123
const navigateToSomePageNone = "navigate to some page (no transition)";
2224
const navigateToSomePageSlide = "navigate to some page (slide transition)";
@@ -28,6 +30,7 @@ const navigateToOtherPageFlip = "navigate to other page (flip transition)";
2830
const players = "Players";
2931
const teams = "Teams";
3032
const playerBack = "playerBack";
33+
const stillOtherPageBack = "stillOtherPageBack";
3134
const somePageBack = "somePageBack";
3235
const otherPageBack = "otherPageBack";
3336
const teamBack = "teamBack";
@@ -38,6 +41,7 @@ const resetApp = "reset app";
3841

3942
export const driverDefaultWaitTime = 10000;
4043
export const home = "Home";
44+
export const stillOtherPage = "still other page";
4145
export const somePage = "some page";
4246
export const otherPage = "other page";
4347

@@ -153,6 +157,10 @@ export class Screen {
153157
await this.navigateToPage(pageWithFrame);
154158
}
155159

160+
navigateToPageWithFrameNonDefaultTransition = async () => {
161+
await this.navigateToPage(pageWithFrameNonDefaultTransition);
162+
}
163+
156164
navigateToPageWithMultiFrame = async () => {
157165
await this.navigateToPage(pageWithMultiFrame);
158166
}
@@ -173,6 +181,10 @@ export class Screen {
173181
await this.navigateToPage(tabBottomRootWithFrames);
174182
}
175183

184+
navigateToStillOtherPageSlide = async () => {
185+
await this.navigateToPage(navigateToStillOtherPageSlide);
186+
};
187+
176188
navigateToSomePageDefault = async () => {
177189
await this.navigateToPage(navigateToSomePageDefault);
178190
};
@@ -228,6 +240,10 @@ export class Screen {
228240
await this.goBack(teamBack);
229241
};
230242

243+
goBackFromStillOtherPage = async () => {
244+
await this.goBack(stillOtherPageBack);
245+
}
246+
231247
goBackFromSomePage = async () => {
232248
await this.goBack(somePageBack);
233249
}
@@ -298,6 +314,10 @@ export class Screen {
298314
loadedTabBottomRootWithFrames = async () => {
299315
await this.loadedPage(tabRootBottomHome);
300316
}
317+
318+
loadedStillOtherPage = async () => {
319+
await this.loadedPage(stillOtherPage);
320+
}
301321

302322
loadedSomePage = async () => {
303323
await this.loadedPage(somePage);

‎e2e/nested-frame-navigation/e2e/shared.e2e-spec.ts‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@ export async function testPlayerNavigatedBack(screen: Screen, driver: AppiumDriv
1717
await screen.loadedPlayersList();
1818
}
1919

20+
export async function testStillOtherPageNavigatedSlide(screen: Screen) {
21+
await screen.navigateToStillOtherPageSlide();
22+
await screen.loadedStillOtherPage();
23+
}
24+
2025
export async function testSomePageNavigatedDefault(screen: Screen) {
2126
await screen.navigateToSomePageDefault();
2227
await screen.loadedSomePage();

‎tns-core-modules/ui/frame/fragment.transitions.android.ts‎

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ interface ExpandedEntry extends BackstackEntry {
4646
transition: Transition;
4747
transitionName: string;
4848
frameId: number
49+
useLollipopTransition: boolean;
4950
}
5051

5152
const sdkVersion = lazy(() => parseInt(device.sdkVersion));
@@ -100,6 +101,8 @@ export function _setAndroidFragmentTransitions(
100101
useLollipopTransition = false;
101102
}
102103

104+
newEntry.useLollipopTransition = useLollipopTransition;
105+
103106
if (!animated) {
104107
name = "none";
105108
} else if (transition) {
@@ -116,6 +119,7 @@ export function _setAndroidFragmentTransitions(
116119
_updateTransitions(currentEntry);
117120
if (currentEntry.transitionName !== name ||
118121
currentEntry.transition !== transition ||
122+
!!currentEntry.useLollipopTransition !== useLollipopTransition ||
119123
!useLollipopTransition) {
120124
clearExitAndReenterTransitions(currentEntry, true);
121125
currentFragmentNeedsDifferentAnimation = true;
@@ -190,11 +194,11 @@ export function _onFragmentCreateAnimator(entry: ExpandedEntry, fragment: androi
190194
let animator: android.animation.Animator;
191195
switch (nextAnim) {
192196
case AnimationType.enterFakeResourceId:
193-
animator = entry.enterAnimator;
197+
animator = entry.enterAnimator || entry.defaultEnterAnimator /* HACK */;
194198
break;
195199

196200
case AnimationType.exitFakeResourceId:
197-
animator = entry.exitAnimator;
201+
animator = entry.exitAnimator || entry.defaultExitAnimator /* HACK */;
198202
break;
199203

200204
case AnimationType.popEnterFakeResourceId:
@@ -268,7 +272,6 @@ export function _reverseTransitions(previousEntry: ExpandedEntry, currentEntry:
268272
} else {
269273
previousFragment.setEnterTransition(null);
270274
}
271-
272275
}
273276

274277
return transitionUsed;

0 commit comments

Comments
 (0)