12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- package com.acdp.transceivr;
- import okhttp3.MediaType;
- import okhttp3.ResponseBody;
- import okio.*;
- import java.io.IOException;
- public class ProgressResponseBody extends ResponseBody {
- private final ResponseBody responseBody;
- private final ProgressListener progressListener;
- private BufferedSource bufferedSource;
- ProgressResponseBody(ResponseBody responseBody, ProgressListener progressListener) {
- this.responseBody = responseBody;
- this.progressListener = progressListener;
- }
- @Override public MediaType contentType() {
- return responseBody.contentType();
- }
- @Override public long contentLength() {
- return responseBody.contentLength();
- }
- @Override public BufferedSource source() {
- if (bufferedSource == null) {
- bufferedSource = Okio.buffer(source(responseBody.source()));
- }
- return bufferedSource;
- }
- private Source source(Source source) {
- return new ForwardingSource(source) {
- long totalBytesRead = 0L;
- @Override public long read(Buffer sink, long byteCount) throws IOException {
- long bytesRead = super.read(sink, byteCount);
- // read() returns the number of bytes read, or -1 if this source is exhausted.
- totalBytesRead += bytesRead != -1 ? bytesRead : 0;
- progressListener.update(totalBytesRead, responseBody.contentLength(), bytesRead == -1);
- return bytesRead;
- }
- };
- }
- }
- interface ProgressListener {
- void update(long bytesRead, long contentLength, boolean done);
- }
|