mirror of
https://github.com/oxen-io/session-android.git
synced 2025-02-19 21:28:26 +00:00
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:
parent
46aebb168c
commit
983e4f59d3
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user