Avoid missing timestamps due to missing previewable event

Just use a non-previewable event instead.
Improves sorting of the room list: don't drop rooms to the bottom
because of too much un-previewable activity.

Change-Id: Ib1ad8050caae85a3e7c8a686c2fa63a2924db890
This commit is contained in:
SpiritCroc 2022-05-22 12:22:20 +02:00
parent d74b8b76e8
commit c214e5daf1
4 changed files with 22 additions and 5 deletions

View file

@ -53,6 +53,7 @@ data class RoomSummary(
val hasUnreadMessages: Boolean = false,
val hasUnreadContentMessages: Boolean = false,
val hasUnreadOriginalContentMessages: Boolean = false,
val lastActivityTime: Long? = null,
val unreadCount: Int? = null,
val markedUnread: Boolean = false,
val aggregatedUnreadCount: Int = 0,

View file

@ -73,6 +73,7 @@ internal class RoomSummaryMapper @Inject constructor(private val timelineEventMa
hasUnreadMessages = roomSummaryEntity.hasUnreadMessages,
hasUnreadContentMessages = roomSummaryEntity.hasUnreadContentMessages,
hasUnreadOriginalContentMessages = roomSummaryEntity.hasUnreadOriginalContentMessages,
lastActivityTime = roomSummaryEntity.lastActivityTime,
markedUnread = roomSummaryEntity.markedUnread,
tags = tags,
typingUsers = typingUsers,

View file

@ -56,6 +56,7 @@ import org.matrix.android.sdk.internal.database.query.findAllInRoomWithSendState
import org.matrix.android.sdk.internal.database.query.getOrCreate
import org.matrix.android.sdk.internal.database.query.getOrNull
import org.matrix.android.sdk.internal.database.query.isEventRead
import org.matrix.android.sdk.internal.database.query.latestEvent
import org.matrix.android.sdk.internal.database.query.where
import org.matrix.android.sdk.internal.di.UserId
import org.matrix.android.sdk.internal.extensions.clearWith
@ -153,12 +154,24 @@ internal class RoomSummaryUpdater @Inject constructor(
val lastActivityFromEvent = scLatestPreviewableEvent?.root?.originServerTs
if (lastActivityFromEvent != null) {
roomSummaryEntity.lastActivityTime = lastActivityFromEvent
attemptToDecryptLatestPreviewables(
roomSummaryEntity.latestPreviewableEvent,
roomSummaryEntity.latestPreviewableContentEvent,
roomSummaryEntity.latestPreviewableOriginalContentEvent
)
} else if (latestPreviewableEvent != scLatestPreviewableEvent) {
// Try using a less aggressive previewable filter for last activity, so we avoid null timestamps, which would just drop the room to the bottom
roomSummaryEntity.lastActivityTime = latestPreviewableEvent?.root?.originServerTs
}
// If we still did not find a timestamp for the last activity:
// Any (non-previewable) event is still better for sorting than just dropping the room to the bottom in the list
if (roomSummaryEntity.lastActivityTime == null) {
roomSummaryEntity.lastActivityTime = TimelineEventEntity.latestEvent(
realm = realm,
roomId = roomId,
includesSending = true
)?.root?.originServerTs
}
attemptToDecryptLatestPreviewables(
roomSummaryEntity.latestPreviewableEvent,
roomSummaryEntity.latestPreviewableContentEvent,
roomSummaryEntity.latestPreviewableOriginalContentEvent
)
val roomSummaryUnreadCount = roomSummaryEntity.unreadCount
if (roomSummaryUnreadCount != null /* && preferences.prioritizeUnreadCountsOverRoomPreviewsForUnreadCalculation() */) {

View file

@ -117,6 +117,8 @@ class RoomSummaryItemFactory @Inject constructor(private val displayableEventFor
if (latestEvent != null) {
latestFormattedEvent = displayableEventFormatter.format(latestEvent, roomSummary.isDirect, roomSummary.isDirect.not())
latestEventTime = dateFormatter.format(latestEvent.root.originServerTs, DateFormatKind.ROOM_LIST)
} else if (roomSummary.lastActivityTime != null) {
latestEventTime = dateFormatter.format(roomSummary.lastActivityTime, DateFormatKind.ROOM_LIST)
}
val typingMessage = typingHelper.getTypingMessage(roomSummary.typingUsers)
return RoomSummaryItem_()