Fix unrecycled delete actions (#836)

* fix: set view press/swipe/long press to null if message is deleted

* fix: deselects messages once they've been deleted
This commit is contained in:
Harris 2022-02-06 12:41:35 +11:00 committed by GitHub
parent 46aebb168c
commit 983e4f59d3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 45 additions and 11 deletions

View File

@ -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)

View File

@ -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<ViewHolder>(context, cursor) {
private val messageDB = DatabaseComponent.get(context).mmsSmsDatabase()
var selectedItems = mutableSetOf<MessageRecord>()
@ -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<MessageRecord>()
val toDeselect = mutableSetOf<Pair<Int, MessageRecord>>()
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)

View File

@ -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)
}