diff --git a/features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/roles/ChangeRolesStateProvider.kt b/features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/roles/ChangeRolesStateProvider.kt index 28c74012d66..14662bacdd2 100644 --- a/features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/roles/ChangeRolesStateProvider.kt +++ b/features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/roles/ChangeRolesStateProvider.kt @@ -44,8 +44,14 @@ class ChangeRolesStateProvider : PreviewParameterProvider { aChangeRolesStateWithSelectedUsers().copy(savingState = AsyncAction.Loading), aChangeRolesStateWithSelectedUsers().copy(savingState = AsyncAction.Success(true)), aChangeRolesStateWithSelectedUsers().copy(savingState = AsyncAction.Failure(Exception("boom"))), - aChangeRolesStateWithOwners(), - aChangeRolesStateWithOwners().copy(role = RoomMember.Role.Owner(isCreator = false)), + aChangeRolesStateWithOwners( + role = RoomMember.Role.Admin, + // Do not include the owners in the selectedUsers (the presenter will not do it), the View will add them + selectedUsers = listOf( + aMatrixUser(id = "@carol:server.org", displayName = "Carol"), + ) + ), + aChangeRolesStateWithOwners(role = RoomMember.Role.Owner(isCreator = false)), ) } @@ -88,8 +94,15 @@ internal fun aChangeRolesStateWithSelectedUsers() = aChangeRolesState( canRemoveMember = { it != UserId("@alice:server.org") }, ) -internal fun aChangeRolesStateWithOwners() = aChangeRolesState( - role = RoomMember.Role.Admin, +internal fun aChangeRolesStateWithOwners( + role: RoomMember.Role = RoomMember.Role.Admin, + selectedUsers: List = listOf( + aMatrixUser(id = "@alice:server.org", displayName = "Alice"), + aMatrixUser(id = "@bob:server.org", displayName = "Bob"), + aMatrixUser(id = "@carol:server.org", displayName = "Carol"), + ), +) = aChangeRolesState( + role = role, searchResults = SearchBarResultState.Results( MembersByRole( members = persistentListOf( @@ -125,9 +138,5 @@ internal fun aChangeRolesStateWithOwners() = aChangeRolesState( else -> false } }, - selectedUsers = persistentListOf( - aMatrixUser(id = "@alice:server.org", displayName = "Alice"), - aMatrixUser(id = "@bob:server.org", displayName = "Bob"), - aMatrixUser(id = "@carol:server.org", displayName = "Carol"), - ) + selectedUsers = selectedUsers.toImmutableList(), ) diff --git a/features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/roles/ChangeRolesView.kt b/features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/roles/ChangeRolesView.kt index 81107e2e893..81b11aa8374 100644 --- a/features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/roles/ChangeRolesView.kt +++ b/features/rolesandpermissions/impl/src/main/kotlin/io/element/android/features/rolesandpermissions/impl/roles/ChangeRolesView.kt @@ -30,6 +30,7 @@ import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource @@ -71,6 +72,7 @@ import io.element.android.libraries.matrix.ui.components.SelectedUsersRowList import io.element.android.libraries.matrix.ui.model.getAvatarData import io.element.android.libraries.ui.strings.CommonStrings import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.toImmutableList @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -226,7 +228,18 @@ private fun SearchResultsList( state = lazyListState, ) { item { - selectedUsersList(selectedUsers) + val usersInHorizontalRow = remember(searchResults.owners, selectedUsers) { + if (currentRole == RoomMember.Role.Admin) { + // Also include the owners in the horizontal list + val owners = searchResults.owners.map { + it.toMatrixUser() + } + (owners + selectedUsers).toImmutableList() + } else { + selectedUsers + } + } + selectedUsersList(usersInHorizontalRow) } if (searchResults.owners.isNotEmpty()) { stickyHeader { ListSectionHeader(text = stringResource(R.string.screen_room_roles_and_permissions_owners)) }