Skip to content

Commit fbd2e13

Browse files
foghinaFacebook Github Bot 6
authored andcommitted
Add Activity to onActivityResult listener interface
Summary: The Android lifecycle is weird: turns out `onActivityResult` is called before `onResume`. This means `getCurrentActivity()` could return the wrong instance, or `null` if the activity was destroyed. To give developers access to the Activity receiving the result (which is also about to become the current activity), pass it as an argumento the listener. Fixes github issue #8694. Reviewed By: donyu Differential Revision: D3704141 fbshipit-source-id: e7e00ccc28114f97415e5beab8c9b10cb1e530be
1 parent d22003a commit fbd2e13

File tree

6 files changed

+22
-9
lines changed

6 files changed

+22
-9
lines changed

ReactAndroid/src/main/java/com/facebook/react/ReactActivityDelegate.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ protected void onDestroy() {
121121
public void onActivityResult(int requestCode, int resultCode, Intent data) {
122122
if (getReactNativeHost().hasInstance()) {
123123
getReactNativeHost().getReactInstanceManager()
124-
.onActivityResult(requestCode, resultCode, data);
124+
.onActivityResult(getPlainActivity(), requestCode, resultCode, data);
125125
}
126126
}
127127

ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,11 @@ public abstract void onHostResume(
146146
*/
147147
public abstract void onHostDestroy(Activity activity);
148148

149-
public abstract void onActivityResult(int requestCode, int resultCode, Intent data);
149+
public abstract void onActivityResult(
150+
Activity activity,
151+
int requestCode,
152+
int resultCode,
153+
Intent data);
150154
public abstract void showDevOptionsDialog();
151155

152156
/**

ReactAndroid/src/main/java/com/facebook/react/XReactInstanceManagerImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -607,9 +607,9 @@ private void moveToBeforeCreateLifecycleState() {
607607
}
608608

609609
@Override
610-
public void onActivityResult(int requestCode, int resultCode, Intent data) {
610+
public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) {
611611
if (mCurrentReactContext != null) {
612-
mCurrentReactContext.onActivityResult(requestCode, resultCode, data);
612+
mCurrentReactContext.onActivityResult(activity, requestCode, resultCode, data);
613613
}
614614
}
615615

ReactAndroid/src/main/java/com/facebook/react/bridge/ActivityEventListener.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,19 @@
22

33
package com.facebook.react.bridge;
44

5+
import android.app.Activity;
56
import android.content.Intent;
67

78
/**
8-
* Listener for receiving activity events.
9+
* Listener for receiving activity events. Consider using {@link BaseActivityEventListener} if
10+
* you're not interested in all the events sent to this interface.
911
*/
1012
public interface ActivityEventListener {
1113

1214
/**
1315
* Called when host (activity/service) receives an {@link Activity#onActivityResult} call.
1416
*/
15-
void onActivityResult(int requestCode, int resultCode, Intent data);
17+
void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data);
1618

1719
/**
1820
* Called when a new intent is passed to the activity

ReactAndroid/src/main/java/com/facebook/react/bridge/BaseActivityEventListener.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,23 @@
22

33
package com.facebook.react.bridge;
44

5+
import android.app.Activity;
56
import android.content.Intent;
67

78
/**
89
* An empty implementation of {@link ActivityEventListener}
910
*/
1011
public class BaseActivityEventListener implements ActivityEventListener {
1112

12-
@Override
13+
/**
14+
* @deprecated use {@link #onActivityResult(Activity, int, int, Intent)} instead.
15+
*/
16+
@Deprecated
1317
public void onActivityResult(int requestCode, int resultCode, Intent data) { }
1418

19+
@Override
20+
public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) { }
21+
1522
@Override
1623
public void onNewIntent(Intent intent) { }
1724
}

ReactAndroid/src/main/java/com/facebook/react/bridge/ReactContext.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -205,9 +205,9 @@ public void destroy() {
205205
/**
206206
* Should be called by the hosting Fragment in {@link Fragment#onActivityResult}
207207
*/
208-
public void onActivityResult(int requestCode, int resultCode, Intent data) {
208+
public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) {
209209
for (ActivityEventListener listener : mActivityEventListeners) {
210-
listener.onActivityResult(requestCode, resultCode, data);
210+
listener.onActivityResult(activity, requestCode, resultCode, data);
211211
}
212212
}
213213

0 commit comments

Comments
 (0)