diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageListFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageListFragment.kt index fe5e21becf4eb1e251ced2e92f6ff93ea55cc8b9..e6c3e77b40d1c9ed05a8df0e3aa2c2fbd0644892 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageListFragment.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageListFragment.kt @@ -231,6 +231,21 @@ class MessageListFragment : ServiceBoundFragment() { } }) + fun processMessages(list: List<QuasselDatabase.DatabaseMessage>, selected: Set<MsgId>, + expanded: Set<MsgId>, markerLine: MsgId?): List<DisplayMessage> { + var previous: QuasselDatabase.DatabaseMessage? = null + return list.asReversed().map { + it.followUp = previous?.sender == it.sender + previous = it + DisplayMessage( + content = it, + isSelected = selected.contains(it.messageId), + isExpanded = expanded.contains(it.messageId), + isMarkerLine = markerLine == it.messageId + ) + }.asReversed() + } + val data = combineLatest(viewModel.buffer, viewModel.selectedMessages, viewModel.expandedMessages, @@ -238,13 +253,8 @@ class MessageListFragment : ServiceBoundFragment() { .toLiveData().switchMapNotNull { (buffer, selected, expanded, markerLine) -> database.filtered().listen(accountId, buffer).switchMapNotNull { filtered -> LivePagedListBuilder( - database.message().findByBufferIdPagedWithDayChange(buffer, filtered).map { - DisplayMessage( - content = it, - isSelected = selected.contains(it.messageId), - isExpanded = expanded.contains(it.messageId), - isMarkerLine = markerLine.orNull() == it.messageId - ) + database.message().findByBufferIdPagedWithDayChange(buffer, filtered).mapByPage { + processMessages(it, selected.keys, expanded, markerLine.orNull()) }, PagedList.Config.Builder() .setPageSize(backlogSettings.pageSize) diff --git a/lib/src/test/java/de/kuschku/libquassel/ConnectionUnitTest.kt b/lib/src/test/java/de/kuschku/libquassel/ConnectionUnitTest.kt index bd816b7425de117ca78c00fa2265892333bd529e..8d7514cb88f3ef8f90f70eb589d6c9c311c251f6 100644 --- a/lib/src/test/java/de/kuschku/libquassel/ConnectionUnitTest.kt +++ b/lib/src/test/java/de/kuschku/libquassel/ConnectionUnitTest.kt @@ -54,4 +54,4 @@ class ConnectionUnitTest { }, user to pass, {}, {}) session.join() } -} \ No newline at end of file +} diff --git a/persistence/src/main/java/de/kuschku/quasseldroid/persistence/QuasselDatabase.kt b/persistence/src/main/java/de/kuschku/quasseldroid/persistence/QuasselDatabase.kt index df1f595d5ef0443e315bbc7528901f0285182764..a72a63436ab5a7f722a6cf6678026996ac7397f7 100644 --- a/persistence/src/main/java/de/kuschku/quasseldroid/persistence/QuasselDatabase.kt +++ b/persistence/src/main/java/de/kuschku/quasseldroid/persistence/QuasselDatabase.kt @@ -201,6 +201,44 @@ fun QuasselDatabase.MessageDao.clearMessages( fun QuasselDatabase.MessageDao.findByBufferIdPagedWithDayChange(bufferId: Int, type: Int) = this.findMessagesRawPaged(SimpleSQLiteQuery(""" SELECT t.* +FROM + ( + SELECT + messageId, + time, + type, + flag, + bufferId, + sender, + senderPrefixes, + content, + followUp + FROM message + WHERE bufferId = ? + AND type & ~? > 0 + UNION ALL + SELECT DISTINCT + strftime('%s', date(datetime(time / 1000, 'unixepoch', 'localtime')), 'utc') * -1000 AS messageId, + strftime('%s', date(datetime(time / 1000, 'unixepoch', 'localtime')), 'utc') * 1000 AS time, + 8192 AS type, + 0 AS flag, + ? AS bufferId, + '' AS sender, + '' AS senderPrefixes, + '' AS content, + 0 AS followUp + FROM message + WHERE bufferId = ? + AND type & ~? > 0 + ) t +ORDER BY TIME + DESC, messageId + DESC + """, arrayOf(bufferId, type, bufferId, bufferId, type))) + +fun QuasselDatabase.MessageDao.findByBufferIdPagedWithDayChangeSlow(bufferId: Int, type: Int) = + this.findMessagesRawPaged(SimpleSQLiteQuery(""" +SELECT t.* FROM ( SELECT @@ -248,4 +286,4 @@ FROM ORDER BY TIME DESC, messageId DESC - """, arrayOf(bufferId, type, bufferId, type, bufferId, bufferId, type))) \ No newline at end of file + """, arrayOf(bufferId, type, bufferId, type, bufferId, bufferId, type))) diff --git a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt index 4d3b89ce7f6625293463b438473e57bebf649fd6..93e54b3353c6be7782cb1204324bb07a3941c39c 100644 --- a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt +++ b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt @@ -37,7 +37,7 @@ class QuasselViewModel : ViewModel() { return result.isNotEmpty() } - val expandedMessages = BehaviorSubject.createDefault(emptyList<MsgId>()) + val expandedMessages = BehaviorSubject.createDefault(emptySet<MsgId>()) val buffer = BehaviorSubject.createDefault(-1) val buffer_liveData = buffer.toLiveData()