From f2066164db620ba2bb2ea8712394880340a27c7a Mon Sep 17 00:00:00 2001 From: Phillip Pan Date: Thu, 2 May 2024 21:53:04 -0700 Subject: [PATCH] introduce CallInvokerHolder stable API Summary: 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 --- .../java/com/facebook/react/bridge/CatalystInstance.java | 1 + .../java/com/facebook/react/bridge/ReactContext.java | 9 +++++++++ .../facebook/react/runtime/BridgelessReactContext.java | 6 ++++++ 3 files changed, 16 insertions(+) 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..4617b2ece477e0 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,14 @@ 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() { + return mCatalystInstance.getJSCallInvokerHolder(); + } + @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(); }