diff --git a/res/values/strings.xml b/res/values/strings.xml
index acdcb41b70..aa177eece8 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -98,6 +98,7 @@
Select contact info
Compose message
Sorry, there was an error setting your attachment.
+ The gif you selected was too big!
Sorry, the selected video exceeds message size restrictions (%1$skB).
Sorry, the selected audio exceeds message size restrictions (%1$skB).
Recipient is not a valid SMS or email address!
diff --git a/src/org/thoughtcrime/securesms/ConversationActivity.java b/src/org/thoughtcrime/securesms/ConversationActivity.java
index cfec8a0c87..ed63b85f42 100644
--- a/src/org/thoughtcrime/securesms/ConversationActivity.java
+++ b/src/org/thoughtcrime/securesms/ConversationActivity.java
@@ -86,6 +86,7 @@ import org.thoughtcrime.securesms.database.MmsSmsColumns.Types;
import org.thoughtcrime.securesms.database.ThreadDatabase;
import org.thoughtcrime.securesms.mms.AttachmentManager;
import org.thoughtcrime.securesms.mms.AttachmentTypeSelectorAdapter;
+import org.thoughtcrime.securesms.mms.MediaConstraints;
import org.thoughtcrime.securesms.mms.MediaTooLargeException;
import org.thoughtcrime.securesms.mms.MmsMediaConstraints;
import org.thoughtcrime.securesms.mms.OutgoingGroupMediaMessage;
@@ -931,6 +932,11 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
attachmentManager.clear();
Toast.makeText(this, R.string.ConversationActivity_sorry_there_was_an_error_setting_your_attachment,
Toast.LENGTH_LONG).show();
+ } catch (MediaTooLargeException e) {
+ attachmentManager.clear();
+ Toast.makeText(this, getString(R.string.ConversationActivity_the_gif_you_selected_was_too_big),
+ Toast.LENGTH_LONG).show();
+ Log.w(TAG, e);
}
}
diff --git a/src/org/thoughtcrime/securesms/mms/AttachmentManager.java b/src/org/thoughtcrime/securesms/mms/AttachmentManager.java
index 71fdda5417..a88ee81cd8 100644
--- a/src/org/thoughtcrime/securesms/mms/AttachmentManager.java
+++ b/src/org/thoughtcrime/securesms/mms/AttachmentManager.java
@@ -87,7 +87,9 @@ public class AttachmentManager {
captureUri = null;
}
- public void setImage(MasterSecret masterSecret, Uri image) throws IOException, BitmapDecodingException {
+ public void setImage(MasterSecret masterSecret, Uri image)
+ throws IOException, BitmapDecodingException, MediaTooLargeException
+ {
if (MediaUtil.isGif(MediaUtil.getMimeType(context, image))) {
setMedia(new GifSlide(context, masterSecret, image), masterSecret);
} else {
diff --git a/src/org/thoughtcrime/securesms/mms/AudioSlide.java b/src/org/thoughtcrime/securesms/mms/AudioSlide.java
index 3086c8b3b0..68bc123bc2 100644
--- a/src/org/thoughtcrime/securesms/mms/AudioSlide.java
+++ b/src/org/thoughtcrime/securesms/mms/AudioSlide.java
@@ -59,7 +59,7 @@ public class AudioSlide extends Slide {
public static PduPart constructPartFromUri(Context context, Uri uri) throws IOException, MediaTooLargeException {
PduPart part = new PduPart();
- assertMediaSize(context, uri);
+ assertMediaSize(context, uri, MmsMediaConstraints.MAX_MESSAGE_SIZE);
Cursor cursor = null;
diff --git a/src/org/thoughtcrime/securesms/mms/GifSlide.java b/src/org/thoughtcrime/securesms/mms/GifSlide.java
index e858373d89..4c87c25742 100644
--- a/src/org/thoughtcrime/securesms/mms/GifSlide.java
+++ b/src/org/thoughtcrime/securesms/mms/GifSlide.java
@@ -2,6 +2,7 @@ package org.thoughtcrime.securesms.mms;
import android.content.Context;
import android.net.Uri;
+import android.provider.MediaStore.Audio.Media;
import org.thoughtcrime.securesms.crypto.MasterSecret;
import org.thoughtcrime.securesms.util.BitmapDecodingException;
@@ -16,9 +17,18 @@ public class GifSlide extends ImageSlide {
}
public GifSlide(Context context, MasterSecret masterSecret, Uri uri)
- throws IOException, BitmapDecodingException
+ throws IOException, BitmapDecodingException, MediaTooLargeException
{
super(context, masterSecret, uri);
+ assertMediaSize();
+ }
+
+ private void assertMediaSize() throws MediaTooLargeException, IOException {
+ // TODO move assertion outside of slides and take available transport options into account
+ assertMediaSize(context, getPart().getDataUri(), MediaConstraints.PUSH_CONSTRAINTS.getGifMaxSize());
+ if (!MediaConstraints.PUSH_CONSTRAINTS.isSatisfied(context, masterSecret, part)) {
+ throw new MediaTooLargeException("Media exceeds maximum message size.");
+ }
}
@Override public Uri getThumbnailUri() {
diff --git a/src/org/thoughtcrime/securesms/mms/MediaConstraints.java b/src/org/thoughtcrime/securesms/mms/MediaConstraints.java
index ddf7b89537..90de4d46d1 100644
--- a/src/org/thoughtcrime/securesms/mms/MediaConstraints.java
+++ b/src/org/thoughtcrime/securesms/mms/MediaConstraints.java
@@ -5,6 +5,9 @@ import android.net.Uri;
import android.util.Log;
import android.util.Pair;
+import com.bumptech.glide.Glide;
+import com.bumptech.glide.gifdecoder.GifDecoder;
+
import org.thoughtcrime.securesms.crypto.MasterSecret;
import org.thoughtcrime.securesms.util.BitmapDecodingException;
import org.thoughtcrime.securesms.util.BitmapUtil;
@@ -33,7 +36,7 @@ public abstract class MediaConstraints {
public boolean isSatisfied(Context context, MasterSecret masterSecret, PduPart part) {
try {
- return (MediaUtil.isGif(part) && part.getDataSize() <= getGifMaxSize()) ||
+ return (MediaUtil.isGif(part) && part.getDataSize() <= getGifMaxSize() && isWithinBounds(context, masterSecret, part.getDataUri())) ||
(MediaUtil.isImage(part) && part.getDataSize() <= getImageMaxSize() && isWithinBounds(context, masterSecret, part.getDataUri())) ||
(MediaUtil.isAudio(part) && part.getDataSize() <= getAudioMaxSize()) ||
(MediaUtil.isVideo(part) && part.getDataSize() <= getVideoMaxSize()) ||
diff --git a/src/org/thoughtcrime/securesms/mms/Slide.java b/src/org/thoughtcrime/securesms/mms/Slide.java
index b4ce8bc981..6eb5f14648 100644
--- a/src/org/thoughtcrime/securesms/mms/Slide.java
+++ b/src/org/thoughtcrime/securesms/mms/Slide.java
@@ -86,7 +86,7 @@ public abstract class Slide {
return !getPart().getPartId().isValid();
}
- protected static void assertMediaSize(Context context, Uri uri)
+ protected static void assertMediaSize(Context context, Uri uri, long max)
throws MediaTooLargeException, IOException
{
InputStream in = context.getContentResolver().openInputStream(uri);
@@ -96,7 +96,7 @@ public abstract class Slide {
while ((read = in.read(buffer)) != -1) {
size += read;
- if (size > MmsMediaConstraints.MAX_MESSAGE_SIZE) throw new MediaTooLargeException("Media exceeds maximum message size.");
+ if (size > max) throw new MediaTooLargeException("Media exceeds maximum message size.");
}
}
diff --git a/src/org/thoughtcrime/securesms/mms/VideoSlide.java b/src/org/thoughtcrime/securesms/mms/VideoSlide.java
index fb3e3f33a4..d8f4d9b61a 100644
--- a/src/org/thoughtcrime/securesms/mms/VideoSlide.java
+++ b/src/org/thoughtcrime/securesms/mms/VideoSlide.java
@@ -76,7 +76,7 @@ public class VideoSlide extends Slide {
cursor.close();
}
- assertMediaSize(context, uri);
+ assertMediaSize(context, uri, MmsMediaConstraints.MAX_MESSAGE_SIZE);
part.setDataUri(uri);
part.setContentId((System.currentTimeMillis()+"").getBytes());
part.setName(("Video" + System.currentTimeMillis()).getBytes());