private PendingMessage findPending(long rid) {
   for (PendingMessage message : pendingMessages.getPendingMessages()) {
     if (message.getRid() == rid) {
       return message;
     }
   }
   return null;
 }
 private void onSent(Peer peer, long rid) {
   for (PendingMessage pending : pendingMessages.getPendingMessages()) {
     if (pending.getRid() == rid && pending.getPeer().equals(peer)) {
       pendingMessages.getPendingMessages().remove(pending);
       break;
     }
   }
   savePending();
 }
  private void onFileUploadError(long rid) {
    PendingMessage msg = findPending(rid);
    if (msg == null) {
      return;
    }

    self().send(new MessageError(msg.getPeer(), msg.getRid()));
    fileUplaodingWakeLocks.remove(rid).releaseLock();
  }
 private void onError(Peer peer, long rid) {
   for (PendingMessage pending : pendingMessages.getPendingMessages()) {
     if (pending.getRid() == rid && pending.getPeer().equals(peer)) {
       pendingMessages.getPendingMessages().remove(pending);
       break;
     }
   }
   savePending();
   context().getMessagesModule().getRouter().onOutgoingError(peer, rid);
 }
  @Override
  public void preStart() {
    pendingMessages = new PendingMessagesStorage();
    byte[] p = preferences().getBytes(PREFERENCES);
    if (p != null) {
      try {
        pendingMessages = PendingMessagesStorage.fromBytes(p);
      } catch (IOException e) {
        e.printStackTrace();
      }
    }

    boolean isChanged = false;
    ArrayList<PendingMessage> messages = pendingMessages.getPendingMessages();
    for (PendingMessage pending : messages.toArray(new PendingMessage[messages.size()])) {
      if (pending.getContent() instanceof TextContent) {
        performSendContent(pending.getPeer(), pending.getRid(), pending.getContent());
      } else if (pending.getContent() instanceof DocumentContent) {
        DocumentContent documentContent = (DocumentContent) pending.getContent();
        if (documentContent.getSource() instanceof FileLocalSource) {
          if (Storage.isFsPersistent()) {
            performUploadFile(
                pending.getRid(),
                ((FileLocalSource) documentContent.getSource()).getFileDescriptor(),
                ((FileLocalSource) documentContent.getSource()).getFileName());
          } else {
            List<Long> rids = new ArrayList<>();
            rids.add(pending.getRid());
            context().getMessagesModule().getRouter().onMessagesDeleted(pending.getPeer(), rids);
            pendingMessages.getPendingMessages().remove(pending);
            isChanged = true;
          }
        } else {
          performSendContent(pending.getPeer(), pending.getRid(), pending.getContent());
        }
      }
    }

    if (isChanged) {
      savePending();
    }
  }
  private void onFileUploaded(long rid, FileReference fileReference) {
    PendingMessage msg = findPending(rid);
    if (msg == null) {
      return;
    }

    pendingMessages.getPendingMessages().remove(msg);

    AbsContent nContent;
    if (msg.getContent() instanceof PhotoContent) {
      PhotoContent basePhotoContent = (PhotoContent) msg.getContent();
      nContent =
          PhotoContent.createRemotePhoto(
              fileReference,
              basePhotoContent.getW(),
              basePhotoContent.getH(),
              basePhotoContent.getFastThumb());
    } else if (msg.getContent() instanceof VideoContent) {
      VideoContent baseVideoContent = (VideoContent) msg.getContent();
      nContent =
          VideoContent.createRemoteVideo(
              fileReference,
              baseVideoContent.getW(),
              baseVideoContent.getH(),
              baseVideoContent.getDuration(),
              baseVideoContent.getFastThumb());
    } else if (msg.getContent() instanceof VoiceContent) {
      VoiceContent baseVoiceContent = (VoiceContent) msg.getContent();
      nContent = VoiceContent.createRemoteAudio(fileReference, baseVoiceContent.getDuration());
    } else if (msg.getContent() instanceof AnimationContent) {
      AnimationContent baseAnimcationContent = (AnimationContent) msg.getContent();
      nContent =
          AnimationContent.createRemoteAnimation(
              fileReference,
              baseAnimcationContent.getW(),
              baseAnimcationContent.getH(),
              baseAnimcationContent.getFastThumb());
    } else if (msg.getContent() instanceof DocumentContent) {
      DocumentContent baseDocContent = (DocumentContent) msg.getContent();
      nContent = DocumentContent.createRemoteDocument(fileReference, baseDocContent.getFastThumb());
    } else {
      return;
    }

    pendingMessages
        .getPendingMessages()
        .add(new PendingMessage(msg.getPeer(), msg.getRid(), nContent));
    context()
        .getMessagesModule()
        .getRouter()
        .onContentChanged(msg.getPeer(), msg.getRid(), nContent);
    performSendContent(msg.getPeer(), rid, nContent);
    fileUplaodingWakeLocks.remove(rid).releaseLock();
  }