private void waitForTransfer(FileTransfer transfer, long timeout) throws SmackException, InterruptedException { double prevProgress = 0; long counter = 0; Thread.sleep(timeout / WAITING_CYCLES / 10); // optimistic while (!transfer.isDone()) { if (transfer.getStatus().equals(FileTransfer.Status.error)) { throw new SmackException(transfer.getError().toString(), transfer.getException()); } else { log.debug("Status: " + transfer.getStatus() + " " + transfer.getProgress()); } if (transfer.getProgress() <= prevProgress) { if (counter >= WAITING_CYCLES) { throw new SmackException("File transfer timed out"); } counter++; Thread.sleep(timeout / WAITING_CYCLES); } else { counter = 0; prevProgress = transfer.getProgress(); } } if (transfer.getProgress() == 0) { throw new SmackException("No data transferred"); } }