From ea08edb912e51eccba03129e28875973b9239b1b Mon Sep 17 00:00:00 2001 From: ganfra Date: Mon, 6 Oct 2025 14:21:01 +0200 Subject: [PATCH] feature(space): compute space room name locally --- .../home/impl/spaces/SpaceRoomProvider.kt | 4 ++-- .../impl/leave/LeaveSpaceStateProvider.kt | 2 +- .../space/impl/root/SpaceStateProvider.kt | 2 +- .../libraries/matrix/api/spaces/SpaceRoom.kt | 14 ++++++++++++- .../matrix/impl/spaces/SpaceRoomMapper.kt | 3 ++- .../matrix/ui/components/SpaceRoomProvider.kt | 20 +++++++++++++------ .../previewutils/room/SpaceRoomFixture.kt | 6 ++++-- 7 files changed, 37 insertions(+), 14 deletions(-) diff --git a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/spaces/SpaceRoomProvider.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/spaces/SpaceRoomProvider.kt index 474e08293a..56d441a42e 100644 --- a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/spaces/SpaceRoomProvider.kt +++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/spaces/SpaceRoomProvider.kt @@ -30,7 +30,7 @@ class SpaceRoomProvider : PreviewParameterProvider { roomId = RoomId("!spaceId1:example.com"), ), aSpaceRoom( - name = null, + rawName = null, numJoinedMembers = 5, childrenCount = 10, worldReadable = true, @@ -39,7 +39,7 @@ class SpaceRoomProvider : PreviewParameterProvider { state = CurrentUserMembership.INVITED, ), aSpaceRoom( - name = null, + rawName = null, numJoinedMembers = 5, childrenCount = 10, worldReadable = true, diff --git a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/leave/LeaveSpaceStateProvider.kt b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/leave/LeaveSpaceStateProvider.kt index 16eb85442c..85518f8b18 100644 --- a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/leave/LeaveSpaceStateProvider.kt +++ b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/leave/LeaveSpaceStateProvider.kt @@ -30,7 +30,7 @@ class LeaveSpaceStateProvider : PreviewParameterProvider { persistentListOf( aSelectableSpaceRoom( spaceRoom = aSpaceRoom( - name = "A long space name that should be truncated", + rawName = "A long space name that should be truncated", worldReadable = true, ), isLastAdmin = true, diff --git a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/root/SpaceStateProvider.kt b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/root/SpaceStateProvider.kt index c0a88c38f5..4f9ec4c561 100644 --- a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/root/SpaceStateProvider.kt +++ b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/root/SpaceStateProvider.kt @@ -25,7 +25,7 @@ open class SpaceStateProvider : PreviewParameterProvider { aSpaceState(), aSpaceState( parentSpace = aSpaceRoom( - name = null, + rawName = null, numJoinedMembers = 5, childrenCount = 10, worldReadable = true, diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/spaces/SpaceRoom.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/spaces/SpaceRoom.kt index 1e89fd2e98..c06bbcc723 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/spaces/SpaceRoom.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/spaces/SpaceRoom.kt @@ -15,7 +15,7 @@ import io.element.android.libraries.matrix.api.room.join.JoinRule import io.element.android.libraries.matrix.api.user.MatrixUser data class SpaceRoom( - val name: String?, + val rawName: String?, val avatarUrl: String?, val canonicalAlias: RoomAlias?, val childrenCount: Int, @@ -32,6 +32,18 @@ data class SpaceRoom( * The via parameters of the room. */ val via: List, + val isDirect: Boolean?, ) { 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 + } } diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/spaces/SpaceRoomMapper.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/spaces/SpaceRoomMapper.kt index 7032d052d8..248366aa03 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/spaces/SpaceRoomMapper.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/spaces/SpaceRoomMapper.kt @@ -24,7 +24,7 @@ class SpaceRoomMapper { guestCanJoin = spaceRoom.guestCanJoin, heroes = spaceRoom.heroes.orEmpty().map { it.map() }, joinRule = spaceRoom.joinRule?.map(), - name = spaceRoom.name, + rawName = spaceRoom.name, numJoinedMembers = spaceRoom.numJoinedMembers.toInt(), roomId = RoomId(spaceRoom.roomId), roomType = spaceRoom.roomType.map(), @@ -32,6 +32,7 @@ class SpaceRoomMapper { topic = spaceRoom.topic, worldReadable = spaceRoom.worldReadable.orFalse(), via = spaceRoom.via, + isDirect = spaceRoom.isDirect, ) } } diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SpaceRoomProvider.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SpaceRoomProvider.kt index bfdfeeac59..a355dd132c 100644 --- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SpaceRoomProvider.kt +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SpaceRoomProvider.kt @@ -18,23 +18,31 @@ class SpaceRoomProvider : PreviewParameterProvider { override val values: Sequence = sequenceOf( aSpaceRoom( roomType = RoomType.Room, - name = "Room name with topic", + rawName = "Room name with topic", topic = "Room topic that is quite long and might be truncated" ), aSpaceRoom( roomType = RoomType.Room, - name = "Room name no topic", + rawName = "Room name no topic", state = CurrentUserMembership.LEFT, ), aSpaceRoom( roomType = RoomType.Room, - name = "Room name with topic", + rawName = null, + isDirect = true, + heroes = listOf(aMatrixUser(displayName = "Alice")), + state = CurrentUserMembership.JOINED, + numJoinedMembers = 2, + ), + aSpaceRoom( + roomType = RoomType.Room, + rawName = "Room name with topic", topic = "Room topic that is quite long and might be truncated", state = CurrentUserMembership.INVITED, ), aSpaceRoom( roomType = RoomType.Room, - name = "Room name no topic", + rawName = "Room name no topic", state = CurrentUserMembership.INVITED, ), aSpaceRoom( @@ -52,7 +60,7 @@ class SpaceRoomProvider : PreviewParameterProvider { state = CurrentUserMembership.LEFT, ), aSpaceRoom( - name = null, + rawName = null, numJoinedMembers = 5, childrenCount = 10, worldReadable = true, @@ -61,7 +69,7 @@ class SpaceRoomProvider : PreviewParameterProvider { state = CurrentUserMembership.INVITED, ), aSpaceRoom( - name = null, + rawName = null, numJoinedMembers = 5, childrenCount = 10, worldReadable = true, diff --git a/libraries/previewutils/src/main/kotlin/io/element/android/libraries/previewutils/room/SpaceRoomFixture.kt b/libraries/previewutils/src/main/kotlin/io/element/android/libraries/previewutils/room/SpaceRoomFixture.kt index f3b38c241a..510a59a7cb 100644 --- a/libraries/previewutils/src/main/kotlin/io/element/android/libraries/previewutils/room/SpaceRoomFixture.kt +++ b/libraries/previewutils/src/main/kotlin/io/element/android/libraries/previewutils/room/SpaceRoomFixture.kt @@ -16,7 +16,7 @@ import io.element.android.libraries.matrix.api.spaces.SpaceRoom import io.element.android.libraries.matrix.api.user.MatrixUser fun aSpaceRoom( - name: String? = "Space name", + rawName: String? = "Space name", avatarUrl: String? = null, canonicalAlias: RoomAlias? = null, childrenCount: Int = 0, @@ -29,9 +29,10 @@ fun aSpaceRoom( state: CurrentUserMembership? = null, topic: String? = null, worldReadable: Boolean = false, + isDirect: Boolean? = null, via: List = emptyList(), ) = SpaceRoom( - name = name, + rawName = rawName, avatarUrl = avatarUrl, canonicalAlias = canonicalAlias, childrenCount = childrenCount, @@ -45,4 +46,5 @@ fun aSpaceRoom( topic = topic, worldReadable = worldReadable, via = via, + isDirect = isDirect )