Skip to content

Commit 6c4ca11

Browse files
authored
fix: ignore foreign onActivityResult (#652)
1 parent 2d6571d commit 6c4ca11

File tree

2 files changed

+40
-37
lines changed

2 files changed

+40
-37
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ New architecture is supported.
2626

2727
- [react-native-document-picker](#react-native-document-picker)
2828
- [Installation](#installation)
29-
- [RN >= 0.69](#rn--063)
29+
- [RN >= 0.69](#rn--069)
3030
- [API](#api)
3131
- [pickSingle(options) / pick(options)](#picksingleoptions--pickoptions)
3232
- [pickDirectory()](#pickdirectory)

android/src/main/java/com/reactnativedocumentpicker/RNDocumentPickerModule.java

Lines changed: 39 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -72,14 +72,22 @@ public RNDocumentPickerModule(ReactApplicationContext reactContext) {
7272
private final ActivityEventListener activityEventListener = new BaseActivityEventListener() {
7373
@Override
7474
public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) {
75+
boolean isForeignResult = requestCode != READ_REQUEST_CODE && requestCode != PICK_DIR_REQUEST_CODE;
76+
if (isForeignResult) {
77+
return;
78+
}
7579
final Promise storedPromise = promise;
7680
if (storedPromise == null) {
7781
Log.e(NAME, "promise was null in onActivityResult");
7882
return;
7983
}
84+
if (resultCode == Activity.RESULT_CANCELED) {
85+
sendError(E_DOCUMENT_PICKER_CANCELED, "User canceled directory picker");
86+
return;
87+
}
8088
if (requestCode == READ_REQUEST_CODE) {
8189
onShowActivityResult(resultCode, data, storedPromise);
82-
} else if (requestCode == PICK_DIR_REQUEST_CODE) {
90+
} else {
8391
onPickDirectoryResult(resultCode, data);
8492
}
8593
}
@@ -96,8 +104,8 @@ private String[] readableArrayToStringArray(ReadableArray readableArray) {
96104

97105
@Override
98106
public void onCatalystInstanceDestroy() {
99-
super.onCatalystInstanceDestroy();
100107
getReactApplicationContext().removeActivityEventListener(activityEventListener);
108+
super.onCatalystInstanceDestroy();
101109
}
102110

103111
@NonNull
@@ -170,10 +178,7 @@ public void releaseSecureAccess(ReadableArray uris, Promise promise) {
170178
}
171179

172180
private void onPickDirectoryResult(int resultCode, Intent data) {
173-
if (resultCode == Activity.RESULT_CANCELED) {
174-
sendError(E_DOCUMENT_PICKER_CANCELED, "User canceled directory picker");
175-
return;
176-
} else if (resultCode != Activity.RESULT_OK) {
181+
if (resultCode != Activity.RESULT_OK) {
177182
sendError(E_UNKNOWN_ACTIVITY_RESULT, "Unknown activity result: " + resultCode);
178183
return;
179184
}
@@ -190,39 +195,37 @@ private void onPickDirectoryResult(int resultCode, Intent data) {
190195
}
191196

192197
public void onShowActivityResult(int resultCode, Intent data, Promise promise) {
193-
if (resultCode == Activity.RESULT_CANCELED) {
194-
sendError(E_DOCUMENT_PICKER_CANCELED, "User canceled document picker");
195-
} else if (resultCode == Activity.RESULT_OK) {
196-
Uri uri = null;
197-
ClipData clipData = null;
198-
199-
if (data != null) {
200-
uri = data.getData();
201-
clipData = data.getClipData();
202-
}
198+
if (resultCode != Activity.RESULT_OK) {
199+
sendError(E_UNKNOWN_ACTIVITY_RESULT, "Unknown activity result: " + resultCode);
200+
return;
201+
}
202+
Uri uri = null;
203+
ClipData clipData = null;
203204

204-
try {
205-
List<Uri> uris = new ArrayList<>();
206-
// condition order seems to matter: https://github.com/rnmods/react-native-document-picker/issues/317#issuecomment-645222635
207-
if (clipData != null && clipData.getItemCount() > 0) {
208-
final int length = clipData.getItemCount();
209-
for (int i = 0; i < length; ++i) {
210-
ClipData.Item item = clipData.getItemAt(i);
211-
uris.add(item.getUri());
212-
}
213-
} else if (uri != null) {
214-
uris.add(uri);
215-
} else {
216-
sendError(E_INVALID_DATA_RETURNED, "Invalid data returned by intent");
217-
return;
218-
}
205+
if (data != null) {
206+
uri = data.getData();
207+
clipData = data.getClipData();
208+
}
219209

220-
new ProcessDataTask(getReactApplicationContext(), uris, copyTo, promise).execute();
221-
} catch (Exception e) {
222-
sendError(E_UNEXPECTED_EXCEPTION, e.getLocalizedMessage(), e);
210+
try {
211+
List<Uri> uris = new ArrayList<>();
212+
// condition order seems to matter: https://github.com/rnmods/react-native-document-picker/issues/317#issuecomment-645222635
213+
if (clipData != null && clipData.getItemCount() > 0) {
214+
final int length = clipData.getItemCount();
215+
for (int i = 0; i < length; ++i) {
216+
ClipData.Item item = clipData.getItemAt(i);
217+
uris.add(item.getUri());
218+
}
219+
} else if (uri != null) {
220+
uris.add(uri);
221+
} else {
222+
sendError(E_INVALID_DATA_RETURNED, "Invalid data returned by intent");
223+
return;
223224
}
224-
} else {
225-
sendError(E_UNKNOWN_ACTIVITY_RESULT, "Unknown activity result: " + resultCode);
225+
226+
new ProcessDataTask(getReactApplicationContext(), uris, copyTo, promise).execute();
227+
} catch (Exception e) {
228+
sendError(E_UNEXPECTED_EXCEPTION, e.getLocalizedMessage(), e);
226229
}
227230
}
228231

0 commit comments

Comments
 (0)