Merge pull request #5476 from element-hq/feature/fga/space_room_display_name

Space : makes sure to use SpaceRoom.displayName from sdk
This commit is contained in:
ganfra 2025-10-08 10:35:41 +02:00 committed by GitHub
commit 8e88c20a1d
29 changed files with 46 additions and 90 deletions

View file

@ -39,7 +39,7 @@ fun HomeSpacesView(
is CurrentSpace.Space -> item { is CurrentSpace.Space -> item {
SpaceHeaderView( SpaceHeaderView(
avatarData = space.spaceRoom.getAvatarData(AvatarSize.SpaceHeader), avatarData = space.spaceRoom.getAvatarData(AvatarSize.SpaceHeader),
name = space.spaceRoom.name, name = space.spaceRoom.displayName,
topic = space.spaceRoom.topic, topic = space.spaceRoom.topic,
visibility = space.spaceRoom.visibility, visibility = space.spaceRoom.visibility,
heroes = space.spaceRoom.heroes.toImmutableList(), heroes = space.spaceRoom.heroes.toImmutableList(),

View file

@ -30,7 +30,6 @@ class SpaceRoomProvider : PreviewParameterProvider<SpaceRoom> {
roomId = RoomId("!spaceId1:example.com"), roomId = RoomId("!spaceId1:example.com"),
), ),
aSpaceRoom( aSpaceRoom(
rawName = null,
numJoinedMembers = 5, numJoinedMembers = 5,
childrenCount = 10, childrenCount = 10,
worldReadable = true, worldReadable = true,
@ -38,14 +37,5 @@ class SpaceRoomProvider : PreviewParameterProvider<SpaceRoom> {
roomId = RoomId("!spaceId2:example.com"), roomId = RoomId("!spaceId2:example.com"),
state = CurrentUserMembership.INVITED, state = CurrentUserMembership.INVITED,
), ),
aSpaceRoom(
rawName = null,
numJoinedMembers = 5,
childrenCount = 10,
worldReadable = true,
avatarUrl = "anUrl",
roomId = RoomId("!spaceId3:example.com"),
state = CurrentUserMembership.INVITED,
),
) )
} }

View file

@ -41,7 +41,7 @@ fun RoomInfo.toInviteData(): InviteData {
fun SpaceRoom.toInviteData(): InviteData { fun SpaceRoom.toInviteData(): InviteData {
return InviteData( return InviteData(
roomId = roomId, roomId = roomId,
roomName = name ?: roomId.value, roomName = displayName,
isDm = false, isDm = false,
) )
} }

View file

@ -277,7 +277,7 @@ private fun RoomPreviewInfo.toContentState(membershipDetails: RoomMembershipDeta
private fun SpaceRoom.toContentState(): ContentState { private fun SpaceRoom.toContentState(): ContentState {
return ContentState.Loaded( return ContentState.Loaded(
roomId = roomId, roomId = roomId,
name = name, name = displayName,
topic = topic, topic = topic,
alias = canonicalAlias, alias = canonicalAlias,
numberOfMembers = numJoinedMembers.toLong(), numberOfMembers = numJoinedMembers.toLong(),

View file

@ -129,7 +129,7 @@ class LeaveSpacePresenter(
} }
return LeaveSpaceState( return LeaveSpaceState(
spaceName = leaveSpaceRooms.dataOrNull()?.current?.spaceRoom?.name, spaceName = leaveSpaceRooms.dataOrNull()?.current?.spaceRoom?.displayName,
isLastAdmin = leaveSpaceRooms.dataOrNull()?.current?.isLastAdmin == true, isLastAdmin = leaveSpaceRooms.dataOrNull()?.current?.isLastAdmin == true,
selectableSpaceRooms = selectableSpaceRooms, selectableSpaceRooms = selectableSpaceRooms,
leaveSpaceAction = leaveSpaceAction.value, leaveSpaceAction = leaveSpaceAction.value,

View file

@ -30,7 +30,7 @@ class LeaveSpaceStateProvider : PreviewParameterProvider<LeaveSpaceState> {
persistentListOf( persistentListOf(
aSelectableSpaceRoom( aSelectableSpaceRoom(
spaceRoom = aSpaceRoom( spaceRoom = aSpaceRoom(
rawName = "A long space name that should be truncated", displayName = "A long space name that should be truncated",
worldReadable = true, worldReadable = true,
), ),
isLastAdmin = true, isLastAdmin = true,

View file

@ -276,13 +276,7 @@ private fun SpaceItem(
Text( Text(
modifier = Modifier modifier = Modifier
.padding(end = 16.dp), .padding(end = 16.dp),
text = room.name ?: stringResource( text = room.displayName,
if (room.isSpace) {
CommonStrings.common_no_space_name
} else {
CommonStrings.common_no_room_name
},
),
color = ElementTheme.colors.textPrimary, color = ElementTheme.colors.textPrimary,
style = ElementTheme.typography.fontBodyLgMedium, style = ElementTheme.typography.fontBodyLgMedium,
maxLines = 1, maxLines = 1,

View file

@ -37,7 +37,6 @@ open class SpaceStateProvider : PreviewParameterProvider<SpaceState> {
), ),
aSpaceState( aSpaceState(
parentSpace = aSpaceRoom( parentSpace = aSpaceRoom(
rawName = null,
numJoinedMembers = 5, numJoinedMembers = 5,
childrenCount = 10, childrenCount = 10,
worldReadable = true, worldReadable = true,

View file

@ -132,7 +132,7 @@ private fun SpaceViewContent(
item { item {
SpaceHeaderView( SpaceHeaderView(
avatarData = currentSpace.getAvatarData(AvatarSize.SpaceHeader), avatarData = currentSpace.getAvatarData(AvatarSize.SpaceHeader),
name = currentSpace.name, name = currentSpace.displayName,
topic = currentSpace.topic, topic = currentSpace.topic,
visibility = currentSpace.visibility, visibility = currentSpace.visibility,
heroes = currentSpace.heroes.toImmutableList(), heroes = currentSpace.heroes.toImmutableList(),
@ -213,7 +213,7 @@ private fun SpaceViewTopBar(
title = { title = {
if (currentSpace != null) { if (currentSpace != null) {
SpaceAvatarAndNameRow( SpaceAvatarAndNameRow(
name = currentSpace.name, name = currentSpace.displayName,
avatarData = currentSpace.getAvatarData(AvatarSize.TimelineRoom), avatarData = currentSpace.getAvatarData(AvatarSize.TimelineRoom),
) )
} }

View file

@ -29,7 +29,7 @@ import org.junit.Test
class LeaveSpacePresenterTest { class LeaveSpacePresenterTest {
private val aSpace = aSpaceRoom( private val aSpace = aSpaceRoom(
roomId = A_SPACE_ID, roomId = A_SPACE_ID,
rawName = A_SPACE_NAME, displayName = A_SPACE_NAME,
) )
@Test @Test
@ -198,7 +198,7 @@ class LeaveSpacePresenterTest {
private fun aLeaveSpaceRoom( private fun aLeaveSpaceRoom(
spaceRoom: SpaceRoom = aSpaceRoom( spaceRoom: SpaceRoom = aSpaceRoom(
roomId = A_SPACE_ID, roomId = A_SPACE_ID,
rawName = A_SPACE_NAME, displayName = A_SPACE_NAME,
), ),
isLastAdmin: Boolean = false, isLastAdmin: Boolean = false,
) = LeaveSpaceRoom( ) = LeaveSpaceRoom(

View file

@ -52,7 +52,7 @@ class SpaceViewTest {
@Test @Test
fun `clicking on a room name invokes the expected callback`() { fun `clicking on a room name invokes the expected callback`() {
val aSpaceRoom = aSpaceRoom(roomId = A_ROOM_ID, rawName = A_ROOM_NAME) val aSpaceRoom = aSpaceRoom(roomId = A_ROOM_ID, displayName = A_ROOM_NAME)
val eventsRecorder = EventsRecorder<SpaceEvents>(expectEvents = false) val eventsRecorder = EventsRecorder<SpaceEvents>(expectEvents = false)
ensureCalledOnceWithParam(aSpaceRoom) { ensureCalledOnceWithParam(aSpaceRoom) {
rule.setSpaceView( rule.setSpaceView(

View file

@ -167,7 +167,7 @@ test_detekt_test = { module = "io.gitlab.arturbosch.detekt:detekt-test", version
# https://github.com/matrix-org/matrix-rust-components-kotlin/commits/main/sdk/sdk-android/src/main/kotlin/org/matrix/rustcomponents/sdk/matrix_sdk_ffi.kt # https://github.com/matrix-org/matrix-rust-components-kotlin/commits/main/sdk/sdk-android/src/main/kotlin/org/matrix/rustcomponents/sdk/matrix_sdk_ffi.kt
# All new features should not be implemented in the pull request that upgrades the version, developers should # All new features should not be implemented in the pull request that upgrades the version, developers should
# only fix API breaks and may add some TODOs. # only fix API breaks and may add some TODOs.
matrix_sdk = "org.matrix.rustcomponents:sdk-android:25.10.2" matrix_sdk = "org.matrix.rustcomponents:sdk-android:25.10.7"
# Others # Others
coil = { module = "io.coil-kt.coil3:coil", version.ref = "coil" } coil = { module = "io.coil-kt.coil3:coil", version.ref = "coil" }

View file

@ -16,6 +16,7 @@ import io.element.android.libraries.matrix.api.user.MatrixUser
data class SpaceRoom( data class SpaceRoom(
val rawName: String?, val rawName: String?,
val displayName: String,
val avatarUrl: String?, val avatarUrl: String?,
val canonicalAlias: RoomAlias?, val canonicalAlias: RoomAlias?,
val childrenCount: Int, val childrenCount: Int,
@ -36,16 +37,5 @@ data class SpaceRoom(
) { ) {
val isSpace = roomType == RoomType.Space val isSpace = roomType == RoomType.Space
/**
* Temporary logic to compute a name for direct rooms with no name.
* This will be replaced by sdk logic in the future.
*/
val name = if (rawName == null && isDirect == true && heroes.size == 1) {
val dmRecipient = heroes.first()
dmRecipient.displayName
} else {
rawName
}
val visibility = SpaceRoomVisibility.fromJoinRule(joinRule) val visibility = SpaceRoomVisibility.fromJoinRule(joinRule)
} }

View file

@ -24,7 +24,8 @@ class SpaceRoomMapper {
guestCanJoin = spaceRoom.guestCanJoin, guestCanJoin = spaceRoom.guestCanJoin,
heroes = spaceRoom.heroes.orEmpty().map { it.map() }, heroes = spaceRoom.heroes.orEmpty().map { it.map() },
joinRule = spaceRoom.joinRule?.map(), joinRule = spaceRoom.joinRule?.map(),
rawName = spaceRoom.name, rawName = spaceRoom.rawName,
displayName = spaceRoom.displayName,
numJoinedMembers = spaceRoom.numJoinedMembers.toInt(), numJoinedMembers = spaceRoom.numJoinedMembers.toInt(),
roomId = RoomId(spaceRoom.roomId), roomId = RoomId(spaceRoom.roomId),
roomType = spaceRoom.roomType.map(), roomType = spaceRoom.roomType.map(),

View file

@ -19,7 +19,8 @@ fun aRustSpaceRoom(
roomId: RoomId = A_ROOM_ID, roomId: RoomId = A_ROOM_ID,
isDirect: Boolean = false, isDirect: Boolean = false,
canonicalAlias: String? = null, canonicalAlias: String? = null,
name: String? = null, rawName: String? = null,
displayName: String = "",
topic: String? = null, topic: String? = null,
avatarUrl: String? = null, avatarUrl: String? = null,
roomType: RoomType = RoomType.Space, roomType: RoomType = RoomType.Space,
@ -34,7 +35,8 @@ fun aRustSpaceRoom(
roomId = roomId.value, roomId = roomId.value,
isDirect = isDirect, isDirect = isDirect,
canonicalAlias = canonicalAlias, canonicalAlias = canonicalAlias,
name = name, rawName = rawName,
displayName = displayName,
topic = topic, topic = topic,
avatarUrl = avatarUrl, avatarUrl = avatarUrl,
roomType = roomType, roomType = roomType,

View file

@ -29,7 +29,6 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.pluralStringResource import androidx.compose.ui.res.pluralStringResource
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontStyle
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
@ -76,8 +75,7 @@ fun SpaceRoomItemView(
trailingAction = trailingAction, trailingAction = trailingAction,
) { ) {
NameAndIndicatorRow( NameAndIndicatorRow(
isSpace = spaceRoom.isSpace, name = spaceRoom.displayName,
name = spaceRoom.name,
showIndicator = showUnreadIndicator showIndicator = showUnreadIndicator
) )
Spacer(modifier = Modifier.height(1.dp)) Spacer(modifier = Modifier.height(1.dp))
@ -92,7 +90,6 @@ fun SpaceRoomItemView(
modifier = Modifier.weight(1f), modifier = Modifier.weight(1f),
style = ElementTheme.typography.fontBodyMdRegular, style = ElementTheme.typography.fontBodyMdRegular,
text = info, text = info,
fontStyle = FontStyle.Italic.takeIf { spaceRoom.name == null },
color = ElementTheme.colors.textSecondary, color = ElementTheme.colors.textSecondary,
maxLines = 1, maxLines = 1,
overflow = TextOverflow.Ellipsis overflow = TextOverflow.Ellipsis
@ -138,8 +135,7 @@ private fun SubtitleRow(
@Composable @Composable
private fun NameAndIndicatorRow( private fun NameAndIndicatorRow(
isSpace: Boolean, name: String,
name: String?,
showIndicator: Boolean, showIndicator: Boolean,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
) { ) {
@ -151,8 +147,7 @@ private fun NameAndIndicatorRow(
Text( Text(
modifier = Modifier.weight(1f), modifier = Modifier.weight(1f),
style = ElementTheme.typography.fontBodyLgMedium, style = ElementTheme.typography.fontBodyLgMedium,
text = name ?: stringResource(id = if (isSpace) CommonStrings.common_no_space_name else CommonStrings.common_no_room_name), text = name,
fontStyle = FontStyle.Italic.takeIf { name == null },
color = ElementTheme.colors.textPrimary, color = ElementTheme.colors.textPrimary,
maxLines = 1, maxLines = 1,
overflow = TextOverflow.Ellipsis overflow = TextOverflow.Ellipsis

View file

@ -18,17 +18,16 @@ class SpaceRoomProvider : PreviewParameterProvider<SpaceRoom> {
override val values: Sequence<SpaceRoom> = sequenceOf( override val values: Sequence<SpaceRoom> = sequenceOf(
aSpaceRoom( aSpaceRoom(
roomType = RoomType.Room, roomType = RoomType.Room,
rawName = "Room name with topic", displayName = "Room name with topic",
topic = "Room topic that is quite long and might be truncated" topic = "Room topic that is quite long and might be truncated"
), ),
aSpaceRoom( aSpaceRoom(
roomType = RoomType.Room, roomType = RoomType.Room,
rawName = "Room name no topic", displayName = "Room name no topic",
state = CurrentUserMembership.LEFT, state = CurrentUserMembership.LEFT,
), ),
aSpaceRoom( aSpaceRoom(
roomType = RoomType.Room, roomType = RoomType.Room,
rawName = null,
isDirect = true, isDirect = true,
heroes = listOf(aMatrixUser(displayName = "Alice")), heroes = listOf(aMatrixUser(displayName = "Alice")),
state = CurrentUserMembership.JOINED, state = CurrentUserMembership.JOINED,
@ -36,13 +35,13 @@ class SpaceRoomProvider : PreviewParameterProvider<SpaceRoom> {
), ),
aSpaceRoom( aSpaceRoom(
roomType = RoomType.Room, roomType = RoomType.Room,
rawName = "Room name with topic", displayName = "Room name with topic",
topic = "Room topic that is quite long and might be truncated", topic = "Room topic that is quite long and might be truncated",
state = CurrentUserMembership.INVITED, state = CurrentUserMembership.INVITED,
), ),
aSpaceRoom( aSpaceRoom(
roomType = RoomType.Room, roomType = RoomType.Room,
rawName = "Room name no topic", displayName = "Room name no topic",
state = CurrentUserMembership.INVITED, state = CurrentUserMembership.INVITED,
), ),
aSpaceRoom( aSpaceRoom(
@ -60,7 +59,6 @@ class SpaceRoomProvider : PreviewParameterProvider<SpaceRoom> {
state = CurrentUserMembership.LEFT, state = CurrentUserMembership.LEFT,
), ),
aSpaceRoom( aSpaceRoom(
rawName = null,
numJoinedMembers = 5, numJoinedMembers = 5,
childrenCount = 10, childrenCount = 10,
worldReadable = true, worldReadable = true,
@ -68,14 +66,5 @@ class SpaceRoomProvider : PreviewParameterProvider<SpaceRoom> {
roomId = RoomId("!spaceId2:example.com"), roomId = RoomId("!spaceId2:example.com"),
state = CurrentUserMembership.INVITED, state = CurrentUserMembership.INVITED,
), ),
aSpaceRoom(
rawName = null,
numJoinedMembers = 5,
childrenCount = 10,
worldReadable = true,
avatarUrl = "anUrl",
roomId = RoomId("!spaceId3:example.com"),
state = CurrentUserMembership.INVITED,
),
) )
} }

View file

@ -20,7 +20,7 @@ import io.element.android.libraries.ui.strings.CommonStrings
fun SpaceRoom.getAvatarData(size: AvatarSize) = AvatarData( fun SpaceRoom.getAvatarData(size: AvatarSize) = AvatarData(
id = roomId.value, id = roomId.value,
name = name, name = displayName,
url = avatarUrl, url = avatarUrl,
size = size, size = size,
) )

View file

@ -16,7 +16,8 @@ import io.element.android.libraries.matrix.api.spaces.SpaceRoom
import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.matrix.api.user.MatrixUser
fun aSpaceRoom( fun aSpaceRoom(
rawName: String? = "Space name", rawName: String? = null,
displayName: String = "Space name",
avatarUrl: String? = null, avatarUrl: String? = null,
canonicalAlias: RoomAlias? = null, canonicalAlias: RoomAlias? = null,
childrenCount: Int = 0, childrenCount: Int = 0,
@ -33,6 +34,7 @@ fun aSpaceRoom(
via: List<String> = emptyList(), via: List<String> = emptyList(),
) = SpaceRoom( ) = SpaceRoom(
rawName = rawName, rawName = rawName,
displayName = displayName,
avatarUrl = avatarUrl, avatarUrl = avatarUrl,
canonicalAlias = canonicalAlias, canonicalAlias = canonicalAlias,
childrenCount = childrenCount, childrenCount = childrenCount,

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:ec84bcc989b8f80e7e025e6d081dfe64165468f3298c3fb5ccd4a75211a4f7bb oid sha256:a6cee41aea25e78f820acf98f01722062ab8247dcc78652b8ac9a27e60f24249
size 118364 size 88723

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:49764c59842a7d3ef7ad9c552bb22e1602c273b0b21f4bc0d9ba79b4942bafe3 oid sha256:5a56da5b32b6ee1ec6c21ec4a24420c219f1318b632fd91bb5e2d8e8d29f2b59
size 116100 size 86985

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:773eb018763a4f19f494043495a60636b5ef1c5fee5c94df7e2e545287725b06 oid sha256:79d880a890173c6af166139e29b115d2bf658e75f18868137616af05f4db586d
size 23111 size 20647

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:7266aeb27353112291ef11d80732eae25ae5c936404af13a99c4572d30bae6a0 oid sha256:c9f4963aa89b1f9811793f50033b004cb5659f7c91d6f16d5204e932c29b9d0a
size 22670 size 20271

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:0145025b77b028a27a4f3dfc9e14a42faa26c55e056464f4b93b2513b16a699d oid sha256:a9aa3aa6fd58dbba3db9e568773770397dcb4a2a7ea4c4cf61b762a0c6ef513a
size 9027 size 10631

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:ef19b16146a20517f04e4fa516b2d48af8cacfb5d6f69aacc308656a883765be oid sha256:0f5425b12bc2902847c5b3b7e4b4e727e2e67f9a776cbf059ca6ba4777f81696
size 39808 size 38569

View file

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ef19b16146a20517f04e4fa516b2d48af8cacfb5d6f69aacc308656a883765be
size 39808

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:f8454b2a9f7959ff981b5fee1b49926d3e22f7255ebadaa15731e494d2416d4c oid sha256:63dfdaf33475bcbf6c0c001b6c62c14fcbc5e84cf9d7f55c4b082dc359fbd7ea
size 8930 size 10515

View file

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:46fe78468ca13402a6cc78f2420ba72b8c5fe13a442e4e424c68eb74362acccb oid sha256:2b55a103be0ad883d0aaf31cceac1a5b33f1923dc4d96778c261ce98e5b0d435
size 38488 size 37334

View file

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:46fe78468ca13402a6cc78f2420ba72b8c5fe13a442e4e424c68eb74362acccb
size 38488