/**
   * Read a complete Provider message into a legacy message (for IMAP upload). This is basically the
   * equivalent of LocalFolder.getMessages() + LocalFolder.fetch().
   */
  public static Message makeMessage(final Context context, final EmailContent.Message localMessage)
      throws MessagingException {
    final MimeMessage message = new MimeMessage();

    // LocalFolder.getMessages() equivalent:  Copy message fields
    message.setSubject(localMessage.mSubject == null ? "" : localMessage.mSubject);
    final Address[] from = Address.fromHeader(localMessage.mFrom);
    if (from.length > 0) {
      message.setFrom(from[0]);
    }
    message.setSentDate(new Date(localMessage.mTimeStamp));
    message.setUid(localMessage.mServerId);
    message.setFlag(
        Flag.DELETED, localMessage.mFlagLoaded == EmailContent.Message.FLAG_LOADED_DELETED);
    message.setFlag(Flag.SEEN, localMessage.mFlagRead);
    message.setFlag(Flag.FLAGGED, localMessage.mFlagFavorite);
    //      message.setFlag(Flag.DRAFT, localMessage.mMailboxKey == draftMailboxKey);
    message.setRecipients(RecipientType.TO, Address.fromHeader(localMessage.mTo));
    message.setRecipients(RecipientType.CC, Address.fromHeader(localMessage.mCc));
    message.setRecipients(RecipientType.BCC, Address.fromHeader(localMessage.mBcc));
    message.setReplyTo(Address.fromHeader(localMessage.mReplyTo));
    message.setInternalDate(new Date(localMessage.mServerTimeStamp));
    message.setMessageId(localMessage.mMessageId);

    // LocalFolder.fetch() equivalent: build body parts
    message.setHeader(MimeHeader.HEADER_CONTENT_TYPE, "multipart/mixed");
    final MimeMultipart mp = new MimeMultipart();
    mp.setSubType("mixed");
    message.setBody(mp);

    try {
      addTextBodyPart(
          mp,
          "text/html",
          EmailContent.Body.restoreBodyHtmlWithMessageId(context, localMessage.mId));
    } catch (RuntimeException rte) {
      LogUtils.d(Logging.LOG_TAG, "Exception while reading html body " + rte.toString());
    }

    try {
      addTextBodyPart(
          mp,
          "text/plain",
          EmailContent.Body.restoreBodyTextWithMessageId(context, localMessage.mId));
    } catch (RuntimeException rte) {
      LogUtils.d(Logging.LOG_TAG, "Exception while reading text body " + rte.toString());
    }

    // Attachments
    final Uri uri = ContentUris.withAppendedId(Attachment.MESSAGE_ID_URI, localMessage.mId);
    final Cursor attachments =
        context.getContentResolver().query(uri, Attachment.CONTENT_PROJECTION, null, null, null);

    try {
      while (attachments != null && attachments.moveToNext()) {
        final Attachment att = new Attachment();
        att.restore(attachments);
        try {
          final InputStream content;
          if (att.mContentBytes != null) {
            // This is generally only the case for synthetic attachments, such as those
            // generated by unit tests or calendar invites
            content = new ByteArrayInputStream(att.mContentBytes);
          } else {
            String contentUriString = att.getCachedFileUri();
            if (TextUtils.isEmpty(contentUriString)) {
              contentUriString = att.getContentUri();
            }
            if (TextUtils.isEmpty(contentUriString)) {
              content = null;
            } else {
              final Uri contentUri = Uri.parse(contentUriString);
              content = context.getContentResolver().openInputStream(contentUri);
            }
          }
          final String mimeType = att.mMimeType;
          final Long contentSize = att.mSize;
          final String contentId = att.mContentId;
          final String filename = att.mFileName;
          if (content != null) {
            addAttachmentPart(mp, mimeType, contentSize, filename, contentId, content);
          } else {
            LogUtils.e(LogUtils.TAG, "Could not open attachment file for upsync");
          }
        } catch (final FileNotFoundException e) {
          LogUtils.e(
              LogUtils.TAG,
              "File Not Found error on %s while upsyncing message",
              att.getCachedFileUri());
        }
      }
    } finally {
      if (attachments != null) {
        attachments.close();
      }
    }

    return message;
  }