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() {