diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt index 3448150ba1..1bcd0639ee 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt @@ -440,6 +440,9 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe lifecycle.repeatOnLifecycle(Lifecycle.State.RESUMED) { // only update the conversation every 3 seconds maximum // channel is rendezvous and shouldn't block on try send calls as often as we want + val layoutManager = binding?.conversationRecyclerView?.layoutManager as? LinearLayoutManager ?: return@repeatOnLifecycle + val lastItemPos = layoutManager.findLastCompletelyVisibleItemPosition() +// adapter.item withContext(Dispatchers.IO) { storage.markConversationAsRead(viewModel.threadId, SnodeAPI.nowWithOffset) } diff --git a/libsession/src/main/java/org/session/libsession/messaging/jobs/ConfigurationSyncJob.kt b/libsession/src/main/java/org/session/libsession/messaging/jobs/ConfigurationSyncJob.kt index fabf76e5b2..c046658dfc 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/jobs/ConfigurationSyncJob.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/jobs/ConfigurationSyncJob.kt @@ -54,17 +54,12 @@ data class ConfigurationSyncJob(val destination: Destination): Job { if (configsRequiringPush.isEmpty()) return delegate.handleJobSucceeded(this, dispatcherName) // need to get the current hashes before we call `push()` - val toDeleteRequest = configsRequiringPush.map { base -> - // accumulate by adding together - base.currentHashes() - }.reduce(List::plus).let { toDeleteFromAllNamespaces -> - if (toDeleteFromAllNamespaces.isEmpty()) null - else SnodeAPI.buildAuthenticatedDeleteBatchInfo(destination.destinationPublicKey(), toDeleteFromAllNamespaces) - } + val toDeleteHashes = mutableListOf() // allow null results here so the list index matches configsRequiringPush val batchObjects: List?> = configsRequiringPush.map { config -> - val (data, seqNo) = config.push() + val (data, seqNo, obsoleteHashes) = config.push() + toDeleteHashes += obsoleteHashes SharedConfigurationMessage(config.protoKindFor(), data, seqNo) to config }.map { (message, config) -> // return a list of batch request objects @@ -77,6 +72,11 @@ data class ConfigurationSyncJob(val destination: Destination): Job { message to authenticated // to keep track of seqNo for calling confirmPushed later } + val toDeleteRequest = toDeleteHashes.let { toDeleteFromAllNamespaces -> + if (toDeleteFromAllNamespaces.isEmpty()) null + else SnodeAPI.buildAuthenticatedDeleteBatchInfo(destination.destinationPublicKey(), toDeleteFromAllNamespaces) + } + if (batchObjects.any { it == null }) { // stop running here, something like a signing error occurred return delegate.handleJobFailedPermanently(this, dispatcherName, NullPointerException("One or more requests had a null batch request info"))