diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesNode.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesNode.kt index b7958f792c..658149489c 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesNode.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesNode.kt @@ -34,8 +34,10 @@ import io.element.android.features.messages.impl.timeline.di.LocalTimelineItemPr import io.element.android.features.messages.impl.timeline.di.TimelineItemPresenterFactories import io.element.android.features.messages.impl.timeline.model.TimelineItem import io.element.android.libraries.androidutils.system.openUrlInExternalApp +import io.element.android.libraries.androidutils.system.toast import io.element.android.libraries.architecture.NodeInputs import io.element.android.libraries.core.bool.orFalse +import io.element.android.libraries.di.ApplicationContext import io.element.android.libraries.di.RoomScope import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.core.RoomId @@ -43,6 +45,7 @@ import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.permalink.PermalinkData import io.element.android.libraries.matrix.api.permalink.PermalinkParser import io.element.android.libraries.matrix.api.room.MatrixRoom +import io.element.android.libraries.matrix.api.room.navigation.isSameRoom import io.element.android.libraries.matrix.api.room.roomMembers import io.element.android.libraries.matrix.api.timeline.item.TimelineItemDebugInfo import io.element.android.libraries.mediaplayer.api.MediaPlayer @@ -60,6 +63,8 @@ class MessagesNode @AssistedInject constructor( private val timelineItemPresenterFactories: TimelineItemPresenterFactories, private val mediaPlayer: MediaPlayer, private val permalinkParser: PermalinkParser, + @ApplicationContext + private val context: Context, ) : Node(buildContext, plugins = plugins), MessagesNavigator { private val presenter = presenterFactory.create(this) private val callback = plugins().firstOrNull() @@ -124,8 +129,7 @@ class MessagesNode @AssistedInject constructor( } } is PermalinkData.RoomLink -> { - // TODO Handle click on current Room - callback?.onPermalinkClicked(permalink) + handleRoomLinkClicked(permalink) } is PermalinkData.FallbackLink, is PermalinkData.RoomEmailInviteLink -> { @@ -134,6 +138,20 @@ class MessagesNode @AssistedInject constructor( } } + private fun handleRoomLinkClicked(roomLink: PermalinkData.RoomLink) { + if (room.isSameRoom(roomLink.roomIdOrAlias)) { + if (roomLink.eventId != null) { + // TODO Handle navigation to the Event + context.toast("TODO Handle navigation to the Event ${roomLink.eventId}") + } else { + // Click on the same room, ignore + context.toast("Already viewing this room!") + } + } else { + callback?.onPermalinkClicked(roomLink) + } + } + override fun onShowEventDebugInfoClicked(eventId: EventId?, debugInfo: TimelineItemDebugInfo) { callback?.onShowEventDebugInfoClicked(eventId, debugInfo) } diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/navigation/Navigation.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/navigation/Navigation.kt new file mode 100644 index 0000000000..3bc46df4fc --- /dev/null +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/navigation/Navigation.kt @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2024 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.element.android.libraries.matrix.api.room.navigation + +import io.element.android.libraries.matrix.api.core.RoomIdOrAlias +import io.element.android.libraries.matrix.api.room.MatrixRoom + +/** + * Return true if the given roomIdOrAlias is the same room as this room. + */ +fun MatrixRoom.isSameRoom(roomIdOrAlias: RoomIdOrAlias): Boolean { + return when (roomIdOrAlias) { + is RoomIdOrAlias.Id -> { + roomIdOrAlias.roomId == roomId + } + is RoomIdOrAlias.Alias -> { + roomIdOrAlias.roomAlias == alias || roomIdOrAlias.roomAlias in alternativeAliases + } + } +}