bug fixes and various improvements for file transfer

iNPUTmice created

Change summary

src/main/java/eu/siacs/conversations/http/HttpConnection.java            |  8 
src/main/java/eu/siacs/conversations/persistance/FileBackend.java        | 15 
src/main/java/eu/siacs/conversations/services/XmppConnectionService.java |  2 
src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java      | 13 
src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java   | 11 
5 files changed, 30 insertions(+), 19 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/http/HttpConnection.java 🔗

@@ -251,14 +251,8 @@ public class HttpConnection implements Downloadable {
 		}
 
 		private void updateImageBounds() {
-			BitmapFactory.Options options = new BitmapFactory.Options();
-			options.inJustDecodeBounds = true;
-			BitmapFactory.decodeFile(file.getAbsolutePath(), options);
-			int imageHeight = options.outHeight;
-			int imageWidth = options.outWidth;
-			message.setBody(mUrl.toString() + "|" + file.getSize() + '|'
-					+ imageWidth + '|' + imageHeight);
 			message.setType(Message.TYPE_IMAGE);
+			mXmppConnectionService.getFileBackend().updateFileParams(message);
 			mXmppConnectionService.updateMessage(message);
 		}
 

src/main/java/eu/siacs/conversations/persistance/FileBackend.java 🔗

@@ -433,6 +433,21 @@ public class FileBackend {
 		return Uri.parse("file://" + file.getAbsolutePath());
 	}
 
+	public void updateFileParams(Message message) {
+		DownloadableFile file = getFile(message);
+		if (message.getType() == Message.TYPE_IMAGE || file.getMimeType().startsWith("image/")) {
+			BitmapFactory.Options options = new BitmapFactory.Options();
+			options.inJustDecodeBounds = true;
+			BitmapFactory.decodeFile(file.getAbsolutePath(), options);
+			int imageHeight = options.outHeight;
+			int imageWidth = options.outWidth;
+			message.setBody(Long.toString(file.getSize()) + '|' + imageWidth + '|' + imageHeight);
+		} else {
+			message.setBody(Long.toString(file.getSize()));
+		}
+
+	}
+
 	public class FileCopyException extends Exception {
 		private static final long serialVersionUID = -1010013599132881427L;
 		private int resId;

src/main/java/eu/siacs/conversations/services/XmppConnectionService.java 🔗

@@ -311,6 +311,7 @@ public class XmppConnectionService extends Service {
 			message.setType(Message.TYPE_FILE);
 			message.setStatus(Message.STATUS_OFFERED);
 			message.setRelativeFilePath(path);
+			getFileBackend().updateFileParams(message);
 			return message;
 		}
 		return null;
@@ -335,7 +336,6 @@ public class XmppConnectionService extends Service {
 			public void run() {
 				try {
 					DownloadableFile file = getFileBackend().copyImageToPrivateStorage(message, uri);
-					message.setRelativeFilePath(file.getName());
 					if (conversation.getNextEncryption(forceEncryption()) == Message.ENCRYPTION_PGP) {
 						getPgpEngine().encrypt(message, callback);
 					} else {

src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java 🔗

@@ -103,10 +103,11 @@ public class MessageAdapter extends ArrayAdapter<Message> {
 		}
 		boolean multiReceived = message.getConversation().getMode() == Conversation.MODE_MULTI
 				&& message.getMergedStatus() <= Message.STATUS_RECEIVED;
-		if (message.getType() == Message.TYPE_IMAGE
-				|| message.getDownloadable() != null) {
+		if (message.getType() == Message.TYPE_IMAGE || message.getType() == Message.TYPE_FILE || message.getDownloadable() != null) {
 			ImageParams params = message.getImageParams();
-			if (params.size != 0) {
+			if (params.size > (1.5 * 1024 * 1024)) {
+				filesize = params.size / (1024 * 1024)+ " MB";
+			} else if (params.size > 0) {
 				filesize = params.size / 1024 + " KB";
 			}
 			if (message.getDownloadable() != null && message.getDownloadable().getStatus() == Downloadable.STATUS_FAILED) {
@@ -509,7 +510,11 @@ public class MessageAdapter extends ArrayAdapter<Message> {
 				displayImageMessage(viewHolder, item);
 			}
 		} else if (item.getType() == Message.TYPE_FILE) {
-			displayOpenableMessage(viewHolder,item);
+			if (item.getImageParams().width > 0) {
+				displayImageMessage(viewHolder,item);
+			} else {
+				displayOpenableMessage(viewHolder, item);
+			}
 		} else {
 			if (item.getEncryption() == Message.ENCRYPTION_PGP) {
 				if (activity.hasPgp()) {

src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java 🔗

@@ -91,13 +91,7 @@ public class JingleConnection implements Downloadable {
 					JingleConnection.this.mXmppConnectionService
 							.getNotificationService().push(message);
 				}
-				BitmapFactory.Options options = new BitmapFactory.Options();
-				options.inJustDecodeBounds = true;
-				BitmapFactory.decodeFile(file.getAbsolutePath(), options);
-				int imageHeight = options.outHeight;
-				int imageWidth = options.outWidth;
-				message.setBody(Long.toString(file.getSize()) + '|'
-						+ imageWidth + '|' + imageHeight);
+				mXmppConnectionService.getFileBackend().updateFileParams(message);
 				mXmppConnectionService.databaseBackend.createMessage(message);
 				mXmppConnectionService.markMessage(message,
 						Message.STATUS_RECEIVED);
@@ -306,6 +300,9 @@ public class JingleConnection implements Downloadable {
 					if (!fileNameElement.getContent().isEmpty()) {
 						String parts[] = fileNameElement.getContent().split("/");
 						suffix = parts[parts.length - 1];
+						if (message.getEncryption() == Message.ENCRYPTION_OTR  && suffix.endsWith(".otr")) {
+							suffix = suffix.substring(0,suffix.length() - 4);
+						}
 					}
 					message.setRelativeFilePath(message.getUuid()+"_"+suffix);
 				}