takeing pictures over intent

This commit is contained in:
Daniel Gultsch 2014-05-13 16:48:39 +02:00
parent a8010e7133
commit 9492e28902
3 changed files with 95 additions and 42 deletions

View File

@ -1,6 +1,7 @@
package eu.siacs.conversations.persistance; package eu.siacs.conversations.persistance;
import java.io.File; import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
@ -17,7 +18,6 @@ import android.util.LruCache;
import android.view.View; import android.view.View;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import eu.siacs.conversations.entities.Account; import eu.siacs.conversations.entities.Account;
import eu.siacs.conversations.entities.Conversation; import eu.siacs.conversations.entities.Conversation;
import eu.siacs.conversations.entities.Message; import eu.siacs.conversations.entities.Message;
@ -89,15 +89,25 @@ public class FileBackend {
public JingleFile copyImageToPrivateStorage(Message message, Uri image) { public JingleFile copyImageToPrivateStorage(Message message, Uri image) {
try { try {
Log.d("xmppService","copying file: "+image.toString()+ " to internal storage"); InputStream is;
InputStream is = context.getContentResolver() if (image!=null) {
Log.d("xmppService","copying file: "+image.toString()+ " to internal storage");
is = context.getContentResolver()
.openInputStream(image); .openInputStream(image);
} else {
Log.d("xmppService","copying file from incoming to internal storage");
is = new FileInputStream(getIncomingFile());
}
JingleFile file = getJingleFile(message); JingleFile file = getJingleFile(message);
file.getParentFile().mkdirs(); file.getParentFile().mkdirs();
file.createNewFile(); file.createNewFile();
OutputStream os = new FileOutputStream(file); OutputStream os = new FileOutputStream(file);
Bitmap originalBitmap = BitmapFactory.decodeStream(is); Bitmap originalBitmap = BitmapFactory.decodeStream(is);
is.close(); is.close();
if (image==null) {
Log.d("xmppService","delete incoming file");
getIncomingFile().delete();
}
Bitmap scalledBitmap = resize(originalBitmap, IMAGE_SIZE); Bitmap scalledBitmap = resize(originalBitmap, IMAGE_SIZE);
boolean success = scalledBitmap.compress( boolean success = scalledBitmap.compress(
Bitmap.CompressFormat.WEBP, 75, os); Bitmap.CompressFormat.WEBP, 75, os);
@ -160,4 +170,8 @@ public class FileBackend {
} }
f.delete(); f.delete();
} }
public File getIncomingFile() {
return new File(context.getFilesDir().getAbsolutePath()+"/incoming");
}
} }

View File

