docs: public synchronized void sendFile(final String fileName,
              final long fileSize, final String description,
              final NegotiationProgress progress) {
          if (progress == null) {
              throw new IllegalArgumentException("Callback progress cannot be null.");
          }
          checkTransferThread();
          if (isDone() || outputStream != null) {
              throw new IllegalStateException(
                      "The negotiation process has already"
                              + " been attempted for this file transfer");
          }
          setFileInfo(fileName, fileSize);
          this.callback = progress;
          transferThread = new Thread(new Runnable() {
              @Override
              public void run() {
                  try {
                      OutgoingFileTransfer.this.outputStream = negotiateStream(
                              fileName, fileSize, description);
                      progress.outputStreamEstablished(OutgoingFileTransfer.this.outputStream);
                  }
                  catch (XMPPErrorException e) {
                      handleXMPPException(e);
                  }
                  catch (Exception e) {
                      setException(e);
                  }
              }
          }, "File Transfer Negotiation " + streamID);
          transferThread.start();
      }