Skip to content

Commit 9dc8fc7

Browse files
committed
Allow attachRoom to set an initial RoomNavigationTarget, allowing using it for other cases like opening the room detail screen from the room list
1 parent 6ec06a1 commit 9dc8fc7

File tree

2 files changed

+46
-25
lines changed

2 files changed

+46
-25
lines changed

appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt

Lines changed: 43 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,7 @@ class LoggedInFlowNode(
331331
lifecycleScope.launch {
332332
attachRoom(
333333
roomIdOrAlias = roomId.toRoomIdOrAlias(),
334-
joinedRoom = joinedRoom,
334+
initialElement = RoomNavigationTarget.Root(joinedRoom = joinedRoom),
335335
clearBackstack = false,
336336
)
337337
}
@@ -358,8 +358,12 @@ class LoggedInFlowNode(
358358
}
359359

360360
override fun navigateToRoomSettings(roomId: RoomId) {
361-
sessionCoroutineScope.launch {
362-
backstack.push(NavTarget.Room(roomId.toRoomIdOrAlias(), initialElement = RoomNavigationTarget.Details))
361+
lifecycleScope.launch {
362+
attachRoom(
363+
roomIdOrAlias = roomId.toRoomIdOrAlias(),
364+
initialElement = RoomNavigationTarget.Details,
365+
clearBackstack = false
366+
)
363367
}
364368
}
365369

@@ -388,24 +392,25 @@ class LoggedInFlowNode(
388392
Timber.e("User link clicked: ${data.userId}.")
389393
}
390394
is PermalinkData.RoomLink -> {
391-
val target = NavTarget.Room(
392-
roomIdOrAlias = data.roomIdOrAlias,
393-
serverNames = data.viaParameters,
394-
trigger = JoinedRoomAnalyticsEvent.Trigger.Timeline,
395-
initialElement = RoomNavigationTarget.Root(data.eventId),
396-
)
397395
if (pushToBackstack) {
398396
lifecycleScope.launch {
399397
attachRoom(
400398
roomIdOrAlias = data.roomIdOrAlias,
401399
serverNames = data.viaParameters,
402400
trigger = JoinedRoomAnalyticsEvent.Trigger.Timeline,
403-
eventId = data.eventId,
401+
initialElement = RoomNavigationTarget.Root(data.eventId),
404402
clearBackstack = false
405403
)
406404
}
407405
} else {
408-
backstack.replace(target)
406+
backstack.replace(
407+
NavTarget.Room(
408+
roomIdOrAlias = data.roomIdOrAlias,
409+
serverNames = data.viaParameters,
410+
trigger = JoinedRoomAnalyticsEvent.Trigger.Timeline,
411+
initialElement = RoomNavigationTarget.Root(data.eventId),
412+
)
413+
)
409414
}
410415
}
411416
is PermalinkData.FallbackLink,
@@ -462,12 +467,21 @@ class LoggedInFlowNode(
462467
}
463468

464469
override fun navigateToRoomNotificationSettings(roomId: RoomId) {
465-
backstack.push(NavTarget.Room(roomId.toRoomIdOrAlias(), initialElement = RoomNavigationTarget.NotificationSettings))
470+
lifecycleScope.launch {
471+
attachRoom(
472+
roomIdOrAlias = roomId.toRoomIdOrAlias(),
473+
initialElement = RoomNavigationTarget.NotificationSettings,
474+
)
475+
}
466476
}
467477

468478
override fun navigateToEvent(roomId: RoomId, eventId: EventId) {
469479
sessionCoroutineScope.launch {
470-
attachRoom(roomIdOrAlias = roomId.toRoomIdOrAlias(), eventId = eventId, clearBackstack = false)
480+
attachRoom(
481+
roomIdOrAlias = roomId.toRoomIdOrAlias(),
482+
initialElement = RoomNavigationTarget.Root(eventId),
483+
clearBackstack = false
484+
)
471485
}
472486
}
473487
}
@@ -499,7 +513,13 @@ class LoggedInFlowNode(
499513
is NavTarget.CreateSpace -> {
500514
val callback = object : CreateRoomEntryPoint.Callback {
501515
override fun onRoomCreated(roomId: RoomId) {
502-
backstack.replace(NavTarget.Room(roomIdOrAlias = RoomIdOrAlias.Id(roomId), serverNames = emptyList()))
516+
lifecycleScope.launch {
517+
attachRoom(
518+
roomIdOrAlias = roomId.toRoomIdOrAlias(),
519+
serverNames = emptyList(),
520+
clearBackstack = false,
521+
)
522+
}
503523
}
504524
}
505525
createRoomEntryPoint
@@ -536,13 +556,13 @@ class LoggedInFlowNode(
536556
buildContext = buildContext,
537557
callback = object : RoomDirectoryEntryPoint.Callback {
538558
override fun navigateToRoom(roomDescription: RoomDescription) {
539-
backstack.push(
540-
NavTarget.Room(
559+
lifecycleScope.launch {
560+
attachRoom(
541561
roomIdOrAlias = roomDescription.roomId.toRoomIdOrAlias(),
542562
roomDescription = roomDescription,
543563
trigger = JoinedRoomAnalyticsEvent.Trigger.RoomDirectory,
544564
)
545-
)
565+
}
546566
}
547567
},
548568
)
@@ -588,11 +608,11 @@ class LoggedInFlowNode(
588608

589609
suspend fun attachRoom(
590610
roomIdOrAlias: RoomIdOrAlias,
591-
joinedRoom: JoinedRoom? = null,
592611
serverNames: List<String> = emptyList(),
593612
trigger: JoinedRoomAnalyticsEvent.Trigger? = null,
594-
eventId: EventId? = null,
595-
clearBackstack: Boolean,
613+
roomDescription: RoomDescription? = null,
614+
initialElement: RoomNavigationTarget = RoomNavigationTarget.Root(),
615+
clearBackstack: Boolean = false,
596616
): RoomFlowNode {
597617
waitForNavTargetAttached { navTarget ->
598618
navTarget is NavTarget.Home
@@ -601,8 +621,9 @@ class LoggedInFlowNode(
601621
val roomNavTarget = NavTarget.Room(
602622
roomIdOrAlias = roomIdOrAlias,
603623
serverNames = serverNames,
624+
roomDescription = roomDescription,
604625
trigger = trigger,
605-
initialElement = RoomNavigationTarget.Root(eventId = eventId, joinedRoom = joinedRoom)
626+
initialElement = initialElement,
606627
)
607628
backstack.accept(AttachRoomOperation(roomNavTarget, clearBackstack))
608629
}
@@ -612,8 +633,7 @@ class LoggedInFlowNode(
612633
return waitForChildAttached<RoomFlowNode, NavTarget> {
613634
it is NavTarget.Room &&
614635
it.roomIdOrAlias == roomIdOrAlias &&
615-
it.initialElement is RoomNavigationTarget.Root &&
616-
it.initialElement.eventId == eventId
636+
it.initialElement == initialElement
617637
}
618638
}
619639

appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import io.element.android.appnav.di.MatrixSessionCache
3333
import io.element.android.appnav.intent.IntentResolver
3434
import io.element.android.appnav.intent.ResolvedIntent
3535
import io.element.android.appnav.room.RoomFlowNode
36+
import io.element.android.appnav.room.RoomNavigationTarget
3637
import io.element.android.appnav.root.RootNavStateFlowFactory
3738
import io.element.android.appnav.root.RootPresenter
3839
import io.element.android.appnav.root.RootView
@@ -430,7 +431,7 @@ class RootFlowNode(
430431
roomIdOrAlias = permalinkData.roomIdOrAlias,
431432
trigger = JoinedRoom.Trigger.MobilePermalink,
432433
serverNames = permalinkData.viaParameters,
433-
eventId = focusedEventId,
434+
initialElement = RoomNavigationTarget.Root(eventId = focusedEventId),
434435
clearBackstack = true
435436
).maybeAttachThread(permalinkData.threadId, permalinkData.eventId)
436437
}
@@ -454,7 +455,7 @@ class RootFlowNode(
454455
is DeeplinkData.Room -> {
455456
loggedInFlowNode.attachRoom(
456457
roomIdOrAlias = deeplinkData.roomId.toRoomIdOrAlias(),
457-
eventId = if (deeplinkData.threadId != null) deeplinkData.threadId?.asEventId() else deeplinkData.eventId,
458+
initialElement = RoomNavigationTarget.Root(eventId = deeplinkData.threadId?.asEventId() ?: deeplinkData.eventId),
458459
clearBackstack = true,
459460
).maybeAttachThread(deeplinkData.threadId, deeplinkData.eventId)
460461
}

0 commit comments

Comments
 (0)