@Override public UploadStatus getState() { if (cancelled.get()) { return UploadStatus.CANCELLED; } if (finished.get()) { return UploadStatus.COMPLETE; } TorrentStatus status = torrent.getStatus(); if (status == null) { return UploadStatus.CONNECTING; } if (torrent.isPaused() || (torrent.isFinished() && torrent.getNumUploads() == 0)) { return UploadStatus.QUEUED; } if (status.isError()) { // TODO add retry // TODO custom error state return UploadStatus.UNAVAILABLE_RANGE; } if (status.isPaused()) { return UploadStatus.UPLOADING; } else { TorrentState state = status.getState(); switch (state) { case DOWNLOADING: case FINISHED: case SEEDING: return UploadStatus.UPLOADING; case QUEUED_FOR_CHECKING: case CHECKING_FILES: case DOWNLOADING_METADATA: case ALLOCATING: return UploadStatus.CONNECTING; default: throw new UnsupportedOperationException("Unknown state: " + state); } } }