From c011e27aab20e918b6359244e33b95f40782a533 Mon Sep 17 00:00:00 2001 From: Phillip Pan Date: Sat, 4 May 2024 02:21:37 -0700 Subject: [PATCH] introduce CallInvokerHolder stable API (#44381) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/44381 Changelog: [Android][Added] I am adding this API in favor of RCTRuntimeExecutor. CallInvoker is now preferred because after #43375, the CallInvoker has access to the jsi::Runtime. Since the community is using CallInvoker already for their async access use cases, CallInvoker is the preferred choice of RuntimeExecutor / RuntimeScheduler because of easier migration. Also, having a wrapper like CallInvoker will give us more flexibility in the future if we want to expand this API. this will be forward compatible in the old architecture Reviewed By: RSNara Differential Revision: D56866817 fbshipit-source-id: 4096847c52559d9a49feb072a0385da6b64392d4 --- .../react-native/ReactAndroid/api/ReactAndroid.api | 1 + .../com/facebook/react/bridge/CatalystInstance.java | 1 + .../java/com/facebook/react/bridge/ReactContext.java | 12 ++++++++++++ .../react/runtime/BridgelessReactContext.java | 6 ++++++ 4 files changed, 20 insertions(+) diff --git a/packages/react-native/ReactAndroid/api/ReactAndroid.api b/packages/react-native/ReactAndroid/api/ReactAndroid.api index c2e71aec7e79cf..98aa97e32fa213 100644 --- a/packages/react-native/ReactAndroid/api/ReactAndroid.api +++ b/packages/react-native/ReactAndroid/api/ReactAndroid.api @@ -1071,6 +1071,7 @@ public abstract class com/facebook/react/bridge/ReactContext : android/content/C public fun getCurrentActivity ()Landroid/app/Activity; public fun getExceptionHandler ()Lcom/facebook/react/bridge/JSExceptionHandler; public fun getFabricUIManager ()Lcom/facebook/react/bridge/UIManager; + public fun getJSCallInvokerHolder ()Lcom/facebook/react/turbomodule/core/interfaces/CallInvokerHolder; public fun getJSExceptionHandler ()Lcom/facebook/react/bridge/JSExceptionHandler; public fun getJSMessageQueueThread ()Lcom/facebook/react/bridge/queue/MessageQueueThread; public fun getJSModule (Ljava/lang/Class;)Lcom/facebook/react/bridge/JavaScriptModule; diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstance.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstance.java index c7c93040cdbdb7..e924caf946b125 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstance.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstance.java @@ -118,6 +118,7 @@ public interface CatalystInstance * Returns a hybrid object that contains a pointer to a JS CallInvoker, which is used to schedule * work on the JS Thread. Required for TurboModuleManager initialization. */ + @Deprecated CallInvokerHolder getJSCallInvokerHolder(); /** diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactContext.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactContext.java index ff7b4c5489aaa8..4a5b07eb647470 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactContext.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactContext.java @@ -27,6 +27,7 @@ import com.facebook.react.common.LifecycleState; import com.facebook.react.common.ReactConstants; import com.facebook.react.common.annotations.DeprecatedInNewArchitecture; +import com.facebook.react.turbomodule.core.interfaces.CallInvokerHolder; import java.lang.ref.WeakReference; import java.util.Collection; import java.util.concurrent.CopyOnWriteArraySet; @@ -581,6 +582,17 @@ public boolean isBridgeless() { return null; } + /** + * Returns a hybrid object that contains a pointer to a JS CallInvoker, which is used to schedule + * work on the JS Thread. + */ + public @Nullable CallInvokerHolder getJSCallInvokerHolder() { + if (mCatalystInstance != null) { + return mCatalystInstance.getJSCallInvokerHolder(); + } + return null; + } + @DeprecatedInNewArchitecture( message = "This method will be deprecated later as part of Stable APIs with bridge removal and not" diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/BridgelessReactContext.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/BridgelessReactContext.java index 7af5a365c07561..97a1bedabef657 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/BridgelessReactContext.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/BridgelessReactContext.java @@ -26,6 +26,7 @@ import com.facebook.react.config.ReactFeatureFlags; import com.facebook.react.devsupport.interfaces.DevSupportManager; import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler; +import com.facebook.react.turbomodule.core.interfaces.CallInvokerHolder; import com.facebook.react.uimanager.events.EventDispatcher; import com.facebook.react.uimanager.events.EventDispatcherProvider; import java.lang.reflect.InvocationHandler; @@ -169,6 +170,11 @@ public void handleException(Exception e) { mReactHost.handleHostException(e); } + @Override + public @Nullable CallInvokerHolder getJSCallInvokerHolder() { + return mReactHost.getJSCallInvokerHolder(); + } + DefaultHardwareBackBtnHandler getDefaultHardwareBackBtnHandler() { return mReactHost.getDefaultBackButtonHandler(); }