package io.lbry.browser.tasks; import android.os.AsyncTask; import android.view.View; import org.json.JSONException; import org.json.JSONObject; import java.io.IOException; import java.io.File; import java.util.concurrent.TimeUnit; import io.lbry.browser.exceptions.LbryResponseException; import io.lbry.browser.utils.Helper; import okhttp3.MediaType; import okhttp3.MultipartBody; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; public class UploadImageTask extends AsyncTask<Void, Void, String> { private String filePath; private View progressView; private UploadThumbnailHandler handler; private Exception error; public UploadImageTask(String filePath, View progressView, UploadThumbnailHandler handler) { this.filePath = filePath; this.progressView = progressView; this.handler = handler; } protected void onPreExecute() { Helper.setViewVisibility(progressView, View.VISIBLE); } protected String doInBackground(Void... params) { String thumbnailUrl = null; try { File file = new File(filePath); String fileName = file.getName(); int dotIndex = fileName.lastIndexOf('.'); String extension = "jpg"; if (dotIndex > -1) { extension = fileName.substring(dotIndex + 1); } String fileType = String.format("image/%s", extension); RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM). addFormDataPart("name", Helper.makeid(24)). addFormDataPart("file", fileName, RequestBody.create(file, MediaType.parse(fileType))). build(); Request request = new Request.Builder().url("https://spee.ch/api/claim/publish").post(body).build(); OkHttpClient client = new OkHttpClient.Builder(). writeTimeout(300, TimeUnit.SECONDS). readTimeout(300, TimeUnit.SECONDS). build(); Response response = client.newCall(request).execute(); JSONObject json = new JSONObject(response.body().string()); if (json.has("success") && Helper.getJSONBoolean("success", false, json)) { JSONObject data = json.getJSONObject("data"); String url = Helper.getJSONString("url", null, data); if (Helper.isNullOrEmpty(url)) { throw new LbryResponseException("Invalid thumbnail url returned after upload."); } thumbnailUrl = String.format("%s.%s", url, extension); } else if (json.has("error") || json.has("message")) { JSONObject error = Helper.getJSONObject("error", json); String message = null; if (error != null) { message = Helper.getJSONString("message", null, error); } if (Helper.isNullOrEmpty(message)) { message = Helper.getJSONString("message", null, json); } throw new LbryResponseException(Helper.isNullOrEmpty(message) ? "The image failed to upload." : message); } } catch (IOException | JSONException | LbryResponseException ex) { error = ex; } return thumbnailUrl; } protected void onPostExecute(String thumbnailUrl) { Helper.setViewVisibility(progressView, View.GONE); if (handler != null) { if (!Helper.isNullOrEmpty(thumbnailUrl)) { handler.onSuccess(thumbnailUrl); } else { handler.onError(error); } } } public interface UploadThumbnailHandler { void onSuccess(String url); void onError(Exception error); } }