package com.fsck.k9.notification; import android.content.Context; import android.text.SpannableStringBuilder; import android.text.TextUtils; import com.fsck.k9.Account; import com.fsck.k9.K9; import com.fsck.k9.R; import com.fsck.k9.activity.MessageReference; import com.fsck.k9.helper.Contacts; import com.fsck.k9.helper.MessageHelper; import com.fsck.k9.mail.Address; import com.fsck.k9.mail.Flag; import com.fsck.k9.mail.Message; import com.fsck.k9.mailstore.LocalMessage; import com.fsck.k9.message.extractors.PreviewResult.PreviewType; class NotificationContentCreator { private final Context context; public NotificationContentCreator(Context context) { this.context = context; } public NotificationContent createFromMessage(Account account, LocalMessage message) { MessageReference messageReference = message.makeMessageReference(); String sender = getMessageSender(account, message); String displaySender = getMessageSenderForDisplay(sender); String subject = getMessageSubject(message); CharSequence preview = getMessagePreview(message); CharSequence summary = buildMessageSummary(sender, subject); boolean starred = message.isSet(Flag.FLAGGED); return new NotificationContent(messageReference, displaySender, subject, preview, summary, starred); } private CharSequence getMessagePreview(LocalMessage message) { String subject = message.getSubject(); String snippet = getPreview(message); boolean isSubjectEmpty = TextUtils.isEmpty(subject); boolean isSnippetPresent = snippet != null; if (isSubjectEmpty && isSnippetPresent) { return snippet; } String displaySubject = getMessageSubject(message); SpannableStringBuilder preview = new SpannableStringBuilder(); preview.append(displaySubject); if (isSnippetPresent) { preview.append('\n'); preview.append(snippet); } return preview; } private String getPreview(LocalMessage message) { PreviewType previewType = message.getPreviewType(); switch (previewType) { case NONE: case ERROR: return null; case TEXT: return message.getPreview(); case ENCRYPTED: return context.getString(R.string.preview_encrypted); } throw new AssertionError("Unknown preview type: " + previewType); } private CharSequence buildMessageSummary(String sender, String subject) { if (sender == null) { return subject; } SpannableStringBuilder summary = new SpannableStringBuilder(); summary.append(sender); summary.append(" "); summary.append(subject); return summary; } private String getMessageSubject(Message message) { String subject = message.getSubject(); if (!TextUtils.isEmpty(subject)) { return subject; } return context.getString(R.string.general_no_subject); } private String getMessageSender(Account account, Message message) { boolean isSelf = false; final Contacts contacts = K9.showContactName() ? Contacts.getInstance(context) : null; final Address[] fromAddresses = message.getFrom(); if (fromAddresses != null) { isSelf = account.isAnIdentity(fromAddresses); if (!isSelf && fromAddresses.length > 0) { return MessageHelper.toFriendly(fromAddresses[0], contacts).toString(); } } if (isSelf) { // show To: if the message was sent from me Address[] recipients = message.getRecipients(Message.RecipientType.TO); if (recipients != null && recipients.length > 0) { return context.getString(R.string.message_to_fmt, MessageHelper.toFriendly(recipients[0], contacts).toString()); } } return null; } private String getMessageSenderForDisplay(String sender) { return (sender != null) ? sender : context.getString(R.string.general_no_sender); } }