Skip to content

Commit ebdd945

Browse files
committed
messages: separate custom tab links from normal links
Some links in the `MessagesView` are part of Element X itself, such as the help pages in `LearnMoreConfig` [1]. These links should open in an "in-app" Chrome Custom Tab, because they are basically part of the app. Web links from chat messages, on the other hand, should open in the user's preferred web browser as regular tabs. Separate "regular" links from "custom tab" links with a new parameter `onLinkClick(..., customTab)`. If true, the link opens in a custom tab. Links within `TimelineView` are always opened in a normal tab. [1]: appconfig/src/main/kotlin/io/element/android/appconfig/LearnMoreConfig.kt
1 parent 31c3b0c commit ebdd945

File tree

5 files changed

+18
-12
lines changed

5 files changed

+18
-12
lines changed

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesNode.kt

+7-2
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ class MessagesNode @AssistedInject constructor(
139139
darkTheme: Boolean,
140140
url: String,
141141
eventSink: (TimelineEvents) -> Unit,
142+
customTab: Boolean
142143
) {
143144
when (val permalink = permalinkParser.parse(url)) {
144145
is PermalinkData.UserLink -> {
@@ -150,7 +151,11 @@ class MessagesNode @AssistedInject constructor(
150151
handleRoomLinkClick(activity, permalink, eventSink)
151152
}
152153
is PermalinkData.FallbackLink -> {
153-
activity.openUrlInExternalApp(url)
154+
if (customTab) {
155+
activity.openUrlInChromeCustomTab(null, darkTheme, url)
156+
} else {
157+
activity.openUrlInExternalApp(url)
158+
}
154159
}
155160
is PermalinkData.RoomEmailInviteLink -> {
156161
activity.openUrlInChromeCustomTab(null, darkTheme, url)
@@ -236,7 +241,7 @@ class MessagesNode @AssistedInject constructor(
236241
onRoomDetailsClick = this::onRoomDetailsClick,
237242
onEventContentClick = this::onEventClick,
238243
onUserDataClick = this::onUserDataClick,
239-
onLinkClick = { url -> onLinkClick(activity, isDark, url, state.timelineState.eventSink) },
244+
onLinkClick = { url, customTab -> onLinkClick(activity, isDark, url, state.timelineState.eventSink, customTab) },
240245
onSendLocationClick = this::onSendLocationClick,
241246
onCreatePollClick = this::onCreatePollClick,
242247
onJoinCallClick = this::onJoinCallClick,

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesView.kt

+5-5
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ fun MessagesView(
111111
onRoomDetailsClick: () -> Unit,
112112
onEventContentClick: (event: TimelineItem.Event) -> Boolean,
113113
onUserDataClick: (UserId) -> Unit,
114-
onLinkClick: (String) -> Unit,
114+
onLinkClick: (String, Boolean) -> Unit,
115115
onSendLocationClick: () -> Unit,
116116
onCreatePollClick: () -> Unit,
117117
onJoinCallClick: () -> Unit,
@@ -273,7 +273,7 @@ private fun MessagesViewContent(
273273
state: MessagesState,
274274
onContentClick: (TimelineItem.Event) -> Unit,
275275
onUserDataClick: (UserId) -> Unit,
276-
onLinkClick: (String) -> Unit,
276+
onLinkClick: (String, Boolean) -> Unit,
277277
onReactionClick: (key: String, TimelineItem.Event) -> Unit,
278278
onReactionLongClick: (key: String, TimelineItem.Event) -> Unit,
279279
onMoreReactionsClick: (TimelineItem.Event) -> Unit,
@@ -347,7 +347,7 @@ private fun MessagesViewContent(
347347
state = state.timelineState,
348348
timelineProtectionState = state.timelineProtectionState,
349349
onUserDataClick = onUserDataClick,
350-
onLinkClick = onLinkClick,
350+
onLinkClick = { url -> onLinkClick(url, false) },
351351
onContentClick = onContentClick,
352352
onMessageLongClick = onMessageLongClick,
353353
onSwipeToReply = onSwipeToReply,
@@ -396,7 +396,7 @@ private fun MessagesViewContent(
396396
private fun MessagesViewComposerBottomSheetContents(
397397
subcomposing: Boolean,
398398
state: MessagesState,
399-
onLinkClick: (String) -> Unit,
399+
onLinkClick: (String, Boolean) -> Unit,
400400
) {
401401
if (state.userEventPermissions.canSendMessage) {
402402
Column(modifier = Modifier.fillMaxWidth()) {
@@ -537,7 +537,7 @@ internal fun MessagesViewPreview(@PreviewParameter(MessagesStateProvider::class)
537537
onRoomDetailsClick = {},
538538
onEventContentClick = { false },
539539
onUserDataClick = {},
540-
onLinkClick = {},
540+
onLinkClick = { _, _ -> },
541541
onSendLocationClick = {},
542542
onCreatePollClick = {},
543543
onJoinCallClick = {},

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/identity/IdentityChangeStateView.kt

+3-3
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import io.element.android.libraries.ui.strings.CommonStrings
2626
@Composable
2727
fun IdentityChangeStateView(
2828
state: IdentityChangeState,
29-
onLinkClick: (String) -> Unit,
29+
onLinkClick: (String, Boolean) -> Unit,
3030
modifier: Modifier = Modifier,
3131
) {
3232
// Pick the first identity change to PinViolation
@@ -73,7 +73,7 @@ fun IdentityChangeStateView(
7373
url = LinkAnnotation.Url(
7474
url = LearnMoreConfig.IDENTITY_CHANGE_URL,
7575
linkInteractionListener = {
76-
onLinkClick(LearnMoreConfig.IDENTITY_CHANGE_URL)
76+
onLinkClick(LearnMoreConfig.IDENTITY_CHANGE_URL, true)
7777
}
7878
),
7979
start = learnMoreStartIndex,
@@ -93,6 +93,6 @@ internal fun IdentityChangeStateViewPreview(
9393
) = ElementPreview {
9494
IdentityChangeStateView(
9595
state = state,
96-
onLinkClick = {},
96+
onLinkClick = { _, _ -> },
9797
)
9898
}

features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/identity/MessagesViewWithIdentityChangePreview.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ internal fun MessagesViewWithIdentityChangePreview(
3535
onRoomDetailsClick = {},
3636
onEventContentClick = { false },
3737
onUserDataClick = {},
38-
onLinkClick = {},
38+
onLinkClick = { _, _ -> },
3939
onSendLocationClick = {},
4040
onCreatePollClick = {},
4141
onJoinCallClick = {},

features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesViewTest.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ import io.element.android.tests.testutils.EnsureCalledOnceWithParam
5858
import io.element.android.tests.testutils.EnsureNeverCalled
5959
import io.element.android.tests.testutils.EnsureNeverCalledWithParam
6060
import io.element.android.tests.testutils.EnsureNeverCalledWithParamAndResult
61+
import io.element.android.tests.testutils.EnsureNeverCalledWithTwoParams
6162
import io.element.android.tests.testutils.EventsRecorder
6263
import io.element.android.tests.testutils.clickOn
6364
import io.element.android.tests.testutils.ensureCalledOnce
@@ -514,7 +515,7 @@ private fun <R : TestRule> AndroidComposeTestRule<R, ComponentActivity>.setMessa
514515
onRoomDetailsClick: () -> Unit = EnsureNeverCalled(),
515516
onEventClick: (event: TimelineItem.Event) -> Boolean = EnsureNeverCalledWithParamAndResult(),
516517
onUserDataClick: (UserId) -> Unit = EnsureNeverCalledWithParam(),
517-
onLinkClick: (String) -> Unit = EnsureNeverCalledWithParam(),
518+
onLinkClick: (String, Boolean) -> Unit = EnsureNeverCalledWithTwoParams(),
518519
onSendLocationClick: () -> Unit = EnsureNeverCalled(),
519520
onCreatePollClick: () -> Unit = EnsureNeverCalled(),
520521
onJoinCallClick: () -> Unit = EnsureNeverCalled(),

0 commit comments

Comments
 (0)