From fbd2e139103e3d520f6dfc009d6200f8b8168e35 Mon Sep 17 00:00:00 2001 From: Felix Oghina Date: Sat, 13 Aug 2016 08:39:31 -0700 Subject: [PATCH] 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 --- .../java/com/facebook/react/ReactActivityDelegate.java | 2 +- .../java/com/facebook/react/ReactInstanceManager.java | 6 +++++- .../com/facebook/react/XReactInstanceManagerImpl.java | 4 ++-- .../com/facebook/react/bridge/ActivityEventListener.java | 6 ++++-- .../facebook/react/bridge/BaseActivityEventListener.java | 9 ++++++++- .../java/com/facebook/react/bridge/ReactContext.java | 4 ++-- 6 files changed, 22 insertions(+), 9 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/ReactActivityDelegate.java b/ReactAndroid/src/main/java/com/facebook/react/ReactActivityDelegate.java index 70990d838..a5b0da68e 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/ReactActivityDelegate.java +++ b/ReactAndroid/src/main/java/com/facebook/react/ReactActivityDelegate.java @@ -121,7 +121,7 @@ public class ReactActivityDelegate { public void onActivityResult(int requestCode, int resultCode, Intent data) { if (getReactNativeHost().hasInstance()) { getReactNativeHost().getReactInstanceManager() - .onActivityResult(requestCode, resultCode, data); + .onActivityResult(getPlainActivity(), requestCode, resultCode, data); } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java b/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java index ad23ebf56..f5d1b9f57 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java @@ -146,7 +146,11 @@ public abstract class ReactInstanceManager { */ public abstract void onHostDestroy(Activity activity); - public abstract void onActivityResult(int requestCode, int resultCode, Intent data); + public abstract void onActivityResult( + Activity activity, + int requestCode, + int resultCode, + Intent data); public abstract void showDevOptionsDialog(); /** diff --git a/ReactAndroid/src/main/java/com/facebook/react/XReactInstanceManagerImpl.java b/ReactAndroid/src/main/java/com/facebook/react/XReactInstanceManagerImpl.java index 6be093312..d2c02aefc 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/XReactInstanceManagerImpl.java +++ b/ReactAndroid/src/main/java/com/facebook/react/XReactInstanceManagerImpl.java @@ -607,9 +607,9 @@ import static com.facebook.systrace.Systrace.TRACE_TAG_REACT_JAVA_BRIDGE; } @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { + public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) { if (mCurrentReactContext != null) { - mCurrentReactContext.onActivityResult(requestCode, resultCode, data); + mCurrentReactContext.onActivityResult(activity, requestCode, resultCode, data); } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/ActivityEventListener.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/ActivityEventListener.java index 888a66a0e..834b2267e 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/ActivityEventListener.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/ActivityEventListener.java @@ -2,17 +2,19 @@ package com.facebook.react.bridge; +import android.app.Activity; import android.content.Intent; /** - * Listener for receiving activity events. + * Listener for receiving activity events. Consider using {@link BaseActivityEventListener} if + * you're not interested in all the events sent to this interface. */ public interface ActivityEventListener { /** * Called when host (activity/service) receives an {@link Activity#onActivityResult} call. */ - void onActivityResult(int requestCode, int resultCode, Intent data); + void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data); /** * Called when a new intent is passed to the activity diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/BaseActivityEventListener.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/BaseActivityEventListener.java index 6a5740ea3..a855e21bb 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/BaseActivityEventListener.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/BaseActivityEventListener.java @@ -2,6 +2,7 @@ package com.facebook.react.bridge; +import android.app.Activity; import android.content.Intent; /** @@ -9,9 +10,15 @@ import android.content.Intent; */ public class BaseActivityEventListener implements ActivityEventListener { - @Override + /** + * @deprecated use {@link #onActivityResult(Activity, int, int, Intent)} instead. + */ + @Deprecated public void onActivityResult(int requestCode, int resultCode, Intent data) { } + @Override + public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) { } + @Override public void onNewIntent(Intent intent) { } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactContext.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactContext.java index e96dbc3ab..8a8666883 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactContext.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactContext.java @@ -205,9 +205,9 @@ public class ReactContext extends ContextWrapper { /** * Should be called by the hosting Fragment in {@link Fragment#onActivityResult} */ - public void onActivityResult(int requestCode, int resultCode, Intent data) { + public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) { for (ActivityEventListener listener : mActivityEventListeners) { - listener.onActivityResult(requestCode, resultCode, data); + listener.onActivityResult(activity, requestCode, resultCode, data); } }