From fffe72b3675c55d3a8c927b3f79c23a7610897db Mon Sep 17 00:00:00 2001 From: Bram Hagens Date: Thu, 22 Jan 2026 09:59:14 +0100 Subject: [PATCH] feat: improve multi-message copy formatting (#671) * feat: improve multi-message copy formatting * use date-first format and preserve blank line separator Refs: #600 --- CHANGELOG.md | 1 + .../messages/adapters/ThreadAdapter.kt | 19 +++++++++++++++---- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 26e14f04..45386e28 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Made "Add number to contact" option visible for alphanumeric senders ([#232]) +- Improved multi-message copy formatting with timestamps and sender names ### Fixed - Fixed missing notifications in some cases ([#159]) diff --git a/app/src/main/kotlin/org/fossify/messages/adapters/ThreadAdapter.kt b/app/src/main/kotlin/org/fossify/messages/adapters/ThreadAdapter.kt index 62fa3075..d9aec0e6 100644 --- a/app/src/main/kotlin/org/fossify/messages/adapters/ThreadAdapter.kt +++ b/app/src/main/kotlin/org/fossify/messages/adapters/ThreadAdapter.kt @@ -38,6 +38,7 @@ import org.fossify.commons.extensions.formatDateOrTime import org.fossify.commons.extensions.getContrastColor import org.fossify.commons.extensions.getProperPrimaryColor import org.fossify.commons.extensions.getTextSize +import org.fossify.commons.extensions.getTimeFormat import org.fossify.commons.extensions.shareTextIntent import org.fossify.commons.extensions.showErrorToast import org.fossify.commons.extensions.usableScreenSize @@ -85,6 +86,7 @@ import org.fossify.messages.models.ThreadItem.ThreadDateTime import org.fossify.messages.models.ThreadItem.ThreadError import org.fossify.messages.models.ThreadItem.ThreadSending import org.fossify.messages.models.ThreadItem.ThreadSent +import org.joda.time.DateTime class ThreadAdapter( activity: SimpleActivity, @@ -220,10 +222,19 @@ class ThreadAdapter( private fun copyToClipboard() { val selectedMessages = getSelectedItems().filterIsInstance() - val textToCopy = selectedMessages - .mapNotNull { message -> message.body.takeIf { it.isNotEmpty() } } - .joinToString("\n\n") - + if (selectedMessages.isEmpty()) return + + val textToCopy = if (selectedMessages.size == 1) { + selectedMessages.first().body + } else { + selectedMessages.filter { it.body.isNotEmpty() }.joinToString("\n\n") { message -> + val format = "${activity.config.dateFormat}, ${activity.getTimeFormat()}" + val dateTime = DateTime(message.millis()).toString(format) + val sender = if (message.isReceivedMessage()) message.senderName else activity.getString(R.string.me) + "[$dateTime] $sender: ${message.body}" + } + } + if (textToCopy.isNotEmpty()) { activity.copyToClipboard(textToCopy) }