aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--res/values/strings.xml5
-rw-r--r--src/eu/siacs/conversations/persistance/FileBackend.java58
-rw-r--r--src/eu/siacs/conversations/services/XmppConnectionService.java9
-rw-r--r--src/eu/siacs/conversations/ui/ConversationActivity.java16
-rw-r--r--src/eu/siacs/conversations/ui/ConversationFragment.java8
-rw-r--r--src/eu/siacs/conversations/ui/XmppActivity.java2
-rw-r--r--src/eu/siacs/conversations/xml/XmlReader.java7
7 files changed, 64 insertions, 41 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 @@
<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>
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<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;
+ }
}
}
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();
diff --git a/src/eu/siacs/conversations/ui/ConversationActivity.java b/src/eu/siacs/conversations/ui/ConversationActivity.java
index 71710257..ac9328ca 100644
--- a/src/eu/siacs/conversations/ui/ConversationActivity.java
+++ b/src/eu/siacs/conversations/ui/ConversationActivity.java
@@ -384,7 +384,6 @@ public class ConversationActivity extends XmppActivity {
@Override
public void error(int error) {
displayErrorDialog(error);
-
}
});
} else {
@@ -728,21 +727,36 @@ public class ConversationActivity extends XmppActivity {
@Override
public void userInputRequried(PendingIntent pi) {
+ hidePrepareImageToast();
ConversationActivity.this.runIntent(pi, ConversationActivity.REQUEST_SEND_PGP_IMAGE);
}
@Override
public void success() {
sendPendingImageMessage();
+ hidePrepareImageToast();
}
@Override
public void error(int error) {
+ hidePrepareImageToast();
pendingMessage = null;
displayErrorDialog(error);
}
});
}
+
+ private void hidePrepareImageToast() {
+ if (prepareImageToast!=null) {
+ runOnUiThread(new Runnable() {
+
+ @Override
+ public void run() {
+ prepareImageToast.cancel();
+ }
+ });
+ }
+ }
private void sendPendingImageMessage() {
pendingMessage.getConversation().getMessages().add(pendingMessage);
diff --git a/src/eu/siacs/conversations/ui/ConversationFragment.java b/src/eu/siacs/conversations/ui/ConversationFragment.java
index 8d29ce8b..708c7f68 100644
--- a/src/eu/siacs/conversations/ui/ConversationFragment.java
+++ b/src/eu/siacs/conversations/ui/ConversationFragment.java
@@ -5,12 +5,9 @@ import java.util.HashMap;
import java.util.List;
import java.util.Set;
-import org.openintents.openpgp.OpenPgpError;
-
import net.java.otr4j.session.SessionStatus;
import eu.siacs.conversations.R;
import eu.siacs.conversations.crypto.PgpEngine;
-import eu.siacs.conversations.entities.Account;
import eu.siacs.conversations.entities.Contact;
import eu.siacs.conversations.entities.Conversation;
import eu.siacs.conversations.entities.Message;
@@ -31,7 +28,6 @@ import android.content.SharedPreferences;
import android.content.IntentSender.SendIntentException;
import android.graphics.Bitmap;
import android.graphics.Typeface;
-import android.net.Uri;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.text.Editable;
@@ -267,7 +263,9 @@ public class ConversationFragment extends Fragment {
}
private void displayInfoMessage(ViewHolder viewHolder, int r) {
- viewHolder.download_button.setVisibility(View.GONE);
+ if (viewHolder.download_button!=null) {
+ viewHolder.download_button.setVisibility(View.GONE);
+ }
viewHolder.image.setVisibility(View.GONE);
viewHolder.messageBody.setVisibility(View.VISIBLE);
viewHolder.messageBody.setText(getString(r));
diff --git a/src/eu/siacs/conversations/ui/XmppActivity.java b/src/eu/siacs/conversations/ui/XmppActivity.java
index dc894ad5..1fe7cf13 100644
--- a/src/eu/siacs/conversations/ui/XmppActivity.java
+++ b/src/eu/siacs/conversations/ui/XmppActivity.java
@@ -1,7 +1,5 @@
package eu.siacs.conversations.ui;
-import java.nio.channels.AlreadyConnectedException;
-
import eu.siacs.conversations.R;
import eu.siacs.conversations.entities.Account;
import eu.siacs.conversations.entities.Conversation;
diff --git a/src/eu/siacs/conversations/xml/XmlReader.java b/src/eu/siacs/conversations/xml/XmlReader.java
index 0a82a5d8..b4b1647e 100644
--- a/src/eu/siacs/conversations/xml/XmlReader.java
+++ b/src/eu/siacs/conversations/xml/XmlReader.java
@@ -85,10 +85,8 @@ public class XmlReader {
public Element readElement(Tag currentTag) throws XmlPullParserException, IOException {
Element element = new Element(currentTag.getName());
- //Log.d(LOGTAG,"trying to read element "+element.getName());
element.setAttributes(currentTag.getAttributes());
Tag nextTag = this.readTag();
- //Log.d(LOGTAG,"next Tag is: "+nextTag.toString());
if(nextTag.isNo()) {
element.setContent(nextTag.getName());
nextTag = this.readTag();
@@ -96,15 +94,16 @@ public class XmlReader {
if (nextTag == null) {
throw new IOException("unterupted mid tag");
}
- //Log.d(LOGTAG,"reading till the end of "+element.getName());
while(!nextTag.isEnd(element.getName())) {
if (!nextTag.isNo()) {
Element child = this.readElement(nextTag);
element.addChild(child);
}
nextTag = this.readTag();
+ if (nextTag == null) {
+ throw new IOException("unterupted mid tag");
+ }
}
- //Log.d(LOGTAG,"return with element"+element);
return element;
}
}