Skip to content

Commit 940b80d

Browse files
authored
Support multiple attachments on Android (#161)
1 parent d8b0b08 commit 940b80d

File tree

4 files changed

+61
-26
lines changed

4 files changed

+61
-26
lines changed
Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,15 @@
11
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
2-
package="com.chirag.RNMail">
2+
package="com.chirag.RNMail">
33

4-
</manifest>
4+
<application>
5+
<provider
6+
android:name=".RNMailFileProvider"
7+
android:authorities="${applicationId}.rnmail.provider"
8+
android:exported="false"
9+
android:grantUriPermissions="true">
10+
<meta-data
11+
android:name="android.support.FILE_PROVIDER_PATHS"
12+
android:resource="@xml/provider_paths"/>
13+
</provider>
14+
</application>
15+
</manifest>
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.chirag.RNMail;
2+
3+
import androidx.core.content.FileProvider;
4+
5+
public class RNMailFileProvider extends FileProvider {
6+
7+
}

android/src/main/java/com/chirag/RNMail/RNMailModule.java

Lines changed: 35 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import android.content.pm.ResolveInfo;
66
import android.net.Uri;
77
import android.text.Html;
8+
import androidx.core.content.FileProvider;
89

910
import com.facebook.react.bridge.ReactApplicationContext;
1011
import com.facebook.react.bridge.ReactContextBaseJavaModule;
@@ -15,6 +16,7 @@
1516

1617
import java.util.List;
1718
import java.io.File;
19+
import java.net.URI;
1820
import java.util.ArrayList;
1921

2022
/**
@@ -54,8 +56,9 @@ private String[] readableArrayToStringArray(ReadableArray r) {
5456

5557
@ReactMethod
5658
public void mail(ReadableMap options, Callback callback) {
57-
Intent i = new Intent(Intent.ACTION_SENDTO);
58-
i.setData(Uri.parse("mailto:"));
59+
Intent i = new Intent(Intent.ACTION_SEND_MULTIPLE);
60+
Intent selectorIntent = new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:"));
61+
i.setSelector(selectorIntent);
5962

6063
if (options.hasKey("subject") && !options.isNull("subject")) {
6164
i.putExtra(Intent.EXTRA_SUBJECT, options.getString("subject"));
@@ -86,25 +89,33 @@ public void mail(ReadableMap options, Callback callback) {
8689
}
8790

8891
if (options.hasKey("attachments") && !options.isNull("attachments")) {
89-
ReadableArray r = options.getArray("attachments");
90-
int length = r.size();
91-
ArrayList<Uri> uris = new ArrayList<Uri>();
92-
for (int keyIndex = 0; keyIndex < length; keyIndex++) {
93-
ReadableMap clip = r.getMap(keyIndex);
94-
if (clip.hasKey("path") && !clip.isNull("path")){
95-
String path = clip.getString("path");
96-
File file = new File(path);
97-
Uri u = Uri.fromFile(file);
98-
uris.add(u);
99-
}
100-
}
101-
102-
if (uris.size() == 1) {
103-
i.putExtra(Intent.EXTRA_STREAM, uris.get(0));
104-
} else {
105-
i.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
106-
}
107-
}
92+
ReadableArray r = options.getArray("attachments");
93+
int length = r.size();
94+
95+
String provider = reactContext.getApplicationContext().getPackageName() + ".rnmail.provider";
96+
List<ResolveInfo> resolvedIntentActivities = reactContext.getPackageManager().queryIntentActivities(i,
97+
PackageManager.MATCH_DEFAULT_ONLY);
98+
99+
ArrayList<Uri> uris = new ArrayList<Uri>();
100+
for (int keyIndex = 0; keyIndex < length; keyIndex++) {
101+
ReadableMap clip = r.getMap(keyIndex);
102+
if (clip.hasKey("path") && !clip.isNull("path")){
103+
String path = clip.getString("path");
104+
File file = new File(path);
105+
Uri uri = FileProvider.getUriForFile(reactContext, provider, file);
106+
uris.add(uri);
107+
108+
for (ResolveInfo resolvedIntentInfo : resolvedIntentActivities) {
109+
String packageName = resolvedIntentInfo.activityInfo.packageName;
110+
reactContext.grantUriPermission(packageName, uri,
111+
Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
112+
}
113+
}
114+
}
115+
116+
i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
117+
i.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
118+
}
108119

109120
PackageManager manager = reactContext.getPackageManager();
110121
List<ResolveInfo> list = manager.queryIntentActivities(i, 0);
@@ -123,11 +134,11 @@ public void mail(ReadableMap options, Callback callback) {
123134
}
124135
} else {
125136
String chooserTitle = "Send Mail";
126-
137+
127138
if (options.hasKey("customChooserTitle") && !options.isNull("customChooserTitle")) {
128139
chooserTitle = options.getString("customChooserTitle");
129-
}
130-
140+
}
141+
131142
Intent chooser = Intent.createChooser(i, chooserTitle);
132143
chooser.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
133144

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<paths xmlns:android="http://schemas.android.com/apk/res/android">
3+
<external-path name="rnmail_dl" path="Download/" />
4+
<cache-path name="rnmail_cache" path="/" />
5+
<root-path name="rnmail_sdcard" path="." />
6+
</paths>

0 commit comments

Comments
 (0)