Handle room, user, group links by converting them to permalinks.

This commit is contained in:
Onuray Sahin 2020-09-02 18:26:08 +03:00
parent dbd080ca6c
commit a151f42495
2 changed files with 49 additions and 5 deletions

View File

@ -144,8 +144,7 @@
<data android:scheme="https" /> <data android:scheme="https" />
<data android:host="riot.im" /> <data android:host="riot.im" />
<data android:host="element.io" /> <data android:host="app.element.io" />
<data android:pathPrefix="/config/" />
</intent-filter> </intent-filter>
</activity> </activity>

View File

@ -24,10 +24,15 @@ import im.vector.app.core.di.ActiveSessionHolder
import im.vector.app.core.di.ScreenComponent import im.vector.app.core.di.ScreenComponent
import im.vector.app.core.error.ErrorFormatter import im.vector.app.core.error.ErrorFormatter
import im.vector.app.core.platform.VectorBaseActivity 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.LoginActivity
import im.vector.app.features.login.LoginConfig 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.MatrixCallback
import org.matrix.android.sdk.api.session.permalinks.PermalinkService
import timber.log.Timber import timber.log.Timber
import java.util.concurrent.TimeUnit
import javax.inject.Inject import javax.inject.Inject
/** /**
@ -37,6 +42,7 @@ class LinkHandlerActivity : VectorBaseActivity() {
@Inject lateinit var sessionHolder: ActiveSessionHolder @Inject lateinit var sessionHolder: ActiveSessionHolder
@Inject lateinit var errorFormatter: ErrorFormatter @Inject lateinit var errorFormatter: ErrorFormatter
@Inject lateinit var permalinkHandler: PermalinkHandler
override fun injectWith(injector: ScreenComponent) { override fun injectWith(injector: ScreenComponent) {
injector.inject(this) injector.inject(this)
@ -62,11 +68,47 @@ class LinkHandlerActivity : VectorBaseActivity() {
startLoginActivity(uri) startLoginActivity(uri)
} }
} else { } else {
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?) // Other link are not yet handled, but should not comes here (manifest configuration error?)
Timber.w("Unable to handle this uir: $uri") Timber.w("Unable to handle this uir: $uri")
finish() 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
}
}
/** /**
* Start the login screen with identity server and home server pre-filled * Start the login screen with identity server and home server pre-filled
@ -114,5 +156,8 @@ class LinkHandlerActivity : VectorBaseActivity() {
companion object { companion object {
private const val PATH_CONFIG = "/config/config" 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/"
} }
} }