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.TimelineEventController
|
||||||
import im.vector.riotredesign.features.home.room.detail.timeline.TimelineItemFactory
|
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.detail.timeline.helper.TimelineMediaSizeProvider
|
||||||
|
import im.vector.riotredesign.features.home.room.list.RoomSummaryComparator
|
||||||
import im.vector.riotredesign.features.home.room.list.RoomSummaryController
|
import im.vector.riotredesign.features.home.room.list.RoomSummaryController
|
||||||
import org.koin.dsl.module.module
|
import org.koin.dsl.module.module
|
||||||
|
|
||||||
@ -90,6 +91,10 @@ class HomeModule {
|
|||||||
HomePermalinkHandler(get())
|
HomePermalinkHandler(get())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
single {
|
||||||
|
RoomSummaryComparator()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -40,7 +40,8 @@ class RoomListViewModel(initialState: RoomListViewState,
|
|||||||
private val session: Session,
|
private val session: Session,
|
||||||
private val selectedGroupHolder: SelectedGroupHolder,
|
private val selectedGroupHolder: SelectedGroupHolder,
|
||||||
private val visibleRoomHolder: VisibleRoomHolder,
|
private val visibleRoomHolder: VisibleRoomHolder,
|
||||||
private val roomSelectionRepository: RoomSelectionRepository)
|
private val roomSelectionRepository: RoomSelectionRepository,
|
||||||
|
private val roomSummaryComparator: RoomSummaryComparator)
|
||||||
: RiotViewModel<RoomListViewState>(initialState) {
|
: RiotViewModel<RoomListViewState>(initialState) {
|
||||||
|
|
||||||
companion object : MvRxViewModelFactory<RoomListViewModel, RoomListViewState> {
|
companion object : MvRxViewModelFactory<RoomListViewModel, RoomListViewState> {
|
||||||
@ -51,7 +52,8 @@ class RoomListViewModel(initialState: RoomListViewState,
|
|||||||
val roomSelectionRepository = viewModelContext.activity.get<RoomSelectionRepository>()
|
val roomSelectionRepository = viewModelContext.activity.get<RoomSelectionRepository>()
|
||||||
val selectedGroupHolder = viewModelContext.activity.get<SelectedGroupHolder>()
|
val selectedGroupHolder = viewModelContext.activity.get<SelectedGroupHolder>()
|
||||||
val visibleRoomHolder = viewModelContext.activity.get<VisibleRoomHolder>()
|
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)
|
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
|
class RoomSummaryController(private val stringProvider: StringProvider
|
||||||
) : TypedEpoxyController<RoomListViewState>() {
|
) : TypedEpoxyController<RoomListViewState>() {
|
||||||
|
|
||||||
private var isDirectRoomsExpanded = true
|
|
||||||
private var isGroupRoomsExpanded = true
|
|
||||||
private var isFavoriteRoomsExpanded = true
|
private var isFavoriteRoomsExpanded = true
|
||||||
private var isLowPriorityRoomsExpanded = true
|
private var isDirectRoomsExpanded = false
|
||||||
private var isServerNoticeRoomsExpanded = true
|
private var isGroupRoomsExpanded = false
|
||||||
|
private var isLowPriorityRoomsExpanded = false
|
||||||
|
private var isServerNoticeRoomsExpanded = false
|
||||||
|
|
||||||
var callback: Callback? = null
|
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) {
|
private fun buildRoomCategory(viewState: RoomListViewState, summaries: List<RoomSummary>, @StringRes titleRes: Int, isExpanded: Boolean, mutateExpandedState: () -> Unit) {
|
||||||
//TODO should add some business logic later
|
//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 }
|
val showHighlighted = summaries.any { it.highlightCount > 0 }
|
||||||
RoomCategoryItem(
|
RoomCategoryItem(
|
||||||
title = stringProvider.getString(titleRes).toUpperCase(),
|
title = stringProvider.getString(titleRes).toUpperCase(),
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package im.vector.matrix.android.api.session.room.model
|
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
|
import im.vector.matrix.android.api.session.room.model.tag.RoomTag
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -28,6 +29,7 @@ data class RoomSummary(
|
|||||||
val topic: String = "",
|
val topic: String = "",
|
||||||
val avatarUrl: String = "",
|
val avatarUrl: String = "",
|
||||||
val isDirect: Boolean,
|
val isDirect: Boolean,
|
||||||
|
val lastMessage: Event? = null,
|
||||||
val otherMemberIds: List<String> = emptyList(),
|
val otherMemberIds: List<String> = emptyList(),
|
||||||
var notificationCount: Int = 0,
|
var notificationCount: Int = 0,
|
||||||
var highlightCount: Int = 0,
|
var highlightCount: Int = 0,
|
||||||
|
@ -33,6 +33,7 @@ internal object RoomSummaryMapper {
|
|||||||
topic = roomSummaryEntity.topic ?: "",
|
topic = roomSummaryEntity.topic ?: "",
|
||||||
avatarUrl = roomSummaryEntity.avatarUrl ?: "",
|
avatarUrl = roomSummaryEntity.avatarUrl ?: "",
|
||||||
isDirect = roomSummaryEntity.isDirect,
|
isDirect = roomSummaryEntity.isDirect,
|
||||||
|
lastMessage = roomSummaryEntity.lastMessage?.asDomain(),
|
||||||
otherMemberIds = roomSummaryEntity.otherMemberIds.toList(),
|
otherMemberIds = roomSummaryEntity.otherMemberIds.toList(),
|
||||||
highlightCount = roomSummaryEntity.highlightCount,
|
highlightCount = roomSummaryEntity.highlightCount,
|
||||||
notificationCount = roomSummaryEntity.notificationCount,
|
notificationCount = roomSummaryEntity.notificationCount,
|
||||||
|
@ -50,9 +50,13 @@ internal fun EventEntity.Companion.where(realm: Realm,
|
|||||||
}
|
}
|
||||||
|
|
||||||
internal fun EventEntity.Companion.latestEvent(realm: Realm,
|
internal fun EventEntity.Companion.latestEvent(realm: Realm,
|
||||||
roomId: String): EventEntity? {
|
roomId: String,
|
||||||
val chunkEntity = ChunkEntity.findLastLiveChunkFromRoom(realm, roomId)
|
excludedTypes: List<String> = emptyList()): EventEntity? {
|
||||||
return chunkEntity?.events?.where()?.sort(EventEntityFields.DISPLAY_INDEX)?.findFirst()
|
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.RoomEntity
|
||||||
import im.vector.matrix.android.internal.database.model.RoomSummaryEntity
|
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.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.database.query.where
|
||||||
import im.vector.matrix.android.internal.session.room.members.RoomDisplayNameResolver
|
import im.vector.matrix.android.internal.session.room.members.RoomDisplayNameResolver
|
||||||
import im.vector.matrix.android.internal.session.room.members.RoomMembers
|
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()
|
val roomSummary = RoomSummaryEntity.where(realm, roomId).findFirst()
|
||||||
?: realm.createObject(roomId)
|
?: 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 lastTopicEvent = EventEntity.where(realm, roomId, EventType.STATE_ROOM_TOPIC).last()?.asDomain()
|
||||||
|
|
||||||
val otherRoomMembers = RoomMembers(realm, roomId).getLoaded().filterKeys { it != credentials.userId }
|
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.displayName = roomDisplayNameResolver.resolve(context, roomId).toString()
|
||||||
roomSummary.avatarUrl = roomAvatarResolver.resolve(roomId)
|
roomSummary.avatarUrl = roomAvatarResolver.resolve(roomId)
|
||||||
roomSummary.topic = lastTopicEvent?.content.toModel<RoomTopicContent>()?.topic
|
roomSummary.topic = lastTopicEvent?.content.toModel<RoomTopicContent>()?.topic
|
||||||
roomSummary.lastMessage = lastMessageEvent
|
roomSummary.lastMessage = lastEvent
|
||||||
roomSummary.otherMemberIds.clear()
|
roomSummary.otherMemberIds.clear()
|
||||||
roomSummary.otherMemberIds.addAll(otherRoomMembers.keys)
|
roomSummary.otherMemberIds.addAll(otherRoomMembers.keys)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user