From 2141f1073ec158687f7ef5972f4c8595eb6d3bb4 Mon Sep 17 00:00:00 2001 From: Alan Evans Date: Sat, 24 Aug 2019 17:54:29 +0100 Subject: [PATCH] Ensure memory file descriptor is available. --- .../securesms/mms/MediaConstraints.java | 4 ++-- .../securesms/util/MemoryFileDescriptor.java | 24 +++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/org/thoughtcrime/securesms/mms/MediaConstraints.java b/src/org/thoughtcrime/securesms/mms/MediaConstraints.java index dab8c05fa0..614ac7ba24 100644 --- a/src/org/thoughtcrime/securesms/mms/MediaConstraints.java +++ b/src/org/thoughtcrime/securesms/mms/MediaConstraints.java @@ -6,13 +6,13 @@ import android.os.Build; import android.util.Pair; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import org.thoughtcrime.securesms.attachments.Attachment; import org.thoughtcrime.securesms.logging.Log; 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 java.io.IOException; import java.io.InputStream; @@ -76,6 +76,6 @@ public abstract class MediaConstraints { } public static boolean isVideoTranscodeAvailable() { - return Build.VERSION.SDK_INT >= 26; + return Build.VERSION.SDK_INT >= 26 && MemoryFileDescriptor.supported(); } } diff --git a/src/org/thoughtcrime/securesms/util/MemoryFileDescriptor.java b/src/org/thoughtcrime/securesms/util/MemoryFileDescriptor.java index e8b7b724d9..c76775bf81 100644 --- a/src/org/thoughtcrime/securesms/util/MemoryFileDescriptor.java +++ b/src/org/thoughtcrime/securesms/util/MemoryFileDescriptor.java @@ -22,9 +22,33 @@ public final class MemoryFileDescriptor implements Closeable { private static final String TAG = Log.tag(MemoryFileDescriptor.class); + private static Boolean supported; + private final ParcelFileDescriptor parcelFileDescriptor; private final AtomicLong sizeEstimate; + /** + * Does this device support memory file descriptor. + */ + public synchronized static boolean supported() { + if (supported == null) { + try { + int fileDescriptor = FileUtils.createMemoryFileDescriptor("CHECK"); + + if (fileDescriptor < 0) { + supported = false; + Log.w(TAG, "MemoryFileDescriptor is not available."); + } else { + supported = true; + ParcelFileDescriptor.adoptFd(fileDescriptor).close(); + } + } catch (IOException e) { + Log.w(TAG, e); + } + } + return supported; + } + /** * memfd files do not show on the available RAM, so we must track our allocations in addition. */