diff --git a/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt index cc50e19895..86e85d7ae6 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt @@ -34,8 +34,10 @@ import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin import com.bumble.appyx.core.plugin.plugins import com.bumble.appyx.navmodel.backstack.BackStack +import com.bumble.appyx.navmodel.backstack.operation.pop import com.bumble.appyx.navmodel.backstack.operation.push import com.bumble.appyx.navmodel.backstack.operation.replace +import com.bumble.appyx.navmodel.backstack.operation.singleTop import dagger.assisted.Assisted import dagger.assisted.AssistedInject import im.vector.app.features.analytics.plan.JoinedRoom @@ -290,21 +292,24 @@ class LoggedInFlowNode @AssistedInject constructor( coroutineScope.launch { attachRoom(roomId.toRoomIdOrAlias()) } } - override fun onPermalinkClick(data: PermalinkData) { + override fun onPermalinkClick(data: PermalinkData, pushToBackstack: Boolean) { when (data) { is PermalinkData.UserLink -> { // Should not happen (handled by MessagesNode) Timber.e("User link clicked: ${data.userId}.") } is PermalinkData.RoomLink -> { - backstack.push( - NavTarget.Room( - roomIdOrAlias = data.roomIdOrAlias, - serverNames = data.viaParameters, - trigger = JoinedRoom.Trigger.Timeline, - initialElement = RoomNavigationTarget.Messages(data.eventId), - ) + val target = NavTarget.Room( + roomIdOrAlias = data.roomIdOrAlias, + serverNames = data.viaParameters, + trigger = JoinedRoom.Trigger.Timeline, + initialElement = RoomNavigationTarget.Messages(data.eventId), ) + if (pushToBackstack) { + backstack.push(target) + } else { + backstack.singleTop(target) + } } is PermalinkData.FallbackLink, is PermalinkData.RoomEmailInviteLink -> { diff --git a/appnav/src/main/kotlin/io/element/android/appnav/room/joined/JoinedRoomLoadedFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/room/joined/JoinedRoomLoadedFlowNode.kt index d181b22bed..affead0b4c 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/room/joined/JoinedRoomLoadedFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/room/joined/JoinedRoomLoadedFlowNode.kt @@ -77,7 +77,7 @@ class JoinedRoomLoadedFlowNode @AssistedInject constructor( ), DaggerComponentOwner { interface Callback : Plugin { fun onOpenRoom(roomId: RoomId) - fun onPermalinkClick(data: PermalinkData) + fun onPermalinkClick(data: PermalinkData, pushToBackstack: Boolean) fun onForwardedToSingleRoom(roomId: RoomId) fun onOpenGlobalNotificationSettings() } @@ -147,8 +147,8 @@ class JoinedRoomLoadedFlowNode @AssistedInject constructor( backstack.push(NavTarget.RoomMemberDetails(userId)) } - override fun onPermalinkClick(data: PermalinkData) { - callbacks.forEach { it.onPermalinkClick(data) } + override fun onPermalinkClick(data: PermalinkData, pushToBackstack: Boolean) { + callbacks.forEach { it.onPermalinkClick(data, pushToBackstack) } } override fun onForwardedToSingleRoom(roomId: RoomId) { diff --git a/features/messages/api/src/main/kotlin/io/element/android/features/messages/api/MessagesEntryPoint.kt b/features/messages/api/src/main/kotlin/io/element/android/features/messages/api/MessagesEntryPoint.kt index 6bd1045c12..cff060ca42 100644 --- a/features/messages/api/src/main/kotlin/io/element/android/features/messages/api/MessagesEntryPoint.kt +++ b/features/messages/api/src/main/kotlin/io/element/android/features/messages/api/MessagesEntryPoint.kt @@ -41,7 +41,7 @@ interface MessagesEntryPoint : FeatureEntryPoint { interface Callback : Plugin { fun onRoomDetailsClick() fun onUserDataClick(userId: UserId) - fun onPermalinkClick(data: PermalinkData) + fun onPermalinkClick(data: PermalinkData, pushToBackstack: Boolean = true) fun onForwardedToSingleRoom(roomId: RoomId) } } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesFlowNode.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesFlowNode.kt index 5472741e02..feecc42661 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesFlowNode.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesFlowNode.kt @@ -28,7 +28,6 @@ import com.bumble.appyx.core.node.node import com.bumble.appyx.core.plugin.Plugin import com.bumble.appyx.core.plugin.plugins import com.bumble.appyx.navmodel.backstack.BackStack -import com.bumble.appyx.navmodel.backstack.operation.newRoot import com.bumble.appyx.navmodel.backstack.operation.push import dagger.assisted.Assisted import dagger.assisted.AssistedInject @@ -69,6 +68,7 @@ import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.UserId +import io.element.android.libraries.matrix.api.core.toRoomIdOrAlias import io.element.android.libraries.matrix.api.media.MediaSource import io.element.android.libraries.matrix.api.permalink.PermalinkData import io.element.android.libraries.matrix.api.room.MatrixRoom @@ -308,16 +308,15 @@ class MessagesFlowNode @AssistedInject constructor( } override fun onViewInTimelineClick(eventId: EventId) { - backstack.newRoot(NavTarget.Messages(overriddenFocusedEventId = eventId)) + val permalinkData = PermalinkData.RoomLink( + roomIdOrAlias = room.roomId.toRoomIdOrAlias(), + eventId = eventId, + ) + callbacks.forEach { it.onPermalinkClick(permalinkData, pushToBackstack = false) } } override fun onRoomPermalinkClick(data: PermalinkData.RoomLink) { - if (room.matches(data.roomIdOrAlias)) { - val eventId = data.eventId - backstack.newRoot(NavTarget.Messages(overriddenFocusedEventId = eventId)) - } else { - callbacks.forEach { it.onPermalinkClick(data) } - } + callbacks.forEach { it.onPermalinkClick(data, pushToBackstack = !room.matches(data.roomIdOrAlias)) } } override fun onShowEventDebugInfoClick(eventId: EventId?, debugInfo: TimelineItemDebugInfo) {