// The listener chain used by the low-level GetObject request.
        // This listener chain ignores any COMPLETE event, so that we could
        // delay firing the signal until the high-level download fully finishes.
        ProgressListenerChain listeners = new ProgressListenerChain(
                new ProgressEventFilter() {
                    @Override
                    public ProgressEvent filter(ProgressEvent progressEvent) {
                        // Block COMPLETE events from the low-level GetObject operation,
                        // but we still want to keep the BytesTransferred
                        return progressEvent.getEventType() == ProgressEventType.TRANSFER_COMPLETED_EVENT