ProgressResponseBody.java 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. package com.acdp.transceivr;
  2. import okhttp3.MediaType;
  3. import okhttp3.ResponseBody;
  4. import okio.*;
  5. import java.io.IOException;
  6. public class ProgressResponseBody extends ResponseBody {
  7. private final ResponseBody responseBody;
  8. private final ProgressListener progressListener;
  9. private BufferedSource bufferedSource;
  10. ProgressResponseBody(ResponseBody responseBody, ProgressListener progressListener) {
  11. this.responseBody = responseBody;
  12. this.progressListener = progressListener;
  13. }
  14. @Override public MediaType contentType() {
  15. return responseBody.contentType();
  16. }
  17. @Override public long contentLength() {
  18. return responseBody.contentLength();
  19. }
  20. @Override public BufferedSource source() {
  21. if (bufferedSource == null) {
  22. bufferedSource = Okio.buffer(source(responseBody.source()));
  23. }
  24. return bufferedSource;
  25. }
  26. private Source source(Source source) {
  27. return new ForwardingSource(source) {
  28. long totalBytesRead = 0L;
  29. @Override public long read(Buffer sink, long byteCount) throws IOException {
  30. long bytesRead = super.read(sink, byteCount);
  31. // read() returns the number of bytes read, or -1 if this source is exhausted.
  32. totalBytesRead += bytesRead != -1 ? bytesRead : 0;
  33. progressListener.update(totalBytesRead, responseBody.contentLength(), bytesRead == -1);
  34. return bytesRead;
  35. }
  36. };
  37. }
  38. }
  39. interface ProgressListener {
  40. void update(long bytesRead, long contentLength, boolean done);
  41. }