package de.stephanlindauer.criticalmaps.handler; import android.app.Activity; import android.app.ProgressDialog; import android.os.AsyncTask; import com.squareup.okhttp.MediaType; import com.squareup.okhttp.MultipartBuilder; import com.squareup.okhttp.OkHttpClient; import com.squareup.okhttp.Request; import com.squareup.okhttp.RequestBody; import com.squareup.okhttp.Response; import java.io.File; import java.io.IOException; import de.stephanlindauer.criticalmaps.App; import de.stephanlindauer.criticalmaps.R; import de.stephanlindauer.criticalmaps.model.OwnLocationModel; import de.stephanlindauer.criticalmaps.utils.AlertBuilder; import de.stephanlindauer.criticalmaps.vo.Endpoints; import de.stephanlindauer.criticalmaps.vo.ResultType; import okio.Buffer; import okio.BufferedSink; import okio.ForwardingSink; import okio.Okio; public class ImageUploadHandler extends AsyncTask<Void, Integer, ResultType> { private final OwnLocationModel ownLocationModel = App.components().ownLocationmodel(); private final Activity activity; private final File imageFileToUpload; private ProgressDialog progressDialog; public ImageUploadHandler(File imageFileToUpload, Activity activity) { this.activity = activity; this.imageFileToUpload = imageFileToUpload; } @Override protected void onPreExecute() { progressDialog = new ProgressDialog(activity); progressDialog.setMessage(activity.getString(R.string.camera_uploading_progress)); progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); progressDialog.setIndeterminate(false); progressDialog.setCancelable(false); progressDialog.setProgressNumberFormat(null); progressDialog.setMax(100); progressDialog.setProgress(0); progressDialog.show(); } @Override protected ResultType doInBackground(Void... params) { final OkHttpClient okHttpClient = App.components().okHttpClient(); final ProgressListener progressListener = new ProgressListener() { @Override public void update(long bytesRead, long contentLength) { publishProgress((int) ((100 * bytesRead) / contentLength)); } }; RequestBody requestBody = new MultipartBuilder() .type(MultipartBuilder.FORM) .addFormDataPart("data", ownLocationModel.getLocationJson().toString()) .addFormDataPart("uploaded_file", imageFileToUpload.getName(), new ProgressRequestBody( RequestBody.create(MediaType.parse("image/jpeg"), imageFileToUpload), progressListener)) .build(); Request request = new Request.Builder().url(Endpoints.IMAGE_POST).post(requestBody).build(); Response response = null; try { response = okHttpClient.newCall(request).execute(); if (response.isSuccessful() && response.body().string().equals("success")) { return ResultType.SUCCEEDED; } } catch (Exception ignored) { } finally { if (response != null) { try { response.body().close(); } catch (IOException ignored) { } } } return ResultType.FAILED; } @Override protected void onProgressUpdate(Integer... progress) { progressDialog.setProgress(progress[0]); } @Override protected void onPostExecute(ResultType resultType) { if (resultType == ResultType.SUCCEEDED) { progressDialog.dismiss(); AlertBuilder.show(activity, R.string.camera_image_upload_succeeded_title, R.string.camera_image_upload_succeeded_message); } else { progressDialog.dismiss(); AlertBuilder.show(activity, R.string.camera_upload_failed_title, R.string.camera_upload_failed_message); } imageFileToUpload.delete(); } private static class ProgressRequestBody extends RequestBody { private final RequestBody requestBody; private final ProgressListener progressListener; public ProgressRequestBody(RequestBody requestBody, ProgressListener progressListener) { this.requestBody = requestBody; this.progressListener = progressListener; } @Override public MediaType contentType() { return requestBody.contentType(); } @Override public long contentLength() throws IOException { return requestBody.contentLength(); } @Override public void writeTo(BufferedSink sink) throws IOException { final long totalBytes = contentLength(); BufferedSink progressSink = Okio.buffer(new ForwardingSink(sink) { private long bytesWritten = 0L; @Override public void write(Buffer source, long byteCount) throws IOException { bytesWritten += byteCount; progressListener.update(bytesWritten, totalBytes); super.write(source, byteCount); } }); requestBody.writeTo(progressSink); progressSink.flush(); } } private interface ProgressListener { void update(long bytesRead, long contentLength); } }