@@ -20,11 +20,20 @@ import androidx.lifecycle.repeatOnLifecycle
20
20
import com.bumble.appyx.core.composable.PermanentChild
21
21
import com.bumble.appyx.core.lifecycle.subscribe
22
22
import com.bumble.appyx.core.modality.BuildContext
23
+ import com.bumble.appyx.core.navigation.NavElements
24
+ import com.bumble.appyx.core.navigation.NavKey
23
25
import com.bumble.appyx.core.navigation.model.permanent.PermanentNavModel
24
26
import com.bumble.appyx.core.node.Node
25
27
import com.bumble.appyx.core.plugin.Plugin
26
28
import com.bumble.appyx.core.plugin.plugins
27
29
import com.bumble.appyx.navmodel.backstack.BackStack
30
+ import com.bumble.appyx.navmodel.backstack.BackStack.State.ACTIVE
31
+ import com.bumble.appyx.navmodel.backstack.BackStack.State.CREATED
32
+ import com.bumble.appyx.navmodel.backstack.BackStack.State.STASHED
33
+ import com.bumble.appyx.navmodel.backstack.BackStackElement
34
+ import com.bumble.appyx.navmodel.backstack.BackStackElements
35
+ import com.bumble.appyx.navmodel.backstack.operation.BackStackOperation
36
+ import com.bumble.appyx.navmodel.backstack.operation.Push
28
37
import com.bumble.appyx.navmodel.backstack.operation.pop
29
38
import com.bumble.appyx.navmodel.backstack.operation.push
30
39
import com.bumble.appyx.navmodel.backstack.operation.replace
@@ -312,7 +321,7 @@ class LoggedInFlowNode @AssistedInject constructor(
312
321
}
313
322
314
323
override fun onForwardedToSingleRoom (roomId : RoomId ) {
315
- coroutineScope.launch { attachRoom(roomId.toRoomIdOrAlias()) }
324
+ coroutineScope.launch { attachRoom(roomId.toRoomIdOrAlias(), clearBackstack = false ) }
316
325
}
317
326
318
327
override fun onPermalinkClick (data : PermalinkData , pushToBackstack : Boolean ) {
@@ -400,6 +409,11 @@ class LoggedInFlowNode @AssistedInject constructor(
400
409
is NavTarget .SecureBackup -> {
401
410
secureBackupEntryPoint.nodeBuilder(this , buildContext)
402
411
.params(SecureBackupEntryPoint .Params (initialElement = navTarget.initialElement))
412
+ .callback(object : SecureBackupEntryPoint .Callback {
413
+ override fun onDone () {
414
+ backstack.pop()
415
+ }
416
+ })
403
417
.build()
404
418
}
405
419
NavTarget .Ftue -> {
@@ -467,21 +481,21 @@ class LoggedInFlowNode @AssistedInject constructor(
467
481
serverNames : List <String > = emptyList(),
468
482
trigger : JoinedRoom .Trigger ? = null,
469
483
eventId : EventId ? = null,
484
+ clearBackstack : Boolean ,
470
485
) {
471
486
waitForNavTargetAttached { navTarget ->
472
487
navTarget is NavTarget .RoomList
473
488
}
474
489
attachChild<RoomFlowNode > {
475
- backstack.push(
476
- NavTarget .Room (
477
- roomIdOrAlias = roomIdOrAlias,
478
- serverNames = serverNames,
479
- trigger = trigger,
480
- initialElement = RoomNavigationTarget .Messages (
481
- focusedEventId = eventId
482
- )
490
+ val roomNavTarget = NavTarget .Room (
491
+ roomIdOrAlias = roomIdOrAlias,
492
+ serverNames = serverNames,
493
+ trigger = trigger,
494
+ initialElement = RoomNavigationTarget .Messages (
495
+ focusedEventId = eventId
483
496
)
484
497
)
498
+ backstack.accept(AttachRoomOperation (roomNavTarget, clearBackstack))
485
499
}
486
500
}
487
501
@@ -526,3 +540,31 @@ class LoggedInFlowNode @AssistedInject constructor(
526
540
@Assisted plugins : List <Plugin >,
527
541
) : Node(buildContext, plugins = plugins)
528
542
}
543
+
544
+ @Parcelize
545
+ private class AttachRoomOperation (
546
+ val roomTarget : LoggedInFlowNode .NavTarget .Room ,
547
+ val clearBackstack : Boolean ,
548
+ ) : BackStackOperation<LoggedInFlowNode.NavTarget> {
549
+ override fun isApplicable (elements : NavElements <LoggedInFlowNode .NavTarget , BackStack .State >) = true
550
+
551
+ override fun invoke (elements : BackStackElements <LoggedInFlowNode .NavTarget >): BackStackElements <LoggedInFlowNode .NavTarget > {
552
+ return if (clearBackstack) {
553
+ // Makes sure the room list target is alone in the backstack and stashed
554
+ elements.mapNotNull { element ->
555
+ if (element.key.navTarget == LoggedInFlowNode .NavTarget .RoomList ) {
556
+ element.transitionTo(STASHED , this )
557
+ } else {
558
+ null
559
+ }
560
+ } + BackStackElement (
561
+ key = NavKey (roomTarget),
562
+ fromState = CREATED ,
563
+ targetState = ACTIVE ,
564
+ operation = this
565
+ )
566
+ } else {
567
+ Push <LoggedInFlowNode .NavTarget >(roomTarget).invoke(elements)
568
+ }
569
+ }
570
+ }
0 commit comments