Some cleanup up

This commit is contained in:
Benoit Marty 2020-12-11 16:35:04 +01:00
parent 544345bbf3
commit 5461fd4060
13 changed files with 188 additions and 143 deletions

View file

@ -23,10 +23,10 @@ import org.matrix.android.sdk.api.session.room.members.ChangeMembershipState
import org.matrix.android.sdk.api.session.room.model.RoomMemberSummary
import org.matrix.android.sdk.api.session.room.model.RoomSummary
import org.matrix.android.sdk.api.session.room.model.create.CreateRoomParams
import org.matrix.android.sdk.api.session.room.peeking.PeekResult
import org.matrix.android.sdk.api.util.Cancelable
import org.matrix.android.sdk.api.util.Optional
import org.matrix.android.sdk.internal.session.room.alias.RoomAliasDescription
import org.matrix.android.sdk.internal.session.room.peeking.PeekResult
/**
* This interface defines methods to get rooms. It's implemented at the session level.
@ -167,6 +167,9 @@ interface RoomService {
*/
fun getRoomMemberLive(userId: String, roomId: String): LiveData<Optional<RoomMemberSummary>>
/**
* Get some state events about a room
*/
fun getRoomState(roomId: String, callback: MatrixCallback<List<Event>>)
/**

View file

@ -0,0 +1,37 @@
/*
* Copyright 2020 The Matrix.org Foundation C.I.C.
*
* 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 org.matrix.android.sdk.api.session.room.peeking
sealed class PeekResult {
data class Success(
val roomId: String,
val alias: String?,
val name: String?,
val topic: String?,
val avatarUrl: String?,
val numJoinedMembers: Int?,
val viaServers: List<String>
) : PeekResult()
data class PeekingNotAllowed(
val roomId: String,
val alias: String?,
val viaServers: List<String>
) : PeekResult()
object UnknownAlias : PeekResult()
}

View file

@ -28,6 +28,7 @@ import org.matrix.android.sdk.api.session.room.members.ChangeMembershipState
import org.matrix.android.sdk.api.session.room.model.RoomMemberSummary
import org.matrix.android.sdk.api.session.room.model.RoomSummary
import org.matrix.android.sdk.api.session.room.model.create.CreateRoomParams
import org.matrix.android.sdk.api.session.room.peeking.PeekResult
import org.matrix.android.sdk.api.util.Cancelable
import org.matrix.android.sdk.api.util.Optional
import org.matrix.android.sdk.api.util.toOptional
@ -41,7 +42,6 @@ import org.matrix.android.sdk.internal.session.room.create.CreateRoomTask
import org.matrix.android.sdk.internal.session.room.membership.RoomChangeMembershipStateDataSource
import org.matrix.android.sdk.internal.session.room.membership.RoomMemberHelper
import org.matrix.android.sdk.internal.session.room.membership.joining.JoinRoomTask
import org.matrix.android.sdk.internal.session.room.peeking.PeekResult
import org.matrix.android.sdk.internal.session.room.peeking.PeekRoomTask
import org.matrix.android.sdk.internal.session.room.peeking.ResolveRoomStateTask
import org.matrix.android.sdk.internal.session.room.read.MarkAllRoomsReadTask

View file

@ -183,7 +183,7 @@ internal interface RoomAPI {
@Body body: ThreePidInviteBody): Call<Unit>
/**
* Send a generic state events
* Send a generic state event
*
* @param roomId the room id.
* @param stateEventType the state event type
@ -195,7 +195,7 @@ internal interface RoomAPI {
@Body params: JsonDict): Call<Unit>
/**
* Send a generic state events
* Send a generic state event
*
* @param roomId the room id.
* @param stateEventType the state event type
@ -208,6 +208,13 @@ internal interface RoomAPI {
@Path("state_key") stateKey: String,
@Body params: JsonDict): Call<Unit>
/**
* Get state events of a room
* Ref: https://matrix.org/docs/spec/client_server/r0.6.1#get-matrix-client-r0-rooms-roomid-state
*/
@GET(NetworkConstants.URI_API_PREFIX_PATH_R0 + "rooms/{roomId}/state")
fun getRoomState(@Path("roomId") roomId: String) : Call<List<Event>>
/**
* Send a relation event to a room.
*
@ -354,7 +361,4 @@ internal interface RoomAPI {
fun deleteTag(@Path("userId") userId: String,
@Path("roomId") roomId: String,
@Path("tag") tag: String): Call<Unit>
@GET(NetworkConstants.URI_API_PREFIX_PATH_R0 + "rooms/{roomId}/state")
fun getRoomState(@Path("roomId") roomId: String) : Call<List<Event>>
}

View file

@ -43,13 +43,13 @@ internal class DefaultGetRoomIdByAliasTask @Inject constructor(
) : GetRoomIdByAliasTask {
override suspend fun execute(params: GetRoomIdByAliasTask.Params): Optional<RoomAliasDescription> {
var roomId = Realm.getInstance(monarchy.realmConfiguration).use {
val roomId = Realm.getInstance(monarchy.realmConfiguration).use {
RoomSummaryEntity.findByAlias(it, params.roomAlias)?.roomId
}
return if (roomId != null) {
Optional.from(RoomAliasDescription(roomId))
} else if (!params.searchOnServer) {
Optional.from<RoomAliasDescription>(null)
Optional.from(null)
} else {
val description = tryOrNull("## Failed to get roomId from alias") {
executeRequest<RoomAliasDescription>(eventBus) {

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2020 New Vector Ltd
* Copyright 2020 The Matrix.org Foundation C.I.C.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -26,32 +26,13 @@ import org.matrix.android.sdk.api.session.room.model.RoomNameContent
import org.matrix.android.sdk.api.session.room.model.RoomTopicContent
import org.matrix.android.sdk.api.session.room.model.roomdirectory.PublicRoomsFilter
import org.matrix.android.sdk.api.session.room.model.roomdirectory.PublicRoomsParams
import org.matrix.android.sdk.api.session.room.peeking.PeekResult
import org.matrix.android.sdk.internal.session.room.alias.GetRoomIdByAliasTask
import org.matrix.android.sdk.internal.session.room.directory.GetPublicRoomTask
import org.matrix.android.sdk.internal.session.room.directory.GetRoomDirectoryVisibilityTask
import org.matrix.android.sdk.internal.task.Task
import javax.inject.Inject
sealed class PeekResult {
data class Success(
val roomId: String,
val alias: String?,
val name: String?,
val topic: String?,
val avatarUrl: String?,
val numJoinedMembers: Int?,
val viaServers: List<String>
) : PeekResult()
data class PeekingNotAllowed(
val roomId: String,
val alias: String?,
val viaServers: List<String>
) : PeekResult()
object UnknownAlias : PeekResult()
}
internal interface PeekRoomTask : Task<PeekRoomTask.Params, PeekResult> {
data class Params(
val roomIdOrAlias: String
@ -66,11 +47,10 @@ internal class DefaultPeekRoomTask @Inject constructor(
) : PeekRoomTask {
override suspend fun execute(params: PeekRoomTask.Params): PeekResult {
val roomId: String?
val roomId: String
val serverList: List<String>
val isAlias: Boolean
if (MatrixPatterns.isRoomAlias(params.roomIdOrAlias)) {
isAlias = true
val isAlias = MatrixPatterns.isRoomAlias(params.roomIdOrAlias)
if (isAlias) {
// get alias description
val aliasDescription = getRoomIdByAliasTask
.execute(GetRoomIdByAliasTask.Params(params.roomIdOrAlias, true))
@ -80,7 +60,6 @@ internal class DefaultPeekRoomTask @Inject constructor(
roomId = aliasDescription.roomId
serverList = aliasDescription.servers
} else {
isAlias = false
roomId = params.roomIdOrAlias
serverList = emptyList()
}
@ -121,34 +100,30 @@ internal class DefaultPeekRoomTask @Inject constructor(
// mm... try to peek state ? maybe the room is not public but yet allow guest to get events?
// this could be slow
try {
val stateEvents = resolveRoomStateTask
.execute(ResolveRoomStateTask.Params(roomId))
val name = stateEvents.lastOrNull {
it.type == EventType.STATE_ROOM_NAME
&& it.stateKey == ""
}?.let { it.content?.toModel<RoomNameContent>()?.name }
val stateEvents = resolveRoomStateTask.execute(ResolveRoomStateTask.Params(roomId))
val name = stateEvents
.lastOrNull { it.type == EventType.STATE_ROOM_NAME && it.stateKey == "" }
?.let { it.content?.toModel<RoomNameContent>()?.name }
val topic = stateEvents.lastOrNull {
it.type == EventType.STATE_ROOM_TOPIC
&& it.stateKey == ""
}?.let { it.content?.toModel<RoomTopicContent>()?.topic }
val topic = stateEvents
.lastOrNull { it.type == EventType.STATE_ROOM_TOPIC && it.stateKey == "" }
?.let { it.content?.toModel<RoomTopicContent>()?.topic }
val avatarUrl = stateEvents.lastOrNull {
it.type == EventType.STATE_ROOM_AVATAR
}?.let { it.content?.toModel<RoomAvatarContent>()?.avatarUrl }
val avatarUrl = stateEvents
.lastOrNull { it.type == EventType.STATE_ROOM_AVATAR }
?.let { it.content?.toModel<RoomAvatarContent>()?.avatarUrl }
val alias = stateEvents.lastOrNull {
it.type == EventType.STATE_ROOM_CANONICAL_ALIAS
}?.let {
val alias = stateEvents
.lastOrNull { it.type == EventType.STATE_ROOM_CANONICAL_ALIAS }
?.let {
it.content?.toModel<RoomCanonicalAliasContent>()?.canonicalAlias
?: it.content?.toModel<RoomCanonicalAliasContent>()?.alternativeAliases?.firstOrNull()
}
// not sure if it's the right way to do that :/
val memberCount = stateEvents.filter {
it.type == EventType.STATE_ROOM_MEMBER
&& it.stateKey?.isNotEmpty() == true
}.distinctBy { it.stateKey }
val memberCount = stateEvents
.filter { it.type == EventType.STATE_ROOM_MEMBER && it.stateKey?.isNotEmpty() == true }
.distinctBy { it.stateKey }
.count()
return PeekResult.Success(

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2020 New Vector Ltd
* Copyright 2020 The Matrix.org Foundation C.I.C.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.

View file

@ -81,7 +81,8 @@
android:resource="@xml/shortcuts" />
</activity-alias>
<activity android:name=".features.home.HomeActivity"
<activity
android:name=".features.home.HomeActivity"
android:launchMode="singleTask" />
<activity
android:name=".features.login.LoginActivity"
@ -190,19 +191,24 @@
<activity
android:name=".features.signout.soft.SoftLogoutActivity"
android:windowSoftInputMode="adjustResize" />
<activity android:name=".features.permalink.PermalinkHandlerActivity" android:launchMode="singleTask">
<activity
android:name=".features.permalink.PermalinkHandlerActivity"
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" />
<data android:scheme="https" />
<data android:host="matrix.to" />
<data android:scheme="element"
android:host="user"/>
<data android:scheme="element"
android:host="room"/>
<data
android:host="user"
android:scheme="element" />
<data
android:host="room"
android:scheme="element" />
</intent-filter>
</activity>

View file

@ -162,29 +162,27 @@ class HomeActivity : VectorBaseActivity(), ToolbarConfigurable, UnknownDeviceDet
private fun handleIntent(intent: Intent?) {
intent?.dataString?.let { deepLink ->
val resolvedLink = if (deepLink.startsWith(PermalinkService.MATRIX_TO_URL_BASE)) {
deepLink
} else if (deepLink.startsWith(PermalinkService.MATRIX_TO_CUSTOM_SCHEME_URL_BASE)) {
// This is a bit hugly, but for now just convert to matrix.to link for compatibility
val service = activeSessionHolder.getSafeActiveSession()?.permalinkService()
val roomLinkPrefix = "${PermalinkService.MATRIX_TO_CUSTOM_SCHEME_URL_BASE}room/"
val userPrefix = "${PermalinkService.MATRIX_TO_CUSTOM_SCHEME_URL_BASE}user/"
val resolvedLink = when {
deepLink.startsWith(PermalinkService.MATRIX_TO_URL_BASE) -> deepLink
deepLink.startsWith(PermalinkService.MATRIX_TO_CUSTOM_SCHEME_URL_BASE) -> {
// This is a bit ugly, but for now just convert to matrix.to link for compatibility
when {
deepLink.startsWith(userPrefix) -> {
val userId = deepLink.substring(userPrefix.length)
service?.createPermalink(userId)
deepLink.startsWith(USER_LINK_PREFIX) -> deepLink.substring(USER_LINK_PREFIX.length)
deepLink.startsWith(ROOM_LINK_PREFIX) -> deepLink.substring(ROOM_LINK_PREFIX.length)
else -> null
}?.let {
activeSessionHolder.getSafeActiveSession()?.permalinkService()?.createPermalink(it)
}
deepLink.startsWith(roomLinkPrefix) -> {
val param = deepLink.substring(roomLinkPrefix.length)
service?.createRoomPermalink(param)
}
else -> null
}
} else null
permalinkHandler.launch(this, resolvedLink,
permalinkHandler.launch(
context = this,
deepLink = resolvedLink,
navigationInterceptor = this,
buildTask = true)
buildTask = true
)
// .delay(500, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe { isHandled ->
@ -408,5 +406,8 @@ class HomeActivity : VectorBaseActivity(), ToolbarConfigurable, UnknownDeviceDet
putExtra(MvRx.KEY_ARG, args)
}
}
private const val ROOM_LINK_PREFIX = "${PermalinkService.MATRIX_TO_CUSTOM_SCHEME_URL_BASE}room/"
private const val USER_LINK_PREFIX = "${PermalinkService.MATRIX_TO_CUSTOM_SCHEME_URL_BASE}user/"
}
}

View file

@ -0,0 +1,23 @@
/*
* Copyright (c) 2020 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 im.vector.app.features.roomdirectory.roompreview
enum class PeekingState {
FOUND,
NOT_FOUND,
NO_ACCESS
}

View file

@ -36,8 +36,8 @@ import org.matrix.android.sdk.api.query.QueryStringValue
import org.matrix.android.sdk.api.session.Session
import org.matrix.android.sdk.api.session.room.members.ChangeMembershipState
import org.matrix.android.sdk.api.session.room.model.Membership
import org.matrix.android.sdk.api.session.room.peeking.PeekResult
import org.matrix.android.sdk.api.session.room.roomSummaryQueryParams
import org.matrix.android.sdk.internal.session.room.peeking.PeekResult
import org.matrix.android.sdk.internal.util.awaitCallback
import org.matrix.android.sdk.rx.rx
import timber.log.Timber
@ -66,6 +66,11 @@ class RoomPreviewViewModel @AssistedInject constructor(@Assisted private val ini
observeMembershipChanges()
if (initialState.shouldPeekFromServer) {
peekRoomFromServer()
}
}
private fun peekRoomFromServer() {
setState {
copy(peekingState = Loading())
}
@ -110,7 +115,6 @@ class RoomPreviewViewModel @AssistedInject constructor(@Assisted private val ini
}
}
}
}
private fun observeRoomSummary() {
val queryParams = roomSummaryQueryParams {

View file

@ -22,15 +22,7 @@ import com.airbnb.mvrx.Uninitialized
import im.vector.app.features.roomdirectory.JoinState
import org.matrix.android.sdk.api.util.MatrixItem
enum class PeekingState {
UNKNOWN,
FOUND,
NOT_FOUND,
NO_ACCESS
}
data class RoomPreviewViewState(
val peekingState: Async<PeekingState> = Uninitialized,
// The room id
val roomId: String = "",