11// Definitions.
2- import { NavigationType } from './frame-common' ;
2+ import { NavigationType , TransitionState } from './frame-common' ;
33import { NavigationTransition , BackstackEntry } from '.' ;
44
55// Types.
@@ -152,7 +152,7 @@ export function _setAndroidFragmentTransitions(animated: boolean, navigationTran
152152 setupCurrentFragmentExplodeTransition ( navigationTransition , currentEntry ) ;
153153 }
154154 } else if ( name . indexOf ( 'flip' ) === 0 ) {
155- const direction = name . substr ( 'flip' . length ) || 'right' ; //Extract the direction from the string
155+ const direction = name . substring ( 'flip' . length ) || 'right' ; //Extract the direction from the string
156156 const flipTransition = new FlipTransition ( direction , navigationTransition . duration , navigationTransition . curve ) ;
157157
158158 setupNewFragmentCustomTransition ( navigationTransition , newEntry , flipTransition ) ;
@@ -282,23 +282,28 @@ export function _getAnimatedEntries(frameId: number): Set<BackstackEntry> {
282282
283283export function _updateTransitions ( entry : ExpandedEntry ) : void {
284284 const fragment = entry . fragment ;
285+
286+ if ( ! fragment ) {
287+ return ;
288+ }
289+
285290 const enterTransitionListener = entry . enterTransitionListener ;
286- if ( enterTransitionListener && fragment ) {
291+ if ( enterTransitionListener ) {
287292 fragment . setEnterTransition ( enterTransitionListener . transition ) ;
288293 }
289294
290295 const exitTransitionListener = entry . exitTransitionListener ;
291- if ( exitTransitionListener && fragment ) {
296+ if ( exitTransitionListener ) {
292297 fragment . setExitTransition ( exitTransitionListener . transition ) ;
293298 }
294299
295300 const reenterTransitionListener = entry . reenterTransitionListener ;
296- if ( reenterTransitionListener && fragment ) {
301+ if ( reenterTransitionListener ) {
297302 fragment . setReenterTransition ( reenterTransitionListener . transition ) ;
298303 }
299304
300305 const returnTransitionListener = entry . returnTransitionListener ;
301- if ( returnTransitionListener && fragment ) {
306+ if ( returnTransitionListener ) {
302307 fragment . setReturnTransition ( returnTransitionListener . transition ) ;
303308 }
304309}
@@ -428,6 +433,16 @@ function addToWaitingQueue(entry: ExpandedEntry): void {
428433 entries . add ( entry ) ;
429434}
430435
436+ function cloneExpandedTransitionListener ( expandedTransitionListener : ExpandedTransitionListener ) {
437+ if ( ! expandedTransitionListener ) {
438+ return null ;
439+ }
440+
441+ const cloneTransition = expandedTransitionListener . transition . clone ( ) ;
442+
443+ return addNativeTransitionListener ( expandedTransitionListener . entry , cloneTransition ) ;
444+ }
445+
431446function clearExitAndReenterTransitions ( entry : ExpandedEntry , removeListener : boolean ) : void {
432447 const fragment : androidx . fragment . app . Fragment = entry . fragment ;
433448 const exitListener = entry . exitTransitionListener ;
@@ -469,15 +484,56 @@ function clearExitAndReenterTransitions(entry: ExpandedEntry, removeListener: bo
469484 }
470485}
471486
487+ export function _getTransitionState ( entry : ExpandedEntry ) : TransitionState {
488+ let transitionState : TransitionState ;
489+
490+ if ( entry . enterTransitionListener && entry . exitTransitionListener ) {
491+ transitionState = {
492+ enterTransitionListener : cloneExpandedTransitionListener ( entry . enterTransitionListener ) ,
493+ exitTransitionListener : cloneExpandedTransitionListener ( entry . exitTransitionListener ) ,
494+ reenterTransitionListener : cloneExpandedTransitionListener ( entry . reenterTransitionListener ) ,
495+ returnTransitionListener : cloneExpandedTransitionListener ( entry . returnTransitionListener ) ,
496+ transitionName : entry . transitionName ,
497+ entry,
498+ } ;
499+ } else {
500+ transitionState = null ;
501+ }
502+
503+ return transitionState ;
504+ }
505+
506+ export function _restoreTransitionState ( snapshot : TransitionState ) : void {
507+ const entry = snapshot . entry as ExpandedEntry ;
508+
509+ if ( snapshot . enterTransitionListener ) {
510+ entry . enterTransitionListener = snapshot . enterTransitionListener ;
511+ }
512+
513+ if ( snapshot . exitTransitionListener ) {
514+ entry . exitTransitionListener = snapshot . exitTransitionListener ;
515+ }
516+
517+ if ( snapshot . reenterTransitionListener ) {
518+ entry . reenterTransitionListener = snapshot . reenterTransitionListener ;
519+ }
520+
521+ if ( snapshot . returnTransitionListener ) {
522+ entry . returnTransitionListener = snapshot . returnTransitionListener ;
523+ }
524+
525+ entry . transitionName = snapshot . transitionName ;
526+ }
527+
472528export function _clearFragment ( entry : ExpandedEntry ) : void {
473- clearEntry ( entry , false ) ;
529+ clearTransitions ( entry , false ) ;
474530}
475531
476532export function _clearEntry ( entry : ExpandedEntry ) : void {
477- clearEntry ( entry , true ) ;
533+ clearTransitions ( entry , true ) ;
478534}
479535
480- function clearEntry ( entry : ExpandedEntry , removeListener : boolean ) : void {
536+ function clearTransitions ( entry : ExpandedEntry , removeListener : boolean ) : void {
481537 clearExitAndReenterTransitions ( entry , removeListener ) ;
482538
483539 const fragment : androidx . fragment . app . Fragment = entry . fragment ;
@@ -569,7 +625,7 @@ function setReturnTransition(navigationTransition: NavigationTransition, entry:
569625
570626function setupNewFragmentSlideTransition ( navTransition : NavigationTransition , entry : ExpandedEntry , name : string ) : void {
571627 setupCurrentFragmentSlideTransition ( navTransition , entry , name ) ;
572- const direction = name . substr ( 'slide' . length ) || 'left' ; //Extract the direction from the string
628+ const direction = name . substring ( 'slide' . length ) || 'left' ; //Extract the direction from the string
573629 switch ( direction ) {
574630 case 'left' :
575631 setEnterTransition ( navTransition , entry , new androidx . transition . Slide ( android . view . Gravity . RIGHT ) ) ;
@@ -594,7 +650,7 @@ function setupNewFragmentSlideTransition(navTransition: NavigationTransition, en
594650}
595651
596652function setupCurrentFragmentSlideTransition ( navTransition : NavigationTransition , entry : ExpandedEntry , name : string ) : void {
597- const direction = name . substr ( 'slide' . length ) || 'left' ; //Extract the direction from the string
653+ const direction = name . substring ( 'slide' . length ) || 'left' ; //Extract the direction from the string
598654 switch ( direction ) {
599655 case 'left' :
600656 setExitTransition ( navTransition , entry , new androidx . transition . Slide ( android . view . Gravity . LEFT ) ) ;
0 commit comments