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 70990d838aaf49..a5b0da68eeafcf 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 @@ protected void onDestroy() { 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 ad23ebf566f7eb..f5d1b9f5735be8 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 void onHostResume( */ 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 6be0933125c6aa..d2c02aefc09f57 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 @@ private void moveToBeforeCreateLifecycleState() { } @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 888a66a0ee74e5..834b2267eb2fd5 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 6a5740ea3f606c..a855e21bb440ee 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 @@ */ 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 e96dbc3abf32a2..8a86668837aeda 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 void destroy() { /** * 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); } }