Loading app/core/src/main/java/com/fsck/k9/message/quote/QuoteHelper.kt +1 −1 Original line number Diff line number Diff line Loading @@ -11,7 +11,7 @@ import com.fsck.k9.K9 import com.fsck.k9.mail.Message internal class QuoteHelper(private val resources: Resources) { class QuoteHelper(private val resources: Resources) { /** * Extract the date from a message and convert it into a locale-specific Loading app/core/src/main/java/com/fsck/k9/message/quote/TextQuoteCreator.kt +84 −62 Original line number Diff line number Diff line package com.fsck.k9.message.quote; package com.fsck.k9.message.quote import java.util.regex.Matcher; import com.fsck.k9.Account.QuoteStyle import com.fsck.k9.CoreResourceProvider import com.fsck.k9.mail.Address import com.fsck.k9.mail.Message import com.fsck.k9.mail.Message.RecipientType import com.fsck.k9.message.quote.QuoteHelper.Companion.QUOTE_BUFFER_LENGTH import com.fsck.k9.Account.QuoteStyle; import com.fsck.k9.CoreResourceProvider; import com.fsck.k9.mail.Address; import com.fsck.k9.mail.Message; import com.fsck.k9.mail.Message.RecipientType; import static com.fsck.k9.message.quote.QuoteHelper.QUOTE_BUFFER_LENGTH; class TextQuoteCreator(private val quoteHelper: QuoteHelper, private val resourceProvider: CoreResourceProvider) { private val prefixInsertionRegex = Regex("(?m)^") public class TextQuoteCreator { private final QuoteHelper quoteHelper; private final CoreResourceProvider resourceProvider; public TextQuoteCreator(QuoteHelper quoteHelper, CoreResourceProvider resourceProvider) { this.quoteHelper = quoteHelper; this.resourceProvider = resourceProvider; fun quoteOriginalTextMessage( originalMessage: Message, messageBody: String?, quoteStyle: QuoteStyle, prefix: String ): String { val body = messageBody ?: "" return when (quoteStyle) { QuoteStyle.PREFIX -> prefixQuoteText(body, originalMessage, prefix) QuoteStyle.HEADER -> headerQuoteText(body, originalMessage) } } /** * Add quoting markup to a text message. * @param originalMessage Metadata for message being quoted. * @param messageBody Text of the message to be quoted. * @param quoteStyle Style of quoting. * @return Quoted text. */ public String quoteOriginalTextMessage(Message originalMessage, String messageBody, QuoteStyle quoteStyle, String prefix) { String body = messageBody == null ? "" : messageBody; String sentDate = quoteHelper.getSentDateText(originalMessage); if (quoteStyle == QuoteStyle.PREFIX) { String sender = Address.toString(originalMessage.getFrom()); StringBuilder quotedText = new StringBuilder(body.length() + QUOTE_BUFFER_LENGTH); if (sentDate.length() != 0) { String replyHeader = resourceProvider.replyHeader(sender, sentDate); quotedText.append(replyHeader); private fun prefixQuoteText(body: String, originalMessage: Message, prefix: String): String { val sentDate = quoteHelper.getSentDateText(originalMessage) val sender = Address.toString(originalMessage.from) return StringBuilder(body.length + QUOTE_BUFFER_LENGTH).apply { val replyHeader = if (sentDate.isEmpty()) { resourceProvider.replyHeader(sender) } else { String replyHeader = resourceProvider.replyHeader(sender); quotedText.append(replyHeader); resourceProvider.replyHeader(sender, sentDate) } quotedText.append("\r\n"); final String escapedPrefix = Matcher.quoteReplacement(prefix); quotedText.append(body.replaceAll("(?m)^", escapedPrefix)); return quotedText.toString(); } else if (quoteStyle == QuoteStyle.HEADER) { StringBuilder quotedText = new StringBuilder(body.length() + QUOTE_BUFFER_LENGTH); quotedText.append("\r\n"); quotedText.append(resourceProvider.messageHeaderSeparator()).append("\r\n"); if (originalMessage.getFrom() != null && Address.toString(originalMessage.getFrom()).length() != 0) { quotedText.append(resourceProvider.messageHeaderFrom()).append(" ").append(Address.toString(originalMessage.getFrom())).append("\r\n"); append(replyHeader) append(CRLF) val escapedPrefix = Regex.escapeReplacement(prefix) val prefixedText = body.replace(prefixInsertionRegex, escapedPrefix) append(prefixedText) }.toString() } if (sentDate.length() != 0) { quotedText.append(resourceProvider.messageHeaderDate()).append(" ").append(sentDate).append("\r\n"); private fun headerQuoteText(body: String, originalMessage: Message): String { val sentDate = quoteHelper.getSentDateText(originalMessage) return StringBuilder(body.length + QUOTE_BUFFER_LENGTH).apply { append(CRLF) append(resourceProvider.messageHeaderSeparator()) append(CRLF) originalMessage.from.displayString()?.let { fromAddresses -> append(resourceProvider.messageHeaderFrom()) append(" ") append(fromAddresses) append(CRLF) } if (originalMessage.getRecipients(RecipientType.TO) != null && originalMessage.getRecipients(RecipientType.TO).length != 0) { quotedText.append(resourceProvider.messageHeaderTo()).append(" ").append(Address.toString(originalMessage.getRecipients(RecipientType.TO))).append("\r\n"); if (sentDate.isNotEmpty()) { append(resourceProvider.messageHeaderDate()) append(" ") append(sentDate) append(CRLF) } if (originalMessage.getRecipients(RecipientType.CC) != null && originalMessage.getRecipients(RecipientType.CC).length != 0) { quotedText.append(resourceProvider.messageHeaderCc()).append(" ").append(Address.toString(originalMessage.getRecipients(RecipientType.CC))).append("\r\n"); originalMessage.getRecipients(RecipientType.TO).displayString()?.let { toAddresses -> append(resourceProvider.messageHeaderTo()) append(" ") append(toAddresses) append(CRLF) } if (originalMessage.getSubject() != null) { quotedText.append(resourceProvider.messageHeaderSubject()).append(" ").append(originalMessage.getSubject()).append("\r\n"); originalMessage.getRecipients(RecipientType.CC).displayString()?.let { ccAddresses -> append(resourceProvider.messageHeaderCc()) append(" ") append(ccAddresses) append(CRLF) } quotedText.append("\r\n"); quotedText.append(body); originalMessage.subject?.let { subject -> append(resourceProvider.messageHeaderSubject()) append(" ") append(subject) append(CRLF) } return quotedText.toString(); } else { // Shouldn't ever happen. return body; append(CRLF) append(body) }.toString() } private fun Array<Address>.displayString() = Address.toString(this)?.let { if (it.isEmpty()) null else it } companion object { private const val CRLF = "\r\n" } } Loading
app/core/src/main/java/com/fsck/k9/message/quote/QuoteHelper.kt +1 −1 Original line number Diff line number Diff line Loading @@ -11,7 +11,7 @@ import com.fsck.k9.K9 import com.fsck.k9.mail.Message internal class QuoteHelper(private val resources: Resources) { class QuoteHelper(private val resources: Resources) { /** * Extract the date from a message and convert it into a locale-specific Loading
app/core/src/main/java/com/fsck/k9/message/quote/TextQuoteCreator.kt +84 −62 Original line number Diff line number Diff line package com.fsck.k9.message.quote; package com.fsck.k9.message.quote import java.util.regex.Matcher; import com.fsck.k9.Account.QuoteStyle import com.fsck.k9.CoreResourceProvider import com.fsck.k9.mail.Address import com.fsck.k9.mail.Message import com.fsck.k9.mail.Message.RecipientType import com.fsck.k9.message.quote.QuoteHelper.Companion.QUOTE_BUFFER_LENGTH import com.fsck.k9.Account.QuoteStyle; import com.fsck.k9.CoreResourceProvider; import com.fsck.k9.mail.Address; import com.fsck.k9.mail.Message; import com.fsck.k9.mail.Message.RecipientType; import static com.fsck.k9.message.quote.QuoteHelper.QUOTE_BUFFER_LENGTH; class TextQuoteCreator(private val quoteHelper: QuoteHelper, private val resourceProvider: CoreResourceProvider) { private val prefixInsertionRegex = Regex("(?m)^") public class TextQuoteCreator { private final QuoteHelper quoteHelper; private final CoreResourceProvider resourceProvider; public TextQuoteCreator(QuoteHelper quoteHelper, CoreResourceProvider resourceProvider) { this.quoteHelper = quoteHelper; this.resourceProvider = resourceProvider; fun quoteOriginalTextMessage( originalMessage: Message, messageBody: String?, quoteStyle: QuoteStyle, prefix: String ): String { val body = messageBody ?: "" return when (quoteStyle) { QuoteStyle.PREFIX -> prefixQuoteText(body, originalMessage, prefix) QuoteStyle.HEADER -> headerQuoteText(body, originalMessage) } } /** * Add quoting markup to a text message. * @param originalMessage Metadata for message being quoted. * @param messageBody Text of the message to be quoted. * @param quoteStyle Style of quoting. * @return Quoted text. */ public String quoteOriginalTextMessage(Message originalMessage, String messageBody, QuoteStyle quoteStyle, String prefix) { String body = messageBody == null ? "" : messageBody; String sentDate = quoteHelper.getSentDateText(originalMessage); if (quoteStyle == QuoteStyle.PREFIX) { String sender = Address.toString(originalMessage.getFrom()); StringBuilder quotedText = new StringBuilder(body.length() + QUOTE_BUFFER_LENGTH); if (sentDate.length() != 0) { String replyHeader = resourceProvider.replyHeader(sender, sentDate); quotedText.append(replyHeader); private fun prefixQuoteText(body: String, originalMessage: Message, prefix: String): String { val sentDate = quoteHelper.getSentDateText(originalMessage) val sender = Address.toString(originalMessage.from) return StringBuilder(body.length + QUOTE_BUFFER_LENGTH).apply { val replyHeader = if (sentDate.isEmpty()) { resourceProvider.replyHeader(sender) } else { String replyHeader = resourceProvider.replyHeader(sender); quotedText.append(replyHeader); resourceProvider.replyHeader(sender, sentDate) } quotedText.append("\r\n"); final String escapedPrefix = Matcher.quoteReplacement(prefix); quotedText.append(body.replaceAll("(?m)^", escapedPrefix)); return quotedText.toString(); } else if (quoteStyle == QuoteStyle.HEADER) { StringBuilder quotedText = new StringBuilder(body.length() + QUOTE_BUFFER_LENGTH); quotedText.append("\r\n"); quotedText.append(resourceProvider.messageHeaderSeparator()).append("\r\n"); if (originalMessage.getFrom() != null && Address.toString(originalMessage.getFrom()).length() != 0) { quotedText.append(resourceProvider.messageHeaderFrom()).append(" ").append(Address.toString(originalMessage.getFrom())).append("\r\n"); append(replyHeader) append(CRLF) val escapedPrefix = Regex.escapeReplacement(prefix) val prefixedText = body.replace(prefixInsertionRegex, escapedPrefix) append(prefixedText) }.toString() } if (sentDate.length() != 0) { quotedText.append(resourceProvider.messageHeaderDate()).append(" ").append(sentDate).append("\r\n"); private fun headerQuoteText(body: String, originalMessage: Message): String { val sentDate = quoteHelper.getSentDateText(originalMessage) return StringBuilder(body.length + QUOTE_BUFFER_LENGTH).apply { append(CRLF) append(resourceProvider.messageHeaderSeparator()) append(CRLF) originalMessage.from.displayString()?.let { fromAddresses -> append(resourceProvider.messageHeaderFrom()) append(" ") append(fromAddresses) append(CRLF) } if (originalMessage.getRecipients(RecipientType.TO) != null && originalMessage.getRecipients(RecipientType.TO).length != 0) { quotedText.append(resourceProvider.messageHeaderTo()).append(" ").append(Address.toString(originalMessage.getRecipients(RecipientType.TO))).append("\r\n"); if (sentDate.isNotEmpty()) { append(resourceProvider.messageHeaderDate()) append(" ") append(sentDate) append(CRLF) } if (originalMessage.getRecipients(RecipientType.CC) != null && originalMessage.getRecipients(RecipientType.CC).length != 0) { quotedText.append(resourceProvider.messageHeaderCc()).append(" ").append(Address.toString(originalMessage.getRecipients(RecipientType.CC))).append("\r\n"); originalMessage.getRecipients(RecipientType.TO).displayString()?.let { toAddresses -> append(resourceProvider.messageHeaderTo()) append(" ") append(toAddresses) append(CRLF) } if (originalMessage.getSubject() != null) { quotedText.append(resourceProvider.messageHeaderSubject()).append(" ").append(originalMessage.getSubject()).append("\r\n"); originalMessage.getRecipients(RecipientType.CC).displayString()?.let { ccAddresses -> append(resourceProvider.messageHeaderCc()) append(" ") append(ccAddresses) append(CRLF) } quotedText.append("\r\n"); quotedText.append(body); originalMessage.subject?.let { subject -> append(resourceProvider.messageHeaderSubject()) append(" ") append(subject) append(CRLF) } return quotedText.toString(); } else { // Shouldn't ever happen. return body; append(CRLF) append(body) }.toString() } private fun Array<Address>.displayString() = Address.toString(this)?.let { if (it.isEmpty()) null else it } companion object { private const val CRLF = "\r\n" } }