fixed #105

Daniel Gultsch created

Change summary

res/values/strings.xml                                         |  5 
src/eu/siacs/conversations/persistance/FileBackend.java        | 58 ++-
src/eu/siacs/conversations/services/XmppConnectionService.java |  9 
3 files changed, 43 insertions(+), 29 deletions(-)

Detailed changes

res/values/strings.xml 🔗

@@ -131,4 +131,9 @@
     <string name="attach_choose_picture">Choose picture</string>
     <string name="attach_take_picture">Take picture</string>
     <string name="preemptively_grant">Preemptively grant subscription request</string>
+    <string name="error_not_an_image_file">The file you selected is not an image</string>
+    <string name="error_compressing_image">Error while converting the image file</string>
+    <string name="error_file_not_found">File not found</string>
+    <string name="error_io_exception">General I/O error. Maybe you ran out of storage space?</string>
+    <string name="error_security_exception_during_image_copy">The app you used to select this image did not provide us with enough permissions to read the file.\n\n<small>Use a different file manager to choose an image</small></string>
 </resources>

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<String, Bitmap> 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;
+		}
 	}
 }

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();