private Download doDownload(final GetObjectRequest getObjectRequest,
            final File file, final TransferStateChangeListener stateListener,
            final S3ProgressListener s3progressListener,
            final boolean resumeExistingDownload,
            final long timeoutMillis,
            final Integer lastFullyDownloadedPart,
            final long lastModifiedTimeRecordedDuringPause,
            final boolean resumeOnRetry,
            final Long lastFullyDownloadedPartPosition,
                                final String lastEtagDuringPause) {

        assertNotObjectLambdaArn(getObjectRequest.getBucketName(), "download");

        PreparedDownloadContext prepared = prepareDownload(getObjectRequest,
                                                           file,
                                                           stateListener,
                                                           s3progressListener,
                                                           resumeExistingDownload,
                                                           timeoutMillis,
                                                           lastFullyDownloadedPart,
                                                           lastModifiedTimeRecordedDuringPause,
                                                           resumeOnRetry,
                                                           lastFullyDownloadedPartPosition,
                                                           lastEtagDuringPause);
        return submitDownload(prepared);
    }
Same as public interface, but adds a state listener so that callers can
be notified of state changes to the download.

@see TransferManager#download(GetObjectRequest, File)
aws-java-sdk-s3/src/main/java/com/amazonaws/services/s3/transfer/TransferManager.java