UNPKG

tns-core-modules

Version:

Telerik NativeScript Core Modules

368 lines (367 loc) • 19.1 kB
var platform = require("platform"); var types = require("utils/types"); var trace = require("trace"); var _sdkVersion = parseInt(platform.device.sdkVersion); var _defaultInterpolator = new android.view.animation.AccelerateDecelerateInterpolator(); var ENTER_POPEXIT_TRANSITION = "ENTER_POPEXIT_TRANSITION"; var EXIT_POPENTER_TRANSITION = "EXIT_POPENTER_TRANSITION"; var COMPLETE_PAGE_ADDITION_WHEN_TRANSITION_ENDS = "COMPLETE_PAGE_ADDITION_WHEN_TRANSITION_ENDS"; var COMPLETE_PAGE_REMOVAL_WHEN_TRANSITION_ENDS = "COMPLETE_PAGE_REMOVAL_WHEN_TRANSITION_ENDS"; var enterFakeResourceId = -10; var exitFakeResourceId = -20; var popEnterFakeResourceId = -30; var popExitFakeResourceId = -40; var AndroidTransitionType; (function (AndroidTransitionType) { AndroidTransitionType.enter = "enter"; AndroidTransitionType.exit = "exit"; AndroidTransitionType.popEnter = "popEnter"; AndroidTransitionType.popExit = "popExit"; })(AndroidTransitionType = exports.AndroidTransitionType || (exports.AndroidTransitionType = {})); function _clearForwardTransitions(fragment) { if (fragment[EXIT_POPENTER_TRANSITION]) { trace.write("Cleared EXIT_POPENTER_TRANSITION " + fragment[EXIT_POPENTER_TRANSITION] + " for " + fragment.getTag(), trace.categories.Transition); fragment[EXIT_POPENTER_TRANSITION] = undefined; } if (_sdkVersion >= 21) { var exitTransition = fragment.getExitTransition(); if (exitTransition) { trace.write("Cleared Exit " + exitTransition.getClass().getSimpleName() + " transition for " + fragment.getTag(), trace.categories.Transition); fragment.setExitTransition(null); } var reenterTransition = fragment.getReenterTransition(); if (reenterTransition) { trace.write("Cleared Pop Enter " + reenterTransition.getClass().getSimpleName() + " transition for " + fragment.getTag(), trace.categories.Transition); fragment.setReenterTransition(null); } } } exports._clearForwardTransitions = _clearForwardTransitions; function _setAndroidFragmentTransitions(navigationTransition, currentFragment, newFragment, fragmentTransaction) { var name; if (navigationTransition.name) { name = navigationTransition.name.toLowerCase(); } var useLollipopTransition = name && (name.indexOf("slide") === 0 || name === "fade" || name === "explode") && _sdkVersion >= 21; if (useLollipopTransition) { newFragment.setAllowEnterTransitionOverlap(true); newFragment.setAllowReturnTransitionOverlap(true); if (currentFragment) { currentFragment.setAllowEnterTransitionOverlap(true); currentFragment.setAllowReturnTransitionOverlap(true); } if (name.indexOf("slide") === 0) { var direction = name.substr("slide".length) || "left"; switch (direction) { case "left": var rightEdge = new android.transition.Slide(android.view.Gravity.RIGHT); _setUpNativeTransition(navigationTransition, rightEdge); _addNativeTransitionListener(newFragment, rightEdge); newFragment.setEnterTransition(rightEdge); if (currentFragment) { var leftEdge_1 = new android.transition.Slide(android.view.Gravity.LEFT); _setUpNativeTransition(navigationTransition, leftEdge_1); _addNativeTransitionListener(currentFragment, leftEdge_1); currentFragment.setExitTransition(leftEdge_1); } break; case "right": var leftEdge = new android.transition.Slide(android.view.Gravity.LEFT); _setUpNativeTransition(navigationTransition, leftEdge); _addNativeTransitionListener(newFragment, leftEdge); newFragment.setEnterTransition(leftEdge); if (currentFragment) { var rightEdge_1 = new android.transition.Slide(android.view.Gravity.RIGHT); _setUpNativeTransition(navigationTransition, rightEdge_1); _addNativeTransitionListener(currentFragment, rightEdge_1); currentFragment.setExitTransition(rightEdge_1); } break; case "top": var bottomEdge = new android.transition.Slide(android.view.Gravity.BOTTOM); _setUpNativeTransition(navigationTransition, bottomEdge); _addNativeTransitionListener(newFragment, bottomEdge); newFragment.setEnterTransition(bottomEdge); if (currentFragment) { var topEdge_1 = new android.transition.Slide(android.view.Gravity.TOP); _setUpNativeTransition(navigationTransition, topEdge_1); _addNativeTransitionListener(currentFragment, topEdge_1); currentFragment.setExitTransition(topEdge_1); } break; case "bottom": var topEdge = new android.transition.Slide(android.view.Gravity.TOP); _setUpNativeTransition(navigationTransition, topEdge); _addNativeTransitionListener(newFragment, topEdge); newFragment.setEnterTransition(topEdge); if (currentFragment) { var bottomEdge_1 = new android.transition.Slide(android.view.Gravity.BOTTOM); _setUpNativeTransition(navigationTransition, bottomEdge_1); _addNativeTransitionListener(currentFragment, bottomEdge_1); currentFragment.setExitTransition(bottomEdge_1); } break; } } else if (name === "fade") { var fadeEnter = new android.transition.Fade(android.transition.Fade.IN); _setUpNativeTransition(navigationTransition, fadeEnter); _addNativeTransitionListener(newFragment, fadeEnter); newFragment.setEnterTransition(fadeEnter); var fadeReturn = new android.transition.Fade(android.transition.Fade.OUT); _setUpNativeTransition(navigationTransition, fadeReturn); _addNativeTransitionListener(newFragment, fadeReturn); newFragment.setReturnTransition(fadeReturn); if (currentFragment) { var fadeExit = new android.transition.Fade(android.transition.Fade.OUT); _setUpNativeTransition(navigationTransition, fadeExit); _addNativeTransitionListener(currentFragment, fadeExit); currentFragment.setExitTransition(fadeExit); var fadeReenter = new android.transition.Fade(android.transition.Fade.IN); _setUpNativeTransition(navigationTransition, fadeReenter); _addNativeTransitionListener(currentFragment, fadeReenter); currentFragment.setReenterTransition(fadeReenter); } } else if (name === "explode") { var explodeEnter = new android.transition.Explode(); _setUpNativeTransition(navigationTransition, explodeEnter); _addNativeTransitionListener(newFragment, explodeEnter); newFragment.setEnterTransition(explodeEnter); if (currentFragment) { var explodeExit = new android.transition.Explode(); _setUpNativeTransition(navigationTransition, explodeExit); _addNativeTransitionListener(currentFragment, explodeExit); currentFragment.setExitTransition(explodeExit); } } return; } var transition; if (name) { if (name.indexOf("slide") === 0) { var slideTransitionModule = require("./slide-transition"); var direction = name.substr("slide".length) || "left"; transition = new slideTransitionModule.SlideTransition(direction, navigationTransition.duration, navigationTransition.curve); } else if (name === "fade") { var fadeTransitionModule = require("./fade-transition"); transition = new fadeTransitionModule.FadeTransition(navigationTransition.duration, navigationTransition.curve); } else if (name.indexOf("flip") === 0) { var flipTransitionModule = require("./flip-transition"); var direction = name.substr("flip".length) || "right"; transition = new flipTransitionModule.FlipTransition(direction, navigationTransition.duration, navigationTransition.curve); } } else { transition = navigationTransition.instance; } if (transition) { newFragment[ENTER_POPEXIT_TRANSITION] = transition; if (currentFragment) { currentFragment[EXIT_POPENTER_TRANSITION] = transition; } fragmentTransaction.setCustomAnimations(enterFakeResourceId, exitFakeResourceId, popEnterFakeResourceId, popExitFakeResourceId); } } exports._setAndroidFragmentTransitions = _setAndroidFragmentTransitions; function _setUpNativeTransition(navigationTransition, nativeTransition) { if (navigationTransition.duration) { nativeTransition.setDuration(navigationTransition.duration); } if (navigationTransition.curve) { var animation = require("ui/animation"); var interpolator = animation._resolveAnimationCurve(navigationTransition.curve); nativeTransition.setInterpolator(interpolator); } else { nativeTransition.setInterpolator(_defaultInterpolator); } } function _onFragmentShown(fragment, isBack) { var transitionType = isBack ? "Pop Enter" : "Enter"; var relevantTransition = isBack ? EXIT_POPENTER_TRANSITION : ENTER_POPEXIT_TRANSITION; if (fragment[relevantTransition]) { trace.write(fragment.getTag() + " has been shown when going " + (isBack ? "back" : "forward") + ", but there is " + transitionType + " " + fragment[relevantTransition] + ". Will complete page addition when transition ends.", trace.categories.Transition); fragment[COMPLETE_PAGE_ADDITION_WHEN_TRANSITION_ENDS] = { isBack: isBack }; } else if (_sdkVersion >= 21) { var nativeTransition = isBack ? fragment.getReenterTransition() : fragment.getEnterTransition(); if (nativeTransition) { trace.write(fragment.getTag() + " has been shown when going " + (isBack ? "back" : "forward") + ", but there is " + transitionType + " " + nativeTransition.getClass().getSimpleName() + " transition. Will complete page addition when transition ends.", trace.categories.Transition); fragment[COMPLETE_PAGE_ADDITION_WHEN_TRANSITION_ENDS] = { isBack: isBack }; } } if (fragment[COMPLETE_PAGE_ADDITION_WHEN_TRANSITION_ENDS] === undefined) { _completePageAddition(fragment, isBack, true); } } exports._onFragmentShown = _onFragmentShown; function _onFragmentHidden(fragment, isBack) { var transitionType = isBack ? "Pop Exit" : "Exit"; var relevantTransition = isBack ? ENTER_POPEXIT_TRANSITION : EXIT_POPENTER_TRANSITION; if (fragment[relevantTransition]) { trace.write(fragment.getTag() + " has been hidden when going " + (isBack ? "back" : "forward") + ", but there is " + transitionType + " " + fragment[relevantTransition] + ". Will complete page removal when transition ends.", trace.categories.Transition); fragment[COMPLETE_PAGE_REMOVAL_WHEN_TRANSITION_ENDS] = true; } else if (_sdkVersion >= 21) { var nativeTransition = isBack ? fragment.getReturnTransition() : fragment.getExitTransition(); if (nativeTransition) { trace.write(fragment.getTag() + " has been hidden when going " + (isBack ? "back" : "forward") + ", but there is " + transitionType + " " + nativeTransition.getClass().getSimpleName() + " transition. Will complete page removal when transition ends.", trace.categories.Transition); fragment[COMPLETE_PAGE_REMOVAL_WHEN_TRANSITION_ENDS] = true; } } if (fragment[COMPLETE_PAGE_REMOVAL_WHEN_TRANSITION_ENDS] === undefined) { _completePageRemoval(fragment, true); } } exports._onFragmentHidden = _onFragmentHidden; function _completePageAddition(fragment, isBack, force) { if (fragment[COMPLETE_PAGE_ADDITION_WHEN_TRANSITION_ENDS] || force) { fragment[COMPLETE_PAGE_ADDITION_WHEN_TRANSITION_ENDS] = undefined; var frame = fragment.frame; var entry = fragment.entry; var page = entry.resolvedPage; frame._currentEntry = entry; page.onNavigatedTo(isBack); frame._processNavigationQueue(page); trace.write("ADDITION of " + page + " completed", trace.categories.Transition); } } function _completePageRemoval(fragment, force) { if (fragment[COMPLETE_PAGE_REMOVAL_WHEN_TRANSITION_ENDS] || force) { fragment[COMPLETE_PAGE_REMOVAL_WHEN_TRANSITION_ENDS] = undefined; var frame = fragment.frame; var entry = fragment.entry; var page = entry.resolvedPage; if (page.frame) { frame._removeView(page); } trace.write("REMOVAL of " + page + " completed", trace.categories.Transition); } } function _addNativeTransitionListener(fragment, nativeTransition) { var transitionListener = new android.transition.Transition.TransitionListener({ onTransitionCancel: function (transition) { trace.write("CANCEL " + nativeTransition + " transition for " + fragment, trace.categories.Transition); if (fragment[COMPLETE_PAGE_REMOVAL_WHEN_TRANSITION_ENDS]) { _completePageRemoval(fragment); } if (fragment[COMPLETE_PAGE_ADDITION_WHEN_TRANSITION_ENDS]) { _completePageAddition(fragment, fragment[COMPLETE_PAGE_ADDITION_WHEN_TRANSITION_ENDS].isBack); } }, onTransitionEnd: function (transition) { trace.write("END " + nativeTransition + " transition for " + fragment, trace.categories.Transition); if (fragment[COMPLETE_PAGE_REMOVAL_WHEN_TRANSITION_ENDS]) { _completePageRemoval(fragment); } if (fragment[COMPLETE_PAGE_ADDITION_WHEN_TRANSITION_ENDS]) { _completePageAddition(fragment, fragment[COMPLETE_PAGE_ADDITION_WHEN_TRANSITION_ENDS].isBack); } }, onTransitionPause: function (transition) { trace.write("PAUSE " + nativeTransition + " transition for " + fragment, trace.categories.Transition); }, onTransitionResume: function (transition) { trace.write("RESUME " + nativeTransition + " transition for " + fragment, trace.categories.Transition); }, onTransitionStart: function (transition) { trace.write("START " + nativeTransition + " transition for " + fragment, trace.categories.Transition); } }); nativeTransition.addListener(transitionListener); } function _onFragmentCreateAnimator(fragment, nextAnim) { var transitionType; switch (nextAnim) { case enterFakeResourceId: transitionType = AndroidTransitionType.enter; break; case exitFakeResourceId: transitionType = AndroidTransitionType.exit; break; case popEnterFakeResourceId: transitionType = AndroidTransitionType.popEnter; break; case popExitFakeResourceId: transitionType = AndroidTransitionType.popExit; break; } var transition; switch (transitionType) { case AndroidTransitionType.enter: case AndroidTransitionType.popExit: transition = fragment[ENTER_POPEXIT_TRANSITION]; break; case AndroidTransitionType.exit: case AndroidTransitionType.popEnter: transition = fragment[EXIT_POPENTER_TRANSITION]; break; } var animator; if (transition) { animator = transition.createAndroidAnimator(transitionType); var transitionListener = new android.animation.Animator.AnimatorListener({ onAnimationStart: function (animator) { trace.write("START " + transitionType + " " + transition + " for " + fragment.getTag(), trace.categories.Transition); }, onAnimationRepeat: function (animator) { trace.write("REPEAT " + transitionType + " " + transition + " for " + fragment.getTag(), trace.categories.Transition); }, onAnimationEnd: function (animator) { trace.write("END " + transitionType + " " + transition, trace.categories.Transition); if (fragment[COMPLETE_PAGE_REMOVAL_WHEN_TRANSITION_ENDS]) { _completePageRemoval(fragment); } if (fragment[COMPLETE_PAGE_ADDITION_WHEN_TRANSITION_ENDS]) { _completePageAddition(fragment, fragment[COMPLETE_PAGE_ADDITION_WHEN_TRANSITION_ENDS].isBack); } }, onAnimationCancel: function (animator) { trace.write("CANCEL " + transitionType + " " + transition + " for " + fragment.getTag(), trace.categories.Transition); if (fragment[COMPLETE_PAGE_REMOVAL_WHEN_TRANSITION_ENDS]) { _completePageRemoval(fragment); } if (fragment[COMPLETE_PAGE_ADDITION_WHEN_TRANSITION_ENDS]) { _completePageAddition(fragment, fragment[COMPLETE_PAGE_ADDITION_WHEN_TRANSITION_ENDS].isBack); } } }); animator.addListener(transitionListener); } return animator; } exports._onFragmentCreateAnimator = _onFragmentCreateAnimator; var transitionId = 0; var Transition = (function () { function Transition(duration, curve) { this._duration = duration; if (curve) { var animation = require("ui/animation"); this._interpolator = animation._resolveAnimationCurve(curve); } else { this._interpolator = _defaultInterpolator; } this._id = transitionId++; } Transition.prototype.getDuration = function () { return this._duration; }; Transition.prototype.getCurve = function () { return this._interpolator; }; Transition.prototype.animateIOSTransition = function (containerView, fromView, toView, operation, completion) { throw new Error("Abstract method call"); }; Transition.prototype.createAndroidAnimator = function (transitionType) { throw new Error("Abstract method call"); }; Transition.prototype.toString = function () { return types.getClass(this) + "@" + this._id; }; return Transition; }()); exports.Transition = Transition;