From f4eebd091ce3be0e429c2f5ea9de292317d7d8a6 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Wed, 14 May 2014 18:32:58 +0200 Subject: [PATCH] fixed #105 --- res/values/strings.xml | 5 ++ .../persistance/FileBackend.java | 58 +++++++++++-------- .../services/XmppConnectionService.java | 9 ++- 3 files changed, 43 insertions(+), 29 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 26af8830..16d191d2 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -131,4 +131,9 @@ Choose picture Take picture Preemptively grant subscription request + The file you selected is not an image + Error while converting the image file + File not found + General I/O error. Maybe you ran out of storage space? + The app you used to select this image did not provide us with enough permissions to read the file.\n\nUse a different file manager to choose an image diff --git a/src/eu/siacs/conversations/persistance/FileBackend.java b/src/eu/siacs/conversations/persistance/FileBackend.java index 0b26049e..3a580048 100644 --- a/src/eu/siacs/conversations/persistance/FileBackend.java +++ b/src/eu/siacs/conversations/persistance/FileBackend.java @@ -7,7 +7,6 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.lang.ref.WeakReference; import android.content.Context; import android.graphics.Bitmap; @@ -15,13 +14,9 @@ import android.graphics.BitmapFactory; import android.net.Uri; import android.util.Log; import android.util.LruCache; -import android.view.View; -import android.widget.ImageView; -import android.widget.TextView; -import eu.siacs.conversations.entities.Account; +import eu.siacs.conversations.R; import eu.siacs.conversations.entities.Conversation; import eu.siacs.conversations.entities.Message; -import eu.siacs.conversations.services.XmppConnectionService; import eu.siacs.conversations.xmpp.jingle.JingleFile; public class FileBackend { @@ -43,11 +38,11 @@ public class FileBackend { }; } - + public LruCache getThumbnailCache() { return thumbnailCache; } - + public JingleFile getJingleFile(Message message) { return getJingleFile(message, true); } @@ -58,7 +53,7 @@ public class FileBackend { String path = prefix + "/" + conversation.getAccount().getJid() + "/" + conversation.getContactJid(); String filename; - if ((decrypted)||(message.getEncryption() == Message.ENCRYPTION_NONE)) { + if ((decrypted) || (message.getEncryption() == Message.ENCRYPTION_NONE)) { filename = message.getUuid() + ".webp"; } else { filename = message.getUuid() + ".webp.pgp"; @@ -87,15 +82,13 @@ public class FileBackend { } } - public JingleFile copyImageToPrivateStorage(Message message, Uri image) { + public JingleFile copyImageToPrivateStorage(Message message, Uri image) + throws ImageCopyException { try { InputStream is; - if (image!=null) { - Log.d("xmppService","copying file: "+image.toString()+ " to internal storage"); - is = context.getContentResolver() - .openInputStream(image); + if (image != null) { + is = context.getContentResolver().openInputStream(image); } else { - Log.d("xmppService","copying file from incoming to internal storage"); is = new FileInputStream(getIncomingFile()); } JingleFile file = getJingleFile(message); @@ -103,30 +96,34 @@ public class FileBackend { file.createNewFile(); OutputStream os = new FileOutputStream(file); Bitmap originalBitmap = BitmapFactory.decodeStream(is); + if (originalBitmap == null) { + os.close(); + throw new ImageCopyException(R.string.error_not_an_image_file); + } is.close(); - if (image==null) { - Log.d("xmppService","delete incoming file"); + if (image == null) { getIncomingFile().delete(); } Bitmap scalledBitmap = resize(originalBitmap, IMAGE_SIZE); boolean success = scalledBitmap.compress( Bitmap.CompressFormat.WEBP, 75, os); if (!success) { - return null; + throw new ImageCopyException(R.string.error_compressing_image); } os.flush(); os.close(); long size = file.getSize(); int width = scalledBitmap.getWidth(); int height = scalledBitmap.getHeight(); - message.setBody(""+size+","+width+","+height); + message.setBody("" + size + "," + width + "," + height); return file; } catch (FileNotFoundException e) { - return null; + throw new ImageCopyException(R.string.error_file_not_found); } catch (IOException e) { - return null; + throw new ImageCopyException(R.string.error_io_exception); } catch (SecurityException e) { - return null; + throw new ImageCopyException( + R.string.error_security_exception_during_image_copy); } } @@ -138,7 +135,7 @@ public class FileBackend { public Bitmap getThumbnail(Message message, int size, boolean cacheOnly) throws FileNotFoundException { Bitmap thumbnail = thumbnailCache.get(message.getUuid()); - if ((thumbnail == null)&&(!cacheOnly)) { + if ((thumbnail == null) && (!cacheOnly)) { Bitmap fullsize = BitmapFactory.decodeFile(getJingleFile(message) .getAbsolutePath()); if (fullsize == null) { @@ -172,6 +169,19 @@ public class FileBackend { } public File getIncomingFile() { - return new File(context.getFilesDir().getAbsolutePath()+"/incoming"); + return new File(context.getFilesDir().getAbsolutePath() + "/incoming"); + } + + public class ImageCopyException extends Exception { + private static final long serialVersionUID = -1010013599132881427L; + private int resId; + + public ImageCopyException(int resId) { + this.resId = resId; + } + + public int getResId() { + return resId; + } } } diff --git a/src/eu/siacs/conversations/services/XmppConnectionService.java b/src/eu/siacs/conversations/services/XmppConnectionService.java index df2ee6a0..90c941e3 100644 --- a/src/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/eu/siacs/conversations/services/XmppConnectionService.java @@ -476,16 +476,15 @@ public class XmppConnectionService extends Service { @Override public void run() { - JingleFile file = getFileBackend().copyImageToPrivateStorage( - message, uri); - if (file == null) { - callback.error(R.string.error_copying_image_file); - } else { + try { + getFileBackend().copyImageToPrivateStorage(message, uri); if (conversation.getNextEncryption() == Message.ENCRYPTION_PGP) { getPgpEngine().encrypt(message, callback); } else { callback.success(); } + } catch (FileBackend.ImageCopyException e) { + callback.error(e.getResId()); } } }).start();