mirror of
https://github.com/oxen-io/session-android.git
synced 2025-02-21 12:38:27 +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 ->
|
onItemLongPress = { message, position ->
|
||||||
handleLongPress(message, position)
|
handleLongPress(message, position)
|
||||||
},
|
},
|
||||||
glide
|
glide,
|
||||||
|
onDeselect = { message, position ->
|
||||||
|
actionMode?.let {
|
||||||
|
onDeselect(message, position, it)
|
||||||
|
}
|
||||||
|
}
|
||||||
)
|
)
|
||||||
adapter.visibleMessageContentViewDelegate = this
|
adapter.visibleMessageContentViewDelegate = this
|
||||||
adapter
|
adapter
|
||||||
@ -799,14 +804,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
|
|||||||
private fun handlePress(message: MessageRecord, position: Int, view: VisibleMessageView, event: MotionEvent) {
|
private fun handlePress(message: MessageRecord, position: Int, view: VisibleMessageView, event: MotionEvent) {
|
||||||
val actionMode = this.actionMode
|
val actionMode = this.actionMode
|
||||||
if (actionMode != null) {
|
if (actionMode != null) {
|
||||||
adapter.toggleSelection(message, position)
|
onDeselect(message, position, actionMode)
|
||||||
val actionModeCallback = ConversationActionModeCallback(adapter, viewModel.threadId, this)
|
|
||||||
actionModeCallback.delegate = this
|
|
||||||
actionModeCallback.updateActionModeMenu(actionMode.menu)
|
|
||||||
if (adapter.selectedItems.isEmpty()) {
|
|
||||||
actionMode.finish()
|
|
||||||
this.actionMode = null
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
// NOTE:
|
// NOTE:
|
||||||
// We have to use onContentClick (rather than a click listener directly on
|
// 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
|
// `position` is the adapter position; not the visual position
|
||||||
private fun handleSwipeToReply(message: MessageRecord, position: Int) {
|
private fun handleSwipeToReply(message: MessageRecord, position: Int) {
|
||||||
binding.inputBar.draftQuote(viewModel.recipient, message, glide)
|
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,
|
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 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) {
|
: CursorRecyclerViewAdapter<ViewHolder>(context, cursor) {
|
||||||
private val messageDB = DatabaseComponent.get(context).mmsSmsDatabase()
|
private val messageDB = DatabaseComponent.get(context).mmsSmsDatabase()
|
||||||
var selectedItems = mutableSetOf<MessageRecord>()
|
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.onPress = { event -> onItemPress(message, viewHolder.adapterPosition, view, event) }
|
||||||
view.onSwipeToReply = { onItemSwipeToReply(message, viewHolder.adapterPosition) }
|
view.onSwipeToReply = { onItemSwipeToReply(message, viewHolder.adapterPosition) }
|
||||||
view.onLongPress = { onItemLongPress(message, viewHolder.adapterPosition) }
|
view.onLongPress = { onItemLongPress(message, viewHolder.adapterPosition) }
|
||||||
|
} else {
|
||||||
|
view.onPress = null
|
||||||
|
view.onSwipeToReply = null
|
||||||
|
view.onLongPress = null
|
||||||
}
|
}
|
||||||
view.contentViewDelegate = visibleMessageContentViewDelegate
|
view.contentViewDelegate = visibleMessageContentViewDelegate
|
||||||
}
|
}
|
||||||
@ -102,6 +106,27 @@ class ConversationAdapter(context: Context, cursor: Cursor, private val onItemPr
|
|||||||
return messageDB.readerFor(cursor).current
|
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) {
|
fun toggleSelection(message: MessageRecord, position: Int) {
|
||||||
if (selectedItems.contains(message)) selectedItems.remove(message) else selectedItems.add(message)
|
if (selectedItems.contains(message)) selectedItems.remove(message) else selectedItems.add(message)
|
||||||
notifyItemChanged(position)
|
notifyItemChanged(position)
|
||||||
|
@ -73,7 +73,7 @@ class OpenGroupPollerV2(private val server: String, private val executorService:
|
|||||||
builder.build() to message.serverID
|
builder.build() to message.serverID
|
||||||
}
|
}
|
||||||
|
|
||||||
envelopes.chunked(20).forEach { list ->
|
envelopes.chunked(256).forEach { list ->
|
||||||
val parameters = list.map { (message, serverId) ->
|
val parameters = list.map { (message, serverId) ->
|
||||||
MessageReceiveParameters(message.toByteArray(), openGroupMessageServerID = serverId)
|
MessageReceiveParameters(message.toByteArray(), openGroupMessageServerID = serverId)
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user