@Override
  public void loadMore(long messageId) throws RemoteException {
    /// M: We Can't load more in low storage state @{
    if (StorageLowState.checkIfStorageLow(mContext)) {
      LogUtils.e(Logging.LOG_TAG, "Can't load more due to low storage");
      return;
    }
    /// @}
    // Load a message for view...
    try {
      // 1. Resample the message, in case it disappeared or synced while
      // this command was in queue
      final EmailContent.Message message =
          EmailContent.Message.restoreMessageWithId(mContext, messageId);
      if (message == null) {
        return;
      }
      if (message.mFlagLoaded == EmailContent.Message.FLAG_LOADED_COMPLETE) {
        // We should NEVER get here
        return;
      }

      // 2. Open the remote folder.
      // TODO combine with common code in loadAttachment
      final Account account = Account.restoreAccountWithId(mContext, message.mAccountKey);
      final Mailbox mailbox = Mailbox.restoreMailboxWithId(mContext, message.mMailboxKey);
      if (account == null || mailbox == null) {
        // mListeners.loadMessageForViewFailed(messageId, "null account or mailbox");
        return;
      }
      TrafficStats.setThreadStatsTag(TrafficFlags.getSyncFlags(mContext, account));

      final Store remoteStore = Store.getInstance(account, mContext);
      final String remoteServerId;
      // If this is a search result, use the protocolSearchInfo field to get the
      // correct remote location
      if (!TextUtils.isEmpty(message.mProtocolSearchInfo)) {
        remoteServerId = message.mProtocolSearchInfo;
      } else {
        remoteServerId = mailbox.mServerId;
      }
      final Folder remoteFolder = remoteStore.getFolder(remoteServerId);
      remoteFolder.open(OpenMode.READ_WRITE);

      // 3. Set up to download the entire message
      final Message remoteMessage = remoteFolder.getMessage(message.mServerId);
      final FetchProfile fp = new FetchProfile();
      fp.add(FetchProfile.Item.BODY);
      remoteFolder.fetch(new Message[] {remoteMessage}, fp, null);

      // 4. Write to provider
      Utilities.copyOneMessageToProvider(
          mContext, remoteMessage, account, mailbox, EmailContent.Message.FLAG_LOADED_COMPLETE);
    } catch (MessagingException me) {
      if (Logging.LOGD) LogUtils.v(Logging.LOG_TAG, "", me);

    } catch (RuntimeException rte) {
      LogUtils.d(Logging.LOG_TAG, "RTE During loadMore");
    }
  }
  /**
   * M: Load the structure and body of messages not yet synced
   *
   * @param account the account we're syncing
   * @param remoteFolder the (open) Folder we're working on
   * @param messages an array of Messages we've got headers for
   * @param toMailbox the destination mailbox we're syncing
   * @throws MessagingException
   */
  public static void loadUnsyncedMessages(
      final Context context,
      final Account account,
      Folder remoteFolder,
      ArrayList<Message> unsyncedMessages,
      final Mailbox toMailbox)
      throws MessagingException {
    FetchProfile fp = new FetchProfile();

    for (Message message : unsyncedMessages) {
      // Also need to pay attention to the 0 RFC822.SIZE that may occurs in using Gmail Imap.
      // Cope with it as partial download in case that the mail has a big size attachment
      // which can lead to potential OutOfMemory

      // Download messages. We ask the server to give us the message structure,
      // but not all of the attachments.
      fp.clear();
      fp.add(FetchProfile.Item.STRUCTURE);
      remoteFolder.fetch(new Message[] {message}, fp, null);

      boolean isPartialDownload = imapPartialFetchMessage(message, remoteFolder);
      // Store the updated message locally and mark it fully loaded
      Utilities.copyOneMessageToProvider(
          context,
          message,
          account,
          toMailbox,
          isPartialDownload
              ? EmailContent.Message.FLAG_LOADED_PARTIAL
              : EmailContent.Message.FLAG_LOADED_COMPLETE);
    }
  }