diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactActivityDelegate.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactActivityDelegate.java index 87ffae6ef54d01..4bbaa82e06fe8b 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactActivityDelegate.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactActivityDelegate.java @@ -144,7 +144,9 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { } public boolean onKeyDown(int keyCode, KeyEvent event) { - if (!ReactFeatureFlags.enableBridgelessArchitecture) { + if (ReactFeatureFlags.enableBridgelessArchitecture) { + // TODO T156475655: support onKeyDown + } else { if (getReactNativeHost().hasInstance() && getReactNativeHost().getUseDeveloperSupport() && keyCode == KeyEvent.KEYCODE_MEDIA_FAST_FORWARD) { @@ -160,7 +162,9 @@ public boolean onKeyUp(int keyCode, KeyEvent event) { } public boolean onKeyLongPress(int keyCode, KeyEvent event) { - if (!ReactFeatureFlags.enableBridgelessArchitecture) { + if (ReactFeatureFlags.enableBridgelessArchitecture) { + // TODO T156475655: support onKeyLongPress + } else { if (getReactNativeHost().hasInstance() && getReactNativeHost().getUseDeveloperSupport() && keyCode == KeyEvent.KEYCODE_MEDIA_FAST_FORWARD) { @@ -176,7 +180,9 @@ public boolean onBackPressed() { } public boolean onNewIntent(Intent intent) { - if (!ReactFeatureFlags.enableBridgelessArchitecture) { + if (ReactFeatureFlags.enableBridgelessArchitecture) { + // TODO T156475655: support onNewIntent + } else { if (getReactNativeHost().hasInstance()) { getReactNativeHost().getReactInstanceManager().onNewIntent(intent); return true; @@ -186,7 +192,9 @@ public boolean onNewIntent(Intent intent) { } public void onWindowFocusChanged(boolean hasFocus) { - if (!ReactFeatureFlags.enableBridgelessArchitecture) { + if (ReactFeatureFlags.enableBridgelessArchitecture) { + // TODO T156475655: support onWindowFocusChanged + } else { if (getReactNativeHost().hasInstance()) { getReactNativeHost().getReactInstanceManager().onWindowFocusChange(hasFocus); } @@ -194,7 +202,9 @@ public void onWindowFocusChanged(boolean hasFocus) { } public void onConfigurationChanged(Configuration newConfig) { - if (!ReactFeatureFlags.enableBridgelessArchitecture) { + if (ReactFeatureFlags.enableBridgelessArchitecture) { + // TODO T156475655: support onConfigurationChanged + } else { if (getReactNativeHost().hasInstance()) { getReactInstanceManager().onConfigurationChanged(getContext(), newConfig); } 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 2140f4a0a1ba53..12b1b06b3fa7f1 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 @@ -140,7 +140,6 @@ public void onActivityResult( int requestCode, int resultCode, Intent data, boolean shouldForwardToReactInstance) { if (ReactFeatureFlags.enableBridgelessArchitecture) { // TODO T156475655: Implement onActivityResult for Bridgeless - return; } else { if (getReactNativeHost().hasInstance() && shouldForwardToReactInstance) { getReactNativeHost() diff --git a/packages/react-native/ReactCommon/react/bridging/Function.h b/packages/react-native/ReactCommon/react/bridging/Function.h index 7fae7fc8575023..88ca9cd792527a 100644 --- a/packages/react-native/ReactCommon/react/bridging/Function.h +++ b/packages/react-native/ReactCommon/react/bridging/Function.h @@ -54,15 +54,6 @@ class AsyncCallback { callWithFunction(priority, std::move(callImpl)); } - /// Invoke the function write-away as if it was a synchronous function - /// without any synchronization or delegating to JS context. - /// @note Caller is responsible for calling this from within JS context. - void unsafeCallSync(Args... args) const noexcept { - if (callback_) { - (*callback_)(std::forward(args)...); - } - } - private: friend Bridging; @@ -110,6 +101,9 @@ class AsyncCallback { } }; +// You must ensure that when invoking this you're located on the JS thread, or +// have exclusive control of the JS VM context. If you cannot ensure this, use +// AsyncCallback instead. template class SyncCallback { public: @@ -122,9 +116,19 @@ class SyncCallback { rt, std::move(jsInvoker))) {} - // Disallow moving to prevent function from get called on another thread. - SyncCallback(SyncCallback&&) = delete; - SyncCallback& operator=(SyncCallback&&) = delete; + // Disallow copying, as we can no longer safely destroy the callback + // from the destructor if there's multiple copies + SyncCallback(const SyncCallback&) = delete; + SyncCallback& operator=(const SyncCallback&) = delete; + + // Allow move + SyncCallback(SyncCallback&& other) noexcept + : wrapper_(std::move(other.wrapper_)) {} + + SyncCallback& operator=(SyncCallback&& other) { + wrapper_ = std::move(other.wrapper_); + return *this; + } ~SyncCallback() { if (auto wrapper = wrapper_.lock()) {