diff --git a/features/userprofile/shared/src/main/kotlin/io/element/android/features/userprofile/shared/UserProfileNodeHelper.kt b/features/userprofile/shared/src/main/kotlin/io/element/android/features/userprofile/shared/UserProfileNodeHelper.kt index 6699183f69..a7c19072e9 100644 --- a/features/userprofile/shared/src/main/kotlin/io/element/android/features/userprofile/shared/UserProfileNodeHelper.kt +++ b/features/userprofile/shared/src/main/kotlin/io/element/android/features/userprofile/shared/UserProfileNodeHelper.kt @@ -33,7 +33,7 @@ class UserProfileNodeHelper( context: Context, permalinkBuilder: PermalinkBuilder, ) { - val permalinkResult = permalinkBuilder.permalinkForUser(userId) + val permalinkResult = permalinkBuilder.sharePermalinkForUser(userId) permalinkResult.onSuccess { permalink -> context.startSharePlainTextIntent( activityResultLauncher = null, diff --git a/libraries/deeplink/impl/src/main/kotlin/io/element/android/libraries/deeplink/impl/usecase/DefaultInviteFriendsUseCase.kt b/libraries/deeplink/impl/src/main/kotlin/io/element/android/libraries/deeplink/impl/usecase/DefaultInviteFriendsUseCase.kt index d3ba7e75fe..fad1742b0b 100644 --- a/libraries/deeplink/impl/src/main/kotlin/io/element/android/libraries/deeplink/impl/usecase/DefaultInviteFriendsUseCase.kt +++ b/libraries/deeplink/impl/src/main/kotlin/io/element/android/libraries/deeplink/impl/usecase/DefaultInviteFriendsUseCase.kt @@ -29,7 +29,7 @@ class DefaultInviteFriendsUseCase( private val permalinkBuilder: PermalinkBuilder, ) : InviteFriendsUseCase { override fun execute(activity: Activity) { - val permalinkResult = permalinkBuilder.permalinkForUser(matrixClient.sessionId) + val permalinkResult = permalinkBuilder.sharePermalinkForUser(matrixClient.sessionId) permalinkResult.fold( onSuccess = { permalink -> val appName = buildMeta.applicationName diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/permalink/PermalinkBuilder.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/permalink/PermalinkBuilder.kt index 878b0e7a69..bb9cee5c4b 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/permalink/PermalinkBuilder.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/permalink/PermalinkBuilder.kt @@ -14,6 +14,16 @@ import io.element.android.libraries.matrix.api.core.UserId interface PermalinkBuilder { fun permalinkForUser(userId: UserId): Result fun permalinkForRoomAlias(roomAlias: RoomAlias): Result + + /** + * Permalink meant to be shared outside of Matrix, for instance through the system share sheet. + * It points to the HealthChat matrix.to deployment, so that recipients who do not have the app + * yet are offered HealthChat rather than Element. + * + * Links embedded in events (mention pills, replies, …) must keep using [permalinkForUser]: + * matrix.to is the format other Matrix clients expect on the wire. + */ + fun sharePermalinkForUser(userId: UserId): Result } sealed class PermalinkBuilderError : Throwable() { diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/permalink/DefaultPermalinkBuilder.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/permalink/DefaultPermalinkBuilder.kt index 2b34138dc9..6178b314a3 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/permalink/DefaultPermalinkBuilder.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/permalink/DefaultPermalinkBuilder.kt @@ -10,6 +10,8 @@ package io.element.android.libraries.matrix.impl.permalink import dev.zacsweers.metro.AppScope import dev.zacsweers.metro.ContributesBinding +import io.element.android.appconfig.MatrixConfiguration +import io.element.android.libraries.core.extensions.replacePrefix import io.element.android.libraries.core.extensions.runCatchingExceptions import io.element.android.libraries.matrix.api.core.MatrixPatterns import io.element.android.libraries.matrix.api.core.RoomAlias @@ -38,4 +40,13 @@ class DefaultPermalinkBuilder : PermalinkBuilder { matrixToRoomAliasPermalink(roomAlias.value) } } + + override fun sharePermalinkForUser(userId: UserId): Result { + return permalinkForUser(userId).map { permalink -> + permalink.replacePrefix( + MatrixConfiguration.MATRIX_TO_PERMALINK_BASE_URL, + MatrixConfiguration.HEALTHCHAT_TO_PERMALINK_BASE_URL, + ) + } + } } diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/permalink/FakePermalinkBuilder.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/permalink/FakePermalinkBuilder.kt index 461d59cf1d..179d96194d 100644 --- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/permalink/FakePermalinkBuilder.kt +++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/permalink/FakePermalinkBuilder.kt @@ -16,6 +16,7 @@ import io.element.android.tests.testutils.lambda.lambdaError class FakePermalinkBuilder( private val permalinkForUserLambda: (UserId) -> Result = { lambdaError() }, private val permalinkForRoomAliasLambda: (RoomAlias) -> Result = { lambdaError() }, + private val sharePermalinkForUserLambda: (UserId) -> Result = { lambdaError() }, ) : PermalinkBuilder { override fun permalinkForUser(userId: UserId): Result { return permalinkForUserLambda(userId) @@ -24,4 +25,8 @@ class FakePermalinkBuilder( override fun permalinkForRoomAlias(roomAlias: RoomAlias): Result { return permalinkForRoomAliasLambda(roomAlias) } + + override fun sharePermalinkForUser(userId: UserId): Result { + return sharePermalinkForUserLambda(userId) + } }