forked from GitHub-Mirror/riotX-android
Room list : add quick ordering
This commit is contained in:
parent
0e7596e0aa
commit
6df8809ee0
@ -27,6 +27,7 @@ import im.vector.riotredesign.features.home.room.detail.timeline.TimelineDateFor
|
||||
import im.vector.riotredesign.features.home.room.detail.timeline.TimelineEventController
|
||||
import im.vector.riotredesign.features.home.room.detail.timeline.TimelineItemFactory
|
||||
import im.vector.riotredesign.features.home.room.detail.timeline.helper.TimelineMediaSizeProvider
|
||||
import im.vector.riotredesign.features.home.room.list.RoomSummaryComparator
|
||||
import im.vector.riotredesign.features.home.room.list.RoomSummaryController
|
||||
import org.koin.dsl.module.module
|
||||
|
||||
@ -90,6 +91,10 @@ class HomeModule {
|
||||
HomePermalinkHandler(get())
|
||||
}
|
||||
|
||||
single {
|
||||
RoomSummaryComparator()
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
@ -40,7 +40,8 @@ class RoomListViewModel(initialState: RoomListViewState,
|
||||
private val session: Session,
|
||||
private val selectedGroupHolder: SelectedGroupHolder,
|
||||
private val visibleRoomHolder: VisibleRoomHolder,
|
||||
private val roomSelectionRepository: RoomSelectionRepository)
|
||||
private val roomSelectionRepository: RoomSelectionRepository,
|
||||
private val roomSummaryComparator: RoomSummaryComparator)
|
||||
: RiotViewModel<RoomListViewState>(initialState) {
|
||||
|
||||
companion object : MvRxViewModelFactory<RoomListViewModel, RoomListViewState> {
|
||||
@ -51,7 +52,8 @@ class RoomListViewModel(initialState: RoomListViewState,
|
||||
val roomSelectionRepository = viewModelContext.activity.get<RoomSelectionRepository>()
|
||||
val selectedGroupHolder = viewModelContext.activity.get<SelectedGroupHolder>()
|
||||
val visibleRoomHolder = viewModelContext.activity.get<VisibleRoomHolder>()
|
||||
return RoomListViewModel(state, currentSession, selectedGroupHolder, visibleRoomHolder, roomSelectionRepository)
|
||||
val roomSummaryComparator = viewModelContext.activity.get<RoomSummaryComparator>()
|
||||
return RoomListViewModel(state, currentSession, selectedGroupHolder, visibleRoomHolder, roomSelectionRepository, roomSummaryComparator)
|
||||
}
|
||||
}
|
||||
|
||||
@ -154,7 +156,14 @@ class RoomListViewModel(initialState: RoomListViewState,
|
||||
else -> groupRooms.add(room)
|
||||
}
|
||||
}
|
||||
return RoomSummaries(favourites, directChats, groupRooms, lowPriorities, serverNotices)
|
||||
|
||||
return RoomSummaries(
|
||||
favourites = favourites.sortedWith(roomSummaryComparator),
|
||||
directRooms = directChats.sortedWith(roomSummaryComparator),
|
||||
groupRooms = groupRooms.sortedWith(roomSummaryComparator),
|
||||
lowPriorities = lowPriorities.sortedWith(roomSummaryComparator),
|
||||
serverNotices = serverNotices.sortedWith(roomSummaryComparator)
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
|
@ -0,0 +1,70 @@
|
||||
/*
|
||||
* Copyright 2019 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.riotredesign.features.home.room.list
|
||||
|
||||
import im.vector.matrix.android.api.session.room.model.RoomSummary
|
||||
|
||||
class RoomSummaryComparator
|
||||
: Comparator<RoomSummary> {
|
||||
|
||||
override fun compare(leftRoomSummary: RoomSummary?, rightRoomSummary: RoomSummary?): Int {
|
||||
val retValue: Int
|
||||
var leftHighlightCount = 0
|
||||
var rightHighlightCount = 0
|
||||
var leftNotificationCount = 0
|
||||
var rightNotificationCount = 0
|
||||
var rightTimestamp = 0L
|
||||
var leftTimestamp = 0L
|
||||
|
||||
if (null != leftRoomSummary) {
|
||||
leftHighlightCount = leftRoomSummary.highlightCount
|
||||
leftNotificationCount = leftRoomSummary.notificationCount
|
||||
leftTimestamp = leftRoomSummary.lastMessage?.originServerTs ?: 0
|
||||
}
|
||||
if (null != rightRoomSummary) {
|
||||
rightHighlightCount = rightRoomSummary.highlightCount
|
||||
rightNotificationCount = rightRoomSummary.notificationCount
|
||||
rightTimestamp = rightRoomSummary.lastMessage?.originServerTs ?: 0
|
||||
}
|
||||
|
||||
if (leftRoomSummary?.lastMessage == null) {
|
||||
retValue = 1
|
||||
} else if (rightRoomSummary?.lastMessage == null) {
|
||||
retValue = -1
|
||||
} else if (rightHighlightCount > 0 && leftHighlightCount == 0) {
|
||||
retValue = 1
|
||||
} else if (rightHighlightCount == 0 && leftHighlightCount > 0) {
|
||||
retValue = -1
|
||||
} else if (rightNotificationCount > 0 && leftNotificationCount == 0) {
|
||||
retValue = 1
|
||||
} else if (rightNotificationCount == 0 && leftNotificationCount > 0) {
|
||||
retValue = -1
|
||||
} else {
|
||||
val deltaTimestamp = rightTimestamp - leftTimestamp
|
||||
if (deltaTimestamp > 0) {
|
||||
retValue = 1
|
||||
} else if (deltaTimestamp < 0) {
|
||||
retValue = -1
|
||||
} else {
|
||||
retValue = 0
|
||||
}
|
||||
}
|
||||
return retValue
|
||||
|
||||
}
|
||||
|
||||
}
|
@ -25,11 +25,11 @@ import im.vector.riotredesign.core.resources.StringProvider
|
||||
class RoomSummaryController(private val stringProvider: StringProvider
|
||||
) : TypedEpoxyController<RoomListViewState>() {
|
||||
|
||||
private var isDirectRoomsExpanded = true
|
||||
private var isGroupRoomsExpanded = true
|
||||
private var isFavoriteRoomsExpanded = true
|
||||
private var isLowPriorityRoomsExpanded = true
|
||||
private var isServerNoticeRoomsExpanded = true
|
||||
private var isDirectRoomsExpanded = false
|
||||
private var isGroupRoomsExpanded = false
|
||||
private var isLowPriorityRoomsExpanded = false
|
||||
private var isServerNoticeRoomsExpanded = false
|
||||
|
||||
var callback: Callback? = null
|
||||
|
||||
@ -79,7 +79,11 @@ class RoomSummaryController(private val stringProvider: StringProvider
|
||||
|
||||
private fun buildRoomCategory(viewState: RoomListViewState, summaries: List<RoomSummary>, @StringRes titleRes: Int, isExpanded: Boolean, mutateExpandedState: () -> Unit) {
|
||||
//TODO should add some business logic later
|
||||
val unreadCount = summaries.map { it.notificationCount }.reduce { acc, i -> acc + i }
|
||||
val unreadCount = if (summaries.isEmpty()) {
|
||||
0
|
||||
} else {
|
||||
summaries.map { it.notificationCount }.reduce { acc, i -> acc + i }
|
||||
}
|
||||
val showHighlighted = summaries.any { it.highlightCount > 0 }
|
||||
RoomCategoryItem(
|
||||
title = stringProvider.getString(titleRes).toUpperCase(),
|
||||
|
@ -16,6 +16,7 @@
|
||||
|
||||
package im.vector.matrix.android.api.session.room.model
|
||||
|
||||
import im.vector.matrix.android.api.session.events.model.Event
|
||||
import im.vector.matrix.android.api.session.room.model.tag.RoomTag
|
||||
|
||||
/**
|
||||
@ -28,6 +29,7 @@ data class RoomSummary(
|
||||
val topic: String = "",
|
||||
val avatarUrl: String = "",
|
||||
val isDirect: Boolean,
|
||||
val lastMessage: Event? = null,
|
||||
val otherMemberIds: List<String> = emptyList(),
|
||||
var notificationCount: Int = 0,
|
||||
var highlightCount: Int = 0,
|
||||
|
@ -33,6 +33,7 @@ internal object RoomSummaryMapper {
|
||||
topic = roomSummaryEntity.topic ?: "",
|
||||
avatarUrl = roomSummaryEntity.avatarUrl ?: "",
|
||||
isDirect = roomSummaryEntity.isDirect,
|
||||
lastMessage = roomSummaryEntity.lastMessage?.asDomain(),
|
||||
otherMemberIds = roomSummaryEntity.otherMemberIds.toList(),
|
||||
highlightCount = roomSummaryEntity.highlightCount,
|
||||
notificationCount = roomSummaryEntity.notificationCount,
|
||||
|
@ -50,9 +50,13 @@ internal fun EventEntity.Companion.where(realm: Realm,
|
||||
}
|
||||
|
||||
internal fun EventEntity.Companion.latestEvent(realm: Realm,
|
||||
roomId: String): EventEntity? {
|
||||
val chunkEntity = ChunkEntity.findLastLiveChunkFromRoom(realm, roomId)
|
||||
return chunkEntity?.events?.where()?.sort(EventEntityFields.DISPLAY_INDEX)?.findFirst()
|
||||
roomId: String,
|
||||
excludedTypes: List<String> = emptyList()): EventEntity? {
|
||||
val query = ChunkEntity.findLastLiveChunkFromRoom(realm, roomId)?.events?.where()
|
||||
return query
|
||||
?.not()?.`in`(EventEntityFields.TYPE, excludedTypes.toTypedArray())
|
||||
?.sort(EventEntityFields.DISPLAY_INDEX)
|
||||
?.findFirst()
|
||||
}
|
||||
|
||||
|
||||
|
@ -28,6 +28,7 @@ import im.vector.matrix.android.internal.database.model.EventEntity
|
||||
import im.vector.matrix.android.internal.database.model.RoomEntity
|
||||
import im.vector.matrix.android.internal.database.model.RoomSummaryEntity
|
||||
import im.vector.matrix.android.internal.database.query.last
|
||||
import im.vector.matrix.android.internal.database.query.latestEvent
|
||||
import im.vector.matrix.android.internal.database.query.where
|
||||
import im.vector.matrix.android.internal.session.room.members.RoomDisplayNameResolver
|
||||
import im.vector.matrix.android.internal.session.room.members.RoomMembers
|
||||
@ -57,7 +58,7 @@ internal class RoomSummaryUpdater(monarchy: Monarchy,
|
||||
val roomSummary = RoomSummaryEntity.where(realm, roomId).findFirst()
|
||||
?: realm.createObject(roomId)
|
||||
|
||||
val lastMessageEvent = EventEntity.where(realm, roomId, EventType.MESSAGE).last()
|
||||
val lastEvent = EventEntity.latestEvent(realm, roomId)
|
||||
val lastTopicEvent = EventEntity.where(realm, roomId, EventType.STATE_ROOM_TOPIC).last()?.asDomain()
|
||||
|
||||
val otherRoomMembers = RoomMembers(realm, roomId).getLoaded().filterKeys { it != credentials.userId }
|
||||
@ -65,7 +66,7 @@ internal class RoomSummaryUpdater(monarchy: Monarchy,
|
||||
roomSummary.displayName = roomDisplayNameResolver.resolve(context, roomId).toString()
|
||||
roomSummary.avatarUrl = roomAvatarResolver.resolve(roomId)
|
||||
roomSummary.topic = lastTopicEvent?.content.toModel<RoomTopicContent>()?.topic
|
||||
roomSummary.lastMessage = lastMessageEvent
|
||||
roomSummary.lastMessage = lastEvent
|
||||
roomSummary.otherMemberIds.clear()
|
||||
roomSummary.otherMemberIds.addAll(otherRoomMembers.keys)
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user