From 83b0963533539e3e12d0df3a2997b9e71e73e4b3 Mon Sep 17 00:00:00 2001 From: Clark Date: Mon, 3 Apr 2023 09:58:09 -0400 Subject: [PATCH] Add fix for m4a mapping to audio/mpeg. --- .../securesms/sharing/v2/ShareRepository.kt | 11 +++-- .../securesms/util/MediaUtil.java | 40 +++++++++++++++++-- 2 files changed, 41 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/sharing/v2/ShareRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/sharing/v2/ShareRepository.kt index bbd2c6b4ac..1bef440312 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/sharing/v2/ShareRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/sharing/v2/ShareRepository.kt @@ -48,7 +48,9 @@ class ShareRepository(context: Context) { } val uri = multiShareExternal.uri - val mimeType = getMimeType(appContext, uri, multiShareExternal.mimeType) + val size = getSize(appContext, uri) + val name = getFileName(appContext, uri) + val mimeType = getMimeType(appContext, uri, multiShareExternal.mimeType, name?.substringAfterLast('.', "")) val stream: InputStream = try { appContext.contentResolver.openInputStream(uri) @@ -57,9 +59,6 @@ class ShareRepository(context: Context) { null } ?: return ResolvedShareData.Failure - val size = getSize(appContext, uri) - val name = getFileName(appContext, uri) - val blobUri: Uri = try { BlobProvider.getInstance() .forData(stream, size) @@ -142,8 +141,8 @@ class ShareRepository(context: Context) { companion object { private val TAG = Log.tag(ShareRepository::class.java) - private fun getMimeType(context: Context, uri: Uri, mimeType: String?): String { - var updatedMimeType = MediaUtil.getMimeType(context, uri) + private fun getMimeType(context: Context, uri: Uri, mimeType: String?, fileExtension: String? = null): String { + var updatedMimeType = MediaUtil.getMimeType(context, uri, fileExtension) if (updatedMimeType == null) { updatedMimeType = MediaUtil.getCorrectedMimeType(mimeType) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/MediaUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/MediaUtil.java index 8730a26a46..fafc873a86 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/MediaUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/MediaUtil.java @@ -60,6 +60,7 @@ public class MediaUtil { public static final String IMAGE_WEBP = "image/webp"; public static final String IMAGE_GIF = "image/gif"; public static final String AUDIO_AAC = "audio/aac"; + public static final String AUDIO_MP4 = "audio/mp4"; public static final String AUDIO_UNSPECIFIED = "audio/*"; public static final String VIDEO_MP4 = "video/mp4"; public static final String VIDEO_UNSPECIFIED = "video/*"; @@ -108,6 +109,10 @@ public class MediaUtil { } public static @Nullable String getMimeType(@NonNull Context context, @Nullable Uri uri) { + return getMimeType(context, uri, null); + } + + public static @Nullable String getMimeType(@NonNull Context context, @Nullable Uri uri, @Nullable String fileExtension) { if (uri == null) return null; if (PartAuthority.isLocalUri(uri)) { @@ -116,8 +121,12 @@ public class MediaUtil { String type = context.getContentResolver().getType(uri); if (type == null || isOctetStream(type)) { - final String extension = MimeTypeMap.getFileExtensionFromUrl(uri.toString()); + String extension = MimeTypeMap.getFileExtensionFromUrl(uri.toString()); + if (TextUtils.isEmpty(extension) && fileExtension != null) { + extension = fileExtension; + } type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension.toLowerCase()); + return getCorrectedMimeType(type, fileExtension); } return getCorrectedMimeType(type); @@ -128,14 +137,37 @@ public class MediaUtil { .getExtensionFromMimeType(getMimeType(context, uri)); } + private static String safeMimeTypeOverride(String originalType, String overrideType) { + if (MimeTypeMap.getSingleton().hasMimeType(overrideType)) { + return overrideType; + } + return originalType; + } + + public static @Nullable String overrideMimeTypeWithExtension(@Nullable String mimeType, @Nullable String fileExtension) { + if (fileExtension == null) { + return mimeType; + } + switch (fileExtension.toLowerCase()) { + case "m4a": + return safeMimeTypeOverride(mimeType, AUDIO_MP4); + default: + return mimeType; + } + } + public static @Nullable String getCorrectedMimeType(@Nullable String mimeType) { + return getCorrectedMimeType(mimeType, null); + } + + public static @Nullable String getCorrectedMimeType(@Nullable String mimeType, @Nullable String fileExtension) { if (mimeType == null) return null; switch(mimeType) { case "image/jpg": - return MimeTypeMap.getSingleton().hasMimeType(IMAGE_JPEG) - ? IMAGE_JPEG - : mimeType; + return safeMimeTypeOverride(mimeType, IMAGE_JPEG); + case "audio/mpeg": + return overrideMimeTypeWithExtension(mimeType, fileExtension); default: return mimeType; }