package akechi.projectl.async;
import android.content.Context;
import android.net.Uri;
import android.support.v4.content.AsyncTaskLoader;
import android.util.Log;
import com.google.api.client.extensions.android.http.AndroidHttp;
import com.google.api.client.http.ByteArrayContent;
import com.google.api.client.http.EmptyContent;
import com.google.api.client.http.FileContent;
import com.google.api.client.http.GenericUrl;
import com.google.api.client.http.HttpContent;
import com.google.api.client.http.HttpHeaders;
import com.google.api.client.http.HttpMediaType;
import com.google.api.client.http.HttpRequest;
import com.google.api.client.http.HttpRequestFactory;
import com.google.api.client.http.HttpRequestInitializer;
import com.google.api.client.http.HttpResponse;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.MultipartContent;
import com.google.api.client.http.UrlEncodedContent;
import com.google.api.client.util.GenericData;
import com.google.api.client.util.IOUtils;
import com.google.api.client.util.Maps;
import org.apache.http.client.utils.URLEncodedUtils;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;
import java.util.HashMap;
import java.util.Map;
import static com.google.common.base.Preconditions.checkNotNull;
public class GyazoUploader
extends AsyncTaskLoader<Uri>
{
public GyazoUploader(Context context, Uri imageUri)
{
super(context);
checkNotNull(imageUri);
this.imageUri= imageUri;
}
@Override
public Uri loadInBackground()
{
try
{
final GenericUrl url= new GenericUrl("https://upload.gyazo.com");
url.appendRawPath("/upload.cgi");
final HttpContent content;
{
final MultipartContent data= new MultipartContent();
data.setMediaType(new HttpMediaType("multipart/form-data"));
data.setBoundary("__END_OF_PART__");
data.addPart(new MultipartContent.Part(
new HttpHeaders()
.set("Content-Disposition", "form-data; name=\"id\""),
new EmptyContent()
));
data.addPart(new MultipartContent.Part(
new HttpHeaders()
.set("Content-Disposition", "form-data; name=\"imagedata\"; filename=\"gyazo.com\""),
new ByteArrayContent(null, this.readBytes())
));
content= data;
}
final HttpRequestFactory factory= transport.createRequestFactory(new HttpRequestInitializer(){
@Override
public void initialize(HttpRequest request)
throws IOException
{
request.setLoggingEnabled(true);
}
});
final HttpRequest request= factory.buildPostRequest(url, content);
final HttpResponse response= request.execute();
Log.i("gyazo", String.format("code=%d, content=%s", response.getStatusCode(), response.toString()));
if(response.getStatusCode() >= 200 && response.getStatusCode() < 300)
{
ByteArrayOutputStream out= null;
try
{
out= new ByteArrayOutputStream();
IOUtils.copy(response.getContent(), out);
return Uri.parse(out.toString());
}
finally
{
response.disconnect();
if(out != null)
{
out.close();
}
}
}
else
{
return null;
}
}
catch(IOException e)
{
Log.e("gyazo", "Oops", e);
return null;
}
}
private byte[] readBytes()
throws IOException
{
final ByteArrayOutputStream ostream= new ByteArrayOutputStream();
IOUtils.copy(this.getContext().getContentResolver().openInputStream(this.imageUri), ostream);
return ostream.toByteArray();
}
private File writeFile()
throws IOException
{
final File file= File.createTempFile("project-l-gyazo-upload", "", this.getContext().getCacheDir());
OutputStream out= null;
try
{
out= new FileOutputStream(file);
IOUtils.copy(this.getContext().getContentResolver().openInputStream(this.imageUri), out);
return file;
}
finally
{
if(out != null)
{
out.close();
}
}
}
private static final HttpTransport transport= AndroidHttp.newCompatibleTransport();
private final Uri imageUri;
}