From 1e2ccd96a732eff1479f22ed72362322b2a91118 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Wed, 11 Dec 2019 17:48:51 +0000 Subject: [PATCH] Remove support for GIF attachments on API < 24. --- .../bramble/util/AndroidUtils.java | 15 ++++- .../AttachmentCreationTaskTest.java | 61 +++++++++++++------ .../attachment/AttachmentCreationTask.java | 12 +--- .../view/TextAttachmentController.java | 5 +- .../api/messaging/MessagingConstants.java | 9 --- 5 files changed, 63 insertions(+), 39 deletions(-) diff --git a/bramble-android/src/main/java/org/briarproject/bramble/util/AndroidUtils.java b/bramble-android/src/main/java/org/briarproject/bramble/util/AndroidUtils.java index d54ad4ea3..d0435f590 100644 --- a/bramble-android/src/main/java/org/briarproject/bramble/util/AndroidUtils.java +++ b/bramble-android/src/main/java/org/briarproject/bramble/util/AndroidUtils.java @@ -8,12 +8,12 @@ import android.provider.Settings; import java.io.File; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.List; import static android.content.Context.MODE_PRIVATE; import static android.os.Build.VERSION.SDK_INT; +import static java.util.Arrays.asList; public class AndroidUtils { @@ -26,7 +26,7 @@ public class AndroidUtils { public static Collection getSupportedArchitectures() { List abis = new ArrayList<>(); if (SDK_INT >= 21) { - abis.addAll(Arrays.asList(Build.SUPPORTED_ABIS)); + abis.addAll(asList(Build.SUPPORTED_ABIS)); } else { abis.add(Build.CPU_ABI); if (Build.CPU_ABI2 != null) abis.add(Build.CPU_ABI2); @@ -57,4 +57,15 @@ public class AndroidUtils { public static File getReportDir(Context ctx) { return ctx.getDir(STORED_REPORTS, MODE_PRIVATE); } + + /** + * Returns an array of supported content types for image attachments. + * GIFs can't be compressed on API < 24 so they're not supported. + *

+ * TODO: Remove this restriction when large message support is added + */ + public static String[] getSupportedImageContentTypes() { + if (SDK_INT < 24) return new String[] {"image/jpeg", "image/png"}; + else return new String[] {"image/jpeg", "image/png", "image/gif"}; + } } diff --git a/briar-android/src/androidTestOfficial/java/org/briarproject/briar/android/attachment/AttachmentCreationTaskTest.java b/briar-android/src/androidTestOfficial/java/org/briarproject/briar/android/attachment/AttachmentCreationTaskTest.java index 248f8afe6..eed0e19e3 100644 --- a/briar-android/src/androidTestOfficial/java/org/briarproject/briar/android/attachment/AttachmentCreationTaskTest.java +++ b/briar-android/src/androidTestOfficial/java/org/briarproject/briar/android/attachment/AttachmentCreationTaskTest.java @@ -11,9 +11,11 @@ import java.util.logging.Logger; import androidx.test.ext.junit.runners.AndroidJUnit4; +import static android.os.Build.VERSION.SDK_INT; import static androidx.test.InstrumentationRegistry.getContext; import static androidx.test.core.app.ApplicationProvider.getApplicationContext; import static java.util.logging.Logger.getLogger; +import static org.junit.Assume.assumeTrue; @RunWith(AndroidJUnit4.class) public class AttachmentCreationTaskTest { @@ -30,30 +32,55 @@ public class AttachmentCreationTaskTest { imageSizeCalculator, null, null, true); @Test - public void testCompress() throws Exception { - InputStream is = getAssetInputStream("animated.gif"); - task.compressImage(is, "image/gif"); + public void testCompress100x100Png() throws Exception { + testCompress("red-100x100.png", "image/png"); + } - is = getAssetInputStream("animated2.gif"); - task.compressImage(is, "image/gif"); + @Test + public void testCompress500x500Png() throws Exception { + testCompress("blue-500x500.png", "image/png"); + } - is = getAssetInputStream("blue-500x500.png"); - task.compressImage(is, "image/png"); + @Test + public void testCompress1000x2000Png() throws Exception { + testCompress("green-1000x2000.png", "image/png"); + } - is = getAssetInputStream("error_high.jpg"); - task.compressImage(is, "image/jpeg"); + @Test + public void testCompressVeryHighJpg() throws Exception { + testCompress("error_high.jpg", "image/jpeg"); + } - is = getAssetInputStream("error_large.gif"); - task.compressImage(is, "image/gif"); + @Test + public void testCompressVeryWideJpg() throws Exception { + testCompress("error_wide.jpg", "image/jpeg"); + } - is = getAssetInputStream("error_wide.jpg"); - task.compressImage(is, "image/jpeg"); + @Test + public void testCompressAnimatedGif1() throws Exception { + // TODO: Remove this assumption when we support large messages + assumeTrue(SDK_INT >= 24); + testCompress("animated.gif", "image/gif"); + } - is = getAssetInputStream("green-1000x2000.png"); - task.compressImage(is, "image/png"); + @Test + public void testCompressAnimatedGif2() throws Exception { + // TODO: Remove this assumption when we support large messages + assumeTrue(SDK_INT >= 24); + testCompress("animated2.gif", "image/gif"); + } - is = getAssetInputStream("red-100x100.png"); - task.compressImage(is, "image/png"); + @Test + public void testCompressVeryLargeGif() throws Exception { + // TODO: Remove this assumption when we support large messages + assumeTrue(SDK_INT >= 24); + testCompress("error_large.gif", "image/gif"); + } + + private void testCompress(String filename, String contentType) + throws Exception { + InputStream is = getAssetInputStream(filename); + task.compressImage(is, contentType); } @Test diff --git a/briar-android/src/main/java/org/briarproject/briar/android/attachment/AttachmentCreationTask.java b/briar-android/src/main/java/org/briarproject/briar/android/attachment/AttachmentCreationTask.java index 4ba0664a8..10a793b86 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/attachment/AttachmentCreationTask.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/attachment/AttachmentCreationTask.java @@ -26,14 +26,15 @@ import androidx.annotation.VisibleForTesting; import static android.graphics.Bitmap.CompressFormat.JPEG; import static android.graphics.BitmapFactory.decodeStream; +import static java.util.Arrays.asList; import static java.util.logging.Level.INFO; import static java.util.logging.Level.WARNING; import static java.util.logging.Logger.getLogger; +import static org.briarproject.bramble.util.AndroidUtils.getSupportedImageContentTypes; import static org.briarproject.bramble.util.IoUtils.tryToClose; import static org.briarproject.bramble.util.LogUtils.logDuration; import static org.briarproject.bramble.util.LogUtils.logException; import static org.briarproject.bramble.util.LogUtils.now; -import static org.briarproject.briar.api.messaging.MessagingConstants.IMAGE_MIME_TYPES; import static org.briarproject.briar.api.messaging.MessagingConstants.MAX_IMAGE_SIZE; @NotNullByDefault @@ -108,7 +109,7 @@ class AttachmentCreationTask { long start = now(); String contentType = contentResolver.getType(uri); if (contentType == null) throw new IOException("null content type"); - if (!isValidMimeType(contentType)) { + if (!asList(getSupportedImageContentTypes()).contains(contentType)) { String uriString = uri.toString(); throw new UnsupportedMimeTypeException("", contentType, uriString); } @@ -124,13 +125,6 @@ class AttachmentCreationTask { return h; } - private boolean isValidMimeType(String mimeType) { - for (String supportedType : IMAGE_MIME_TYPES) { - if (supportedType.equals(mimeType)) return true; - } - return false; - } - @VisibleForTesting InputStream compressImage(InputStream is, String contentType) throws IOException { diff --git a/briar-android/src/main/java/org/briarproject/briar/android/view/TextAttachmentController.java b/briar-android/src/main/java/org/briarproject/briar/android/view/TextAttachmentController.java index fcf3e3981..806fd9e4c 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/view/TextAttachmentController.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/view/TextAttachmentController.java @@ -40,8 +40,8 @@ import static android.widget.Toast.LENGTH_LONG; import static androidx.core.content.ContextCompat.getColor; import static androidx.customview.view.AbsSavedState.EMPTY_STATE; import static androidx.lifecycle.Lifecycle.State.DESTROYED; +import static org.briarproject.bramble.util.AndroidUtils.getSupportedImageContentTypes; import static org.briarproject.briar.android.util.UiUtils.resolveColorAttribute; -import static org.briarproject.briar.api.messaging.MessagingConstants.IMAGE_MIME_TYPES; import static org.briarproject.briar.api.messaging.MessagingConstants.MAX_ATTACHMENTS_PER_MESSAGE; @UiThread @@ -131,7 +131,8 @@ public class TextAttachmentController extends TextSendController ACTION_OPEN_DOCUMENT : ACTION_GET_CONTENT); intent.setType("image/*"); intent.addCategory(CATEGORY_OPENABLE); - if (SDK_INT >= 19) intent.putExtra(EXTRA_MIME_TYPES, IMAGE_MIME_TYPES); + if (SDK_INT >= 19) + intent.putExtra(EXTRA_MIME_TYPES, getSupportedImageContentTypes()); if (SDK_INT >= 18) intent.putExtra(EXTRA_ALLOW_MULTIPLE, true); return intent; } diff --git a/briar-api/src/main/java/org/briarproject/briar/api/messaging/MessagingConstants.java b/briar-api/src/main/java/org/briarproject/briar/api/messaging/MessagingConstants.java index fda09771b..f957a404a 100644 --- a/briar-api/src/main/java/org/briarproject/briar/api/messaging/MessagingConstants.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/messaging/MessagingConstants.java @@ -19,15 +19,6 @@ public interface MessagingConstants { */ int MAX_CONTENT_TYPE_BYTES = 50; - /** - * The supported mime types for image attachments. - */ - String[] IMAGE_MIME_TYPES = { - "image/jpeg", - "image/png", - "image/gif", - }; - /** * The maximum allowed size of image attachments. * TODO: Different limit for GIFs?