/* * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.emailcommon.mail; import com.android.emailcommon.internet.MimeBodyPart; import com.android.emailcommon.internet.MimeHeader; import com.android.emailcommon.internet.MimeMessage; import com.android.emailcommon.internet.MimeMultipart; import com.android.emailcommon.internet.TextBody; import com.android.emailcommon.provider.Account; import com.android.emailcommon.utility.AttachmentUtilities; import android.net.Uri; import java.util.ArrayList; /** * Utility class makes it easier for developer to build mail message objects. * <p> * Typical usage of these helper functions and builder objects are as follows. * <p> * <pre> * String text2 = new TextBuilder("<html>").text("<head></head>") * .text("<body>").cidImg("contetid@domain").text("</body>").build("</html"); * String text2 = new TextBuilder("<html>").text("<head></head>") * .text("<body>").uriImg(contentUri).text("</body>").build("</html"); * Message msg = new MessageBuilder() * .setBody(new MultipartBuilder("multipart/mixed") * .addBodyPart(MessageTestUtils.imagePart("image/jpeg", null, 30, store)) * .addBodyPart(MessageTestUtils.imagePart("application/pdf", cid1, aid1, store)) * .addBodyPart(new MultipartBuilder("multipart/related") * .addBodyPart(MessageTestUtils.textPart("text/html", text2 + text1)) * .addBodyPart(MessageTestUtils.imagePart("image/jpg", cid1, aid1, store)) * .addBodyPart(MessageTestUtils.imagePart("image/gif", cid2, aid2, store)) * .buildBodyPart()) * .addBodyPart(MessageTestUtils.imagePart("application/pdf", cid2, aid2, store)) * .build()) * .build(); * </pre> */ public class MessageTestUtils { /** * Generate AttachmentProvider content URI from attachment ID and Account. * * @param attachmentId attachment id * @param account Account object * @return AttachmentProvider content URI */ public static Uri contentUri(long attachmentId, Account account) { return AttachmentUtilities.getAttachmentUri(account.mId, attachmentId); } /** * Create simple MimeBodyPart. * * @param mimeType MIME type of body part * @param contentId content-id header value (optional - null for no header) * @return MimeBodyPart object which body is null. * @throws MessagingException */ public static BodyPart bodyPart(String mimeType, String contentId) throws MessagingException { final MimeBodyPart bp = new MimeBodyPart(null, mimeType); if (contentId != null) { bp.setHeader(MimeHeader.HEADER_CONTENT_ID, contentId); } return bp; } /** * Create MimeBodyPart with TextBody. * * @param mimeType MIME type of text * @param text body text string * @return MimeBodyPart object whose body is TextBody * @throws MessagingException */ public static BodyPart textPart(String mimeType, String text) throws MessagingException { final TextBody textBody = new TextBody(text); final MimeBodyPart textPart = new MimeBodyPart(textBody); textPart.setHeader(MimeHeader.HEADER_CONTENT_TYPE, mimeType); return textPart; } /** * Builder class for Multipart. * * This builder object accepts any number of BodyParts and then can produce * Multipart or BodyPart which contains accepted BodyParts. Usually combined with other * builder object and helper method. */ public static class MultipartBuilder { private final String mContentType; private final ArrayList<BodyPart> mParts = new ArrayList<BodyPart>(); /** * Create builder object with MIME type and dummy boundary string. * * @param mimeType MIME type of this Multipart */ public MultipartBuilder(String mimeType) { this(mimeType, "this_is_boundary"); } /** * Create builder object with MIME type and boundary string. * * @param mimeType MIME type of this Multipart * @param boundary boundary string */ public MultipartBuilder(String mimeType, String boundary) { mContentType = mimeType + "; boundary=" + boundary; } /** * Modifier method to add BodyPart to intended Multipart. * * @param bodyPart BodyPart to be added * @return builder object itself */ public MultipartBuilder addBodyPart(final BodyPart bodyPart) { mParts.add(bodyPart); return this; } /** * Build method to create Multipart. * * @return intended Multipart object * @throws MessagingException */ public Multipart build() throws MessagingException { final MimeMultipart mp = new MimeMultipart(mContentType); for (BodyPart p : mParts) { mp.addBodyPart(p); } return mp; } /** * Build method to create BodyPart that contains this "Multipart" * @return BodyPart whose body is intended Multipart. * @throws MessagingException */ public BodyPart buildBodyPart() throws MessagingException { final BodyPart bp = new MimeBodyPart(); bp.setBody(this.build()); return bp; } } /** * Builder class for Message * * This builder object accepts Body and then can produce Message object. * Usually combined with other builder object and helper method. */ public static class MessageBuilder { private Body mBody; /** * Create Builder object. */ public MessageBuilder() { } /** * Modifier method to set Body. * * @param body Body of intended Message * @return builder object itself */ public MessageBuilder setBody(final Body body) { mBody = body; return this; } /** * Build method to create Message. * * @return intended Message object * @throws MessagingException */ public Message build() throws MessagingException { final MimeMessage msg = new MimeMessage(); if (mBody == null) { throw new MessagingException("body is not specified"); } msg.setBody(mBody); return msg; } } /** * Builder class for simple HTML String. * This builder object accepts some type of object or and string and then create String object. * Usually combined with other builder object and helper method. */ public static class TextBuilder { final StringBuilder mBuilder = new StringBuilder(); /** * Create builder with preamble string * @param preamble */ public TextBuilder(String preamble) { mBuilder.append(preamble); } /** * Modifier method to add img tag that has cid: src attribute. * @param contentId content id string * @return builder object itself */ public TextBuilder addCidImg(String contentId) { return addTag("img", "SRC", "cid:" + contentId); } /** * Modifier method to add img tag that has content:// src attribute. * @param contentUri content uri object * @return builder object itself */ public TextBuilder addUidImg(Uri contentUri) { return addTag("img", "src", contentUri.toString()); } /** * Modifier method to add tag with specified attribute and value. * * @param tag tag name * @param attribute attribute name * @param value attribute value * @return builder object itself */ public TextBuilder addTag(String tag, String attribute, String value) { return addText(String.format("<%s %s=\"%s\">", tag, attribute, value)); } /** * Modifier method to add simple string. * @param text string to add * @return builder object itself */ public TextBuilder addText(String text) { mBuilder.append(text); return this; } /** * Build method to create intended String * @param epilogue string to add to the end * @return intended String */ public String build(String epilogue) { mBuilder.append(epilogue); return mBuilder.toString(); } } }