diff --git a/vector/src/main/AndroidManifest.xml b/vector/src/main/AndroidManifest.xml
index f07d992726..539a672e97 100644
--- a/vector/src/main/AndroidManifest.xml
+++ b/vector/src/main/AndroidManifest.xml
@@ -144,8 +144,7 @@
-
-
+
diff --git a/vector/src/main/java/im/vector/app/features/link/LinkHandlerActivity.kt b/vector/src/main/java/im/vector/app/features/link/LinkHandlerActivity.kt
index 71a372f039..c9c07a9419 100644
--- a/vector/src/main/java/im/vector/app/features/link/LinkHandlerActivity.kt
+++ b/vector/src/main/java/im/vector/app/features/link/LinkHandlerActivity.kt
@@ -24,10 +24,15 @@ import im.vector.app.core.di.ActiveSessionHolder
import im.vector.app.core.di.ScreenComponent
import im.vector.app.core.error.ErrorFormatter
import im.vector.app.core.platform.VectorBaseActivity
+import im.vector.app.core.utils.toast
import im.vector.app.features.login.LoginActivity
import im.vector.app.features.login.LoginConfig
+import im.vector.app.features.permalink.PermalinkHandler
+import io.reactivex.android.schedulers.AndroidSchedulers
import org.matrix.android.sdk.api.MatrixCallback
+import org.matrix.android.sdk.api.session.permalinks.PermalinkService
import timber.log.Timber
+import java.util.concurrent.TimeUnit
import javax.inject.Inject
/**
@@ -37,6 +42,7 @@ class LinkHandlerActivity : VectorBaseActivity() {
@Inject lateinit var sessionHolder: ActiveSessionHolder
@Inject lateinit var errorFormatter: ErrorFormatter
+ @Inject lateinit var permalinkHandler: PermalinkHandler
override fun injectWith(injector: ScreenComponent) {
injector.inject(this)
@@ -62,9 +68,45 @@ class LinkHandlerActivity : VectorBaseActivity() {
startLoginActivity(uri)
}
} else {
- // Other link are not yet handled, but should not comes here (manifest configuration error?)
- Timber.w("Unable to handle this uir: $uri")
- finish()
+ if (!sessionHolder.hasActiveSession()) {
+ startLoginActivity(uri)
+ finish()
+ } else {
+ convertUrlToPermalink(uri.toString())?.let { permalink ->
+ startPermalinkHandler(permalink)
+ } ?: run {
+ // Other link are not yet handled, but should not comes here (manifest configuration error?)
+ Timber.w("Unable to handle this uir: $uri")
+ finish()
+ }
+ }
+ }
+ }
+
+ private fun startPermalinkHandler(permalink: String) {
+ permalinkHandler.launch(this, permalink, buildTask = true)
+ .delay(500, TimeUnit.MILLISECONDS)
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe { isHandled ->
+ if (!isHandled) {
+ toast(R.string.permalink_malformed)
+ }
+ finish()
+ }
+ .disposeOnDestroy()
+ }
+
+ /**
+ * Converts domain urls to matrix.to urls
+ * @param url full url like https://app.element.io/#/room/#dummy_room:matrix.org
+ * @return matrix.to url like https://matrix.to/#/#dummy_room:matrix.org
+ */
+ private fun convertUrlToPermalink(url: String): String? {
+ return when {
+ url.startsWith(ROOM_BASE_URL) -> url.replace(ROOM_BASE_URL, PermalinkService.MATRIX_TO_URL_BASE)
+ url.startsWith(USER_BASE_URL) -> url.replace(USER_BASE_URL, PermalinkService.MATRIX_TO_URL_BASE)
+ url.startsWith(GROUP_BASE_URL) -> url.replace(GROUP_BASE_URL, PermalinkService.MATRIX_TO_URL_BASE)
+ else -> null
}
}
@@ -114,5 +156,8 @@ class LinkHandlerActivity : VectorBaseActivity() {
companion object {
private const val PATH_CONFIG = "/config/config"
+ private const val ROOM_BASE_URL = "https://app.element.io/#/room/"
+ private const val USER_BASE_URL = "https://app.element.io/#/user/"
+ private const val GROUP_BASE_URL = "https://app.element.io/#/group/"
}
}