-
Notifications
You must be signed in to change notification settings - Fork 61
Expand file tree
/
Copy pathRNFileSelectorModule.java
More file actions
130 lines (99 loc) · 4.06 KB
/
RNFileSelectorModule.java
File metadata and controls
130 lines (99 loc) · 4.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
package ui.fileselector;
import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
/* modified by kevin at 2021-06-07 begin */
// import android.support.v4.app.ActivityCompat;
// import android.support.v4.content.ContextCompat;
// import android.support.v7.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.appcompat.app.AppCompatActivity;
/* modified by kevin at 2021-06-07 end */
import android.util.Log;
import android.widget.Toast;
import com.facebook.react.bridge.ActivityEventListener;
import com.facebook.react.bridge.Callback;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.ReadableMap;
import com.nbsp.materialfilepicker.MaterialFilePicker;
import com.nbsp.materialfilepicker.ui.FilePickerActivity;
import java.util.regex.Pattern;
public class RNFileSelectorModule extends ReactContextBaseJavaModule {
public static final int PERMISSIONS_REQUEST_CODE = 0;
public static final int FILE_PICKER_REQUEST_CODE = 1;
private Callback onDone;
private Callback onCancel;
public RNFileSelectorModule(ReactApplicationContext reactContext) {
super(reactContext);
getReactApplicationContext().addActivityEventListener(new ActivityEventListener());
}
@Override
public String getName() {
return "RNFileSelector";
}
@ReactMethod
public void Show(final ReadableMap props, final Callback onDone, final Callback onCancel) {
boolean openFilePicker = checkPermissionsAndOpenFilePicker();
if (openFilePicker) {
openFilePicker(props, onDone, onCancel);
}
}
private boolean checkPermissionsAndOpenFilePicker() {
String permission = Manifest.permission.READ_EXTERNAL_STORAGE;
if (ContextCompat.checkSelfPermission(getCurrentActivity(), permission) != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(getCurrentActivity(), permission)) {
showError();
return false;
} else {
ActivityCompat.requestPermissions(getCurrentActivity(), new String[]{permission}, PERMISSIONS_REQUEST_CODE);
return true;
}
}
return true;
}
private void showError() {
Toast.makeText(getCurrentActivity(), "Allow external storage reading", Toast.LENGTH_SHORT).show();
}
private void openFilePicker(final ReadableMap props, final Callback onDone, final Callback onCancel) {
MaterialFilePicker picker = new MaterialFilePicker();
picker = picker.withActivity(getCurrentActivity());
picker = picker.withRequestCode(1);
String filter = props.getString("filter");
boolean filterDirectories = props.getBoolean("filterDirectories");
String path = props.getString("path");
boolean hiddenFiles = props.getBoolean("hiddenFiles");
boolean closeMenu = props.getBoolean("closeMenu");
String title = props.getString("title");
if (filter.length() > 0) {
picker = picker.withFilter(Pattern.compile(filter));
}
picker = picker.withFilterDirectories(filterDirectories);
if (path.length() > 0) {
picker = picker.withRootPath(path);
}
picker = picker.withHiddenFiles(hiddenFiles);
picker = picker.withCloseMenu(closeMenu);
picker = picker.withTitle(title);
this.onDone = onDone;
this.onCancel = onCancel;
picker.start();
}
private class ActivityEventListener implements com.facebook.react.bridge.ActivityEventListener {
@Override
public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) {
if (requestCode == 1 && resultCode == AppCompatActivity.RESULT_OK) {
String filePath = data.getStringExtra(FilePickerActivity.RESULT_FILE_PATH);
onDone.invoke(filePath);
} else if (requestCode == 1 && resultCode == AppCompatActivity.RESULT_CANCELED) {
onCancel.invoke();
}
}
@Override
public void onNewIntent(Intent intent) {
}
}
}