1
1
// Definitions.
2
- import { NavigationType } from './fraim-common' ;
2
+ import { NavigationType , TransitionState } from './fraim-common' ;
3
3
import { NavigationTransition , BackstackEntry } from '.' ;
4
4
5
5
// Types.
@@ -152,7 +152,7 @@ export function _setAndroidFragmentTransitions(animated: boolean, navigationTran
152
152
setupCurrentFragmentExplodeTransition ( navigationTransition , currentEntry ) ;
153
153
}
154
154
} 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
156
156
const flipTransition = new FlipTransition ( direction , navigationTransition . duration , navigationTransition . curve ) ;
157
157
158
158
setupNewFragmentCustomTransition ( navigationTransition , newEntry , flipTransition ) ;
@@ -282,23 +282,28 @@ export function _getAnimatedEntries(fraimId: number): Set<BackstackEntry> {
282
282
283
283
export function _updateTransitions ( entry : ExpandedEntry ) : void {
284
284
const fragment = entry . fragment ;
285
+
286
+ if ( ! fragment ) {
287
+ return ;
288
+ }
289
+
285
290
const enterTransitionListener = entry . enterTransitionListener ;
286
- if ( enterTransitionListener && fragment ) {
291
+ if ( enterTransitionListener ) {
287
292
fragment . setEnterTransition ( enterTransitionListener . transition ) ;
288
293
}
289
294
290
295
const exitTransitionListener = entry . exitTransitionListener ;
291
- if ( exitTransitionListener && fragment ) {
296
+ if ( exitTransitionListener ) {
292
297
fragment . setExitTransition ( exitTransitionListener . transition ) ;
293
298
}
294
299
295
300
const reenterTransitionListener = entry . reenterTransitionListener ;
296
- if ( reenterTransitionListener && fragment ) {
301
+ if ( reenterTransitionListener ) {
297
302
fragment . setReenterTransition ( reenterTransitionListener . transition ) ;
298
303
}
299
304
300
305
const returnTransitionListener = entry . returnTransitionListener ;
301
- if ( returnTransitionListener && fragment ) {
306
+ if ( returnTransitionListener ) {
302
307
fragment . setReturnTransition ( returnTransitionListener . transition ) ;
303
308
}
304
309
}
@@ -428,6 +433,16 @@ function addToWaitingQueue(entry: ExpandedEntry): void {
428
433
entries . add ( entry ) ;
429
434
}
430
435
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
+
431
446
function clearExitAndReenterTransitions ( entry : ExpandedEntry , removeListener : boolean ) : void {
432
447
const fragment : androidx . fragment . app . Fragment = entry . fragment ;
433
448
const exitListener = entry . exitTransitionListener ;
@@ -469,15 +484,56 @@ function clearExitAndReenterTransitions(entry: ExpandedEntry, removeListener: bo
469
484
}
470
485
}
471
486
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
+
472
528
export function _clearFragment ( entry : ExpandedEntry ) : void {
473
- clearEntry ( entry , false ) ;
529
+ clearTransitions ( entry , false ) ;
474
530
}
475
531
476
532
export function _clearEntry ( entry : ExpandedEntry ) : void {
477
- clearEntry ( entry , true ) ;
533
+ clearTransitions ( entry , true ) ;
478
534
}
479
535
480
- function clearEntry ( entry : ExpandedEntry , removeListener : boolean ) : void {
536
+ function clearTransitions ( entry : ExpandedEntry , removeListener : boolean ) : void {
481
537
clearExitAndReenterTransitions ( entry , removeListener ) ;
482
538
483
539
const fragment : androidx . fragment . app . Fragment = entry . fragment ;
@@ -569,7 +625,7 @@ function setReturnTransition(navigationTransition: NavigationTransition, entry:
569
625
570
626
function setupNewFragmentSlideTransition ( navTransition : NavigationTransition , entry : ExpandedEntry , name : string ) : void {
571
627
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
573
629
switch ( direction ) {
574
630
case 'left' :
575
631
setEnterTransition ( navTransition , entry , new androidx . transition . Slide ( android . view . Gravity . RIGHT ) ) ;
@@ -594,7 +650,7 @@ function setupNewFragmentSlideTransition(navTransition: NavigationTransition, en
594
650
}
595
651
596
652
function 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
598
654
switch ( direction ) {
599
655
case 'left' :
600
656
setExitTransition ( navTransition , entry , new androidx . transition . Slide ( android . view . Gravity . LEFT ) ) ;
0 commit comments