@ -2,13 +2,13 @@ package eu.siacs.conversations.services;
import java.io.File; import java.io.File;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.IOException;
import eu.siacs.conversations.entities.Account; import eu.siacs.conversations.entities.Account;
import eu.siacs.conversations.entities.Conversation; import eu.siacs.conversations.entities.Conversation;
import eu.siacs.conversations.entities.Message; import eu.siacs.conversations.entities.Message;
import eu.siacs.conversations.persistance.DatabaseBackend; import eu.siacs.conversations.persistance.DatabaseBackend;
import eu.siacs.conversations.persistance.FileBackend; import eu.siacs.conversations.persistance.FileBackend;
import android.content.ContentProvider; import android.content.ContentProvider;
import android.content.ContentValues; import android.content.ContentValues;
import android.database.Cursor; import android.database.Cursor;
@ -21,46 +21,60 @@ public class ImageProvider extends ContentProvider {
@Override @Override
public ParcelFileDescriptor openFile(Uri uri, String mode) public ParcelFileDescriptor openFile(Uri uri, String mode)
throws FileNotFoundException { throws FileNotFoundException {
DatabaseBackend databaseBackend = DatabaseBackend ParcelFileDescriptor pfd;
.getInstance(getContext());
FileBackend fileBackend = new FileBackend(getContext()); FileBackend fileBackend = new FileBackend(getContext());
String uuids = uri.getPath(); if ("r".equals(mode)) {
Log.d("xmppService", "uuids = " + uuids); DatabaseBackend databaseBackend = DatabaseBackend
if (uuids == null) { .getInstance(getContext());
String uuids = uri.getPath();
Log.d("xmppService", "uuids = " + uuids+" mode="+mode);
if (uuids == null) {
throw new FileNotFoundException();
}
String[] uuidsSplited = uuids.split("/");
if (uuidsSplited.length != 3) {
throw new FileNotFoundException();
}
String conversationUuid = uuidsSplited[1];
String messageUuid = uuidsSplited[2];
Conversation conversation = databaseBackend
.findConversationByUuid(conversationUuid);
if (conversation == null) {
throw new FileNotFoundException("conversation " + conversationUuid
+ " could not be found");
}
Message message = databaseBackend.findMessageByUuid(messageUuid);
if (message == null) {
throw new FileNotFoundException("message " + messageUuid
+ " could not be found");
}
Account account = databaseBackend.findAccountByUuid(conversation
.getAccountUuid());
if (account == null) {
throw new FileNotFoundException("account "
+ conversation.getAccountUuid() + " cound not be found");
}
message.setConversation(conversation);
conversation.setAccount(account);
File file = fileBackend.getJingleFile(message);
pfd = ParcelFileDescriptor.open(file,
ParcelFileDescriptor.MODE_READ_ONLY);
return pfd;
} else if ("w".equals(mode)){
File file = fileBackend.getIncomingFile();
try {
file.createNewFile();
} catch (IOException e) {
throw new FileNotFoundException();
}
pfd = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_WRITE);
return pfd;
} else {
throw new FileNotFoundException(); throw new FileNotFoundException();
} }
String[] uuidsSplited = uuids.split("/");
if (uuidsSplited.length != 3) {
throw new FileNotFoundException();
}
String conversationUuid = uuidsSplited[1];
String messageUuid = uuidsSplited[2];
Conversation conversation = databaseBackend
.findConversationByUuid(conversationUuid);
if (conversation == null) {
throw new FileNotFoundException("conversation " + conversationUuid
+ " could not be found");
}
Message message = databaseBackend.findMessageByUuid(messageUuid);
if (message == null) {
throw new FileNotFoundException("message " + messageUuid
+ " could not be found");
}
Account account = databaseBackend.findAccountByUuid(conversation
.getAccountUuid());
if (account == null) {
throw new FileNotFoundException("account "
+ conversation.getAccountUuid() + " cound not be found");
}
message.setConversation(conversation);
conversation.setAccount(account);
File file = fileBackend.getJingleFile(message);
ParcelFileDescriptor pfd = ParcelFileDescriptor.open(file,
ParcelFileDescriptor.MODE_READ_ONLY);
return pfd;
} }
@Override @Override
@ -102,4 +116,7 @@ public class ImageProvider extends ContentProvider {
+ message.getUuid()); + message.getUuid());
} }
public static Uri getIncomingContentUri() {
return Uri.parse("content://eu.siacs.conversations.images/incoming");
}
} }

View File

@ -13,6 +13,7 @@ import eu.siacs.conversations.entities.Account;
import eu.siacs.conversations.entities.Contact; import eu.siacs.conversations.entities.Contact;
import eu.siacs.conversations.entities.Conversation; import eu.siacs.conversations.entities.Conversation;
import eu.siacs.conversations.entities.Message; import eu.siacs.conversations.entities.Message;
import eu.siacs.conversations.services.ImageProvider;
import eu.siacs.conversations.utils.ExceptionHelper; import eu.siacs.conversations.utils.ExceptionHelper;
import eu.siacs.conversations.utils.UIHelper; import eu.siacs.conversations.utils.UIHelper;
import android.net.Uri; import android.net.Uri;
@ -352,6 +353,7 @@ public class ConversationActivity extends XmppActivity {
private void takePicture() { private void takePicture() {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, ImageProvider.getIncomingContentUri());
if (takePictureIntent.resolveActivity(getPackageManager()) != null) { if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE); startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
} }
@ -732,6 +734,26 @@ public class ConversationActivity extends XmppActivity {
announcePgp(getSelectedConversation().getAccount(),getSelectedConversation()); announcePgp(getSelectedConversation().getAccount(),getSelectedConversation());
} else if (requestCode == REQUEST_ENCRYPT_MESSAGE) { } else if (requestCode == REQUEST_ENCRYPT_MESSAGE) {
encryptTextMessage(); encryptTextMessage();
} else if (requestCode == REQUEST_IMAGE_CAPTURE) {
this.pendingMessage = xmppConnectionService.attachImageToConversation(getSelectedConversation(), null, new UiCallback() {
@Override
public void userInputRequried(PendingIntent pi) {
// TODO Auto-generated method stub
}
@Override
public void success() {
sendPendingImageMessage();
}
@Override
public void error(int errorCode) {
// TODO Auto-generated method stub
}
});
} else { } else {
Log.d(LOGTAG,"unknown result code:"+requestCode); Log.d(LOGTAG,"unknown result code:"+requestCode);
} }