package de.vanmar.android.yarrn.projects; import android.app.Application; import android.net.Uri; import com.androidquery.util.AQUtility; import org.json.JSONObject; import org.scribe.model.OAuthRequest; import org.scribe.model.Response; import org.scribe.model.Verb; import org.springframework.core.io.InputStreamResource; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.converter.FormHttpMessageConverter; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestTemplate; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import de.vanmar.android.yarrn.R; import de.vanmar.android.yarrn.YarrnPrefs_; import de.vanmar.android.yarrn.ravelry.RavelryException; import de.vanmar.android.yarrn.ravelry.dts.UploadResult; import de.vanmar.android.yarrn.requests.AbstractRavelryRequest; public class PhotoUploadRequest extends AbstractRavelryRequest<String> { private final Uri photoUri; private final int projectId; public PhotoUploadRequest(Application application, YarrnPrefs_ prefs, Uri photoUri, int projectId) { super(String.class, prefs, application); this.photoUri = photoUri; this.projectId = projectId; } @Override public String loadDataFromNetwork() throws Exception { final OAuthRequest request = new OAuthRequest(Verb.POST, application.getString(R.string.ravelry_url) + "/upload/request_token.json"); Response requestTokenResponse = executeRequest(request); final String token = new JSONObject(requestTokenResponse.getBody()).getString("upload_token"); try { MultiValueMap<String, Object> parts = new LinkedMultiValueMap<String, Object>(); parts.add("upload_token", token); parts.add("access_key", application.getString(R.string.api_key)); final InputStream inputStream = application.getContentResolver().openInputStream(photoUri); parts.add("file0", new InputStreamResource(inputStream) { @Override public long contentLength() throws IOException { return inputStream.available(); } @Override public String getFilename() throws IllegalStateException { return photoUri.getLastPathSegment(); } }); MultiValueMap<String, String> headers = new HttpHeaders(); headers.add("Content-Type", "multipart/form-data"); HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<MultiValueMap<String, Object>>(parts, headers); RestTemplate restTemplate = getRestTemplate(); restTemplate.getMessageConverters().add(0, new FormHttpMessageConverter()); UploadResult uploadResult = restTemplate.postForObject(application.getString(R.string.ravelry_url) + "/upload/image.json", requestEntity, UploadResult.class); Integer imageId = uploadResult.get("uploads").get("file0").get("image_id"); return addPhotoToProject(imageId, projectId); } catch (final FileNotFoundException e) { onError(e); throw e; } } private String addPhotoToProject(final int imageId, final int projectId) throws RavelryException { final OAuthRequest request = new OAuthRequest(Verb.POST, application.getString(R.string.ravelry_url) + String.format("/projects/%s/%s/create_photo.json", prefs.username().get(), projectId)); request.addBodyParameter("image_id", String.valueOf(imageId)); Response response = executeRequest(request); return response.getBody(); } private void onError(final Exception exception) { AQUtility.report(exception); } }