diff --git a/changelog.d/3081.bugfix b/changelog.d/3081.bugfix new file mode 100644 index 0000000000..37baf6cca2 --- /dev/null +++ b/changelog.d/3081.bugfix @@ -0,0 +1 @@ + Let roles and permissions screens work for invited room members too. diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsPresenter.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsPresenter.kt index 3f7224602d..9f5c7d041e 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsPresenter.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsPresenter.kt @@ -33,7 +33,7 @@ import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.room.MatrixRoom import io.element.android.libraries.matrix.api.room.MatrixRoomInfo import io.element.android.libraries.matrix.api.room.RoomMember -import io.element.android.libraries.matrix.api.room.joinedRoomMembers +import io.element.android.libraries.matrix.api.room.activeRoomMembers import io.element.android.libraries.matrix.api.room.powerlevels.UserRoleChange import io.element.android.services.analytics.api.AnalyticsService import kotlinx.coroutines.CoroutineScope @@ -50,21 +50,21 @@ class RolesAndPermissionsPresenter @Inject constructor( val coroutineScope = rememberCoroutineScope() val roomInfo by room.roomInfoFlow.collectAsState(initial = null) val roomMembers by room.membersStateFlow.collectAsState() - // Get the list of joined room members, in order to filter members present in the power - // level state Event, but not member of the room anymore. - val joinedRoomMemberIds by remember { + // Get the list of active room members (joined or invited), in order to filter members present in the power + // level state Event. + val activeRoomMemberIds by remember { derivedStateOf { - roomMembers.joinedRoomMembers().map { it.userId } + roomMembers.activeRoomMembers().map { it.userId } } } val moderatorCount by remember { derivedStateOf { - roomInfo.userCountWithRole(joinedRoomMemberIds, RoomMember.Role.MODERATOR) + roomInfo.userCountWithRole(activeRoomMemberIds, RoomMember.Role.MODERATOR) } } val adminCount by remember { derivedStateOf { - roomInfo.userCountWithRole(joinedRoomMemberIds, RoomMember.Role.ADMIN) + roomInfo.userCountWithRole(activeRoomMemberIds, RoomMember.Role.ADMIN) } } val changeOwnRoleAction = remember { mutableStateOf>(AsyncAction.Uninitialized) } @@ -118,9 +118,9 @@ class RolesAndPermissionsPresenter @Inject constructor( } } - private fun MatrixRoomInfo?.userCountWithRole(joinedRoomMemberIds: List, role: RoomMember.Role): Int { + private fun MatrixRoomInfo?.userCountWithRole(userIds: List, role: RoomMember.Role): Int { return this?.userPowerLevels.orEmpty().count { (userId, level) -> - RoomMember.Role.forPowerLevel(level) == role && userId in joinedRoomMemberIds + RoomMember.Role.forPowerLevel(level) == role && userId in userIds } } } diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoomMembersState.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoomMembersState.kt index 13f19fe0e0..d41336b369 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoomMembersState.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoomMembersState.kt @@ -39,3 +39,7 @@ fun MatrixRoomMembersState.roomMembers(): List? { fun MatrixRoomMembersState.joinedRoomMembers(): List { return roomMembers().orEmpty().filter { it.membership == RoomMembershipState.JOIN } } + +fun MatrixRoomMembersState.activeRoomMembers(): List { + return roomMembers().orEmpty().filter { it.membership.isActive() } +} diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/powerlevels/MatrixRoomMembersWithRole.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/powerlevels/MatrixRoomMembersWithRole.kt index 2c17718ccf..bbfa928643 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/powerlevels/MatrixRoomMembersWithRole.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/powerlevels/MatrixRoomMembersWithRole.kt @@ -18,7 +18,7 @@ package io.element.android.libraries.matrix.api.room.powerlevels import io.element.android.libraries.matrix.api.room.MatrixRoom import io.element.android.libraries.matrix.api.room.RoomMember -import io.element.android.libraries.matrix.api.room.joinedRoomMembers +import io.element.android.libraries.matrix.api.room.activeRoomMembers import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.toPersistentList import kotlinx.coroutines.flow.Flow @@ -27,14 +27,13 @@ import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.map /** - * Return a flow of the list of room members who are still in the room (with membership == RoomMembershipState.JOIN) - * and who have the given role. + * Return a flow of the list of active room members who have the given role. */ fun MatrixRoom.usersWithRole(role: RoomMember.Role): Flow> { return roomInfoFlow .map { it.userPowerLevels.filter { (_, powerLevel) -> RoomMember.Role.forPowerLevel(powerLevel) == role } } .combine(membersStateFlow) { powerLevels, membersState -> - membersState.joinedRoomMembers() + membersState.activeRoomMembers() .filter { powerLevels.containsKey(it.userId) } .toPersistentList() }