feat: allow copying multiple messages (#601)

Refs: https://github.com/FossifyOrg/Messages/issues/600
This commit is contained in:
Naveen Singh 2025-11-22 22:21:34 +05:30 committed by GitHub
parent 7dff7d62b8
commit 30ecbbe3cb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 14 additions and 5 deletions

View file

@ -5,6 +5,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased] ## [Unreleased]
### Added
- Ability to select and copy multiple text messages at once ([#600])
## [1.6.0] - 2025-10-29 ## [1.6.0] - 2025-10-29
### Changed ### Changed
@ -200,6 +202,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
[#561]: https://github.com/FossifyOrg/Messages/issues/561 [#561]: https://github.com/FossifyOrg/Messages/issues/561
[#562]: https://github.com/FossifyOrg/Messages/issues/562 [#562]: https://github.com/FossifyOrg/Messages/issues/562
[#574]: https://github.com/FossifyOrg/Messages/issues/574 [#574]: https://github.com/FossifyOrg/Messages/issues/574
[#600]: https://github.com/FossifyOrg/Messages/issues/600
[Unreleased]: https://github.com/FossifyOrg/Messages/compare/1.6.0...HEAD [Unreleased]: https://github.com/FossifyOrg/Messages/compare/1.6.0...HEAD
[1.6.0]: https://github.com/FossifyOrg/Messages/compare/1.5.0...1.6.0 [1.6.0]: https://github.com/FossifyOrg/Messages/compare/1.5.0...1.6.0

View file

@ -115,14 +115,14 @@ class ThreadAdapter(
override fun prepareActionMode(menu: Menu) { override fun prepareActionMode(menu: Menu) {
val isOneItemSelected = isOneItemSelected() val isOneItemSelected = isOneItemSelected()
val selectedItem = getSelectedItems().firstOrNull() as? Message val selectedMessages = getSelectedItems().filterIsInstance<Message>()
val hasText = selectedItem?.body != null && selectedItem.body != "" val hasText = selectedMessages.any { it.body.isNotEmpty() }
val showSaveAs = getSelectedItems().all { val showSaveAs = getSelectedItems().all {
it is Message && (it.attachment?.attachments?.size ?: 0) > 0 it is Message && (it.attachment?.attachments?.size ?: 0) > 0
} && getSelectedAttachments().isNotEmpty() } && getSelectedAttachments().isNotEmpty()
menu.apply { menu.apply {
findItem(R.id.cab_copy_to_clipboard).isVisible = isOneItemSelected && hasText findItem(R.id.cab_copy_to_clipboard).isVisible = hasText
findItem(R.id.cab_save_as).isVisible = showSaveAs findItem(R.id.cab_save_as).isVisible = showSaveAs
findItem(R.id.cab_share).isVisible = isOneItemSelected && hasText findItem(R.id.cab_share).isVisible = isOneItemSelected && hasText
findItem(R.id.cab_forward_message).isVisible = isOneItemSelected findItem(R.id.cab_forward_message).isVisible = isOneItemSelected
@ -219,8 +219,14 @@ class ThreadAdapter(
} }
private fun copyToClipboard() { private fun copyToClipboard() {
val firstItem = getSelectedItems().firstOrNull() as? Message ?: return val selectedMessages = getSelectedItems().filterIsInstance<Message>()
activity.copyToClipboard(firstItem.body) val textToCopy = selectedMessages
.mapNotNull { message -> message.body.takeIf { it.isNotEmpty() } }
.joinToString("\n\n")
if (textToCopy.isNotEmpty()) {
activity.copyToClipboard(textToCopy)
}
} }
private fun getSelectedAttachments(): List<Attachment> { private fun getSelectedAttachments(): List<Attachment> {