diff --git a/android/src/main/AndroidManifest.xml b/android/src/main/AndroidManifest.xml index 914eec5..1c61a40 100644 --- a/android/src/main/AndroidManifest.xml +++ b/android/src/main/AndroidManifest.xml @@ -1,4 +1,15 @@ + package="com.chirag.RNMail"> - \ No newline at end of file + + + + + + diff --git a/android/src/main/java/com/chirag/RNMail/RNMailFileProvider.java b/android/src/main/java/com/chirag/RNMail/RNMailFileProvider.java new file mode 100644 index 0000000..45cf23e --- /dev/null +++ b/android/src/main/java/com/chirag/RNMail/RNMailFileProvider.java @@ -0,0 +1,7 @@ +package com.chirag.RNMail; + +import androidx.core.content.FileProvider; + +public class RNMailFileProvider extends FileProvider { + +} diff --git a/android/src/main/java/com/chirag/RNMail/RNMailModule.java b/android/src/main/java/com/chirag/RNMail/RNMailModule.java index bcd00c4..8460848 100644 --- a/android/src/main/java/com/chirag/RNMail/RNMailModule.java +++ b/android/src/main/java/com/chirag/RNMail/RNMailModule.java @@ -5,6 +5,7 @@ import android.content.pm.ResolveInfo; import android.net.Uri; import android.text.Html; +import androidx.core.content.FileProvider; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactContextBaseJavaModule; @@ -15,6 +16,7 @@ import java.util.List; import java.io.File; +import java.net.URI; import java.util.ArrayList; /** @@ -54,8 +56,9 @@ private String[] readableArrayToStringArray(ReadableArray r) { @ReactMethod public void mail(ReadableMap options, Callback callback) { - Intent i = new Intent(Intent.ACTION_SENDTO); - i.setData(Uri.parse("mailto:")); + Intent i = new Intent(Intent.ACTION_SEND_MULTIPLE); + Intent selectorIntent = new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:")); + i.setSelector(selectorIntent); if (options.hasKey("subject") && !options.isNull("subject")) { i.putExtra(Intent.EXTRA_SUBJECT, options.getString("subject")); @@ -86,25 +89,33 @@ public void mail(ReadableMap options, Callback callback) { } if (options.hasKey("attachments") && !options.isNull("attachments")) { - ReadableArray r = options.getArray("attachments"); - int length = r.size(); - ArrayList uris = new ArrayList(); - for (int keyIndex = 0; keyIndex < length; keyIndex++) { - ReadableMap clip = r.getMap(keyIndex); - if (clip.hasKey("path") && !clip.isNull("path")){ - String path = clip.getString("path"); - File file = new File(path); - Uri u = Uri.fromFile(file); - uris.add(u); - } - } - - if (uris.size() == 1) { - i.putExtra(Intent.EXTRA_STREAM, uris.get(0)); - } else { - i.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris); - } - } + ReadableArray r = options.getArray("attachments"); + int length = r.size(); + + String provider = reactContext.getApplicationContext().getPackageName() + ".rnmail.provider"; + List resolvedIntentActivities = reactContext.getPackageManager().queryIntentActivities(i, + PackageManager.MATCH_DEFAULT_ONLY); + + ArrayList uris = new ArrayList(); + for (int keyIndex = 0; keyIndex < length; keyIndex++) { + ReadableMap clip = r.getMap(keyIndex); + if (clip.hasKey("path") && !clip.isNull("path")){ + String path = clip.getString("path"); + File file = new File(path); + Uri uri = FileProvider.getUriForFile(reactContext, provider, file); + uris.add(uri); + + for (ResolveInfo resolvedIntentInfo : resolvedIntentActivities) { + String packageName = resolvedIntentInfo.activityInfo.packageName; + reactContext.grantUriPermission(packageName, uri, + Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); + } + } + } + + i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + i.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris); + } PackageManager manager = reactContext.getPackageManager(); List list = manager.queryIntentActivities(i, 0); @@ -123,11 +134,11 @@ public void mail(ReadableMap options, Callback callback) { } } else { String chooserTitle = "Send Mail"; - + if (options.hasKey("customChooserTitle") && !options.isNull("customChooserTitle")) { chooserTitle = options.getString("customChooserTitle"); - } - + } + Intent chooser = Intent.createChooser(i, chooserTitle); chooser.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); diff --git a/android/src/main/res/xml/provider_paths.xml b/android/src/main/res/xml/provider_paths.xml new file mode 100644 index 0000000..97384e1 --- /dev/null +++ b/android/src/main/res/xml/provider_paths.xml @@ -0,0 +1,6 @@ + + + + + +