diff --git a/app/src/main/java/de/kuschku/quasseldroid/service/BacklogRequester.kt b/app/src/main/java/de/kuschku/quasseldroid/service/BacklogRequester.kt index d044c3e88d95adb3abaef15b504d205ae50c38cb..d6bae199432d15f240b669dc7ec8ae80fbee67da 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/service/BacklogRequester.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/service/BacklogRequester.kt @@ -22,7 +22,11 @@ package de.kuschku.quasseldroid.service import de.kuschku.libquassel.protocol.BufferId import de.kuschku.libquassel.protocol.Message import de.kuschku.libquassel.protocol.MsgId +import de.kuschku.libquassel.session.ISession +import de.kuschku.libquassel.util.compatibility.LoggingHandler.Companion.log +import de.kuschku.libquassel.util.compatibility.LoggingHandler.LogLevel.ERROR import de.kuschku.libquassel.util.helpers.value +import de.kuschku.quasseldroid.persistence.QuasselBacklogStorage import de.kuschku.quasseldroid.persistence.QuasselDatabase import de.kuschku.quasseldroid.viewmodel.QuasselViewModel @@ -34,36 +38,53 @@ class BacklogRequester( lastMessageId: MsgId? = null, untilAllVisible: Boolean = false, finishCallback: () -> Unit) { + log(ERROR, + "BacklogRequester", + "requested(buffer: $buffer, amount: $amount, pageSize: $pageSize, lastMessageId: $lastMessageId, untilAllVisible: $untilAllVisible)") var missing = amount - viewModel.session.value?.orNull()?.backlogManager?.let { - it.requestBacklog( - bufferId = buffer, - last = lastMessageId ?: database.message().findFirstByBufferId( - buffer - )?.messageId ?: -1, - limit = amount - ) { - if (it.isNotEmpty()) { - val filtered = database.filtered().get(accountId, buffer) ?: 0 - missing -= it.count { - (it.type.value and filtered.inv()) != 0 - } - val hasLoadedAll = missing == 0 - val hasLoadedAny = missing < amount - if (untilAllVisible && !hasLoadedAll || !untilAllVisible && !hasLoadedAny) { - val messageId = it.map(Message::messageId).min() - loadMore(accountId, - buffer, - missing, - pageSize, - messageId, - untilAllVisible, - finishCallback) + viewModel.session.value?.orNull()?.let { session: ISession -> + session.backlogManager?.let { + val filtered = database.filtered().get(accountId, buffer) ?: 0 + it.requestBacklog( + bufferId = buffer, + last = lastMessageId ?: database.message().findFirstByBufferId( + buffer + )?.messageId ?: -1, + limit = amount + ) { + log(ERROR, + "BacklogRequester", + "received(buffer: $buffer, amount: $amount, pageSize: $pageSize, lastMessageId: $lastMessageId, untilAllVisible: $untilAllVisible)") + log(ERROR, "BacklogRequester", "message count: ${it.size}") + if (it.isNotEmpty()) { + val visibleMessages = it.count { + (it.type.value and filtered.inv()) != 0 && + !QuasselBacklogStorage.isIgnored(session, it) + } + log(ERROR, "BacklogRequester", "visibleMessages: $visibleMessages") + missing -= visibleMessages + val hasLoadedAll = missing == 0 + val hasLoadedAny = missing < amount + if (untilAllVisible && !hasLoadedAll || !untilAllVisible && !hasLoadedAny) { + val messageId = it.map(Message::messageId).min() + loadMore(accountId, + buffer, + missing, + pageSize, + messageId, + untilAllVisible, + finishCallback) + true + } else { + log(ERROR, "BacklogRequester", "finished") + finishCallback() + true + } } else { + log(ERROR, "BacklogRequester", "finished") finishCallback() + true } - } else { - finishCallback() } } } diff --git a/app/src/main/java/de/kuschku/quasseldroid/service/QuasselNotificationBackend.kt b/app/src/main/java/de/kuschku/quasseldroid/service/QuasselNotificationBackend.kt index b9a452c90650f1f69fead6fdf74fc82d67d192e3..a05b91fb43ab4e720bde13a48fad731fb564ae7b 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/service/QuasselNotificationBackend.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/service/QuasselNotificationBackend.kt @@ -109,6 +109,7 @@ class QuasselNotificationBackend @Inject constructor( 0 ) { processMessages(session, *it.toTypedArray()) + false } } NotificationSettings.Level.HIGHLIGHT -> { @@ -122,6 +123,7 @@ class QuasselNotificationBackend @Inject constructor( Message_Flag.of(Message_Flag.Highlight).toInt() ) { processMessages(session, *it.toTypedArray()) + false } } } diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt index 29aaabcee5e655d8c21be929bfb175620686b015..28082401528b8f8ee31f8bb1bb0dba8689a2e490 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt @@ -632,6 +632,7 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc database.filtered().replace( QuasselDatabase.Filtered(accountId, buffer, newlyFiltered.value) ) + backend.value.orNull()?.sessionManager()?.backlogStorage?.clearMessages(buffer) } }.negativeColorAttr(R.attr.colorTextPrimary) .backgroundColorAttr(R.attr.colorBackgroundCard) 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 35a0dd92deb9c20b66705cddd416ca7d16a0de54..07fbae84786f0af4ed70788c5e5d0d7790a8c26b 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 @@ -45,6 +45,8 @@ import de.kuschku.libquassel.protocol.BufferId import de.kuschku.libquassel.protocol.MsgId import de.kuschku.libquassel.quassel.syncables.BufferSyncer import de.kuschku.libquassel.session.SessionManager +import de.kuschku.libquassel.util.compatibility.LoggingHandler.Companion.log +import de.kuschku.libquassel.util.compatibility.LoggingHandler.LogLevel.ERROR import de.kuschku.libquassel.util.helpers.mapSwitchMap import de.kuschku.libquassel.util.helpers.value import de.kuschku.libquassel.util.irc.HostmaskHelper @@ -195,7 +197,10 @@ class MessageListFragment : ServiceBoundFragment() { private val boundaryCallback = object : PagedList.BoundaryCallback<DisplayMessage>() { override fun onItemAtFrontLoaded(itemAtFront: DisplayMessage) = Unit - override fun onItemAtEndLoaded(itemAtEnd: DisplayMessage) = loadMore() + override fun onItemAtEndLoaded(itemAtEnd: DisplayMessage) { + log(ERROR, "MessageListFragment", "onItemAtEndLoaded") + loadMore() + } } override fun onCreateView( @@ -249,6 +254,7 @@ class MessageListFragment : ServiceBoundFragment() { swipeRefreshLayout.setColorSchemeColors(*senderColors) swipeRefreshLayout.setOnRefreshListener { + log(ERROR, "MessageListFragment", "swipeRefreshed") loadMore() } @@ -327,7 +333,9 @@ class MessageListFragment : ServiceBoundFragment() { viewModel.buffer { bufferId -> val filtered = database.filtered().get(accountId, bufferId) // Try loading messages when switching to isEmpty buffer - if (!database.message().hasVisibleMessages(bufferId, filtered ?: 0)) { + val hasVisibleMessages = database.message().hasVisibleMessages(bufferId, filtered ?: 0) + log(ERROR, "MessageListFragment", "connected(hasVisibleMessages: $hasVisibleMessages)") + if (!hasVisibleMessages) { if (bufferId > 0 && bufferId != Int.MAX_VALUE) { loadMore(initial = true) } @@ -363,6 +371,8 @@ class MessageListFragment : ServiceBoundFragment() { var lastBuffer = -1 data.observe(this, Observer { list -> + log(ERROR, "MessageListFragment", "Messages Changed ${list?.size}") + val firstVisibleItemPosition = linearLayoutManager.findFirstVisibleItemPosition() val firstVisibleMessageId = adapter[firstVisibleItemPosition]?.content?.messageId runInBackground { @@ -440,7 +450,9 @@ class MessageListFragment : ServiceBoundFragment() { } // Try loading messages when switching to isEmpty buffer val filtered = database.filtered().get(accountId, current) - if (!database.message().hasVisibleMessages(current, filtered ?: 0)) { + val hasVisibleMessages = database.message().hasVisibleMessages(current, filtered ?: 0) + log(ERROR, "MessageListFragment", "bufferChange(hasVisibleMessages: $hasVisibleMessages)") + if (!hasVisibleMessages) { if (current > 0 && current != Int.MAX_VALUE) { loadMore(initial = true) }