From 10d65924eedef924bc0e05f8ddeddfc87168f2dc Mon Sep 17 00:00:00 2001 From: Arushi Kesarwani Date: Wed, 6 Mar 2024 13:19:55 -0800 Subject: [PATCH] Support onActivityResult in Bridgeless (#43351) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/43351 Implement `onActivityResult` on Bridgeless Changelog: [Internal] internal Reviewed By: cortinico Differential Revision: D54574139 fbshipit-source-id: f2369077199186ac6ef0187b5dfe7ed95f3b87fc --- .../ReactAndroid/api/ReactAndroid.api | 2 ++ .../com/facebook/react/ReactDelegate.java | 3 +- .../main/java/com/facebook/react/ReactHost.kt | 9 ++++++ .../facebook/react/runtime/ReactHostImpl.java | 32 +++++++++++++++++++ 4 files changed, 44 insertions(+), 2 deletions(-) diff --git a/packages/react-native/ReactAndroid/api/ReactAndroid.api b/packages/react-native/ReactAndroid/api/ReactAndroid.api index f7c5343d1d7..419dd741ffd 100644 --- a/packages/react-native/ReactAndroid/api/ReactAndroid.api +++ b/packages/react-native/ReactAndroid/api/ReactAndroid.api @@ -196,6 +196,7 @@ public abstract interface class com/facebook/react/ReactHost { public abstract fun getJsEngineResolutionAlgorithm ()Lcom/facebook/react/JSEngineResolutionAlgorithm; public abstract fun getLifecycleState ()Lcom/facebook/react/common/LifecycleState; public abstract fun getReactQueueConfiguration ()Lcom/facebook/react/bridge/queue/ReactQueueConfiguration; + public abstract fun onActivityResult (Landroid/app/Activity;IILandroid/content/Intent;)V public abstract fun onBackPressed ()Z public abstract fun onHostDestroy ()V public abstract fun onHostDestroy (Landroid/app/Activity;)V @@ -3602,6 +3603,7 @@ public class com/facebook/react/runtime/ReactHostImpl : com/facebook/react/React public fun getLifecycleState ()Lcom/facebook/react/common/LifecycleState; public fun getMemoryPressureRouter ()Lcom/facebook/react/MemoryPressureRouter; public fun getReactQueueConfiguration ()Lcom/facebook/react/bridge/queue/ReactQueueConfiguration; + public fun onActivityResult (Landroid/app/Activity;IILandroid/content/Intent;)V public fun onBackPressed ()Z public fun onHostDestroy ()V public fun onHostDestroy (Landroid/app/Activity;)V diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactDelegate.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactDelegate.java index 2140f4a0a1b..1f89ceee0f6 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactDelegate.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactDelegate.java @@ -139,8 +139,7 @@ public class ReactDelegate { public void onActivityResult( int requestCode, int resultCode, Intent data, boolean shouldForwardToReactInstance) { if (ReactFeatureFlags.enableBridgelessArchitecture) { - // TODO T156475655: Implement onActivityResult for Bridgeless - return; + mReactHost.onActivityResult(mActivity, requestCode, resultCode, data); } else { if (getReactNativeHost().hasInstance() && shouldForwardToReactInstance) { getReactNativeHost() diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactHost.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactHost.kt index 966bbb54fda..69c9821b004 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactHost.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactHost.kt @@ -9,6 +9,7 @@ package com.facebook.react import android.app.Activity import android.content.Context +import android.content.Intent import android.os.Bundle import com.facebook.react.bridge.ReactContext import com.facebook.react.bridge.queue.ReactQueueConfiguration @@ -111,6 +112,14 @@ public interface ReactHost { */ public fun destroy(reason: String, ex: Exception?): TaskInterface + /* To be called when the host activity receives an activity result. */ + public fun onActivityResult( + activity: Activity, + requestCode: Int, + resultCode: Int, + data: Intent?, + ) + public fun addBeforeDestroyListener(onBeforeDestroy: () -> Unit) public fun removeBeforeDestroyListener(onBeforeDestroy: () -> Unit) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostImpl.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostImpl.java index 674aeb42f9f..1bf665685bb 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostImpl.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostImpl.java @@ -15,6 +15,7 @@ import static java.lang.Boolean.TRUE; import android.app.Activity; import android.content.Context; +import android.content.Intent; import android.os.Bundle; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -600,6 +601,37 @@ public class ReactHostImpl implements ReactHost { return null; } + /** + * To be called when the host activity receives an activity result. + * + * @param activity The host activity + */ + @ThreadConfined(UI) + @Override + public void onActivityResult( + Activity activity, int requestCode, int resultCode, @Nullable Intent data) { + final String method = + "onActivityResult(activity = \"" + + activity + + "\", requestCode = \"" + + requestCode + + "\", resultCode = \"" + + resultCode + + "\", data = \"" + + data + + "\")"; + log(method); + + ReactContext currentContext = getCurrentReactContext(); + if (currentContext != null) { + currentContext.onActivityResult(activity, requestCode, resultCode, data); + } + ReactSoftExceptionLogger.logSoftException( + TAG, + new ReactNoCrashSoftException( + "Tried to access onActivityResult while context is not ready")); + } + @Nullable JavaScriptContextHolder getJavaScriptContextHolder() { final ReactInstance reactInstance = mReactInstanceTaskRef.get().getResult();