From c6287547a31591b6b8e9a651f784a2d4cffdd033 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Sat, 24 Aug 2019 09:27:08 -0400 Subject: [PATCH] Improve video transcoding exception handling. Previously, we'd crash if we couldn't find the attachment at runtime, but that's not uncommon if someone deletes before sending. Now we just fail. Also, previously we'd fail if we couldn't create a memory file. Now we will only fail if the attachment is >100mb (same as the other video failures). --- .../securesms/jobs/AttachmentCompressionJob.java | 6 ++++-- .../securesms/util/MemoryFileDescriptor.java | 16 +++++++++++++--- .../securesms/util/MemoryLimitException.java | 6 ------ 3 files changed, 17 insertions(+), 11 deletions(-) delete mode 100644 src/org/thoughtcrime/securesms/util/MemoryLimitException.java diff --git a/src/org/thoughtcrime/securesms/jobs/AttachmentCompressionJob.java b/src/org/thoughtcrime/securesms/jobs/AttachmentCompressionJob.java index df80e72550..d5392daf3a 100644 --- a/src/org/thoughtcrime/securesms/jobs/AttachmentCompressionJob.java +++ b/src/org/thoughtcrime/securesms/jobs/AttachmentCompressionJob.java @@ -28,6 +28,8 @@ import org.thoughtcrime.securesms.transport.UndeliverableMessageException; import org.thoughtcrime.securesms.util.BitmapDecodingException; import org.thoughtcrime.securesms.util.BitmapUtil; import org.thoughtcrime.securesms.util.MediaUtil; +import org.thoughtcrime.securesms.util.MemoryFileDescriptor; +import org.thoughtcrime.securesms.util.MemoryFileDescriptor.MemoryFileException; import org.thoughtcrime.securesms.video.InMemoryTranscoder; import org.thoughtcrime.securesms.video.VideoSizeException; import org.thoughtcrime.securesms.video.VideoSourceException; @@ -110,7 +112,7 @@ public final class AttachmentCompressionJob extends BaseJob { DatabaseAttachment databaseAttachment = database.getAttachment(attachmentId); if (databaseAttachment == null) { - throw new IllegalStateException("Cannot find the specified attachment."); + throw new UndeliverableMessageException("Cannot find the specified attachment."); } MediaConstraints mediaConstraints = mms ? MediaConstraints.getMmsMediaConstraints(mmsSubscriptionId) @@ -185,7 +187,7 @@ public final class AttachmentCompressionJob extends BaseJob { } } } - } catch (VideoSourceException | EncodingException e) { + } catch (VideoSourceException | EncodingException | MemoryFileException e) { if (attachment.getSize() > constraints.getVideoMaxSize(context)) { throw new UndeliverableMessageException("Duration not found, attachment too large to skip transcode", e); } else { diff --git a/src/org/thoughtcrime/securesms/util/MemoryFileDescriptor.java b/src/org/thoughtcrime/securesms/util/MemoryFileDescriptor.java index dcc6ea2785..e8b7b724d9 100644 --- a/src/org/thoughtcrime/securesms/util/MemoryFileDescriptor.java +++ b/src/org/thoughtcrime/securesms/util/MemoryFileDescriptor.java @@ -47,12 +47,12 @@ public final class MemoryFileDescriptor implements Closeable { * Use zero to avoid RAM check. * @return MemoryFileDescriptor * @throws MemoryLimitException If there is not enough available RAM to comfortably fit this file. - * @throws IOException If fails to create a memory file descriptor. + * @throws MemoryFileCreationException If fails to create a memory file descriptor. */ public static MemoryFileDescriptor newMemoryFileDescriptor(@NonNull Context context, @NonNull String debugName, long sizeEstimate) - throws MemoryLimitException, IOException + throws MemoryFileException { if (sizeEstimate < 0) throw new IllegalArgumentException(); @@ -89,7 +89,8 @@ public final class MemoryFileDescriptor implements Closeable { int fileDescriptor = FileUtils.createMemoryFileDescriptor(debugName); if (fileDescriptor < 0) { - throw new IOException("Failed to create a memory file descriptor " + fileDescriptor); + Log.w(TAG, "Failed to create file descriptor: " + fileDescriptor); + throw new MemoryFileCreationException(); } return new MemoryFileDescriptor(ParcelFileDescriptor.adoptFd(fileDescriptor), sizeEstimate); @@ -155,4 +156,13 @@ public final class MemoryFileDescriptor implements Closeable { return fileInputStream.getChannel().size(); } } + + public static class MemoryFileException extends IOException { + } + + private static final class MemoryLimitException extends MemoryFileException { + } + + private static final class MemoryFileCreationException extends MemoryFileException { + } } diff --git a/src/org/thoughtcrime/securesms/util/MemoryLimitException.java b/src/org/thoughtcrime/securesms/util/MemoryLimitException.java deleted file mode 100644 index 2dfe9d0d87..0000000000 --- a/src/org/thoughtcrime/securesms/util/MemoryLimitException.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.thoughtcrime.securesms.util; - -import java.io.IOException; - -public final class MemoryLimitException extends IOException { -}