mirror of
https://github.com/SchildiChat/SchildiChat-android.git
synced 2025-02-16 20:10:04 +03:00
Filter in the controller, to keep a live members list
This commit is contained in:
parent
85417eb24c
commit
78ed184f60
4 changed files with 57 additions and 32 deletions
|
@ -17,12 +17,6 @@
|
|||
package im.vector.app.features.roomprofile.members
|
||||
|
||||
import com.airbnb.epoxy.TypedEpoxyController
|
||||
import org.matrix.android.sdk.api.session.events.model.Event
|
||||
import org.matrix.android.sdk.api.session.events.model.toModel
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomMemberSummary
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomThirdPartyInviteContent
|
||||
import org.matrix.android.sdk.api.util.MatrixItem
|
||||
import org.matrix.android.sdk.api.util.toMatrixItem
|
||||
import im.vector.app.R
|
||||
import im.vector.app.core.epoxy.dividerItem
|
||||
import im.vector.app.core.epoxy.profiles.buildProfileSection
|
||||
|
@ -31,11 +25,18 @@ import im.vector.app.core.extensions.join
|
|||
import im.vector.app.core.resources.ColorProvider
|
||||
import im.vector.app.core.resources.StringProvider
|
||||
import im.vector.app.features.home.AvatarRenderer
|
||||
import org.matrix.android.sdk.api.session.events.model.Event
|
||||
import org.matrix.android.sdk.api.session.events.model.toModel
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomMemberSummary
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomThirdPartyInviteContent
|
||||
import org.matrix.android.sdk.api.util.MatrixItem
|
||||
import org.matrix.android.sdk.api.util.toMatrixItem
|
||||
import javax.inject.Inject
|
||||
|
||||
class RoomMemberListController @Inject constructor(
|
||||
private val avatarRenderer: AvatarRenderer,
|
||||
private val stringProvider: StringProvider,
|
||||
private val roomMemberSummaryFilter: RoomMemberSummaryFilter,
|
||||
colorProvider: ColorProvider
|
||||
) : TypedEpoxyController<RoomMemberListViewState>() {
|
||||
|
||||
|
@ -55,17 +56,20 @@ class RoomMemberListController @Inject constructor(
|
|||
override fun buildModels(data: RoomMemberListViewState?) {
|
||||
data ?: return
|
||||
|
||||
val roomMembersByPowerLevel = data.filteredRoomMemberSummaries ?: data.roomMemberSummaries.invoke() ?: return
|
||||
roomMemberSummaryFilter.filter = data.filter
|
||||
|
||||
val roomMembersByPowerLevel = data.roomMemberSummaries.invoke() ?: return
|
||||
val threePidInvites = data.threePidInvites().orEmpty()
|
||||
var threePidInvitesDone = threePidInvites.isEmpty()
|
||||
|
||||
for ((powerLevelCategory, roomMemberList) in roomMembersByPowerLevel) {
|
||||
if (roomMemberList.isEmpty()) {
|
||||
val filteredRoomMemberList = roomMemberList.filter { roomMemberSummaryFilter.test(it) }
|
||||
if (filteredRoomMemberList.isEmpty()) {
|
||||
continue
|
||||
}
|
||||
|
||||
if (powerLevelCategory == RoomMemberListCategories.USER && !threePidInvitesDone) {
|
||||
// If there is not regular invite, display threepid invite before the regular user
|
||||
// If there is no regular invite, display threepid invite before the regular user
|
||||
buildProfileSection(
|
||||
stringProvider.getString(RoomMemberListCategories.INVITE.titleRes)
|
||||
)
|
||||
|
@ -77,7 +81,7 @@ class RoomMemberListController @Inject constructor(
|
|||
buildProfileSection(
|
||||
stringProvider.getString(powerLevelCategory.titleRes)
|
||||
)
|
||||
roomMemberList.join(
|
||||
filteredRoomMemberList.join(
|
||||
each = { _, roomMember ->
|
||||
profileMatrixItem {
|
||||
id(roomMember.userId)
|
||||
|
|
|
@ -203,27 +203,11 @@ class RoomMemberListViewModel @AssistedInject constructor(@Assisted initialState
|
|||
}
|
||||
}
|
||||
|
||||
private fun handleFilterMemberList(action: RoomMemberListAction.FilterMemberList) = withState { state ->
|
||||
if (action.searchTerm.isBlank()) {
|
||||
setState { copy(filteredRoomMemberSummaries = null) }
|
||||
return@withState
|
||||
private fun handleFilterMemberList(action: RoomMemberListAction.FilterMemberList) = withState {
|
||||
setState {
|
||||
copy(
|
||||
filter = action.searchTerm
|
||||
)
|
||||
}
|
||||
val roomMemberSummaries = state.roomMemberSummaries.invoke()
|
||||
roomMemberSummaries
|
||||
?.mapNotNull { (powerLevelCategory, roomMemberList) ->
|
||||
roomMemberList
|
||||
.filter { it.displayName?.contains(action.searchTerm).orFalse() || it.userId.contains(action.searchTerm) }
|
||||
.takeIf { it.isNotEmpty() }
|
||||
?.let { filteredMemberList ->
|
||||
Pair(powerLevelCategory, filteredMemberList)
|
||||
}
|
||||
}
|
||||
?.also { filteredRoomMemberSummaries ->
|
||||
setState {
|
||||
copy(
|
||||
filteredRoomMemberSummaries = filteredRoomMemberSummaries
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -31,7 +31,7 @@ data class RoomMemberListViewState(
|
|||
val roomId: String,
|
||||
val roomSummary: Async<RoomSummary> = Uninitialized,
|
||||
val roomMemberSummaries: Async<RoomMemberSummaries> = Uninitialized,
|
||||
val filteredRoomMemberSummaries: RoomMemberSummaries? = null,
|
||||
val filter: String = "",
|
||||
val threePidInvites: Async<List<Event>> = Uninitialized,
|
||||
val trustLevelMap: Async<Map<String, RoomEncryptionTrustLevel?>> = Uninitialized,
|
||||
val actionsPermissions: ActionPermissions = ActionPermissions()
|
||||
|
|
|
@ -0,0 +1,37 @@
|
|||
/*
|
||||
* Copyright (c) 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.app.features.roomprofile.members
|
||||
|
||||
import io.reactivex.functions.Predicate
|
||||
import org.matrix.android.sdk.api.extensions.orFalse
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomMemberSummary
|
||||
import javax.inject.Inject
|
||||
|
||||
class RoomMemberSummaryFilter @Inject constructor() : Predicate<RoomMemberSummary> {
|
||||
var filter: String = ""
|
||||
|
||||
override fun test(roomMemberSummary: RoomMemberSummary): Boolean {
|
||||
if (filter.isBlank()) {
|
||||
// No filter
|
||||
return true
|
||||
}
|
||||
|
||||
return roomMemberSummary.displayName?.contains(filter, ignoreCase = true).orFalse()
|
||||
// We should maybe exclude the domain from the userId
|
||||
|| roomMemberSummary.userId.contains(filter, ignoreCase = true)
|
||||
}
|
||||
}
|
Loading…
Add table
Reference in a new issue