From fe64caddd14a05200e3232af9e453175e5285b2b Mon Sep 17 00:00:00 2001 From: Raphael Fakhri <153192858+RaphaelFakhri@users.noreply.github.com> Date: Wed, 21 Oct 2026 08:05:02 +0000 Subject: [PATCH] fix(share): keep the common MIME type when sharing several files on Android --- .../plugins/share/SharePlugin.java | 26 +++++++++++++---- .../plugins/share/SharePluginTest.java | 28 +++++++++++++++++++ 2 files changed, 49 insertions(+), 5 deletions(-) create mode 100644 share/android/src/test/java/com/capacitorjs/plugins/share/SharePluginTest.java diff --git a/share/android/src/main/java/com/capacitorjs/plugins/share/SharePlugin.java b/share/android/src/main/java/com/capacitorjs/plugins/share/SharePlugin.java index 9b97dc0135..d51334e39e 100644 --- a/share/android/src/main/java/com/capacitorjs/plugins/share/SharePlugin.java +++ b/share/android/src/main/java/com/capacitorjs/plugins/share/SharePlugin.java @@ -167,16 +167,14 @@ public void share(PluginCall call) { private void shareFiles(JSArray files, Intent intent, PluginCall call) { List filesList; ArrayList fileUris = new ArrayList<>(); + String sharedType = null; try { filesList = files.toList(); for (int i = 0; i < filesList.size(); i++) { String file = (String) filesList.get(i); if (isFileUrl(file)) { - String type = getMimeType(file); - if (type == null || filesList.size() > 1) { - type = "*/*"; - } - intent.setType(type); + sharedType = i == 0 ? getMimeType(file) : getCommonMimeType(sharedType, getMimeType(file)); + intent.setType(sharedType != null ? sharedType : "*/*"); Uri fileUrl = FileProvider.getUriForFile( getActivity(), @@ -227,6 +225,24 @@ private String getMimeType(String url) { return type; } + /** + * Returns the most specific MIME type that covers both types: the type itself when they match, + * {@code type/*} when only the top-level type matches, and {@code null} otherwise. + */ + static String getCommonMimeType(String first, String second) { + if (first == null || second == null) { + return null; + } + if (first.equals(second)) { + return first; + } + int slash = first.indexOf('/'); + if (slash > 0 && slash == second.indexOf('/') && first.regionMatches(0, second, 0, slash)) { + return first.substring(0, slash) + "/*"; + } + return null; + } + private boolean isFileUrl(String url) { return url.startsWith("file:"); } diff --git a/share/android/src/test/java/com/capacitorjs/plugins/share/SharePluginTest.java b/share/android/src/test/java/com/capacitorjs/plugins/share/SharePluginTest.java new file mode 100644 index 0000000000..d20dc17696 --- /dev/null +++ b/share/android/src/test/java/com/capacitorjs/plugins/share/SharePluginTest.java @@ -0,0 +1,28 @@ +package com.capacitorjs.plugins.share; + +import static org.junit.Assert.*; + +import org.junit.Test; + +public class SharePluginTest { + + @Test + public void getCommonMimeType_keepsMatchingType() { + assertEquals("image/jpeg", SharePlugin.getCommonMimeType("image/jpeg", "image/jpeg")); + } + + @Test + public void getCommonMimeType_usesWildcardSubtypeForSameTopLevelType() { + assertEquals("image/*", SharePlugin.getCommonMimeType("image/jpeg", "image/png")); + assertEquals("image/*", SharePlugin.getCommonMimeType("image/*", "image/png")); + assertEquals("video/*", SharePlugin.getCommonMimeType("video/mp4", "video/webm")); + } + + @Test + public void getCommonMimeType_returnsNullForDifferentOrUnknownTypes() { + assertNull(SharePlugin.getCommonMimeType("image/jpeg", "video/mp4")); + assertNull(SharePlugin.getCommonMimeType("image/jpeg", null)); + assertNull(SharePlugin.getCommonMimeType(null, "image/jpeg")); + assertNull(SharePlugin.getCommonMimeType("imagex/png", "image/png")); + } +}