/*
* Copyright (C) 2016 Amit Shekhar
* Copyright (C) 2011 Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.androidnetworking.internal;
import com.androidnetworking.common.ANConstants;
import com.androidnetworking.interfaces.DownloadProgressListener;
import com.androidnetworking.model.Progress;
import java.io.IOException;
import okhttp3.MediaType;
import okhttp3.ResponseBody;
import okio.Buffer;
import okio.BufferedSource;
import okio.ForwardingSource;
import okio.Okio;
import okio.Source;
/**
* Created by amitshekhar on 24/05/16.
*/
public class ResponseProgressBody extends ResponseBody {
private final ResponseBody mResponseBody;
private BufferedSource bufferedSource;
private DownloadProgressHandler downloadProgressHandler;
public ResponseProgressBody(ResponseBody responseBody, DownloadProgressListener downloadProgressListener) {
this.mResponseBody = responseBody;
if (downloadProgressListener != null) {
this.downloadProgressHandler = new DownloadProgressHandler(downloadProgressListener);
}
}
@Override
public MediaType contentType() {
return mResponseBody.contentType();
}
@Override
public long contentLength() {
return mResponseBody.contentLength();
}
@Override
public BufferedSource source() {
if (bufferedSource == null) {
bufferedSource = Okio.buffer(source(mResponseBody.source()));
}
return bufferedSource;
}
private Source source(Source source) {
return new ForwardingSource(source) {
long totalBytesRead;
@Override
public long read(Buffer sink, long byteCount) throws IOException {
long bytesRead = super.read(sink, byteCount);
totalBytesRead += ((bytesRead != -1) ? bytesRead : 0);
if (downloadProgressHandler != null) {
downloadProgressHandler
.obtainMessage(ANConstants.UPDATE,
new Progress(totalBytesRead, mResponseBody.contentLength()))
.sendToTarget();
}
return bytesRead;
}
};
}
}