mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-19 14:19:53 +01:00
Remove support for GIF attachments on API < 24.
This commit is contained in:
@@ -8,12 +8,12 @@ import android.provider.Settings;
|
|||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static android.content.Context.MODE_PRIVATE;
|
import static android.content.Context.MODE_PRIVATE;
|
||||||
import static android.os.Build.VERSION.SDK_INT;
|
import static android.os.Build.VERSION.SDK_INT;
|
||||||
|
import static java.util.Arrays.asList;
|
||||||
|
|
||||||
public class AndroidUtils {
|
public class AndroidUtils {
|
||||||
|
|
||||||
@@ -26,7 +26,7 @@ public class AndroidUtils {
|
|||||||
public static Collection<String> getSupportedArchitectures() {
|
public static Collection<String> getSupportedArchitectures() {
|
||||||
List<String> abis = new ArrayList<>();
|
List<String> abis = new ArrayList<>();
|
||||||
if (SDK_INT >= 21) {
|
if (SDK_INT >= 21) {
|
||||||
abis.addAll(Arrays.asList(Build.SUPPORTED_ABIS));
|
abis.addAll(asList(Build.SUPPORTED_ABIS));
|
||||||
} else {
|
} else {
|
||||||
abis.add(Build.CPU_ABI);
|
abis.add(Build.CPU_ABI);
|
||||||
if (Build.CPU_ABI2 != null) abis.add(Build.CPU_ABI2);
|
if (Build.CPU_ABI2 != null) abis.add(Build.CPU_ABI2);
|
||||||
@@ -57,4 +57,15 @@ public class AndroidUtils {
|
|||||||
public static File getReportDir(Context ctx) {
|
public static File getReportDir(Context ctx) {
|
||||||
return ctx.getDir(STORED_REPORTS, MODE_PRIVATE);
|
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.
|
||||||
|
* <p>
|
||||||
|
* 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"};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,9 +11,11 @@ import java.util.logging.Logger;
|
|||||||
|
|
||||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
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.InstrumentationRegistry.getContext;
|
||||||
import static androidx.test.core.app.ApplicationProvider.getApplicationContext;
|
import static androidx.test.core.app.ApplicationProvider.getApplicationContext;
|
||||||
import static java.util.logging.Logger.getLogger;
|
import static java.util.logging.Logger.getLogger;
|
||||||
|
import static org.junit.Assume.assumeTrue;
|
||||||
|
|
||||||
@RunWith(AndroidJUnit4.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public class AttachmentCreationTaskTest {
|
public class AttachmentCreationTaskTest {
|
||||||
@@ -30,30 +32,55 @@ public class AttachmentCreationTaskTest {
|
|||||||
imageSizeCalculator, null, null, true);
|
imageSizeCalculator, null, null, true);
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCompress() throws Exception {
|
public void testCompress100x100Png() throws Exception {
|
||||||
InputStream is = getAssetInputStream("animated.gif");
|
testCompress("red-100x100.png", "image/png");
|
||||||
task.compressImage(is, "image/gif");
|
}
|
||||||
|
|
||||||
is = getAssetInputStream("animated2.gif");
|
@Test
|
||||||
task.compressImage(is, "image/gif");
|
public void testCompress500x500Png() throws Exception {
|
||||||
|
testCompress("blue-500x500.png", "image/png");
|
||||||
|
}
|
||||||
|
|
||||||
is = getAssetInputStream("blue-500x500.png");
|
@Test
|
||||||
task.compressImage(is, "image/png");
|
public void testCompress1000x2000Png() throws Exception {
|
||||||
|
testCompress("green-1000x2000.png", "image/png");
|
||||||
|
}
|
||||||
|
|
||||||
is = getAssetInputStream("error_high.jpg");
|
@Test
|
||||||
task.compressImage(is, "image/jpeg");
|
public void testCompressVeryHighJpg() throws Exception {
|
||||||
|
testCompress("error_high.jpg", "image/jpeg");
|
||||||
|
}
|
||||||
|
|
||||||
is = getAssetInputStream("error_large.gif");
|
@Test
|
||||||
task.compressImage(is, "image/gif");
|
public void testCompressVeryWideJpg() throws Exception {
|
||||||
|
testCompress("error_wide.jpg", "image/jpeg");
|
||||||
|
}
|
||||||
|
|
||||||
is = getAssetInputStream("error_wide.jpg");
|
@Test
|
||||||
task.compressImage(is, "image/jpeg");
|
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");
|
@Test
|
||||||
task.compressImage(is, "image/png");
|
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");
|
@Test
|
||||||
task.compressImage(is, "image/png");
|
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
|
@Test
|
||||||
|
|||||||
@@ -26,14 +26,15 @@ import androidx.annotation.VisibleForTesting;
|
|||||||
|
|
||||||
import static android.graphics.Bitmap.CompressFormat.JPEG;
|
import static android.graphics.Bitmap.CompressFormat.JPEG;
|
||||||
import static android.graphics.BitmapFactory.decodeStream;
|
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.INFO;
|
||||||
import static java.util.logging.Level.WARNING;
|
import static java.util.logging.Level.WARNING;
|
||||||
import static java.util.logging.Logger.getLogger;
|
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.IoUtils.tryToClose;
|
||||||
import static org.briarproject.bramble.util.LogUtils.logDuration;
|
import static org.briarproject.bramble.util.LogUtils.logDuration;
|
||||||
import static org.briarproject.bramble.util.LogUtils.logException;
|
import static org.briarproject.bramble.util.LogUtils.logException;
|
||||||
import static org.briarproject.bramble.util.LogUtils.now;
|
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;
|
import static org.briarproject.briar.api.messaging.MessagingConstants.MAX_IMAGE_SIZE;
|
||||||
|
|
||||||
@NotNullByDefault
|
@NotNullByDefault
|
||||||
@@ -108,7 +109,7 @@ class AttachmentCreationTask {
|
|||||||
long start = now();
|
long start = now();
|
||||||
String contentType = contentResolver.getType(uri);
|
String contentType = contentResolver.getType(uri);
|
||||||
if (contentType == null) throw new IOException("null content type");
|
if (contentType == null) throw new IOException("null content type");
|
||||||
if (!isValidMimeType(contentType)) {
|
if (!asList(getSupportedImageContentTypes()).contains(contentType)) {
|
||||||
String uriString = uri.toString();
|
String uriString = uri.toString();
|
||||||
throw new UnsupportedMimeTypeException("", contentType, uriString);
|
throw new UnsupportedMimeTypeException("", contentType, uriString);
|
||||||
}
|
}
|
||||||
@@ -124,13 +125,6 @@ class AttachmentCreationTask {
|
|||||||
return h;
|
return h;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isValidMimeType(String mimeType) {
|
|
||||||
for (String supportedType : IMAGE_MIME_TYPES) {
|
|
||||||
if (supportedType.equals(mimeType)) return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
InputStream compressImage(InputStream is, String contentType)
|
InputStream compressImage(InputStream is, String contentType)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
|
|||||||
@@ -40,8 +40,8 @@ import static android.widget.Toast.LENGTH_LONG;
|
|||||||
import static androidx.core.content.ContextCompat.getColor;
|
import static androidx.core.content.ContextCompat.getColor;
|
||||||
import static androidx.customview.view.AbsSavedState.EMPTY_STATE;
|
import static androidx.customview.view.AbsSavedState.EMPTY_STATE;
|
||||||
import static androidx.lifecycle.Lifecycle.State.DESTROYED;
|
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.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;
|
import static org.briarproject.briar.api.messaging.MessagingConstants.MAX_ATTACHMENTS_PER_MESSAGE;
|
||||||
|
|
||||||
@UiThread
|
@UiThread
|
||||||
@@ -131,7 +131,8 @@ public class TextAttachmentController extends TextSendController
|
|||||||
ACTION_OPEN_DOCUMENT : ACTION_GET_CONTENT);
|
ACTION_OPEN_DOCUMENT : ACTION_GET_CONTENT);
|
||||||
intent.setType("image/*");
|
intent.setType("image/*");
|
||||||
intent.addCategory(CATEGORY_OPENABLE);
|
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);
|
if (SDK_INT >= 18) intent.putExtra(EXTRA_ALLOW_MULTIPLE, true);
|
||||||
return intent;
|
return intent;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,15 +19,6 @@ public interface MessagingConstants {
|
|||||||
*/
|
*/
|
||||||
int MAX_CONTENT_TYPE_BYTES = 50;
|
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.
|
* The maximum allowed size of image attachments.
|
||||||
* TODO: Different limit for GIFs?
|
* TODO: Different limit for GIFs?
|
||||||
|
|||||||
Reference in New Issue
Block a user