package com.badoo.chateau.example.data.repos.messages;
import android.app.IntentService;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.Log;
import com.badoo.chateau.example.data.util.ParseUtils;
import com.parse.ParseException;
import com.parse.ParseFile;
import com.parse.ParseObject;
import java.io.Closeable;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class ImageUploadService extends IntentService {
private static final String TAG = "ImageUploadService";
private static final int BUFFER_SIZE = 16 * 1024; // 16k
private static final String KEY_LOCAL_MESSAGE_ID = ImageUploadService.class.getName() + ":localId";
private static final String KEY_IMAGE_URI = ImageUploadService.class.getName() + ":imageUri";
public static Intent createIntent(@NonNull Context context, @NonNull String localMessageId, @NonNull Uri imageUri) {
final Intent intent = new Intent(context, ImageUploadService.class);
intent.putExtra(KEY_LOCAL_MESSAGE_ID, localMessageId);
intent.putExtra(KEY_IMAGE_URI, imageUri);
return intent;
}
public ImageUploadService() {
super(TAG);
}
@Override
protected void onHandleIntent(Intent intent) {
final String localMessageId = intent.getStringExtra(KEY_LOCAL_MESSAGE_ID);
final Uri uri = intent.getParcelableExtra(KEY_IMAGE_URI);
// TODO: Put shortcut in if already file
Log.d(TAG, "Starting upload of " + uri + " for message " + localMessageId);
InputStream is = null;
OutputStream os = null;
File cacheFile = null;
try {
is = getApplicationContext().getContentResolver().openInputStream(uri);
if (is == null) {
Log.e(TAG, "Unable to open input stream from uri " + uri.toString());
return;
}
cacheFile = getCacheFile();
os = new FileOutputStream(cacheFile);
pipeStream(is, os);
saveParseFile(localMessageId, cacheFile);
}
catch (IOException e) {
Log.e(TAG, "Unable to pipe uri to temp file " + uri.toString(), e);
}
finally {
silentClose(is);
silentClose(os);
if (cacheFile != null) {
cacheFile.delete();
}
}
}
@NonNull
private File getCacheFile() throws IOException {
final File cacheDir = getApplicationContext().getCacheDir();
return File.createTempFile("ius", null, cacheDir);
}
private void pipeStream(@NonNull InputStream is, @NonNull OutputStream os) throws IOException {
final byte[] buffer = new byte[BUFFER_SIZE];
int len;
while ((len = is.read(buffer)) != -1) {
os.write(buffer, 0, len);
}
}
private void saveParseFile(@NonNull String localMessageId, @NonNull File cacheFile) {
final ParseObject image = ParseObject.create(ParseUtils.ImagesTable.NAME);
try {
image.put(ParseUtils.ImagesTable.Fields.IMAGE, new ParseFile(cacheFile));
image.put(ParseUtils.ImagesTable.Fields.LOCAL_MESSAGE_ID, localMessageId);
image.save();
Log.d(TAG, "Saved file to Parse cloud");
}
catch (ParseException e) {
Log.e(TAG, "Unable to save parse object " + image, e);
}
}
private void silentClose(@Nullable Closeable closeable) {
if (closeable == null) return;
try {
closeable.close();
}
catch (IOException e) {
// Ignore
}
}
}