diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/persistence/QuasselDatabase.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/persistence/QuasselDatabase.kt index 5d7d0746a3a59aa7df5bc461e3ebb45c5c82dfc2..8d7daca1d983c26728fc99662b396d28ce8e60b3 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/persistence/QuasselDatabase.kt +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/persistence/QuasselDatabase.kt @@ -72,6 +72,9 @@ abstract class QuasselDatabase : RoomDatabase() { @Query("SELECT * FROM message WHERE bufferId = :bufferId ORDER BY messageId DESC LIMIT 1") fun findLastByBufferId(bufferId: Int): DatabaseMessage? + @Query("SELECT * FROM message WHERE bufferId = :bufferId ORDER BY messageId DESC LIMIT 1") + fun lastMsgId(bufferId: Int): LiveData<DatabaseMessage> + @Query("SELECT * FROM message WHERE bufferId = :bufferId ORDER BY messageId ASC LIMIT 1") fun findFirstByBufferId(bufferId: Int): DatabaseMessage? diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/messages/MessageListFragment.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/messages/MessageListFragment.kt index b08403f7eac1ea5fdedc64c3e791cb94a296bd97..50d269aa41807331741ef65c8c63ef0eb1ddff11 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/messages/MessageListFragment.kt +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/messages/MessageListFragment.kt @@ -102,21 +102,27 @@ class MessageListFragment : ServiceBoundFragment() { } handler.post { - viewModel.sessionManager.zip(viewModel.getBuffer(), data).observe( + val lastMessageId = viewModel.getBuffer().switchMapNotNull { + database.message().lastMsgId(it) + } + + var previousMessageId = -1 + viewModel.sessionManager.zip(lastMessageId).observe( this, Observer { val previous = lastBuffer ?: -1 val firstVisibleItemPosition = linearLayoutManager.findFirstVisibleItemPosition() - val messageId = adapter[firstVisibleItemPosition]?.messageId + val firstVisibleMessageId = adapter[firstVisibleItemPosition]?.messageId handler.post { val session = it?.first - val buffer = it?.second + val message = it?.second val bufferSyncer = session?.bufferSyncer - if (buffer != null && bufferSyncer != null) { - markAsRead(bufferSyncer, buffer, messageId) - if (buffer != previous) { - onBufferChange(previous, buffer, messageId, bufferSyncer) + if (message != null && bufferSyncer != null && previousMessageId != message.messageId) { + markAsRead(bufferSyncer, message.bufferId, message.messageId) + if (message.bufferId != previous) { + onBufferChange(previous, message.bufferId, firstVisibleMessageId, bufferSyncer) } - lastBuffer = buffer + lastBuffer = message.bufferId + previousMessageId = message.messageId } } }