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 916f7ba00..d6a8779f8 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 @@ -232,7 +232,12 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe onItemLongPress = { message, position -> handleLongPress(message, position) }, - glide + glide, + onDeselect = { message, position -> + actionMode?.let { + onDeselect(message, position, it) + } + } ) adapter.visibleMessageContentViewDelegate = this adapter @@ -799,14 +804,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe private fun handlePress(message: MessageRecord, position: Int, view: VisibleMessageView, event: MotionEvent) { val actionMode = this.actionMode if (actionMode != null) { - adapter.toggleSelection(message, position) - val actionModeCallback = ConversationActionModeCallback(adapter, viewModel.threadId, this) - actionModeCallback.delegate = this - actionModeCallback.updateActionModeMenu(actionMode.menu) - if (adapter.selectedItems.isEmpty()) { - actionMode.finish() - this.actionMode = null - } + onDeselect(message, position, actionMode) } else { // NOTE: // We have to use onContentClick (rather than a click listener directly on @@ -816,6 +814,17 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe } } + private fun onDeselect(message: MessageRecord, position: Int, actionMode: ActionMode) { + adapter.toggleSelection(message, position) + val actionModeCallback = ConversationActionModeCallback(adapter, viewModel.threadId, this) + actionModeCallback.delegate = this + actionModeCallback.updateActionModeMenu(actionMode.menu) + if (adapter.selectedItems.isEmpty()) { + actionMode.finish() + this.actionMode = null + } + } + // `position` is the adapter position; not the visual position private fun handleSwipeToReply(message: MessageRecord, position: Int) { binding.inputBar.draftQuote(viewModel.recipient, message, glide) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationAdapter.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationAdapter.kt index b3558ffe2..0c8bda33f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationAdapter.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationAdapter.kt @@ -15,7 +15,7 @@ import org.thoughtcrime.securesms.mms.GlideRequests class ConversationAdapter(context: Context, cursor: Cursor, private val onItemPress: (MessageRecord, Int, VisibleMessageView, MotionEvent) -> Unit, private val onItemSwipeToReply: (MessageRecord, Int) -> Unit, private val onItemLongPress: (MessageRecord, Int) -> Unit, - private val glide: GlideRequests) + private val glide: GlideRequests, private val onDeselect: (MessageRecord, Int) -> Unit) : CursorRecyclerViewAdapter(context, cursor) { private val messageDB = DatabaseComponent.get(context).mmsSmsDatabase() var selectedItems = mutableSetOf() @@ -69,6 +69,10 @@ class ConversationAdapter(context: Context, cursor: Cursor, private val onItemPr view.onPress = { event -> onItemPress(message, viewHolder.adapterPosition, view, event) } view.onSwipeToReply = { onItemSwipeToReply(message, viewHolder.adapterPosition) } view.onLongPress = { onItemLongPress(message, viewHolder.adapterPosition) } + } else { + view.onPress = null + view.onSwipeToReply = null + view.onLongPress = null } view.contentViewDelegate = visibleMessageContentViewDelegate } @@ -102,6 +106,27 @@ class ConversationAdapter(context: Context, cursor: Cursor, private val onItemPr return messageDB.readerFor(cursor).current } + override fun changeCursor(cursor: Cursor?) { + super.changeCursor(cursor) + val toRemove = mutableSetOf() + val toDeselect = mutableSetOf>() + for (selected in selectedItems) { + val position = getItemPositionForTimestamp(selected.timestamp) + if (position == null || position == -1) { + toRemove += selected + } else { + val item = getMessage(getCursorAtPositionOrThrow(position)) + if (item == null || item.isDeleted) { + toDeselect += position to selected + } + } + } + selectedItems -= toRemove + toDeselect.iterator().forEach { (pos, record) -> + onDeselect(record, pos) + } + } + fun toggleSelection(message: MessageRecord, position: Int) { if (selectedItems.contains(message)) selectedItems.remove(message) else selectedItems.add(message) notifyItemChanged(position) diff --git a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/OpenGroupPollerV2.kt b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/OpenGroupPollerV2.kt index c604fb7f9..90f4144cb 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/OpenGroupPollerV2.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/OpenGroupPollerV2.kt @@ -73,7 +73,7 @@ class OpenGroupPollerV2(private val server: String, private val executorService: builder.build() to message.serverID } - envelopes.chunked(20).forEach { list -> + envelopes.chunked(256).forEach { list -> val parameters = list.map { (message, serverId) -> MessageReceiveParameters(message.toByteArray(), openGroupMessageServerID = serverId) }