diff --git a/legacy/ui/legacy/src/main/java/com/fsck/k9/ui/messageview/MessagePrinter.kt b/legacy/ui/legacy/src/main/java/com/fsck/k9/ui/messageview/MessagePrinter.kt new file mode 100644 index 00000000000..0bf57280a05 --- /dev/null +++ b/legacy/ui/legacy/src/main/java/com/fsck/k9/ui/messageview/MessagePrinter.kt @@ -0,0 +1,104 @@ +package com.fsck.k9.ui.messageview + +import android.content.Context +import android.print.PrintAttributes +import android.print.PrintManager +import com.fsck.k9.mail.Address +import com.fsck.k9.mail.Message +import com.fsck.k9.mailstore.MessageViewInfo +import com.fsck.k9.view.MessageWebView +import java.text.SimpleDateFormat +import java.util.Locale + +class MessagePrinter( + private val context: Context, + private val appName: String, + private val noSubjectText: String, +) { + fun print(messageViewInfo: MessageViewInfo) { + val printManager = context.getSystemService(Context.PRINT_SERVICE) as? PrintManager ?: return + + val subject = messageViewInfo.message.subject ?: noSubjectText + val headerHtml = buildHeaderHtml(messageViewInfo) + val cleanBodyHtml = (messageViewInfo.text ?: "") + .replace(Regex("(?i)]*>"), "") + .replace(Regex("(?i)"), "") + val fullHtml = buildFullHtml(headerHtml, cleanBodyHtml) + + val printWebView = MessageWebView(context) + printWebView.displayHtmlContentWithInlineAttachments( + htmlText = fullHtml, + attachmentResolver = null, + onPageFinishedListener = { + val jobName = "$appName: $subject" + val printAdapter = printWebView.createPrintDocumentAdapter(jobName) + printManager.print(jobName, printAdapter, PrintAttributes.Builder().build()) + }, + ) + } + + private fun buildFullHtml(headerHtml: String, bodyHtml: String): String = """ + + + + + +
+ $headerHtml + $bodyHtml +
+ + + """.trimIndent() + + private fun buildHeaderHtml(messageViewInfo: MessageViewInfo): String { + val message = messageViewInfo.message + + val subject = (message.subject ?: noSubjectText) + .replace("<", "<") + .replace(">", ">") + + val from = message.from + ?.joinToString(", ") { it.toDisplayString() } + ?: "" + + val to = message.getRecipients(Message.RecipientType.TO) + ?.joinToString(", ") { it.toDisplayString() } + ?: "" + + val date = message.sentDate?.let { + SimpleDateFormat("M/d/yyyy, h:mm a", Locale.getDefault()).format(it) + } ?: "" + + return """ +
+

Subject: $subject

+

From: $from

+

Date: $date

+

To: $to

+
+
+ """.trimIndent() + } + + private fun Address.toDisplayString(): String { + val name = personal ?: "" + return if (name.isNotBlank() && address.isNotBlank()) { + "$name <$address>" + } else { + address ?: "" + } + } +} diff --git a/legacy/ui/legacy/src/main/java/com/fsck/k9/ui/messageview/MessageViewFragment.kt b/legacy/ui/legacy/src/main/java/com/fsck/k9/ui/messageview/MessageViewFragment.kt index 432a69fc8a9..54887a924fd 100644 --- a/legacy/ui/legacy/src/main/java/com/fsck/k9/ui/messageview/MessageViewFragment.kt +++ b/legacy/ui/legacy/src/main/java/com/fsck/k9/ui/messageview/MessageViewFragment.kt @@ -10,8 +10,6 @@ import android.net.Uri import android.os.Bundle import android.os.Parcelable import android.os.SystemClock -import android.print.PrintAttributes -import android.print.PrintManager import android.view.ContextThemeWrapper import android.view.LayoutInflater import android.view.Menu @@ -20,7 +18,6 @@ import android.view.MenuItem import android.view.View import android.view.ViewGroup import android.view.inputmethod.InputMethodManager -import android.webkit.WebView import android.widget.Toast import androidx.activity.result.ActivityResultLauncher import androidx.compose.runtime.collectAsState @@ -477,20 +474,12 @@ class MessageViewFragment : } private fun printMessage() { - val context = context - val webView = view?.findViewById(R.id.message_content) - val printManager = context?.getSystemService(Context.PRINT_SERVICE) as? PrintManager - if (context == null || webView == null || printManager == null) return - - val subject = mMessageViewInfo?.subject ?: getString(R.string.general_no_subject) - val jobName = appNameProvider.appName + ": " + subject - val printAdapter = webView.createPrintDocumentAdapter(jobName) - - printManager.print( - jobName, - printAdapter, - PrintAttributes.Builder().build(), - ) + val messageViewInfo = mMessageViewInfo ?: return + MessagePrinter( + context = requireContext(), + appName = appNameProvider.appName, + noSubjectText = getString(R.string.general_no_subject), + ).print(messageViewInfo) } private fun onShowHeaders() {