mirror of
https://github.com/SchildiChat/SchildiChat-android.git
synced 2025-03-20 21:28:45 +03:00
Merge pull request #3986 from vector-im/feature/bca/room_summary_api
Better room preview, use room Summary API if available
This commit is contained in:
commit
d6b261ce4c
6 changed files with 190 additions and 1 deletions
changelog.d
matrix-sdk-android/src/main/java/org/matrix/android/sdk
api/session/room/model
internal/session/room
1
changelog.d/3946.bugfix
Normal file
1
changelog.d/3946.bugfix
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Restricted Room previews aren't working
|
|
@ -0,0 +1,111 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2021 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.model
|
||||||
|
|
||||||
|
import com.squareup.moshi.Json
|
||||||
|
import com.squareup.moshi.JsonClass
|
||||||
|
|
||||||
|
/**
|
||||||
|
* These are the same fields as those returned by /publicRooms, with a few additions: room_type, membership and is_encrypted.
|
||||||
|
*/
|
||||||
|
@JsonClass(generateAdapter = true)
|
||||||
|
data class RoomStrippedState(
|
||||||
|
/**
|
||||||
|
* Aliases of the room. May be empty.
|
||||||
|
*/
|
||||||
|
@Json(name = "aliases")
|
||||||
|
val aliases: List<String>? = null,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The canonical alias of the room, if any.
|
||||||
|
*/
|
||||||
|
@Json(name = "canonical_alias")
|
||||||
|
val canonicalAlias: String? = null,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The name of the room, if any.
|
||||||
|
*/
|
||||||
|
@Json(name = "name")
|
||||||
|
val name: String? = null,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Required. The number of members joined to the room.
|
||||||
|
*/
|
||||||
|
@Json(name = "num_joined_members")
|
||||||
|
val numJoinedMembers: Int = 0,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Required. The ID of the room.
|
||||||
|
*/
|
||||||
|
@Json(name = "room_id")
|
||||||
|
val roomId: String,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The topic of the room, if any.
|
||||||
|
*/
|
||||||
|
@Json(name = "topic")
|
||||||
|
val topic: String? = null,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Required. Whether the room may be viewed by guest users without joining.
|
||||||
|
*/
|
||||||
|
@Json(name = "world_readable")
|
||||||
|
val worldReadable: Boolean = false,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Required. Whether guest users may join the room and participate in it. If they can,
|
||||||
|
* they will be subject to ordinary power level rules like any other user.
|
||||||
|
*/
|
||||||
|
@Json(name = "guest_can_join")
|
||||||
|
val guestCanJoin: Boolean = false,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The URL for the room's avatar, if one is set.
|
||||||
|
*/
|
||||||
|
@Json(name = "avatar_url")
|
||||||
|
val avatarUrl: String? = null,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Undocumented item
|
||||||
|
*/
|
||||||
|
@Json(name = "m.federate")
|
||||||
|
val isFederated: Boolean = false,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Optional. If the room is encrypted. This is already accessible as stripped state.
|
||||||
|
*/
|
||||||
|
@Json(name = "is_encrypted")
|
||||||
|
val isEncrypted: Boolean?,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Optional. Type of the room, if any, i.e. m.space
|
||||||
|
*/
|
||||||
|
@Json(name = "room_type")
|
||||||
|
val roomType: String?,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The current membership of this user in the room. Usually leave if the room is fetched over federation.
|
||||||
|
*/
|
||||||
|
@Json(name = "membership")
|
||||||
|
val membership: String?
|
||||||
|
) {
|
||||||
|
/**
|
||||||
|
* Return the canonical alias, or the first alias from the list of aliases, or null
|
||||||
|
*/
|
||||||
|
fun getPrimaryAlias(): String? {
|
||||||
|
return canonicalAlias ?: aliases?.firstOrNull()
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,42 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2021 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.internal.session.room
|
||||||
|
|
||||||
|
import org.matrix.android.sdk.api.session.room.model.RoomStrippedState
|
||||||
|
import org.matrix.android.sdk.internal.network.GlobalErrorReceiver
|
||||||
|
import org.matrix.android.sdk.internal.network.executeRequest
|
||||||
|
import org.matrix.android.sdk.internal.task.Task
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
internal interface GetRoomSummaryTask : Task<GetRoomSummaryTask.Params, RoomStrippedState> {
|
||||||
|
data class Params(
|
||||||
|
val roomId: String,
|
||||||
|
val viaServers: List<String>?
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
internal class DefaultGetRoomSummaryTask @Inject constructor(
|
||||||
|
private val roomAPI: RoomAPI,
|
||||||
|
private val globalErrorReceiver: GlobalErrorReceiver
|
||||||
|
) : GetRoomSummaryTask {
|
||||||
|
|
||||||
|
override suspend fun execute(params: GetRoomSummaryTask.Params): RoomStrippedState {
|
||||||
|
return executeRequest(globalErrorReceiver) {
|
||||||
|
roomAPI.getRoomSummary(params.roomId, params.viaServers)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -19,6 +19,7 @@ package org.matrix.android.sdk.internal.session.room
|
||||||
import org.matrix.android.sdk.api.session.events.model.Content
|
import org.matrix.android.sdk.api.session.events.model.Content
|
||||||
import org.matrix.android.sdk.api.session.events.model.Event
|
import org.matrix.android.sdk.api.session.events.model.Event
|
||||||
import org.matrix.android.sdk.api.session.room.model.Membership
|
import org.matrix.android.sdk.api.session.room.model.Membership
|
||||||
|
import org.matrix.android.sdk.api.session.room.model.RoomStrippedState
|
||||||
import org.matrix.android.sdk.api.session.room.model.roomdirectory.PublicRoomsParams
|
import org.matrix.android.sdk.api.session.room.model.roomdirectory.PublicRoomsParams
|
||||||
import org.matrix.android.sdk.api.session.room.model.roomdirectory.PublicRoomsResponse
|
import org.matrix.android.sdk.api.session.room.model.roomdirectory.PublicRoomsResponse
|
||||||
import org.matrix.android.sdk.api.util.JsonDict
|
import org.matrix.android.sdk.api.util.JsonDict
|
||||||
|
@ -254,7 +255,7 @@ internal interface RoomAPI {
|
||||||
@POST(NetworkConstants.URI_API_PREFIX_PATH_R0 + "join/{roomIdOrAlias}")
|
@POST(NetworkConstants.URI_API_PREFIX_PATH_R0 + "join/{roomIdOrAlias}")
|
||||||
suspend fun join(@Path("roomIdOrAlias") roomIdOrAlias: String,
|
suspend fun join(@Path("roomIdOrAlias") roomIdOrAlias: String,
|
||||||
@Query("server_name") viaServers: List<String>,
|
@Query("server_name") viaServers: List<String>,
|
||||||
@Body params: JsonDict): JoinRoomResponse
|
@Body params: JsonDict): JoinRoomResponse
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Leave the given room.
|
* Leave the given room.
|
||||||
|
@ -381,4 +382,14 @@ internal interface RoomAPI {
|
||||||
@POST(NetworkConstants.URI_API_PREFIX_PATH_R0 + "rooms/{roomId}/upgrade")
|
@POST(NetworkConstants.URI_API_PREFIX_PATH_R0 + "rooms/{roomId}/upgrade")
|
||||||
suspend fun upgradeRoom(@Path("roomId") roomId: String,
|
suspend fun upgradeRoom(@Path("roomId") roomId: String,
|
||||||
@Body body: RoomUpgradeBody): RoomUpgradeResponse
|
@Body body: RoomUpgradeBody): RoomUpgradeResponse
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The API returns the summary of the specified room, if the room could be found and the client should be able to view
|
||||||
|
* its contents according to the join_rules, history visibility, space membership and similar rules outlined in MSC3173
|
||||||
|
* as well as if the user is already a member of that room.
|
||||||
|
* https://github.com/deepbluev7/matrix-doc/blob/room-summaries/proposals/3266-room-summary.md
|
||||||
|
*/
|
||||||
|
@GET(NetworkConstants.URI_API_PREFIX_PATH_UNSTABLE + "im.nheko.summary/rooms/{roomIdOrAlias}/summary")
|
||||||
|
suspend fun getRoomSummary(@Path("roomIdOrAlias") roomidOrAlias: String,
|
||||||
|
@Query("via") viaServers: List<String>?): RoomStrippedState
|
||||||
}
|
}
|
||||||
|
|
|
@ -253,4 +253,7 @@ internal abstract class RoomModule {
|
||||||
|
|
||||||
@Binds
|
@Binds
|
||||||
abstract fun bindSign3pidInvitationTask(task: DefaultSign3pidInvitationTask): Sign3pidInvitationTask
|
abstract fun bindSign3pidInvitationTask(task: DefaultSign3pidInvitationTask): Sign3pidInvitationTask
|
||||||
|
|
||||||
|
@Binds
|
||||||
|
abstract fun bindGetRoomSummaryTask(task: DefaultGetRoomSummaryTask): GetRoomSummaryTask
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,6 +33,7 @@ import org.matrix.android.sdk.api.session.room.model.roomdirectory.PublicRoomsFi
|
||||||
import org.matrix.android.sdk.api.session.room.model.roomdirectory.PublicRoomsParams
|
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.api.session.room.peeking.PeekResult
|
||||||
import org.matrix.android.sdk.api.util.MatrixItem
|
import org.matrix.android.sdk.api.util.MatrixItem
|
||||||
|
import org.matrix.android.sdk.internal.session.room.GetRoomSummaryTask
|
||||||
import org.matrix.android.sdk.internal.session.room.alias.GetRoomIdByAliasTask
|
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.GetPublicRoomTask
|
||||||
import org.matrix.android.sdk.internal.session.room.directory.GetRoomDirectoryVisibilityTask
|
import org.matrix.android.sdk.internal.session.room.directory.GetRoomDirectoryVisibilityTask
|
||||||
|
@ -49,6 +50,7 @@ internal class DefaultPeekRoomTask @Inject constructor(
|
||||||
private val getRoomIdByAliasTask: GetRoomIdByAliasTask,
|
private val getRoomIdByAliasTask: GetRoomIdByAliasTask,
|
||||||
private val getRoomDirectoryVisibilityTask: GetRoomDirectoryVisibilityTask,
|
private val getRoomDirectoryVisibilityTask: GetRoomDirectoryVisibilityTask,
|
||||||
private val getPublicRoomTask: GetPublicRoomTask,
|
private val getPublicRoomTask: GetPublicRoomTask,
|
||||||
|
private val getRoomSummaryTask: GetRoomSummaryTask,
|
||||||
private val resolveRoomStateTask: ResolveRoomStateTask
|
private val resolveRoomStateTask: ResolveRoomStateTask
|
||||||
) : PeekRoomTask {
|
) : PeekRoomTask {
|
||||||
|
|
||||||
|
@ -70,6 +72,25 @@ internal class DefaultPeekRoomTask @Inject constructor(
|
||||||
serverList = emptyList()
|
serverList = emptyList()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If the room summary API is available on the Home Server we should try it first
|
||||||
|
val strippedState = tryOrNull("Failed to get room stripped state roomId:$roomId") {
|
||||||
|
getRoomSummaryTask.execute(GetRoomSummaryTask.Params(roomId, serverList))
|
||||||
|
}
|
||||||
|
if (strippedState != null) {
|
||||||
|
return PeekResult.Success(
|
||||||
|
roomId = strippedState.roomId,
|
||||||
|
alias = strippedState.getPrimaryAlias() ?: params.roomIdOrAlias.takeIf { isAlias },
|
||||||
|
avatarUrl = strippedState.avatarUrl,
|
||||||
|
name = strippedState.name,
|
||||||
|
topic = strippedState.topic,
|
||||||
|
numJoinedMembers = strippedState.numJoinedMembers,
|
||||||
|
viaServers = serverList,
|
||||||
|
roomType = strippedState.roomType,
|
||||||
|
someMembers = null,
|
||||||
|
isPublic = strippedState.worldReadable
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
// Is it a public room?
|
// Is it a public room?
|
||||||
val visibilityRes = tryOrNull("## PEEK: failed to get visibility") {
|
val visibilityRes = tryOrNull("## PEEK: failed to get visibility") {
|
||||||
getRoomDirectoryVisibilityTask.execute(GetRoomDirectoryVisibilityTask.Params(roomId))
|
getRoomDirectoryVisibilityTask.execute(GetRoomDirectoryVisibilityTask.Params(roomId))
|
||||||
|
|
Loading…
Add table
Reference in a new issue