package org.commcare.network; import android.support.annotation.NonNull; import android.util.Log; import org.apache.http.entity.mime.MultipartEntity; import org.commcare.tasks.DataSubmissionListener; import java.io.FilterOutputStream; import java.io.IOException; import java.io.OutputStream; /** * @author ctsims */ public class DataSubmissionEntity extends MultipartEntity { private final DataSubmissionListener listener; private final int submissionId; private int attempt = 1; public DataSubmissionEntity(DataSubmissionListener listener, int submissionId) { super(); this.listener = listener; this.submissionId = submissionId; } @Override public boolean isRepeatable() { return true; } @Override public void writeTo(OutputStream outstream) throws IOException { if (attempt != 1) { Log.i("commcare-transport", "Retrying submission, attempt #" + attempt); } super.writeTo(new CountingOutputStream(outstream, listener, submissionId)); attempt++; } private class CountingOutputStream extends FilterOutputStream { private final DataSubmissionListener listener; private long transferred; private long lastNumberReported; private final int submissionId; private final static int REPORT_WHEN_PROGRESS_OVER = 50; public CountingOutputStream(final OutputStream out, final DataSubmissionListener listener, int submissionId) { super(out); this.listener = listener; this.transferred = 0; this.submissionId = submissionId; this.lastNumberReported = 0; } @Override public void write(@NonNull byte[] b, int off, int len) throws IOException { out.write(b, off, len); this.transferred += len; reportProgress(); } private void reportProgress() { if (listener != null && hasProgressedEnoughToReport()) { lastNumberReported = transferred; this.listener.notifyProgress(submissionId, this.transferred); } } private boolean hasProgressedEnoughToReport() { return (transferred - lastNumberReported) > REPORT_WHEN_PROGRESS_OVER; } @Override public void write(int b) throws IOException { out.write(b); this.transferred++; reportProgress(); } } }