diff --git a/changelog.d/921.bugfix b/changelog.d/921.bugfix new file mode 100644 index 0000000000..939455b177 --- /dev/null +++ b/changelog.d/921.bugfix @@ -0,0 +1 @@ +Make the room settings screen update automatically when new room info (name, avatar, topic) is available. diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsPresenter.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsPresenter.kt index e9aebe104b..c832cab666 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsPresenter.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsPresenter.kt @@ -63,6 +63,12 @@ class RoomDetailsPresenter @Inject constructor( val scope = rememberCoroutineScope() val leaveRoomState = leaveRoomPresenter.present() val canShowNotificationSettings = remember { mutableStateOf(false) } + val roomInfo = room.roomInfoFlow.collectAsState(initial = null).value + + val roomAvatar by remember { derivedStateOf { roomInfo?.avatarUrl ?: room.avatarUrl } } + + val roomName by remember { derivedStateOf { (roomInfo?.name ?: room.name ?: room.displayName).trim() } } + val roomTopic by remember { derivedStateOf { roomInfo?.topic ?: room.topic } } LaunchedEffect(Unit) { canShowNotificationSettings.value = featureFlagService.isFeatureEnabled(FeatureFlags.NotificationSettings) @@ -82,8 +88,8 @@ class RoomDetailsPresenter @Inject constructor( val roomMemberDetailsPresenter = roomMemberDetailsPresenter(dmMember) val roomType by getRoomType(dmMember) - val topicState = remember(canEditTopic, room.topic, roomType) { - val topic = room.topic + val topicState = remember(canEditTopic, roomTopic, roomType) { + val topic = roomTopic when { !topic.isNullOrBlank() -> RoomTopicState.ExistingTopic(topic) @@ -115,9 +121,9 @@ class RoomDetailsPresenter @Inject constructor( return RoomDetailsState( roomId = room.roomId.value, - roomName = room.displayName, + roomName = roomName, roomAlias = room.alias, - roomAvatarUrl = room.avatarUrl, + roomAvatarUrl = roomAvatar, roomTopic = topicState, memberCount = room.joinedMemberCount, isEncrypted = room.isEncrypted, diff --git a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/RoomDetailsPresenterTests.kt b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/RoomDetailsPresenterTests.kt index 0a25434339..95deffad31 100644 --- a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/RoomDetailsPresenterTests.kt +++ b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/RoomDetailsPresenterTests.kt @@ -46,6 +46,7 @@ import io.element.android.libraries.matrix.test.A_USER_ID_2 import io.element.android.libraries.matrix.test.FakeMatrixClient import io.element.android.libraries.matrix.test.notificationsettings.FakeNotificationSettingsService import io.element.android.libraries.matrix.test.room.FakeMatrixRoom +import io.element.android.libraries.matrix.test.room.aRoomInfo import io.element.android.tests.testutils.WarmUpRule import io.element.android.tests.testutils.consumeItemsUntilPredicate import io.element.android.tests.testutils.testCoroutineDispatchers @@ -89,7 +90,7 @@ class RoomDetailsPresenterTests { } @Test - fun `present - initial state is created from room info`() = runTest { + fun `present - initial state is created from room if roomInfo is null`() = runTest { val room = aMatrixRoom() val presenter = createRoomDetailsPresenter(room) moleculeFlow(RecompositionMode.Immediate) { @@ -97,7 +98,7 @@ class RoomDetailsPresenterTests { }.test { val initialState = awaitItem() assertThat(initialState.roomId).isEqualTo(room.roomId.value) - assertThat(initialState.roomName).isEqualTo(room.displayName) + assertThat(initialState.roomName).isEqualTo(room.name) assertThat(initialState.roomAvatarUrl).isEqualTo(room.avatarUrl) assertThat(initialState.roomTopic).isEqualTo(RoomTopicState.ExistingTopic(room.topic!!)) assertThat(initialState.memberCount).isEqualTo(room.joinedMemberCount) @@ -107,6 +108,26 @@ class RoomDetailsPresenterTests { } } + @Test + fun `present - initial state is updated with roomInfo if it exists`() = runTest { + val roomInfo = aRoomInfo(name = "A room name", topic = "A topic", avatarUrl = "https://matrix.org/avatar.jpg") + val room = aMatrixRoom().apply { + givenRoomInfo(roomInfo) + } + val presenter = createRoomDetailsPresenter(room) + moleculeFlow(RecompositionMode.Immediate) { + presenter.present() + }.test { + skipItems(1) + val updatedState = awaitItem() + assertThat(updatedState.roomName).isEqualTo(roomInfo.name) + assertThat(updatedState.roomAvatarUrl).isEqualTo(roomInfo.avatarUrl) + assertThat(updatedState.roomTopic).isEqualTo(RoomTopicState.ExistingTopic(roomInfo.topic!!)) + + cancelAndIgnoreRemainingEvents() + } + } + @Test fun `present - initial state with no room name`() = runTest { val room = aMatrixRoom(name = null) @@ -334,6 +355,7 @@ class RoomDetailsPresenterTests { val room = aMatrixRoom(topic = null).apply { givenCanSendStateResult(StateEventType.ROOM_TOPIC, Result.success(true)) givenCanInviteResult(Result.success(false)) + givenRoomInfo(aRoomInfo(topic = null)) } val presenter = createRoomDetailsPresenter(room) diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeMatrixRoom.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeMatrixRoom.kt index 9c12ba1f4f..b4e0001e84 100644 --- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeMatrixRoom.kt +++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeMatrixRoom.kt @@ -161,7 +161,7 @@ class FakeMatrixRoom( private var leaveRoomError: Throwable? = null - private val _roomInfoFlow: MutableSharedFlow = MutableStateFlow(aRoomInfo()) + private val _roomInfoFlow: MutableSharedFlow = MutableSharedFlow(replay = 1) override val roomInfoFlow: Flow = _roomInfoFlow override val membersStateFlow: MutableStateFlow = MutableStateFlow(MatrixRoomMembersState.Unknown)