From 57a13fa30df86c12177a0600c478822f1af6b9b5 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 29 Jan 2020 18:07:57 +0100 Subject: [PATCH] Sort room members by display names --- CHANGES.md | 1 + .../members/RoomMemberListViewModel.kt | 11 ++-- .../members/RoomMemberSummaryComparator.kt | 61 +++++++++++++++++++ 3 files changed, 68 insertions(+), 5 deletions(-) create mode 100644 vector/src/main/java/im/vector/riotx/features/roomprofile/members/RoomMemberSummaryComparator.kt diff --git a/CHANGES.md b/CHANGES.md index 3993bf755b..7c235d8704 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -8,6 +8,7 @@ Features ✨: Improvements 🙌: - Sharing things to RiotX: sort list by recent room first (#771) - Hide the algorithm when turning on e2e (#897) + - Sort room members by display names Other changes: - Add support for /rainbow and /rainbowme commands (#879) diff --git a/vector/src/main/java/im/vector/riotx/features/roomprofile/members/RoomMemberListViewModel.kt b/vector/src/main/java/im/vector/riotx/features/roomprofile/members/RoomMemberListViewModel.kt index 8472d4a2a5..2556e3b78c 100644 --- a/vector/src/main/java/im/vector/riotx/features/roomprofile/members/RoomMemberListViewModel.kt +++ b/vector/src/main/java/im/vector/riotx/features/roomprofile/members/RoomMemberListViewModel.kt @@ -40,6 +40,7 @@ import io.reactivex.Observable import io.reactivex.functions.BiFunction class RoomMemberListViewModel @AssistedInject constructor(@Assisted initialState: RoomMemberListViewState, + private val roomMemberSummaryComparator: RoomMemberSummaryComparator, private val session: Session) : VectorViewModel(initialState) { @@ -113,11 +114,11 @@ class RoomMemberListViewModel @AssistedInject constructor(@Assisted initialState } return listOf( - PowerLevelCategory.ADMIN to admins, - PowerLevelCategory.MODERATOR to moderators, - PowerLevelCategory.CUSTOM to customs, - PowerLevelCategory.INVITE to invites, - PowerLevelCategory.USER to users + PowerLevelCategory.ADMIN to admins.sortedWith(roomMemberSummaryComparator), + PowerLevelCategory.MODERATOR to moderators.sortedWith(roomMemberSummaryComparator), + PowerLevelCategory.CUSTOM to customs.sortedWith(roomMemberSummaryComparator), + PowerLevelCategory.INVITE to invites.sortedWith(roomMemberSummaryComparator), + PowerLevelCategory.USER to users.sortedWith(roomMemberSummaryComparator) ) } diff --git a/vector/src/main/java/im/vector/riotx/features/roomprofile/members/RoomMemberSummaryComparator.kt b/vector/src/main/java/im/vector/riotx/features/roomprofile/members/RoomMemberSummaryComparator.kt new file mode 100644 index 0000000000..cc1dd29d13 --- /dev/null +++ b/vector/src/main/java/im/vector/riotx/features/roomprofile/members/RoomMemberSummaryComparator.kt @@ -0,0 +1,61 @@ +/* + * Copyright 2020 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.riotx.features.roomprofile.members + +import im.vector.matrix.android.api.session.room.model.RoomMemberSummary +import javax.inject.Inject + +class RoomMemberSummaryComparator @Inject constructor() : Comparator { + + override fun compare(leftRoomMemberSummary: RoomMemberSummary?, rightRoomMemberSummary: RoomMemberSummary?): Int { + return when (leftRoomMemberSummary) { + null -> + when (rightRoomMemberSummary) { + null -> 0 + else -> 1 + } + else -> + when (rightRoomMemberSummary) { + null -> -1 + else -> + when { + leftRoomMemberSummary.displayName.isNullOrBlank() -> + when { + rightRoomMemberSummary.displayName.isNullOrBlank() -> { + // No display names, compare ids + leftRoomMemberSummary.userId.compareTo(rightRoomMemberSummary.userId) + } + else -> 1 + } + else -> + when { + rightRoomMemberSummary.displayName.isNullOrBlank() -> -1 + else -> { + when (leftRoomMemberSummary.displayName) { + rightRoomMemberSummary.displayName -> + // Same display name, compare id + leftRoomMemberSummary.userId.compareTo(rightRoomMemberSummary.userId) + else -> + leftRoomMemberSummary.displayName!!.compareTo(rightRoomMemberSummary.displayName!!, true) + } + } + } + } + } + } + } +}