Avoid creating many PowerLevelRoomMemberComparator instance and also avoid doing the sorting twice.
This commit is contained in:
@@ -61,6 +61,8 @@ class ChangeRolesPresenter(
|
||||
fun create(role: RoomMember.Role): ChangeRolesPresenter
|
||||
}
|
||||
|
||||
private val powerLevelRoomMemberComparator = PowerLevelRoomMemberComparator()
|
||||
|
||||
@Composable
|
||||
override fun present(): ChangeRolesState {
|
||||
val dataSource = remember { RoomMemberListDataSource(room, dispatchers) }
|
||||
@@ -176,17 +178,7 @@ class ChangeRolesPresenter(
|
||||
}
|
||||
|
||||
private fun List<RoomMember>.groupedByRole(): MembersByRole {
|
||||
val groupedMembers = MembersByRole(this)
|
||||
return MembersByRole(
|
||||
owners = groupedMembers.owners.sorted(),
|
||||
admins = groupedMembers.admins.sorted(),
|
||||
moderators = groupedMembers.moderators.sorted(),
|
||||
members = groupedMembers.members.sorted(),
|
||||
)
|
||||
}
|
||||
|
||||
private fun Iterable<RoomMember>.sorted(): ImmutableList<RoomMember> {
|
||||
return sortedWith(PowerLevelRoomMemberComparator()).toImmutableList()
|
||||
return MembersByRole(this, powerLevelRoomMemberComparator)
|
||||
}
|
||||
|
||||
private fun CoroutineScope.save(
|
||||
|
||||
@@ -13,8 +13,8 @@ import io.element.android.libraries.designsystem.theme.components.SearchBarResul
|
||||
import io.element.android.libraries.matrix.api.core.UserId
|
||||
import io.element.android.libraries.matrix.api.room.RoomMember
|
||||
import io.element.android.libraries.matrix.api.user.MatrixUser
|
||||
import io.element.android.libraries.matrix.ui.room.PowerLevelRoomMemberComparator
|
||||
import kotlinx.collections.immutable.ImmutableList
|
||||
import kotlinx.collections.immutable.persistentListOf
|
||||
import kotlinx.collections.immutable.toImmutableList
|
||||
|
||||
data class ChangeRolesState(
|
||||
@@ -35,16 +35,23 @@ data class MembersByRole(
|
||||
val moderators: ImmutableList<RoomMember>,
|
||||
val members: ImmutableList<RoomMember>,
|
||||
) {
|
||||
constructor(members: List<RoomMember>) : this(
|
||||
owners = members.filter { it.role is RoomMember.Role.Owner }.sorted(),
|
||||
admins = members.filter { it.role == RoomMember.Role.Admin }.sorted(),
|
||||
moderators = members.filter { it.role == RoomMember.Role.Moderator }.sorted(),
|
||||
members = members.filter { it.role == RoomMember.Role.User }.sorted(),
|
||||
constructor() : this(
|
||||
owners = persistentListOf(),
|
||||
admins = persistentListOf(),
|
||||
moderators = persistentListOf(),
|
||||
members = persistentListOf(),
|
||||
)
|
||||
|
||||
constructor(members: List<RoomMember>, comparator: Comparator<RoomMember>) : this(
|
||||
owners = members.filter { it.role is RoomMember.Role.Owner }.sorted(comparator),
|
||||
admins = members.filter { it.role == RoomMember.Role.Admin }.sorted(comparator),
|
||||
moderators = members.filter { it.role == RoomMember.Role.Moderator }.sorted(comparator),
|
||||
members = members.filter { it.role == RoomMember.Role.User }.sorted(comparator),
|
||||
)
|
||||
|
||||
fun isEmpty() = owners.isEmpty() && admins.isEmpty() && moderators.isEmpty() && members.isEmpty()
|
||||
}
|
||||
|
||||
private fun Iterable<RoomMember>.sorted(): ImmutableList<RoomMember> {
|
||||
return sortedWith(PowerLevelRoomMemberComparator()).toImmutableList()
|
||||
private fun Iterable<RoomMember>.sorted(comparator: Comparator<RoomMember>): ImmutableList<RoomMember> {
|
||||
return sortedWith(comparator).toImmutableList()
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@ import io.element.android.libraries.matrix.api.room.RoomMembershipState
|
||||
import io.element.android.libraries.matrix.api.user.MatrixUser
|
||||
import io.element.android.libraries.matrix.ui.components.aMatrixUser
|
||||
import io.element.android.libraries.matrix.ui.components.aMatrixUserList
|
||||
import io.element.android.libraries.matrix.ui.room.PowerLevelRoomMemberComparator
|
||||
import io.element.android.libraries.previewutils.room.aRoomMember
|
||||
import io.element.android.libraries.previewutils.room.aRoomMemberList
|
||||
import kotlinx.collections.immutable.ImmutableList
|
||||
@@ -36,7 +37,12 @@ class ChangeRolesStateProvider : PreviewParameterProvider<ChangeRolesState> {
|
||||
aChangeRolesStateWithSelectedUsers().copy(
|
||||
query = "Alice",
|
||||
isSearchActive = true,
|
||||
searchResults = SearchBarResultState.Results(MembersByRole(aRoomMemberList().take(1).toImmutableList())),
|
||||
searchResults = SearchBarResultState.Results(
|
||||
MembersByRole(
|
||||
members = aRoomMemberList().take(1),
|
||||
comparator = PowerLevelRoomMemberComparator(),
|
||||
)
|
||||
),
|
||||
selectedUsers = aMatrixUserList().take(1).toImmutableList(),
|
||||
),
|
||||
aChangeRolesStateWithSelectedUsers().copy(savingState = AsyncAction.ConfirmingCancellation),
|
||||
@@ -87,7 +93,8 @@ internal fun aChangeRolesStateWithSelectedUsers() = aChangeRolesState(
|
||||
} else {
|
||||
roomMember
|
||||
}
|
||||
}
|
||||
},
|
||||
comparator = PowerLevelRoomMemberComparator(),
|
||||
)
|
||||
),
|
||||
hasPendingChanges = true,
|
||||
@@ -126,7 +133,8 @@ internal fun aChangeRolesStateWithOwners(
|
||||
displayName = "David",
|
||||
role = RoomMember.Role.User,
|
||||
),
|
||||
)
|
||||
),
|
||||
comparator = PowerLevelRoomMemberComparator(),
|
||||
),
|
||||
),
|
||||
canRemoveMember = { userId ->
|
||||
|
||||
@@ -145,7 +145,7 @@ fun ChangeRolesView(
|
||||
SearchResultsList(
|
||||
currentRole = state.role,
|
||||
lazyListState = lazyListState,
|
||||
searchResults = (state.searchResults as? SearchBarResultState.Results)?.results ?: MembersByRole(emptyList()),
|
||||
searchResults = (state.searchResults as? SearchBarResultState.Results)?.results ?: MembersByRole(),
|
||||
selectedUsers = state.selectedUsers,
|
||||
canRemoveMember = state.canChangeMemberRole,
|
||||
onToggleSelection = { state.eventSink(ChangeRolesEvent.UserSelectionToggled(it.toMatrixUser())) },
|
||||
|
||||
@@ -18,6 +18,7 @@ import io.element.android.libraries.matrix.test.A_USER_ID_5
|
||||
import io.element.android.libraries.matrix.test.A_USER_ID_6
|
||||
import io.element.android.libraries.matrix.test.A_USER_ID_7
|
||||
import io.element.android.libraries.matrix.test.room.aRoomMember
|
||||
import io.element.android.libraries.matrix.ui.room.PowerLevelRoomMemberComparator
|
||||
import kotlinx.collections.immutable.persistentListOf
|
||||
import org.junit.Test
|
||||
|
||||
@@ -33,7 +34,7 @@ class MembersByRoleTest {
|
||||
aRoomMember(A_USER_ID_6, displayName = "Justin", role = RoomMember.Role.Owner(isCreator = true)),
|
||||
aRoomMember(A_USER_ID_7, displayName = "Mallory", role = RoomMember.Role.Owner(isCreator = false)),
|
||||
)
|
||||
val membersByRole = MembersByRole(members = members)
|
||||
val membersByRole = MembersByRole(members = members, comparator = PowerLevelRoomMemberComparator())
|
||||
assertThat(membersByRole.owners).containsExactly(
|
||||
aRoomMember(A_USER_ID_6, displayName = "Justin", role = RoomMember.Role.Owner(isCreator = true)),
|
||||
aRoomMember(A_USER_ID_7, displayName = "Mallory", role = RoomMember.Role.Owner(isCreator = false)),
|
||||
@@ -52,7 +53,7 @@ class MembersByRoleTest {
|
||||
|
||||
@Test
|
||||
fun `isEmpty - only returns true with no members of any role`() {
|
||||
val emptyMembersByRole = MembersByRole(emptyList())
|
||||
val emptyMembersByRole = MembersByRole()
|
||||
assertThat(emptyMembersByRole.isEmpty()).isTrue()
|
||||
|
||||
val membersByRoleWithOwners = MembersByRole(
|
||||
|
||||
Reference in New Issue
Block a user