From 56065ae601e2b95e518561567d19260f0334eaaf Mon Sep 17 00:00:00 2001 From: Rossen Hristov Date: Wed, 20 Apr 2016 14:53:10 +0300 Subject: [PATCH] Fix broken navigation after clear history with transition Resolves #1948 --- CrossPlatformModules.csproj | 7 +- .../Android/drawable-hdpi/icon.png | Bin 0 -> 10946 bytes .../Android/drawable-ldpi/icon.png | Bin 0 -> 6170 bytes .../Android/drawable-mdpi/icon.png | Bin 0 -> 7594 bytes .../Android/drawable-nodpi/splashscreen.9.png | Bin 0 -> 26614 bytes apps/App_Resources/package.json | 2 + apps/perf-tests/NavigationTest/app.ts | 5 +- apps/perf-tests/nav-page.ts | 19 ++- apps/tests/navigation/navigation-tests.ts | 148 ++++++++++++------ ui/frame/frame-common.ts | 11 ++ ui/frame/frame.android.ts | 22 +-- ui/transition/transition.android.ts | 26 ++- ui/transition/transition.d.ts | 1 + 13 files changed, 175 insertions(+), 66 deletions(-) create mode 100644 apps/App_Resources/Android/drawable-hdpi/icon.png create mode 100644 apps/App_Resources/Android/drawable-ldpi/icon.png create mode 100644 apps/App_Resources/Android/drawable-mdpi/icon.png create mode 100644 apps/App_Resources/Android/drawable-nodpi/splashscreen.9.png create mode 100644 apps/App_Resources/package.json diff --git a/CrossPlatformModules.csproj b/CrossPlatformModules.csproj index f3bbc4871..7703aa599 100644 --- a/CrossPlatformModules.csproj +++ b/CrossPlatformModules.csproj @@ -145,6 +145,10 @@ + + + + Designer @@ -2116,6 +2120,7 @@ PreserveNewest + @@ -2213,7 +2218,7 @@ False - + \ No newline at end of file diff --git a/apps/App_Resources/Android/drawable-hdpi/icon.png b/apps/App_Resources/Android/drawable-hdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1034356e2641a785ae5182f97d86293c7d1e572a GIT binary patch literal 10946 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 lmDvf8z`|5dEfUn+mCXE9vpxzu&r{|EZkbKn2~ literal 0 HcmV?d00001 diff --git a/apps/App_Resources/Android/drawable-mdpi/icon.png b/apps/App_Resources/Android/drawable-mdpi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..486e41091b02089223650cb0a490a3d598a7a666 GIT binary patch literal 7594 zcmb_>2{_d47q+xel3v-8GDeYgRx@TSWj4u@?0Zc!gJH~!F*1aCRftlFRJ5ol$x@Pi z36Xu@6(RN7izHEfqecDStMXpo_qnbyzvVvnIp;agb3f;~Cd|}CUwEDLIzB!=VS_z5 zGu}6N@gul~_ura-E|mARnT@w$n=_o*K13FUPmjzvL;)Ch5M3x{6e8Kzvx=h4GbU3l zY}hu&MrablL!G#YQRjFtdDeV<+PgSRBFUY?1{|WeQ0Y3r$^2p9)VnOnAC!xr|UAh2m4w^^cL17aC91j}Z3(e61e&I#)t`{GJfPgO$w!04S zYfv`ErT{F1MFD82Yp9XHPzV5tQio{3Q4okK01Ae{KoBqpic*6>&~PLgf&hH`1MZ?+DQ7wOj&JeW(gbgys2#2YXWhsXp$)WM4>eF2h5OE{)C zi}uAinFONHC>|6#+lz;VEMb|h3^v2dmGK+urPu%CfH$;9GguZ32JL&5 zO~2<0z+wSAjfo^GeKCKfMQ`5>C^#aUq66fW9HItBszG2D5GWc9M#GRQ;KhrtP-6y} z>g>A&)ldV&)xeq-5Cj?qMng4Jz_1@s-h3ky*~DeRWD?q$!SW#TMvJ<*L_kcs%NK9P z#%Ke&7n?{YQ4DZ8KwhZoR4N&bM`$AP8W0T}0>%p#568fuU@U=v)x;w(U?>#!-4@3n zc`ug!yDj;LEn+#_eJm<(*%4{K;y__EFjy1@0oH_q5tc?BqGAu|a z2MGnZl9|-s5d8#Ljthn0pb!AgAIN@2EXM|c!#TVUfb%E9e}R_eL_s+a6qLvLN78?x zmScr$a^RW(kKd2sPk`mPpl}Wp{wJ=V0LyW~5F8i+K>K}MKLM8Gf@pFent$T@39uZO zg)7wyz@~UGX*@9j_z=ASq(w2JkO7B$0mf94E0ID25NJe}Hxpn=O4IM zC=flES^&M@OxFJo%uFVg#GrqVZqX-jxqS5KWEO);1{e{&=_FSQ3t+%w09brakhi7$ zCfxsExSVfW-mU;3GMT^eu=IM72ei0xeiatb4@vnS>G|>ayQb;!bk&QuQT$4nbiKWK zY6-)kz&xFU!wFaf1cJk$G;k^fW;zVyhz}11pX(> zU)ShY#rV=_p!ZN0i{txkY|Sa2OQQ_<(p#X3q{W^|2l#D?0lz(_{$k5qcFX!^>*Gq{ z5&oeE`0Cl~TVt!|!rNYd(PNlv0G4`;pV!#`#_dHsOd~C^#70t1&nfr!I7G32sp1@f@^9b)HIP4q8f@wLZS|l zU=X4P<@-1+RbZ*LLZYEaGz{^*wfb+l{Hx3RYV@yUzD&rk^9uCuDfjgrM`2NUH6pNh z^8BSCMgMAY{nzw(9V(jqi=J%R$+@I(KOGgmiyrU%v3R+3@ZsGo9i1q2Ug220gVF3- z&q_W%k*5YYJqu3vW+U^+C(9|=!sUCnnb#zKJ2$R@ojU~XO4$QyW>YK9nXyTJxC8=<+YF6#g8i1&F|nY;5IsCpHIIAv7tXL)UTf4 zcGf8Bs%CtSuPj;#EK4>~b0|5<5ifgEytU@i{x$EDn=~9dFphn#Gcd>O(eB=9OqRo4 z_mgQN+^8>zj*v=gM=NA3oB>)pZ8vjLZw_o;wKv^gj$?>Mk5B4}14mGI zQnSim>773;(!uo5<=SnSznE5+M<1zMIZ&wDQm21KTd8k+EZY8_7uhB5<5**$ z{D>Gr^5nwQFmvC=kiIr^XtGm6O6@9awwe18E%}s;TJ7VCx!E_%dasD-v_CPd1Ae}4 zxI*2>N9lEBgG6bF^1|5kt4cMl=hdT(lWXmhAD^&`d?g;);V8!{na2fA7wmD2h^l6R z@_QlIyTv=k$AKfc_xz&;Yi>IDUh=(xDb!@2*n=$`-+y(QpRHo~xOV1lC6aV%A$nK! zX_1fNnOh@cx7KB3%_Nbn9RPaqW%{(Tx1}r_pXnZ8hr@`4pdv~<$+-U^{bb1iSwHO2 zrL|kFocoA^t30%lH)ErAdkFV>^RvV5%0DrBkK^t6zylG13AFBlbmn`J5X+j& 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 Q1^@s607*qoM6N<$f>N!hyZ`_I literal 0 HcmV?d00001 diff --git a/apps/App_Resources/package.json b/apps/App_Resources/package.json new file mode 100644 index 000000000..08e44e117 --- /dev/null +++ b/apps/App_Resources/package.json @@ -0,0 +1,2 @@ +{ "name" : "app-resources", + "main" : "dummy.js" } diff --git a/apps/perf-tests/NavigationTest/app.ts b/apps/perf-tests/NavigationTest/app.ts index 80b471c3e..dff5826b6 100644 --- a/apps/perf-tests/NavigationTest/app.ts +++ b/apps/perf-tests/NavigationTest/app.ts @@ -1,11 +1,14 @@ import * as application from "application"; import {NavPage} from "../nav-page"; import * as trace from "trace"; +import { Frame } from "ui/frame"; + +Frame.defaultTransition = { name: "fade" }; + trace.enable(); trace.setCategories(trace.categories.concat( trace.categories.NativeLifecycle, trace.categories.Navigation, - //trace.categories.Animation, trace.categories.Transition )); diff --git a/apps/perf-tests/nav-page.ts b/apps/perf-tests/nav-page.ts index fa421434a..ccaf0fe25 100644 --- a/apps/perf-tests/nav-page.ts +++ b/apps/perf-tests/nav-page.ts @@ -1,7 +1,7 @@ import definition = require("controls-page"); import {View} from "ui/core/view"; import {Page} from "ui/page"; -import {topmost as topmostFrame, NavigationTransition} from "ui/frame"; +import {topmost as topmostFrame, NavigationTransition, Frame} from "ui/frame"; import {Orientation, AnimationCurve} from "ui/enums"; import {StackLayout} from "ui/layouts/stack-layout"; import {Button} from "ui/button"; @@ -10,6 +10,7 @@ import {TextField} from "ui/text-field"; import {Switch} from "ui/switch"; import {Slider} from "ui/slider"; import {Color} from "color"; +import {ScrollView} from "ui/scroll-view"; import * as platform from "platform"; var availableTransitions = ["default", "custom", "flip", "flipRight", "flipLeft", "slide", "slideLeft", "slideRight", "slideTop", "slideBottom", "fade"]; @@ -57,6 +58,10 @@ export class NavPage extends Page implements definition.ControlsPage { }); that.on(Page.navigatedToEvent, (args) => { console.log(`${args.object}.navigatedToEvent`); + (topmostFrame())._printFrameBackStack(); + if (topmostFrame().android) { + (topmostFrame())._printNativeBackStack(); + } }); this.id = "" + context.index; @@ -122,6 +127,14 @@ export class NavPage extends Page implements definition.ControlsPage { animatedSwitch.checked = context.animated; optionsLayout.addChild(animatedSwitch); + var globalTransitionButton = new Button(); + globalTransitionButton.text = "global: " + (Frame.defaultTransition ? Frame.defaultTransition.name : "none"); + globalTransitionButton.on("tap", (args) => { + Frame.defaultTransition = Frame.defaultTransition ? null : { name: "fade" }; + (args.object).text = "global: " + (Frame.defaultTransition ? Frame.defaultTransition.name : "none"); + }); + optionsLayout.addChild(globalTransitionButton); + var transitionButton = new Button(); transitionButton.text = availableTransitions[context.transition]; transitionButton.on("tap", () => { @@ -202,6 +215,8 @@ export class NavPage extends Page implements definition.ControlsPage { }); stackLayout.addChild(forwardButton); - this.content = stackLayout; + var scrollView = new ScrollView(); + scrollView.content = stackLayout; + this.content = scrollView; } } diff --git a/apps/tests/navigation/navigation-tests.ts b/apps/tests/navigation/navigation-tests.ts index 659a3bce2..ee1a7bff1 100644 --- a/apps/tests/navigation/navigation-tests.ts +++ b/apps/tests/navigation/navigation-tests.ts @@ -1,6 +1,6 @@ import * as TKUnit from "../TKUnit"; import {Page} from "ui/page"; -import {topmost as topmostFrame} from "ui/frame"; +import {topmost as topmostFrame, NavigationTransition} from "ui/frame"; import {Color} from "color"; // Creates a random colorful page full of meaningless stuff. @@ -10,32 +10,41 @@ var pageFactory = function(): Page { return page; }; -export var test_backstackVisible = function () { - var mainTestPage = topmostFrame().currentPage; - topmostFrame().navigate({ create: pageFactory }); - TKUnit.waitUntilReady(() => { return topmostFrame().currentPage !== mainTestPage; }); +function _test_backstackVisible(transition?: NavigationTransition) { + let topmost = topmostFrame(); + let mainTestPage = topmost.currentPage; + topmost.navigate({ create: pageFactory, transition: transition }); + TKUnit.waitUntilReady(() => { return topmost.currentPage !== mainTestPage; }); // page1 should not be added to the backstack - var page0 = topmostFrame().currentPage; - topmostFrame().navigate({ create: pageFactory, backstackVisible: false }); - TKUnit.waitUntilReady(() => { return topmostFrame().currentPage !== page0; }); + let page0 = topmost.currentPage; + topmost.navigate({ create: pageFactory, backstackVisible: false, transition: transition }); + TKUnit.waitUntilReady(() => { return topmost.currentPage !== page0; }); - var page1 = topmostFrame().currentPage; - topmostFrame().navigate({ create: pageFactory }); - TKUnit.waitUntilReady(() => { return topmostFrame().currentPage !== page1; }); + let page1 = topmost.currentPage; + topmost.navigate({ create: pageFactory, transition: transition }); + TKUnit.waitUntilReady(() => { return topmost.currentPage !== page1; }); - var page2 = topmostFrame().currentPage; - topmostFrame().goBack(); - TKUnit.waitUntilReady(() => { return topmostFrame().currentPage !== page2; }); + let page2 = topmost.currentPage; + topmost.goBack(); + TKUnit.waitUntilReady(() => { return topmost.currentPage !== page2; }); // From page2 we have to go directly to page0, skipping page1. - TKUnit.assert(topmostFrame().currentPage === page0, "Page 1 should be skipped when going back."); + TKUnit.assert(topmost.currentPage === page0, "Page 1 should be skipped when going back."); - topmostFrame().goBack(); - TKUnit.waitUntilReady(() => { return topmostFrame().currentPage === mainTestPage; }); + topmost.goBack(); + TKUnit.waitUntilReady(() => { return topmost.currentPage === mainTestPage; }); } -export var test_backToEntry = function () { +export var test_backstackVisible = function () { + _test_backstackVisible(); +} + +export var test_backstackVisible_WithTransition = function () { + _test_backstackVisible({name: "fade"}); +} + +function _test_backToEntry(transition?: NavigationTransition) { let page = (tag) => () => { var p = new Page(); p["tag"] = tag; @@ -44,7 +53,7 @@ export var test_backToEntry = function () { let topmost = topmostFrame(); let wait = tag => TKUnit.waitUntilReady(() => topmost.currentPage["tag"] === tag, 1); let navigate = tag => { - topmost.navigate({ create: page(tag) }); + topmost.navigate({ create: page(tag), transition: transition }); wait(tag) } let back = pages => { @@ -75,42 +84,93 @@ export var test_backToEntry = function () { back(1); } -// Clearing the history messes up the tests app. -export var test_ClearHistory = function () { - var mainTestPage = topmostFrame().currentPage; - var mainPageFactory = function (): Page { +export var test_backToEntry = function () { + _test_backToEntry(); +} + +export var test_backToEntry_WithTransition = function () { + _test_backToEntry({name: "flip"}); +} + +function _test_ClearHistory(transition?: NavigationTransition) { + let topmost = topmostFrame(); + let mainTestPage = topmost.currentPage; + let mainPageFactory = function (): Page { return mainTestPage; }; var currentPage: Page; - currentPage = topmostFrame().currentPage; - topmostFrame().navigate({ create: pageFactory, clearHistory: true }); - TKUnit.waitUntilReady(() => { return topmostFrame().currentPage !== currentPage; }); + currentPage = topmost.currentPage; + topmost.navigate({ create: pageFactory, clearHistory: true, transition: transition}); + TKUnit.waitUntilReady(() => { return topmost.currentPage !== currentPage; }); - currentPage = topmostFrame().currentPage; - topmostFrame().navigate({ create: pageFactory }); - TKUnit.waitUntilReady(() => { return topmostFrame().currentPage !== currentPage; }); + currentPage = topmost.currentPage; + topmost.navigate({ create: pageFactory, transition: transition }); + TKUnit.waitUntilReady(() => { return topmost.currentPage !== currentPage; }); - currentPage = topmostFrame().currentPage; - topmostFrame().navigate({ create: pageFactory }); - TKUnit.waitUntilReady(() => { return topmostFrame().currentPage !== currentPage; }); + currentPage = topmost.currentPage; + topmost.navigate({ create: pageFactory, transition: transition }); + TKUnit.waitUntilReady(() => { return topmost.currentPage !== currentPage; }); - currentPage = topmostFrame().currentPage; - topmostFrame().navigate({ create: pageFactory }); - TKUnit.waitUntilReady(() => { return topmostFrame().currentPage !== currentPage; }); + currentPage = topmost.currentPage; + topmost.navigate({ create: pageFactory, transition: transition }); + TKUnit.waitUntilReady(() => { return topmost.currentPage !== currentPage; }); - TKUnit.assert(topmostFrame().canGoBack(), "Frame should be able to go back."); - TKUnit.assert(topmostFrame().backStack.length === 3, "Back stack should have 3 entries."); + TKUnit.assert(topmost.canGoBack(), "Frame should be able to go back."); + TKUnit.assert(topmost.backStack.length === 3, "Back stack should have 3 entries."); // Navigate with clear history. - currentPage = topmostFrame().currentPage; - topmostFrame().navigate({ create: pageFactory, clearHistory: true }); - TKUnit.waitUntilReady(() => { return topmostFrame().currentPage !== currentPage; }); + currentPage = topmost.currentPage; + topmost.navigate({ create: pageFactory, clearHistory: true, transition: transition }); + TKUnit.waitUntilReady(() => { return topmost.currentPage !== currentPage; }); - TKUnit.assert(!topmostFrame().canGoBack(), "Frame should NOT be able to go back."); - TKUnit.assert(topmostFrame().backStack.length === 0, "Back stack should have 0 entries."); + TKUnit.assert(!topmost.canGoBack(), "Frame should NOT be able to go back."); + TKUnit.assert(topmost.backStack.length === 0, "Back stack should have 0 entries."); - topmostFrame().navigate({ create: mainPageFactory }); - TKUnit.waitUntilReady(() => { return topmostFrame().currentPage === mainTestPage; }); + topmost.navigate({ create: mainPageFactory, transition: transition }); + TKUnit.waitUntilReady(() => { return topmost.currentPage === mainTestPage; }); +} + +// Clearing the history messes up the tests app. +export var test_ClearHistory = function () { + _test_ClearHistory(); +} + +export var test_ClearHistory_WithTransition = function () { + _test_ClearHistory({ name: "slide" }); +} + +// Test case for https://github.com/NativeScript/NativeScript/issues/1948 +export var test_ClearHistoryWithTransitionDoesNotBreakNavigation = function () { + let topmost = topmostFrame(); + + let mainTestPage = topmost.currentPage; + let mainPageFactory = function (): Page { + return mainTestPage; + }; + + // Go to details-page + topmost.navigate({ create: pageFactory, clearHistory: false }); + TKUnit.waitUntilReady(() => { return topmost.currentPage !== mainTestPage; }); + + // Go back to main-page with clearHistory + var detailsPage: Page; + detailsPage = topmost.currentPage; + topmost.transition = { name: "fade" }; + topmost.navigate({ create: mainPageFactory, clearHistory: true }); + TKUnit.waitUntilReady(() => { return topmost.currentPage === mainTestPage; }); + + // Go to details-page AGAIN + topmost.navigate({ create: pageFactory, clearHistory: false }); + TKUnit.waitUntilReady(() => { return topmost.currentPage !== mainTestPage; }); + + // Go back to main-page with clearHistory + detailsPage = topmost.currentPage; + topmost.transition = { name: "fade" }; + topmost.navigate({ create: mainPageFactory, clearHistory: true }); + TKUnit.waitUntilReady(() => { return topmost.currentPage === mainTestPage; }); + + // Clean up + topmost.transition = undefined; } diff --git a/ui/frame/frame-common.ts b/ui/frame/frame-common.ts index 0354cab0d..0070b5646 100644 --- a/ui/frame/frame-common.ts +++ b/ui/frame/frame-common.ts @@ -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 = this.backStack[i--]; + console.log("[ " + backstackEntry.resolvedPage.id + " ]"); + } + } } var _topmost = function (): Frame { diff --git a/ui/frame/frame.android.ts b/ui/frame/frame.android.ts index 5393c585b..88c77fe08 100644 --- a/ui/frame/frame.android.ts +++ b/ui/frame/frame.android.ts @@ -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 = this.backStack[i--]; - console.log("[ " + backstackEntry.resolvedPage.id + " ]"); - } - } - public _getNavBarVisible(page: pages.Page): boolean { if (types.isDefined(page.actionBarHidden)) { return !page.actionBarHidden; diff --git a/ui/transition/transition.android.ts b/ui/transition/transition.android.ts index 20829e2b6..010bb7b48 100644 --- a/ui/transition/transition.android.ts +++ b/ui/transition/transition.android.ts @@ -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 = (fragment).getEnterTransition(); + if (enterTransition) { + trace.write(`Cleared Enter ${enterTransition.getClass().getSimpleName()} transition for ${fragment.getTag()}`, trace.categories.Transition); + (fragment).setEnterTransition(null); + } + var returnTransition = (fragment).getReturnTransition(); + if (returnTransition) { + trace.write(`Cleared Pop Exit ${returnTransition.getClass().getSimpleName()} transition for ${fragment.getTag()}`, trace.categories.Transition); + (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); } } diff --git a/ui/transition/transition.d.ts b/ui/transition/transition.d.ts index aba7adb17..1c5f38bde 100644 --- a/ui/transition/transition.d.ts +++ b/ui/transition/transition.d.ts @@ -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;