diff --git a/packages/react-native/ReactAndroid/api/ReactAndroid.api b/packages/react-native/ReactAndroid/api/ReactAndroid.api index c4a2cd600a3..e1909ad0345 100644 --- a/packages/react-native/ReactAndroid/api/ReactAndroid.api +++ b/packages/react-native/ReactAndroid/api/ReactAndroid.api @@ -2041,10 +2041,7 @@ public final class com/facebook/react/common/network/OkHttpCallUtil { public class com/facebook/react/config/ReactFeatureFlags { public static field dispatchPointerEvents Z - public static field enableBridgelessArchitecture Z public static field enableCppPropsIteratorSetter Z - public static field enableFabricRenderer Z - public static field useTurboModules Z public fun ()V } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/BaseReactPackage.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/BaseReactPackage.java index 0a606e0c65f..2e10cc9dc29 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/BaseReactPackage.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/BaseReactPackage.java @@ -13,7 +13,7 @@ import com.facebook.react.bridge.ModuleHolder; import com.facebook.react.bridge.ModuleSpec; import com.facebook.react.bridge.NativeModule; import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.config.ReactFeatureFlags; +import com.facebook.react.internal.featureflags.ReactNativeFeatureFlags; import com.facebook.react.module.model.ReactModuleInfo; import com.facebook.react.module.model.ReactModuleInfoProvider; import com.facebook.react.uimanager.ViewManager; @@ -73,7 +73,7 @@ public abstract class BaseReactPackage implements ReactPackage { // This Iterator is used to create the NativeModule registry. The NativeModule // registry must not have TurboModules. Therefore, if TurboModules are enabled, and // the current NativeModule is a TurboModule, we need to skip iterating over it. - if (ReactFeatureFlags.useTurboModules && reactModuleInfo.isTurboModule()) { + if (ReactNativeFeatureFlags.useTurboModules() && reactModuleInfo.isTurboModule()) { continue; } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/HeadlessJsTaskService.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/HeadlessJsTaskService.java index 9fa6f58fe30..314e6838837 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/HeadlessJsTaskService.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/HeadlessJsTaskService.java @@ -19,7 +19,7 @@ import androidx.annotation.Nullable; import com.facebook.infer.annotation.Assertions; import com.facebook.react.bridge.ReactContext; import com.facebook.react.bridge.UiThreadUtil; -import com.facebook.react.config.ReactFeatureFlags; +import com.facebook.react.internal.featureflags.ReactNativeFeatureFlags; import com.facebook.react.jstasks.HeadlessJsTaskConfig; import com.facebook.react.jstasks.HeadlessJsTaskContext; import com.facebook.react.jstasks.HeadlessJsTaskEventListener; @@ -167,7 +167,7 @@ public abstract class HeadlessJsTaskService extends Service implements HeadlessJ } protected ReactContext getReactContext() { - if (ReactFeatureFlags.enableBridgelessArchitecture) { + if (ReactNativeFeatureFlags.enableBridgelessArchitecture()) { ReactHost reactHost = getReactHost(); Assertions.assertNotNull(reactHost, "getReactHost() is null in New Architecture"); return reactHost.getCurrentReactContext(); 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 9ca16398b40..48c59f8ee72 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 @@ -18,7 +18,7 @@ import android.view.KeyEvent; import androidx.annotation.Nullable; import com.facebook.infer.annotation.Assertions; import com.facebook.react.bridge.Callback; -import com.facebook.react.config.ReactFeatureFlags; +import com.facebook.react.internal.featureflags.ReactNativeFeatureFlags; import com.facebook.react.modules.core.PermissionListener; /** @@ -107,7 +107,7 @@ public class ReactActivityDelegate { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && isWideColorGamutEnabled()) { mActivity.getWindow().setColorMode(ActivityInfo.COLOR_MODE_WIDE_COLOR_GAMUT); } - if (ReactFeatureFlags.enableBridgelessArchitecture) { + if (ReactNativeFeatureFlags.enableBridgelessArchitecture()) { mReactDelegate = new ReactDelegate(getPlainActivity(), getReactHost(), mainComponentName, launchOptions); } else { @@ -226,7 +226,7 @@ public class ReactActivityDelegate { * @return true if Fabric is enabled for this Activity, false otherwise. */ protected boolean isFabricEnabled() { - return ReactFeatureFlags.enableFabricRenderer; + return ReactNativeFeatureFlags.enableFabricRenderer(); } /** 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 7c0f4edd6bb..c7b8ce77297 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 @@ -15,11 +15,11 @@ import android.view.KeyEvent; import androidx.annotation.Nullable; import com.facebook.infer.annotation.Assertions; import com.facebook.react.bridge.UiThreadUtil; -import com.facebook.react.config.ReactFeatureFlags; import com.facebook.react.devsupport.DoubleTapReloadRecognizer; import com.facebook.react.devsupport.ReleaseDevSupportManager; import com.facebook.react.devsupport.interfaces.DevSupportManager; import com.facebook.react.interfaces.fabric.ReactSurface; +import com.facebook.react.internal.featureflags.ReactNativeFeatureFlags; import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler; /** @@ -43,7 +43,7 @@ public class ReactDelegate { @Nullable private ReactSurface mReactSurface; - private boolean mFabricEnabled = ReactFeatureFlags.enableFabricRenderer; + private boolean mFabricEnabled = ReactNativeFeatureFlags.enableFabricRenderer(); /** * Do not use this constructor as it's not accounting for New Architecture at all. You should @@ -94,7 +94,7 @@ public class ReactDelegate { @Nullable private DevSupportManager getDevSupportManager() { - if (ReactFeatureFlags.enableBridgelessArchitecture + if (ReactNativeFeatureFlags.enableBridgelessArchitecture() && mReactHost != null && mReactHost.getDevSupportManager() != null) { return mReactHost.getDevSupportManager(); @@ -111,7 +111,7 @@ public class ReactDelegate { throw new ClassCastException( "Host Activity does not implement DefaultHardwareBackBtnHandler"); } - if (ReactFeatureFlags.enableBridgelessArchitecture) { + if (ReactNativeFeatureFlags.enableBridgelessArchitecture()) { mReactHost.onHostResume(mActivity, (DefaultHardwareBackBtnHandler) mActivity); } else { if (getReactNativeHost().hasInstance()) { @@ -123,7 +123,7 @@ public class ReactDelegate { } public void onUserLeaveHint() { - if (ReactFeatureFlags.enableBridgelessArchitecture) { + if (ReactNativeFeatureFlags.enableBridgelessArchitecture()) { mReactHost.onHostLeaveHint(mActivity); } else { if (getReactNativeHost().hasInstance()) { @@ -133,7 +133,7 @@ public class ReactDelegate { } public void onHostPause() { - if (ReactFeatureFlags.enableBridgelessArchitecture) { + if (ReactNativeFeatureFlags.enableBridgelessArchitecture()) { mReactHost.onHostPause(mActivity); } else { if (getReactNativeHost().hasInstance()) { @@ -144,7 +144,7 @@ public class ReactDelegate { public void onHostDestroy() { unloadApp(); - if (ReactFeatureFlags.enableBridgelessArchitecture) { + if (ReactNativeFeatureFlags.enableBridgelessArchitecture()) { mReactHost.onHostDestroy(mActivity); } else { if (getReactNativeHost().hasInstance()) { @@ -154,7 +154,7 @@ public class ReactDelegate { } public boolean onBackPressed() { - if (ReactFeatureFlags.enableBridgelessArchitecture) { + if (ReactNativeFeatureFlags.enableBridgelessArchitecture()) { mReactHost.onBackPressed(); return true; } else { @@ -167,7 +167,7 @@ public class ReactDelegate { } public boolean onNewIntent(Intent intent) { - if (ReactFeatureFlags.enableBridgelessArchitecture) { + if (ReactNativeFeatureFlags.enableBridgelessArchitecture()) { mReactHost.onNewIntent(intent); return true; } else { @@ -181,7 +181,7 @@ public class ReactDelegate { public void onActivityResult( int requestCode, int resultCode, Intent data, boolean shouldForwardToReactInstance) { - if (ReactFeatureFlags.enableBridgelessArchitecture) { + if (ReactNativeFeatureFlags.enableBridgelessArchitecture()) { mReactHost.onActivityResult(mActivity, requestCode, resultCode, data); } else { if (getReactNativeHost().hasInstance() && shouldForwardToReactInstance) { @@ -193,7 +193,7 @@ public class ReactDelegate { } public void onWindowFocusChanged(boolean hasFocus) { - if (ReactFeatureFlags.enableBridgelessArchitecture) { + if (ReactNativeFeatureFlags.enableBridgelessArchitecture()) { mReactHost.onWindowFocusChange(hasFocus); } else { if (getReactNativeHost().hasInstance()) { @@ -203,7 +203,7 @@ public class ReactDelegate { } public void onConfigurationChanged(Configuration newConfig) { - if (ReactFeatureFlags.enableBridgelessArchitecture) { + if (ReactNativeFeatureFlags.enableBridgelessArchitecture()) { mReactHost.onConfigurationChanged(Assertions.assertNotNull(mActivity)); } else { if (getReactNativeHost().hasInstance()) { @@ -215,7 +215,7 @@ public class ReactDelegate { public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_MEDIA_FAST_FORWARD - && ((ReactFeatureFlags.enableBridgelessArchitecture + && ((ReactNativeFeatureFlags.enableBridgelessArchitecture() && mReactHost != null && mReactHost.getDevSupportManager() != null) || (getReactNativeHost().hasInstance() @@ -228,7 +228,7 @@ public class ReactDelegate { public boolean onKeyLongPress(int keyCode) { if (keyCode == KeyEvent.KEYCODE_MEDIA_FAST_FORWARD) { - if (ReactFeatureFlags.enableBridgelessArchitecture && mReactHost != null) { + if (ReactNativeFeatureFlags.enableBridgelessArchitecture() && mReactHost != null) { DevSupportManager devSupportManager = mReactHost.getDevSupportManager(); // onKeyLongPress is a Dev API and not supported in RELEASE mode. if (devSupportManager != null && !(devSupportManager instanceof ReleaseDevSupportManager)) { @@ -254,7 +254,7 @@ public class ReactDelegate { // Reload in RELEASE mode if (devSupportManager instanceof ReleaseDevSupportManager) { // Do not reload the bundle from JS as there is no bundler running in release mode. - if (ReactFeatureFlags.enableBridgelessArchitecture) { + if (ReactNativeFeatureFlags.enableBridgelessArchitecture()) { if (mReactHost != null) { mReactHost.reload("ReactDelegate.reload()"); } @@ -286,7 +286,7 @@ public class ReactDelegate { */ public void loadApp(String appKey) { // With Bridgeless enabled, create and start the surface - if (ReactFeatureFlags.enableBridgelessArchitecture) { + if (ReactNativeFeatureFlags.enableBridgelessArchitecture()) { if (mReactSurface == null) { // Create a ReactSurface mReactSurface = mReactHost.createSurface(mActivity, appKey, mLaunchOptions); @@ -306,7 +306,7 @@ public class ReactDelegate { /** Stop the React surface started with {@link ReactDelegate#loadApp()}. */ public void unloadApp() { - if (ReactFeatureFlags.enableBridgelessArchitecture) { + if (ReactNativeFeatureFlags.enableBridgelessArchitecture()) { if (mReactSurface != null) { mReactSurface.stop(); mReactSurface = null; @@ -321,7 +321,7 @@ public class ReactDelegate { @Nullable public ReactRootView getReactRootView() { - if (ReactFeatureFlags.enableBridgelessArchitecture) { + if (ReactNativeFeatureFlags.enableBridgelessArchitecture()) { return (ReactRootView) mReactSurface.getView(); } else { return mReactRootView; diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java index ca0c62ac03b..31cf7f73823 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java @@ -80,7 +80,6 @@ import com.facebook.react.common.ReactConstants; import com.facebook.react.common.SurfaceDelegateFactory; import com.facebook.react.common.annotations.StableReactNativeAPI; import com.facebook.react.common.annotations.VisibleForTesting; -import com.facebook.react.config.ReactFeatureFlags; import com.facebook.react.devsupport.DevSupportManagerFactory; import com.facebook.react.devsupport.InspectorFlags; import com.facebook.react.devsupport.ReactInstanceDevHelper; @@ -355,7 +354,7 @@ public class ReactInstanceManager { Activity currentActivity = getCurrentActivity(); if (currentActivity != null) { ReactRootView rootView = new ReactRootView(currentActivity); - boolean isFabric = ReactFeatureFlags.enableFabricRenderer; + boolean isFabric = ReactNativeFeatureFlags.enableFabricRenderer(); rootView.setIsFabric(isFabric); rootView.startReactApplication(ReactInstanceManager.this, appKey, new Bundle()); return rootView; @@ -1470,7 +1469,7 @@ public class ReactInstanceManager { // architecture so it will always be there. catalystInstance.getRuntimeScheduler(); - if (ReactFeatureFlags.useTurboModules && mTMMDelegateBuilder != null) { + if (ReactNativeFeatureFlags.useTurboModules() && mTMMDelegateBuilder != null) { TurboModuleManagerDelegate tmmDelegate = mTMMDelegateBuilder .setPackages(mPackages) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactPackageTurboModuleManagerDelegate.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactPackageTurboModuleManagerDelegate.java index fa72014403d..cfbbd336b19 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactPackageTurboModuleManagerDelegate.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/ReactPackageTurboModuleManagerDelegate.java @@ -14,7 +14,6 @@ import com.facebook.react.bridge.CxxModuleWrapper; import com.facebook.react.bridge.ModuleSpec; import com.facebook.react.bridge.NativeModule; import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.config.ReactFeatureFlags; import com.facebook.react.internal.featureflags.ReactNativeFeatureFlags; import com.facebook.react.internal.turbomodule.core.TurboModuleManagerDelegate; import com.facebook.react.module.annotations.ReactModule; @@ -37,7 +36,7 @@ public abstract class ReactPackageTurboModuleManagerDelegate extends TurboModule new HashMap<>(); private final boolean mShouldEnableLegacyModuleInterop = - ReactFeatureFlags.enableBridgelessArchitecture + ReactNativeFeatureFlags.enableBridgelessArchitecture() && ReactNativeFeatureFlags.useTurboModuleInterop(); // Lazy Props diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java index 31fd36010ab..a5f4dd86c0b 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java @@ -26,7 +26,7 @@ import com.facebook.react.bridge.queue.ReactQueueConfigurationImpl; import com.facebook.react.bridge.queue.ReactQueueConfigurationSpec; import com.facebook.react.common.ReactConstants; import com.facebook.react.common.annotations.VisibleForTesting; -import com.facebook.react.config.ReactFeatureFlags; +import com.facebook.react.internal.featureflags.ReactNativeFeatureFlags; import com.facebook.react.internal.turbomodule.core.interfaces.TurboModuleRegistry; import com.facebook.react.module.annotations.ReactModule; import com.facebook.react.turbomodule.core.CallInvokerHolderImpl; @@ -459,7 +459,7 @@ public class CatalystInstanceImpl implements CatalystInstance { } private TurboModuleRegistry getTurboModuleRegistry() { - if (ReactFeatureFlags.useTurboModules) { + if (ReactNativeFeatureFlags.useTurboModules()) { return Assertions.assertNotNull( mTurboModuleRegistry, "TurboModules are enabled, but mTurboModuleRegistry hasn't been set."); diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/interop/InteropModuleRegistry.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/interop/InteropModuleRegistry.java index d694de0e8de..344bc7a1451 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/interop/InteropModuleRegistry.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/interop/InteropModuleRegistry.java @@ -9,7 +9,6 @@ package com.facebook.react.bridge.interop; import androidx.annotation.Nullable; import com.facebook.react.bridge.JavaScriptModule; -import com.facebook.react.config.ReactFeatureFlags; import com.facebook.react.internal.featureflags.ReactNativeFeatureFlags; import java.util.HashMap; @@ -52,6 +51,7 @@ public class InteropModuleRegistry { } private boolean checkReactFeatureFlagsConditions() { - return ReactFeatureFlags.enableFabricRenderer && ReactNativeFeatureFlags.useFabricInterop(); + return ReactNativeFeatureFlags.enableFabricRenderer() + && ReactNativeFeatureFlags.useFabricInterop(); } } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java index 11dfa80e682..68a65b32704 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/config/ReactFeatureFlags.java @@ -21,40 +21,6 @@ import com.facebook.proguard.annotations.DoNotStripAny; @Deprecated(since = "Use com.facebook.react.internal.featureflags.ReactNativeFeatureFlags instead.") @DoNotStripAny public class ReactFeatureFlags { - /** - * Should this application use TurboModules? If yes, then any module that inherits {@link - * com.facebook.react.turbomodule.core.interfaces.TurboModule} will NOT be passed in to C++ - * CatalystInstanceImpl - */ - @Deprecated( - since = - "useTurboModules will be deleted in 0.77, please use" - + " DefaultNewArchitectureEntryPoint.load() to enable TurboModules instead.", - forRemoval = true) - public static volatile boolean useTurboModules = false; - - /** - * Should this application use the new (Fabric) Renderer? If yes, all rendering in this app will - * use Fabric instead of the legacy renderer. - */ - @Deprecated( - since = - "enableFabricRenderer will be deleted in 0.77, please use" - + " DefaultNewArchitectureEntryPoint.load() to enable fabric instead.", - forRemoval = true) - public static volatile boolean enableFabricRenderer = false; - - /** - * Feature flag to enable the new bridgeless architecture. Note: Enabling this will force enable - * the following flags: `useTurboModules` & `enableFabricRenderer`. - */ - @Deprecated( - since = - "enableBridgelessArchitecture will be deleted in 0.77, please use" - + " DefaultNewArchitectureEntryPoint.load() to enable bridgeless architecture" - + " instead.", - forRemoval = true) - public static boolean enableBridgelessArchitecture = false; public static boolean dispatchPointerEvents = false; diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultNewArchitectureEntryPoint.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultNewArchitectureEntryPoint.kt index 80f5e965ca4..42dc49a0ffd 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultNewArchitectureEntryPoint.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/defaults/DefaultNewArchitectureEntryPoint.kt @@ -10,7 +10,6 @@ package com.facebook.react.defaults import com.facebook.react.common.annotations.VisibleForTesting -import com.facebook.react.config.ReactFeatureFlags import com.facebook.react.internal.featureflags.ReactNativeFeatureFlags import com.facebook.react.internal.featureflags.ReactNativeNewArchitectureFeatureFlagsDefaults @@ -39,18 +38,20 @@ public object DefaultNewArchitectureEntryPoint { if (!isValid) { error(errorMessage) } - ReactFeatureFlags.useTurboModules = turboModulesEnabled - ReactFeatureFlags.enableFabricRenderer = fabricEnabled if (bridgelessEnabled) { ReactNativeFeatureFlags.override( object : ReactNativeNewArchitectureFeatureFlagsDefaults() { override fun useFabricInterop(): Boolean = fabricEnabled + override fun enableFabricRenderer(): Boolean = fabricEnabled + // We turn this feature flag to true for OSS to fix #44610 and #45126 and other // similar bugs related to pressable. override fun enableEventEmitterRetentionDuringGesturesOnAndroid(): Boolean = fabricEnabled + + override fun useTurboModules(): Boolean = turboModulesEnabled }) } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java index 870544b54d6..82f6fcef57c 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java @@ -50,7 +50,6 @@ import com.facebook.react.bridge.UiThreadUtil; import com.facebook.react.bridge.WritableMap; import com.facebook.react.common.build.ReactBuildConfig; import com.facebook.react.common.mapbuffer.ReadableMapBuffer; -import com.facebook.react.config.ReactFeatureFlags; import com.facebook.react.fabric.events.EventEmitterWrapper; import com.facebook.react.fabric.events.FabricEventEmitter; import com.facebook.react.fabric.internal.interop.InteropUIBlockListener; @@ -442,7 +441,7 @@ public class FabricUIManager // responsible for initializing and deallocating EventDispatcher. StaticViewConfigs is enabled // only in Bridgeless for now. // TODO T83943316: Remove this IF once StaticViewConfigs are enabled by default - if (!ReactFeatureFlags.enableBridgelessArchitecture) { + if (!ReactNativeFeatureFlags.enableBridgelessArchitecture()) { mEventDispatcher.onCatalystInstanceDestroyed(); } } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt index 5784404f29f..5fb42d9f9ef 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlags.kt @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<73409b567e77f17838ae9681a8e20be6>> + * @generated SignedSource<> */ /** @@ -82,6 +82,12 @@ public object ReactNativeFeatureFlags { @JvmStatic public fun enableBackgroundStyleApplicator(): Boolean = accessor.enableBackgroundStyleApplicator() + /** + * Feature flag to enable the new bridgeless architecture. Note: Enabling this will force enable the following flags: `useTurboModules` & `enableFabricRenderer. + */ + @JvmStatic + public fun enableBridgelessArchitecture(): Boolean = accessor.enableBridgelessArchitecture() + /** * Clean yoga node when does not change. */ @@ -112,6 +118,12 @@ public object ReactNativeFeatureFlags { @JvmStatic public fun enableFabricLogs(): Boolean = accessor.enableFabricLogs() + /** + * Enables the use of the Fabric renderer in the whole app. + */ + @JvmStatic + public fun enableFabricRenderer(): Boolean = accessor.enableFabricRenderer() + /** * When the app is completely migrated to Fabric, set this flag to true to disable parts of Paper infrastructure that are not needed anymore but consume memory and CPU. Specifically, UIViewOperationQueue and EventDispatcherImpl will no longer work as they will not subscribe to ReactChoreographer for updates. */ @@ -334,6 +346,12 @@ public object ReactNativeFeatureFlags { @JvmStatic public fun useTurboModuleInterop(): Boolean = accessor.useTurboModuleInterop() + /** + * When enabled, NativeModules will be executed by using the TurboModule system + */ + @JvmStatic + public fun useTurboModules(): Boolean = accessor.useTurboModules() + /** * Overrides the feature flags with the ones provided by the given provider * (generally one that extends `ReactNativeFeatureFlagsDefaults`). diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt index f851574f87c..68e4e60d24c 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxAccessor.kt @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<9f2978b5a732a3ca4f3c3d74debba782>> + * @generated SignedSource<<19dca512d93d689e927ee5988a43e646>> */ /** @@ -29,11 +29,13 @@ public class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAccesso private var enableAndroidLineHeightCenteringCache: Boolean? = null private var enableAndroidMixBlendModePropCache: Boolean? = null private var enableBackgroundStyleApplicatorCache: Boolean? = null + private var enableBridgelessArchitectureCache: Boolean? = null private var enableCleanTextInputYogaNodeCache: Boolean? = null private var enableDeletionOfUnmountedViewsCache: Boolean? = null private var enableEagerRootViewAttachmentCache: Boolean? = null private var enableEventEmitterRetentionDuringGesturesOnAndroidCache: Boolean? = null private var enableFabricLogsCache: Boolean? = null + private var enableFabricRendererCache: Boolean? = null private var enableFabricRendererExclusivelyCache: Boolean? = null private var enableGranularShadowTreeStateReconciliationCache: Boolean? = null private var enableIOSViewClipToPaddingBoxCache: Boolean? = null @@ -71,6 +73,7 @@ public class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAccesso private var useRuntimeShadowNodeReferenceUpdateOnLayoutCache: Boolean? = null private var useStateAlignmentMechanismCache: Boolean? = null private var useTurboModuleInteropCache: Boolean? = null + private var useTurboModulesCache: Boolean? = null override fun commonTestFlag(): Boolean { var cached = commonTestFlagCache @@ -153,6 +156,15 @@ public class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAccesso return cached } + override fun enableBridgelessArchitecture(): Boolean { + var cached = enableBridgelessArchitectureCache + if (cached == null) { + cached = ReactNativeFeatureFlagsCxxInterop.enableBridgelessArchitecture() + enableBridgelessArchitectureCache = cached + } + return cached + } + override fun enableCleanTextInputYogaNode(): Boolean { var cached = enableCleanTextInputYogaNodeCache if (cached == null) { @@ -198,6 +210,15 @@ public class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAccesso return cached } + override fun enableFabricRenderer(): Boolean { + var cached = enableFabricRendererCache + if (cached == null) { + cached = ReactNativeFeatureFlagsCxxInterop.enableFabricRenderer() + enableFabricRendererCache = cached + } + return cached + } + override fun enableFabricRendererExclusively(): Boolean { var cached = enableFabricRendererExclusivelyCache if (cached == null) { @@ -531,6 +552,15 @@ public class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAccesso return cached } + override fun useTurboModules(): Boolean { + var cached = useTurboModulesCache + if (cached == null) { + cached = ReactNativeFeatureFlagsCxxInterop.useTurboModules() + useTurboModulesCache = cached + } + return cached + } + override fun override(provider: ReactNativeFeatureFlagsProvider): Unit = ReactNativeFeatureFlagsCxxInterop.override(provider as Any) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt index 89950a0f986..7bd8cfdc898 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsCxxInterop.kt @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<0d2f5427661ce67e468aea47bdd29802>> + * @generated SignedSource<<76eebf045692e945d39a4ea27a63ae02>> */ /** @@ -46,6 +46,8 @@ public object ReactNativeFeatureFlagsCxxInterop { @DoNotStrip @JvmStatic public external fun enableBackgroundStyleApplicator(): Boolean + @DoNotStrip @JvmStatic public external fun enableBridgelessArchitecture(): Boolean + @DoNotStrip @JvmStatic public external fun enableCleanTextInputYogaNode(): Boolean @DoNotStrip @JvmStatic public external fun enableDeletionOfUnmountedViews(): Boolean @@ -56,6 +58,8 @@ public object ReactNativeFeatureFlagsCxxInterop { @DoNotStrip @JvmStatic public external fun enableFabricLogs(): Boolean + @DoNotStrip @JvmStatic public external fun enableFabricRenderer(): Boolean + @DoNotStrip @JvmStatic public external fun enableFabricRendererExclusively(): Boolean @DoNotStrip @JvmStatic public external fun enableGranularShadowTreeStateReconciliation(): Boolean @@ -130,6 +134,8 @@ public object ReactNativeFeatureFlagsCxxInterop { @DoNotStrip @JvmStatic public external fun useTurboModuleInterop(): Boolean + @DoNotStrip @JvmStatic public external fun useTurboModules(): Boolean + @DoNotStrip @JvmStatic public external fun override(provider: Any) @DoNotStrip @JvmStatic public external fun dangerouslyReset() diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt index 83264bfcf22..7a844d2e333 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsDefaults.kt @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<72e3e7b5a53e64f8f48310d8b07cdf76>> + * @generated SignedSource<<8155a9c1309145fefdb19feb33c241db>> */ /** @@ -41,6 +41,8 @@ public open class ReactNativeFeatureFlagsDefaults : ReactNativeFeatureFlagsProvi override fun enableBackgroundStyleApplicator(): Boolean = true + override fun enableBridgelessArchitecture(): Boolean = false + override fun enableCleanTextInputYogaNode(): Boolean = false override fun enableDeletionOfUnmountedViews(): Boolean = false @@ -51,6 +53,8 @@ public open class ReactNativeFeatureFlagsDefaults : ReactNativeFeatureFlagsProvi override fun enableFabricLogs(): Boolean = false + override fun enableFabricRenderer(): Boolean = false + override fun enableFabricRendererExclusively(): Boolean = false override fun enableGranularShadowTreeStateReconciliation(): Boolean = false @@ -124,4 +128,6 @@ public open class ReactNativeFeatureFlagsDefaults : ReactNativeFeatureFlagsProvi override fun useStateAlignmentMechanism(): Boolean = false override fun useTurboModuleInterop(): Boolean = false + + override fun useTurboModules(): Boolean = false } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt index 119d2f0b8cf..c855a74f49e 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsLocalAccessor.kt @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<<5e4e474b62996caec15bbf8af9622a0a>> */ /** @@ -33,11 +33,13 @@ public class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcces private var enableAndroidLineHeightCenteringCache: Boolean? = null private var enableAndroidMixBlendModePropCache: Boolean? = null private var enableBackgroundStyleApplicatorCache: Boolean? = null + private var enableBridgelessArchitectureCache: Boolean? = null private var enableCleanTextInputYogaNodeCache: Boolean? = null private var enableDeletionOfUnmountedViewsCache: Boolean? = null private var enableEagerRootViewAttachmentCache: Boolean? = null private var enableEventEmitterRetentionDuringGesturesOnAndroidCache: Boolean? = null private var enableFabricLogsCache: Boolean? = null + private var enableFabricRendererCache: Boolean? = null private var enableFabricRendererExclusivelyCache: Boolean? = null private var enableGranularShadowTreeStateReconciliationCache: Boolean? = null private var enableIOSViewClipToPaddingBoxCache: Boolean? = null @@ -75,6 +77,7 @@ public class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcces private var useRuntimeShadowNodeReferenceUpdateOnLayoutCache: Boolean? = null private var useStateAlignmentMechanismCache: Boolean? = null private var useTurboModuleInteropCache: Boolean? = null + private var useTurboModulesCache: Boolean? = null override fun commonTestFlag(): Boolean { var cached = commonTestFlagCache @@ -166,6 +169,16 @@ public class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcces return cached } + override fun enableBridgelessArchitecture(): Boolean { + var cached = enableBridgelessArchitectureCache + if (cached == null) { + cached = currentProvider.enableBridgelessArchitecture() + accessedFeatureFlags.add("enableBridgelessArchitecture") + enableBridgelessArchitectureCache = cached + } + return cached + } + override fun enableCleanTextInputYogaNode(): Boolean { var cached = enableCleanTextInputYogaNodeCache if (cached == null) { @@ -216,6 +229,16 @@ public class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcces return cached } + override fun enableFabricRenderer(): Boolean { + var cached = enableFabricRendererCache + if (cached == null) { + cached = currentProvider.enableFabricRenderer() + accessedFeatureFlags.add("enableFabricRenderer") + enableFabricRendererCache = cached + } + return cached + } + override fun enableFabricRendererExclusively(): Boolean { var cached = enableFabricRendererExclusivelyCache if (cached == null) { @@ -586,6 +609,16 @@ public class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAcces return cached } + override fun useTurboModules(): Boolean { + var cached = useTurboModulesCache + if (cached == null) { + cached = currentProvider.useTurboModules() + accessedFeatureFlags.add("useTurboModules") + useTurboModulesCache = cached + } + return cached + } + override fun override(provider: ReactNativeFeatureFlagsProvider) { if (accessedFeatureFlags.isNotEmpty()) { val accessedFeatureFlagsStr = accessedFeatureFlags.joinToString(separator = ", ") { it } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt index c3eb8fbe97c..2098020dd96 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeFeatureFlagsProvider.kt @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<0f6129ccbcf7857785724f14b41edb2d>> + * @generated SignedSource<<97eddbbd75ff7cfd0f1c905d72e9eafd>> */ /** @@ -41,6 +41,8 @@ public interface ReactNativeFeatureFlagsProvider { @DoNotStrip public fun enableBackgroundStyleApplicator(): Boolean + @DoNotStrip public fun enableBridgelessArchitecture(): Boolean + @DoNotStrip public fun enableCleanTextInputYogaNode(): Boolean @DoNotStrip public fun enableDeletionOfUnmountedViews(): Boolean @@ -51,6 +53,8 @@ public interface ReactNativeFeatureFlagsProvider { @DoNotStrip public fun enableFabricLogs(): Boolean + @DoNotStrip public fun enableFabricRenderer(): Boolean + @DoNotStrip public fun enableFabricRendererExclusively(): Boolean @DoNotStrip public fun enableGranularShadowTreeStateReconciliation(): Boolean @@ -124,4 +128,6 @@ public interface ReactNativeFeatureFlagsProvider { @DoNotStrip public fun useStateAlignmentMechanism(): Boolean @DoNotStrip public fun useTurboModuleInterop(): Boolean + + @DoNotStrip public fun useTurboModules(): Boolean } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeNewArchitectureFeatureFlagsDefaults.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeNewArchitectureFeatureFlagsDefaults.kt index 261b17d4b23..97e20f572a0 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeNewArchitectureFeatureFlagsDefaults.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/internal/featureflags/ReactNativeNewArchitectureFeatureFlagsDefaults.kt @@ -1,10 +1,14 @@ -// (c) Meta Platforms, Inc. and affiliates. Confidential and proprietary. +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + @file:Suppress("DEPRECATION") // We want to use ReactFeatureFlags here specifically package com.facebook.react.internal.featureflags -import com.facebook.react.config.ReactFeatureFlags - /** * This class initializes default values for ReactNativeFeatureFlags when the New architecture is * enabled. This class is meant to be overrode only by internal apps migrating to the new @@ -12,23 +16,14 @@ import com.facebook.react.config.ReactFeatureFlags * * NOTE: Be aware that as a side effect this class also modifies static fields in {@link * com.facebook.react.config.ReactFeatureFlags} when newArchitectureEnabled is true. + * + * When the new architecture is enabled, we want to set the default values of the flags for Fabric, + * TurboModules and Bridgeless as enabled by default. */ public open class ReactNativeNewArchitectureFeatureFlagsDefaults( private val newArchitectureEnabled: Boolean = true ) : ReactNativeFeatureFlagsDefaults() { - init { - if (newArchitectureEnabled) { - // When the new architecture is enabled, we want to set the default values of the flags for - // Fabric, TurboModules and Bridgeless as enabled by default. - // ReactFeatureFlags is deprecated and will be deleted in 0.77, this code is temporary to - // support the new architecture before 0.77 cut. - ReactFeatureFlags.enableFabricRenderer = true - ReactFeatureFlags.useTurboModules = true - ReactFeatureFlags.enableBridgelessArchitecture = true - } - } - override fun batchRenderingUpdatesInEventLoop(): Boolean = newArchitectureEnabled || super.batchRenderingUpdatesInEventLoop() @@ -37,7 +32,13 @@ public open class ReactNativeNewArchitectureFeatureFlagsDefaults( override fun useModernRuntimeScheduler(): Boolean = true + override fun enableBridgelessArchitecture(): Boolean = newArchitectureEnabled + override fun enableMicrotasks(): Boolean = true + override fun enableFabricRenderer(): Boolean = newArchitectureEnabled + override fun useNativeViewConfigsInBridgelessMode(): Boolean = true + + override fun useTurboModules(): Boolean = newArchitectureEnabled } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModuleConstantsHelper.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModuleConstantsHelper.java index d4f70672e9f..f45479043bf 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModuleConstantsHelper.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModuleConstantsHelper.java @@ -13,7 +13,6 @@ import com.facebook.common.logging.FLog; import com.facebook.infer.annotation.Nullsafe; import com.facebook.react.common.MapBuilder; import com.facebook.react.common.build.ReactBuildConfig; -import com.facebook.react.config.ReactFeatureFlags; import com.facebook.react.internal.featureflags.ReactNativeFeatureFlags; import java.util.ArrayList; import java.util.HashMap; @@ -135,7 +134,8 @@ public class UIManagerModuleConstantsHelper { Map viewManagerBubblingEvents = viewManager.getExportedCustomBubblingEventTypeConstants(); if (viewManagerBubblingEvents != null) { - if (ReactFeatureFlags.enableFabricRenderer && ReactNativeFeatureFlags.useFabricInterop()) { + if (ReactNativeFeatureFlags.enableFabricRenderer() + && ReactNativeFeatureFlags.useFabricInterop()) { // For Fabric, events needs to be fired with a "top" prefix. // For the sake of Fabric Interop, here we normalize events adding "top" in their // name if the user hasn't provided it. @@ -151,7 +151,8 @@ public class UIManagerModuleConstantsHelper { Map viewManagerDirectEvents = viewManager.getExportedCustomDirectEventTypeConstants(); validateDirectEventNames(viewManager.getName(), viewManagerDirectEvents); if (viewManagerDirectEvents != null) { - if (ReactFeatureFlags.enableFabricRenderer && ReactNativeFeatureFlags.useFabricInterop()) { + if (ReactNativeFeatureFlags.enableFabricRenderer() + && ReactNativeFeatureFlags.useFabricInterop()) { // For Fabric, events needs to be fired with a "top" prefix. // For the sake of Fabric Interop, here we normalize events adding "top" in their // name if the user hasn't provided it. diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageView.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageView.kt index 318dddfd717..b19a9a137b7 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageView.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageView.kt @@ -47,7 +47,7 @@ import com.facebook.react.bridge.ReadableMap import com.facebook.react.common.annotations.UnstableReactNativeAPI import com.facebook.react.common.annotations.VisibleForTesting import com.facebook.react.common.build.ReactBuildConfig -import com.facebook.react.config.ReactFeatureFlags +import com.facebook.react.internal.featureflags.ReactNativeFeatureFlags import com.facebook.react.internal.featureflags.ReactNativeFeatureFlags.loadVectorDrawablesOnImages import com.facebook.react.modules.fresco.ReactNetworkImageRequest import com.facebook.react.uimanager.BackgroundStyleApplicator @@ -590,7 +590,7 @@ public class ReactImageView( // 3. ReactImageView detects the null src; displays a warning in LogBox (via this code). // 3. LogBox renders an , which fabric preallocates. // 4. Rinse and repeat. - if (ReactBuildConfig.DEBUG && !ReactFeatureFlags.enableBridgelessArchitecture) { + if (ReactBuildConfig.DEBUG && !ReactNativeFeatureFlags.enableBridgelessArchitecture()) { RNLog.w(context as ReactContext, "ReactImageView: Image source \"$uri\" doesn't exist") } } diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp index 326213c7d46..8fe3b974a72 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.cpp @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<43b92dd984e985e09e3efad9c8fedf44>> + * @generated SignedSource<<383e9749c506bc2326455ef907e06a4c>> */ /** @@ -93,6 +93,12 @@ class ReactNativeFeatureFlagsProviderHolder return method(javaProvider_); } + bool enableBridgelessArchitecture() override { + static const auto method = + getReactNativeFeatureFlagsProviderJavaClass()->getMethod("enableBridgelessArchitecture"); + return method(javaProvider_); + } + bool enableCleanTextInputYogaNode() override { static const auto method = getReactNativeFeatureFlagsProviderJavaClass()->getMethod("enableCleanTextInputYogaNode"); @@ -123,6 +129,12 @@ class ReactNativeFeatureFlagsProviderHolder return method(javaProvider_); } + bool enableFabricRenderer() override { + static const auto method = + getReactNativeFeatureFlagsProviderJavaClass()->getMethod("enableFabricRenderer"); + return method(javaProvider_); + } + bool enableFabricRendererExclusively() override { static const auto method = getReactNativeFeatureFlagsProviderJavaClass()->getMethod("enableFabricRendererExclusively"); @@ -345,6 +357,12 @@ class ReactNativeFeatureFlagsProviderHolder return method(javaProvider_); } + bool useTurboModules() override { + static const auto method = + getReactNativeFeatureFlagsProviderJavaClass()->getMethod("useTurboModules"); + return method(javaProvider_); + } + private: jni::global_ref javaProvider_; }; @@ -394,6 +412,11 @@ bool JReactNativeFeatureFlagsCxxInterop::enableBackgroundStyleApplicator( return ReactNativeFeatureFlags::enableBackgroundStyleApplicator(); } +bool JReactNativeFeatureFlagsCxxInterop::enableBridgelessArchitecture( + facebook::jni::alias_ref /*unused*/) { + return ReactNativeFeatureFlags::enableBridgelessArchitecture(); +} + bool JReactNativeFeatureFlagsCxxInterop::enableCleanTextInputYogaNode( facebook::jni::alias_ref /*unused*/) { return ReactNativeFeatureFlags::enableCleanTextInputYogaNode(); @@ -419,6 +442,11 @@ bool JReactNativeFeatureFlagsCxxInterop::enableFabricLogs( return ReactNativeFeatureFlags::enableFabricLogs(); } +bool JReactNativeFeatureFlagsCxxInterop::enableFabricRenderer( + facebook::jni::alias_ref /*unused*/) { + return ReactNativeFeatureFlags::enableFabricRenderer(); +} + bool JReactNativeFeatureFlagsCxxInterop::enableFabricRendererExclusively( facebook::jni::alias_ref /*unused*/) { return ReactNativeFeatureFlags::enableFabricRendererExclusively(); @@ -604,6 +632,11 @@ bool JReactNativeFeatureFlagsCxxInterop::useTurboModuleInterop( return ReactNativeFeatureFlags::useTurboModuleInterop(); } +bool JReactNativeFeatureFlagsCxxInterop::useTurboModules( + facebook::jni::alias_ref /*unused*/) { + return ReactNativeFeatureFlags::useTurboModules(); +} + void JReactNativeFeatureFlagsCxxInterop::override( facebook::jni::alias_ref /*unused*/, jni::alias_ref provider) { @@ -648,6 +681,9 @@ void JReactNativeFeatureFlagsCxxInterop::registerNatives() { makeNativeMethod( "enableBackgroundStyleApplicator", JReactNativeFeatureFlagsCxxInterop::enableBackgroundStyleApplicator), + makeNativeMethod( + "enableBridgelessArchitecture", + JReactNativeFeatureFlagsCxxInterop::enableBridgelessArchitecture), makeNativeMethod( "enableCleanTextInputYogaNode", JReactNativeFeatureFlagsCxxInterop::enableCleanTextInputYogaNode), @@ -663,6 +699,9 @@ void JReactNativeFeatureFlagsCxxInterop::registerNatives() { makeNativeMethod( "enableFabricLogs", JReactNativeFeatureFlagsCxxInterop::enableFabricLogs), + makeNativeMethod( + "enableFabricRenderer", + JReactNativeFeatureFlagsCxxInterop::enableFabricRenderer), makeNativeMethod( "enableFabricRendererExclusively", JReactNativeFeatureFlagsCxxInterop::enableFabricRendererExclusively), @@ -774,6 +813,9 @@ void JReactNativeFeatureFlagsCxxInterop::registerNatives() { makeNativeMethod( "useTurboModuleInterop", JReactNativeFeatureFlagsCxxInterop::useTurboModuleInterop), + makeNativeMethod( + "useTurboModules", + JReactNativeFeatureFlagsCxxInterop::useTurboModules), }); } diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h b/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h index 02bb54491be..c478530d81b 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h +++ b/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/JReactNativeFeatureFlagsCxxInterop.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<54c94f9bfa07e41d978899dbce03469f>> + * @generated SignedSource<<293ed423f770e7e0ba95b19eb5c28dc2>> */ /** @@ -57,6 +57,9 @@ class JReactNativeFeatureFlagsCxxInterop static bool enableBackgroundStyleApplicator( facebook::jni::alias_ref); + static bool enableBridgelessArchitecture( + facebook::jni::alias_ref); + static bool enableCleanTextInputYogaNode( facebook::jni::alias_ref); @@ -72,6 +75,9 @@ class JReactNativeFeatureFlagsCxxInterop static bool enableFabricLogs( facebook::jni::alias_ref); + static bool enableFabricRenderer( + facebook::jni::alias_ref); + static bool enableFabricRendererExclusively( facebook::jni::alias_ref); @@ -183,6 +189,9 @@ class JReactNativeFeatureFlagsCxxInterop static bool useTurboModuleInterop( facebook::jni::alias_ref); + static bool useTurboModules( + facebook::jni::alias_ref); + static void override( facebook::jni::alias_ref, jni::alias_ref provider); diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/bridge/interop/InteropModuleRegistryTest.kt b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/bridge/interop/InteropModuleRegistryTest.kt index 3d4e36d6ffc..63ef4bef012 100644 --- a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/bridge/interop/InteropModuleRegistryTest.kt +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/bridge/interop/InteropModuleRegistryTest.kt @@ -11,7 +11,6 @@ package com.facebook.react.bridge.interop import com.facebook.react.common.annotations.UnstableReactNativeAPI -import com.facebook.react.config.ReactFeatureFlags import com.facebook.react.internal.featureflags.ReactNativeFeatureFlags import com.facebook.react.internal.featureflags.ReactNativeFeatureFlagsDefaults import com.facebook.react.internal.featureflags.ReactNativeFeatureFlagsForTests @@ -40,38 +39,28 @@ class InteropModuleRegistryTest { @Test fun shouldReturnInteropModule_withFabricDisabled_returnsFalse() { - ReactFeatureFlags.enableFabricRenderer = false + overrideFeatureFlags(false, false) assertThat(underTest.shouldReturnInteropModule(RCTEventEmitter::class.java)).isFalse() } @Test fun shouldReturnInteropModule_withFabricInteropDisabled_returnsFalse() { - ReactFeatureFlags.enableFabricRenderer = true - overrideUseFabricInteropFlag(false) + overrideFeatureFlags(false, true) assertThat(underTest.shouldReturnInteropModule(RCTEventEmitter::class.java)).isFalse() } - private fun overrideUseFabricInteropFlag(value: Boolean) { - ReactNativeFeatureFlags.override( - object : ReactNativeFeatureFlagsDefaults() { - override fun useFabricInterop(): Boolean = value - }) - } - @Test fun shouldReturnInteropModule_withUnregisteredClass_returnsFalse() { - ReactFeatureFlags.enableFabricRenderer = true - overrideUseFabricInteropFlag(true) + overrideFeatureFlags(true, true) assertThat(underTest.shouldReturnInteropModule(JSTimers::class.java)).isFalse() } @Test fun shouldReturnInteropModule_withRegisteredClass_returnsTrue() { - ReactFeatureFlags.enableFabricRenderer = true - overrideUseFabricInteropFlag(true) + overrideFeatureFlags(true, true) underTest.registerInteropModule(RCTEventEmitter::class.java, FakeRCTEventEmitter()) @@ -80,8 +69,7 @@ class InteropModuleRegistryTest { @Test fun getInteropModule_withRegisteredClassAndInvalidFlags_returnsNull() { - ReactFeatureFlags.enableFabricRenderer = false - overrideUseFabricInteropFlag(false) + overrideFeatureFlags(false, false) underTest.registerInteropModule(RCTEventEmitter::class.java, FakeRCTEventEmitter()) val interopModule = underTest.getInteropModule(RCTEventEmitter::class.java) @@ -91,8 +79,7 @@ class InteropModuleRegistryTest { @Test fun getInteropModule_withRegisteredClassAndValidFlags_returnsInteropModule() { - ReactFeatureFlags.enableFabricRenderer = true - overrideUseFabricInteropFlag(true) + overrideFeatureFlags(true, true) underTest.registerInteropModule(RCTEventEmitter::class.java, FakeRCTEventEmitter()) val interopModule = underTest.getInteropModule(RCTEventEmitter::class.java) @@ -102,10 +89,18 @@ class InteropModuleRegistryTest { @Test fun getInteropModule_withUnregisteredClass_returnsNull() { - ReactFeatureFlags.enableFabricRenderer = true - overrideUseFabricInteropFlag(true) + overrideFeatureFlags(true, true) val missingModule = underTest.getInteropModule(JSTimers::class.java) assertThat(missingModule).isNull() } + + private fun overrideFeatureFlags(useFabricInterop: Boolean, enableFabricRenderer: Boolean) { + ReactNativeFeatureFlags.override( + object : ReactNativeFeatureFlagsDefaults() { + override fun useFabricInterop(): Boolean = useFabricInterop + + override fun enableFabricRenderer(): Boolean = enableFabricRenderer + }) + } } diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/modules/deviceinfo/DeviceInfoModuleTest.kt b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/modules/deviceinfo/DeviceInfoModuleTest.kt index dafaf8b1761..fb6f22e44ed 100644 --- a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/modules/deviceinfo/DeviceInfoModuleTest.kt +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/modules/deviceinfo/DeviceInfoModuleTest.kt @@ -12,6 +12,7 @@ import com.facebook.react.bridge.JavaOnlyMap import com.facebook.react.bridge.ReactContext import com.facebook.react.bridge.ReactTestHelper import com.facebook.react.bridge.WritableMap +import com.facebook.react.internal.featureflags.ReactNativeFeatureFlagsForTests import com.facebook.react.uimanager.DisplayMetricsHolder import junit.framework.TestCase import org.assertj.core.api.Assertions @@ -37,6 +38,7 @@ class DeviceInfoModuleTest : TestCase() { @Before public override fun setUp() { + ReactNativeFeatureFlagsForTests.setUp() fakePortraitDisplayMetrics = JavaOnlyMap() fakePortraitDisplayMetrics.putInt("width", 100) fakePortraitDisplayMetrics.putInt("height", 200) diff --git a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/UIManagerModuleConstantsTest.kt b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/UIManagerModuleConstantsTest.kt index ac990680dfa..e1bf44598ac 100644 --- a/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/UIManagerModuleConstantsTest.kt +++ b/packages/react-native/ReactAndroid/src/test/java/com/facebook/react/uimanager/UIManagerModuleConstantsTest.kt @@ -10,6 +10,7 @@ package com.facebook.react.uimanager import android.view.View import com.facebook.react.bridge.BridgeReactContext import com.facebook.react.bridge.ReactApplicationContext +import com.facebook.react.internal.featureflags.ReactNativeFeatureFlagsForTests import org.assertj.core.api.Assertions import org.assertj.core.data.MapEntry import org.junit.Before @@ -54,6 +55,7 @@ class UIManagerModuleConstantsTest { @Before fun setUp() { + ReactNativeFeatureFlagsForTests.setUp() reactContext = BridgeReactContext(RuntimeEnvironment.getApplication()) } diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.cpp b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.cpp index 15b4f233ca2..09d76c096ff 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.cpp +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.cpp @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<<85cdb5a41317e9671cc23b2c7345c04d>> */ /** @@ -57,6 +57,10 @@ bool ReactNativeFeatureFlags::enableBackgroundStyleApplicator() { return getAccessor().enableBackgroundStyleApplicator(); } +bool ReactNativeFeatureFlags::enableBridgelessArchitecture() { + return getAccessor().enableBridgelessArchitecture(); +} + bool ReactNativeFeatureFlags::enableCleanTextInputYogaNode() { return getAccessor().enableCleanTextInputYogaNode(); } @@ -77,6 +81,10 @@ bool ReactNativeFeatureFlags::enableFabricLogs() { return getAccessor().enableFabricLogs(); } +bool ReactNativeFeatureFlags::enableFabricRenderer() { + return getAccessor().enableFabricRenderer(); +} + bool ReactNativeFeatureFlags::enableFabricRendererExclusively() { return getAccessor().enableFabricRendererExclusively(); } @@ -225,6 +233,10 @@ bool ReactNativeFeatureFlags::useTurboModuleInterop() { return getAccessor().useTurboModuleInterop(); } +bool ReactNativeFeatureFlags::useTurboModules() { + return getAccessor().useTurboModules(); +} + void ReactNativeFeatureFlags::override( std::unique_ptr provider) { getAccessor().override(std::move(provider)); diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h index 646a250ad70..c844d465157 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<2cde82b474ab94cd05bdf5e04e700c13>> + * @generated SignedSource<> */ /** @@ -82,6 +82,11 @@ class ReactNativeFeatureFlags { */ RN_EXPORT static bool enableBackgroundStyleApplicator(); + /** + * Feature flag to enable the new bridgeless architecture. Note: Enabling this will force enable the following flags: `useTurboModules` & `enableFabricRenderer. + */ + RN_EXPORT static bool enableBridgelessArchitecture(); + /** * Clean yoga node when does not change. */ @@ -107,6 +112,11 @@ class ReactNativeFeatureFlags { */ RN_EXPORT static bool enableFabricLogs(); + /** + * Enables the use of the Fabric renderer in the whole app. + */ + RN_EXPORT static bool enableFabricRenderer(); + /** * When the app is completely migrated to Fabric, set this flag to true to disable parts of Paper infrastructure that are not needed anymore but consume memory and CPU. Specifically, UIViewOperationQueue and EventDispatcherImpl will no longer work as they will not subscribe to ReactChoreographer for updates. */ @@ -292,6 +302,11 @@ class ReactNativeFeatureFlags { */ RN_EXPORT static bool useTurboModuleInterop(); + /** + * When enabled, NativeModules will be executed by using the TurboModule system + */ + RN_EXPORT static bool useTurboModules(); + /** * Overrides the feature flags with the ones provided by the given provider * (generally one that extends `ReactNativeFeatureFlagsDefaults`). diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.cpp b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.cpp index 5fa57e0f615..09f80847d1f 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.cpp +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.cpp @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<> */ /** @@ -191,6 +191,24 @@ bool ReactNativeFeatureFlagsAccessor::enableBackgroundStyleApplicator() { return flagValue.value(); } +bool ReactNativeFeatureFlagsAccessor::enableBridgelessArchitecture() { + auto flagValue = enableBridgelessArchitecture_.load(); + + if (!flagValue.has_value()) { + // This block is not exclusive but it is not necessary. + // If multiple threads try to initialize the feature flag, we would only + // be accessing the provider multiple times but the end state of this + // instance and the returned flag value would be the same. + + markFlagAsAccessed(9, "enableBridgelessArchitecture"); + + flagValue = currentProvider_->enableBridgelessArchitecture(); + enableBridgelessArchitecture_ = flagValue; + } + + return flagValue.value(); +} + bool ReactNativeFeatureFlagsAccessor::enableCleanTextInputYogaNode() { auto flagValue = enableCleanTextInputYogaNode_.load(); @@ -200,7 +218,7 @@ bool ReactNativeFeatureFlagsAccessor::enableCleanTextInputYogaNode() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(9, "enableCleanTextInputYogaNode"); + markFlagAsAccessed(10, "enableCleanTextInputYogaNode"); flagValue = currentProvider_->enableCleanTextInputYogaNode(); enableCleanTextInputYogaNode_ = flagValue; @@ -218,7 +236,7 @@ bool ReactNativeFeatureFlagsAccessor::enableDeletionOfUnmountedViews() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(10, "enableDeletionOfUnmountedViews"); + markFlagAsAccessed(11, "enableDeletionOfUnmountedViews"); flagValue = currentProvider_->enableDeletionOfUnmountedViews(); enableDeletionOfUnmountedViews_ = flagValue; @@ -236,7 +254,7 @@ bool ReactNativeFeatureFlagsAccessor::enableEagerRootViewAttachment() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(11, "enableEagerRootViewAttachment"); + markFlagAsAccessed(12, "enableEagerRootViewAttachment"); flagValue = currentProvider_->enableEagerRootViewAttachment(); enableEagerRootViewAttachment_ = flagValue; @@ -254,7 +272,7 @@ bool ReactNativeFeatureFlagsAccessor::enableEventEmitterRetentionDuringGesturesO // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(12, "enableEventEmitterRetentionDuringGesturesOnAndroid"); + markFlagAsAccessed(13, "enableEventEmitterRetentionDuringGesturesOnAndroid"); flagValue = currentProvider_->enableEventEmitterRetentionDuringGesturesOnAndroid(); enableEventEmitterRetentionDuringGesturesOnAndroid_ = flagValue; @@ -272,7 +290,7 @@ bool ReactNativeFeatureFlagsAccessor::enableFabricLogs() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(13, "enableFabricLogs"); + markFlagAsAccessed(14, "enableFabricLogs"); flagValue = currentProvider_->enableFabricLogs(); enableFabricLogs_ = flagValue; @@ -281,6 +299,24 @@ bool ReactNativeFeatureFlagsAccessor::enableFabricLogs() { return flagValue.value(); } +bool ReactNativeFeatureFlagsAccessor::enableFabricRenderer() { + auto flagValue = enableFabricRenderer_.load(); + + if (!flagValue.has_value()) { + // This block is not exclusive but it is not necessary. + // If multiple threads try to initialize the feature flag, we would only + // be accessing the provider multiple times but the end state of this + // instance and the returned flag value would be the same. + + markFlagAsAccessed(15, "enableFabricRenderer"); + + flagValue = currentProvider_->enableFabricRenderer(); + enableFabricRenderer_ = flagValue; + } + + return flagValue.value(); +} + bool ReactNativeFeatureFlagsAccessor::enableFabricRendererExclusively() { auto flagValue = enableFabricRendererExclusively_.load(); @@ -290,7 +326,7 @@ bool ReactNativeFeatureFlagsAccessor::enableFabricRendererExclusively() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(14, "enableFabricRendererExclusively"); + markFlagAsAccessed(16, "enableFabricRendererExclusively"); flagValue = currentProvider_->enableFabricRendererExclusively(); enableFabricRendererExclusively_ = flagValue; @@ -308,7 +344,7 @@ bool ReactNativeFeatureFlagsAccessor::enableGranularShadowTreeStateReconciliatio // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(15, "enableGranularShadowTreeStateReconciliation"); + markFlagAsAccessed(17, "enableGranularShadowTreeStateReconciliation"); flagValue = currentProvider_->enableGranularShadowTreeStateReconciliation(); enableGranularShadowTreeStateReconciliation_ = flagValue; @@ -326,7 +362,7 @@ bool ReactNativeFeatureFlagsAccessor::enableIOSViewClipToPaddingBox() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(16, "enableIOSViewClipToPaddingBox"); + markFlagAsAccessed(18, "enableIOSViewClipToPaddingBox"); flagValue = currentProvider_->enableIOSViewClipToPaddingBox(); enableIOSViewClipToPaddingBox_ = flagValue; @@ -344,7 +380,7 @@ bool ReactNativeFeatureFlagsAccessor::enableLayoutAnimationsOnIOS() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(17, "enableLayoutAnimationsOnIOS"); + markFlagAsAccessed(19, "enableLayoutAnimationsOnIOS"); flagValue = currentProvider_->enableLayoutAnimationsOnIOS(); enableLayoutAnimationsOnIOS_ = flagValue; @@ -362,7 +398,7 @@ bool ReactNativeFeatureFlagsAccessor::enableLongTaskAPI() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(18, "enableLongTaskAPI"); + markFlagAsAccessed(20, "enableLongTaskAPI"); flagValue = currentProvider_->enableLongTaskAPI(); enableLongTaskAPI_ = flagValue; @@ -380,7 +416,7 @@ bool ReactNativeFeatureFlagsAccessor::enableMicrotasks() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(19, "enableMicrotasks"); + markFlagAsAccessed(21, "enableMicrotasks"); flagValue = currentProvider_->enableMicrotasks(); enableMicrotasks_ = flagValue; @@ -398,7 +434,7 @@ bool ReactNativeFeatureFlagsAccessor::enablePreciseSchedulingForPremountItemsOnA // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(20, "enablePreciseSchedulingForPremountItemsOnAndroid"); + markFlagAsAccessed(22, "enablePreciseSchedulingForPremountItemsOnAndroid"); flagValue = currentProvider_->enablePreciseSchedulingForPremountItemsOnAndroid(); enablePreciseSchedulingForPremountItemsOnAndroid_ = flagValue; @@ -416,7 +452,7 @@ bool ReactNativeFeatureFlagsAccessor::enablePropsUpdateReconciliationAndroid() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(21, "enablePropsUpdateReconciliationAndroid"); + markFlagAsAccessed(23, "enablePropsUpdateReconciliationAndroid"); flagValue = currentProvider_->enablePropsUpdateReconciliationAndroid(); enablePropsUpdateReconciliationAndroid_ = flagValue; @@ -434,7 +470,7 @@ bool ReactNativeFeatureFlagsAccessor::enableReportEventPaintTime() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(22, "enableReportEventPaintTime"); + markFlagAsAccessed(24, "enableReportEventPaintTime"); flagValue = currentProvider_->enableReportEventPaintTime(); enableReportEventPaintTime_ = flagValue; @@ -452,7 +488,7 @@ bool ReactNativeFeatureFlagsAccessor::enableSynchronousStateUpdates() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(23, "enableSynchronousStateUpdates"); + markFlagAsAccessed(25, "enableSynchronousStateUpdates"); flagValue = currentProvider_->enableSynchronousStateUpdates(); enableSynchronousStateUpdates_ = flagValue; @@ -470,7 +506,7 @@ bool ReactNativeFeatureFlagsAccessor::enableTextPreallocationOptimisation() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(24, "enableTextPreallocationOptimisation"); + markFlagAsAccessed(26, "enableTextPreallocationOptimisation"); flagValue = currentProvider_->enableTextPreallocationOptimisation(); enableTextPreallocationOptimisation_ = flagValue; @@ -488,7 +524,7 @@ bool ReactNativeFeatureFlagsAccessor::enableUIConsistency() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(25, "enableUIConsistency"); + markFlagAsAccessed(27, "enableUIConsistency"); flagValue = currentProvider_->enableUIConsistency(); enableUIConsistency_ = flagValue; @@ -506,7 +542,7 @@ bool ReactNativeFeatureFlagsAccessor::enableViewRecycling() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(26, "enableViewRecycling"); + markFlagAsAccessed(28, "enableViewRecycling"); flagValue = currentProvider_->enableViewRecycling(); enableViewRecycling_ = flagValue; @@ -524,7 +560,7 @@ bool ReactNativeFeatureFlagsAccessor::excludeYogaFromRawProps() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(27, "excludeYogaFromRawProps"); + markFlagAsAccessed(29, "excludeYogaFromRawProps"); flagValue = currentProvider_->excludeYogaFromRawProps(); excludeYogaFromRawProps_ = flagValue; @@ -542,7 +578,7 @@ bool ReactNativeFeatureFlagsAccessor::fetchImagesInViewPreallocation() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(28, "fetchImagesInViewPreallocation"); + markFlagAsAccessed(30, "fetchImagesInViewPreallocation"); flagValue = currentProvider_->fetchImagesInViewPreallocation(); fetchImagesInViewPreallocation_ = flagValue; @@ -560,7 +596,7 @@ bool ReactNativeFeatureFlagsAccessor::fixMappingOfEventPrioritiesBetweenFabricAn // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(29, "fixMappingOfEventPrioritiesBetweenFabricAndReact"); + markFlagAsAccessed(31, "fixMappingOfEventPrioritiesBetweenFabricAndReact"); flagValue = currentProvider_->fixMappingOfEventPrioritiesBetweenFabricAndReact(); fixMappingOfEventPrioritiesBetweenFabricAndReact_ = flagValue; @@ -578,7 +614,7 @@ bool ReactNativeFeatureFlagsAccessor::fixMountingCoordinatorReportedPendingTrans // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(30, "fixMountingCoordinatorReportedPendingTransactionsOnAndroid"); + markFlagAsAccessed(32, "fixMountingCoordinatorReportedPendingTransactionsOnAndroid"); flagValue = currentProvider_->fixMountingCoordinatorReportedPendingTransactionsOnAndroid(); fixMountingCoordinatorReportedPendingTransactionsOnAndroid_ = flagValue; @@ -596,7 +632,7 @@ bool ReactNativeFeatureFlagsAccessor::forceBatchingMountItemsOnAndroid() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(31, "forceBatchingMountItemsOnAndroid"); + markFlagAsAccessed(33, "forceBatchingMountItemsOnAndroid"); flagValue = currentProvider_->forceBatchingMountItemsOnAndroid(); forceBatchingMountItemsOnAndroid_ = flagValue; @@ -614,7 +650,7 @@ bool ReactNativeFeatureFlagsAccessor::fuseboxEnabledDebug() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(32, "fuseboxEnabledDebug"); + markFlagAsAccessed(34, "fuseboxEnabledDebug"); flagValue = currentProvider_->fuseboxEnabledDebug(); fuseboxEnabledDebug_ = flagValue; @@ -632,7 +668,7 @@ bool ReactNativeFeatureFlagsAccessor::fuseboxEnabledRelease() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(33, "fuseboxEnabledRelease"); + markFlagAsAccessed(35, "fuseboxEnabledRelease"); flagValue = currentProvider_->fuseboxEnabledRelease(); fuseboxEnabledRelease_ = flagValue; @@ -650,7 +686,7 @@ bool ReactNativeFeatureFlagsAccessor::initEagerTurboModulesOnNativeModulesQueueA // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(34, "initEagerTurboModulesOnNativeModulesQueueAndroid"); + markFlagAsAccessed(36, "initEagerTurboModulesOnNativeModulesQueueAndroid"); flagValue = currentProvider_->initEagerTurboModulesOnNativeModulesQueueAndroid(); initEagerTurboModulesOnNativeModulesQueueAndroid_ = flagValue; @@ -668,7 +704,7 @@ bool ReactNativeFeatureFlagsAccessor::lazyAnimationCallbacks() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(35, "lazyAnimationCallbacks"); + markFlagAsAccessed(37, "lazyAnimationCallbacks"); flagValue = currentProvider_->lazyAnimationCallbacks(); lazyAnimationCallbacks_ = flagValue; @@ -686,7 +722,7 @@ bool ReactNativeFeatureFlagsAccessor::loadVectorDrawablesOnImages() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(36, "loadVectorDrawablesOnImages"); + markFlagAsAccessed(38, "loadVectorDrawablesOnImages"); flagValue = currentProvider_->loadVectorDrawablesOnImages(); loadVectorDrawablesOnImages_ = flagValue; @@ -704,7 +740,7 @@ bool ReactNativeFeatureFlagsAccessor::removeNestedCallsToDispatchMountItemsOnAnd // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(37, "removeNestedCallsToDispatchMountItemsOnAndroid"); + markFlagAsAccessed(39, "removeNestedCallsToDispatchMountItemsOnAndroid"); flagValue = currentProvider_->removeNestedCallsToDispatchMountItemsOnAndroid(); removeNestedCallsToDispatchMountItemsOnAndroid_ = flagValue; @@ -722,7 +758,7 @@ bool ReactNativeFeatureFlagsAccessor::setAndroidLayoutDirection() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(38, "setAndroidLayoutDirection"); + markFlagAsAccessed(40, "setAndroidLayoutDirection"); flagValue = currentProvider_->setAndroidLayoutDirection(); setAndroidLayoutDirection_ = flagValue; @@ -740,7 +776,7 @@ bool ReactNativeFeatureFlagsAccessor::traceTurboModulePromiseRejectionsOnAndroid // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(39, "traceTurboModulePromiseRejectionsOnAndroid"); + markFlagAsAccessed(41, "traceTurboModulePromiseRejectionsOnAndroid"); flagValue = currentProvider_->traceTurboModulePromiseRejectionsOnAndroid(); traceTurboModulePromiseRejectionsOnAndroid_ = flagValue; @@ -758,7 +794,7 @@ bool ReactNativeFeatureFlagsAccessor::useFabricInterop() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(40, "useFabricInterop"); + markFlagAsAccessed(42, "useFabricInterop"); flagValue = currentProvider_->useFabricInterop(); useFabricInterop_ = flagValue; @@ -776,7 +812,7 @@ bool ReactNativeFeatureFlagsAccessor::useImmediateExecutorInAndroidBridgeless() // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(41, "useImmediateExecutorInAndroidBridgeless"); + markFlagAsAccessed(43, "useImmediateExecutorInAndroidBridgeless"); flagValue = currentProvider_->useImmediateExecutorInAndroidBridgeless(); useImmediateExecutorInAndroidBridgeless_ = flagValue; @@ -794,7 +830,7 @@ bool ReactNativeFeatureFlagsAccessor::useModernRuntimeScheduler() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(42, "useModernRuntimeScheduler"); + markFlagAsAccessed(44, "useModernRuntimeScheduler"); flagValue = currentProvider_->useModernRuntimeScheduler(); useModernRuntimeScheduler_ = flagValue; @@ -812,7 +848,7 @@ bool ReactNativeFeatureFlagsAccessor::useNativeViewConfigsInBridgelessMode() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(43, "useNativeViewConfigsInBridgelessMode"); + markFlagAsAccessed(45, "useNativeViewConfigsInBridgelessMode"); flagValue = currentProvider_->useNativeViewConfigsInBridgelessMode(); useNativeViewConfigsInBridgelessMode_ = flagValue; @@ -830,7 +866,7 @@ bool ReactNativeFeatureFlagsAccessor::useNewReactImageViewBackgroundDrawing() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(44, "useNewReactImageViewBackgroundDrawing"); + markFlagAsAccessed(46, "useNewReactImageViewBackgroundDrawing"); flagValue = currentProvider_->useNewReactImageViewBackgroundDrawing(); useNewReactImageViewBackgroundDrawing_ = flagValue; @@ -848,7 +884,7 @@ bool ReactNativeFeatureFlagsAccessor::useOptimisedViewPreallocationOnAndroid() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(45, "useOptimisedViewPreallocationOnAndroid"); + markFlagAsAccessed(47, "useOptimisedViewPreallocationOnAndroid"); flagValue = currentProvider_->useOptimisedViewPreallocationOnAndroid(); useOptimisedViewPreallocationOnAndroid_ = flagValue; @@ -866,7 +902,7 @@ bool ReactNativeFeatureFlagsAccessor::useOptimizedEventBatchingOnAndroid() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(46, "useOptimizedEventBatchingOnAndroid"); + markFlagAsAccessed(48, "useOptimizedEventBatchingOnAndroid"); flagValue = currentProvider_->useOptimizedEventBatchingOnAndroid(); useOptimizedEventBatchingOnAndroid_ = flagValue; @@ -884,7 +920,7 @@ bool ReactNativeFeatureFlagsAccessor::useRuntimeShadowNodeReferenceUpdate() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(47, "useRuntimeShadowNodeReferenceUpdate"); + markFlagAsAccessed(49, "useRuntimeShadowNodeReferenceUpdate"); flagValue = currentProvider_->useRuntimeShadowNodeReferenceUpdate(); useRuntimeShadowNodeReferenceUpdate_ = flagValue; @@ -902,7 +938,7 @@ bool ReactNativeFeatureFlagsAccessor::useRuntimeShadowNodeReferenceUpdateOnLayou // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(48, "useRuntimeShadowNodeReferenceUpdateOnLayout"); + markFlagAsAccessed(50, "useRuntimeShadowNodeReferenceUpdateOnLayout"); flagValue = currentProvider_->useRuntimeShadowNodeReferenceUpdateOnLayout(); useRuntimeShadowNodeReferenceUpdateOnLayout_ = flagValue; @@ -920,7 +956,7 @@ bool ReactNativeFeatureFlagsAccessor::useStateAlignmentMechanism() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(49, "useStateAlignmentMechanism"); + markFlagAsAccessed(51, "useStateAlignmentMechanism"); flagValue = currentProvider_->useStateAlignmentMechanism(); useStateAlignmentMechanism_ = flagValue; @@ -938,7 +974,7 @@ bool ReactNativeFeatureFlagsAccessor::useTurboModuleInterop() { // be accessing the provider multiple times but the end state of this // instance and the returned flag value would be the same. - markFlagAsAccessed(50, "useTurboModuleInterop"); + markFlagAsAccessed(52, "useTurboModuleInterop"); flagValue = currentProvider_->useTurboModuleInterop(); useTurboModuleInterop_ = flagValue; @@ -947,6 +983,24 @@ bool ReactNativeFeatureFlagsAccessor::useTurboModuleInterop() { return flagValue.value(); } +bool ReactNativeFeatureFlagsAccessor::useTurboModules() { + auto flagValue = useTurboModules_.load(); + + if (!flagValue.has_value()) { + // This block is not exclusive but it is not necessary. + // If multiple threads try to initialize the feature flag, we would only + // be accessing the provider multiple times but the end state of this + // instance and the returned flag value would be the same. + + markFlagAsAccessed(53, "useTurboModules"); + + flagValue = currentProvider_->useTurboModules(); + useTurboModules_ = flagValue; + } + + return flagValue.value(); +} + void ReactNativeFeatureFlagsAccessor::override( std::unique_ptr provider) { if (wasOverridden_) { diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h index bb5798df4dd..c7db3980bfc 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<3273d68bcf8118b939e11dde654c3e34>> + * @generated SignedSource<<5f2c9b500fc26e68d56efae08b15575f>> */ /** @@ -40,11 +40,13 @@ class ReactNativeFeatureFlagsAccessor { bool enableAndroidLineHeightCentering(); bool enableAndroidMixBlendModeProp(); bool enableBackgroundStyleApplicator(); + bool enableBridgelessArchitecture(); bool enableCleanTextInputYogaNode(); bool enableDeletionOfUnmountedViews(); bool enableEagerRootViewAttachment(); bool enableEventEmitterRetentionDuringGesturesOnAndroid(); bool enableFabricLogs(); + bool enableFabricRenderer(); bool enableFabricRendererExclusively(); bool enableGranularShadowTreeStateReconciliation(); bool enableIOSViewClipToPaddingBox(); @@ -82,6 +84,7 @@ class ReactNativeFeatureFlagsAccessor { bool useRuntimeShadowNodeReferenceUpdateOnLayout(); bool useStateAlignmentMechanism(); bool useTurboModuleInterop(); + bool useTurboModules(); void override(std::unique_ptr provider); @@ -92,7 +95,7 @@ class ReactNativeFeatureFlagsAccessor { std::unique_ptr currentProvider_; bool wasOverridden_; - std::array, 51> accessedFeatureFlags_; + std::array, 54> accessedFeatureFlags_; std::atomic> commonTestFlag_; std::atomic> allowRecursiveCommitsWithSynchronousMountOnAndroid_; @@ -103,11 +106,13 @@ class ReactNativeFeatureFlagsAccessor { std::atomic> enableAndroidLineHeightCentering_; std::atomic> enableAndroidMixBlendModeProp_; std::atomic> enableBackgroundStyleApplicator_; + std::atomic> enableBridgelessArchitecture_; std::atomic> enableCleanTextInputYogaNode_; std::atomic> enableDeletionOfUnmountedViews_; std::atomic> enableEagerRootViewAttachment_; std::atomic> enableEventEmitterRetentionDuringGesturesOnAndroid_; std::atomic> enableFabricLogs_; + std::atomic> enableFabricRenderer_; std::atomic> enableFabricRendererExclusively_; std::atomic> enableGranularShadowTreeStateReconciliation_; std::atomic> enableIOSViewClipToPaddingBox_; @@ -145,6 +150,7 @@ class ReactNativeFeatureFlagsAccessor { std::atomic> useRuntimeShadowNodeReferenceUpdateOnLayout_; std::atomic> useStateAlignmentMechanism_; std::atomic> useTurboModuleInterop_; + std::atomic> useTurboModules_; }; } // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h index 9c9bd460a44..5ce07698ba0 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<3ba99bf8dd5f7e146e3488dbc8bc59c8>> + * @generated SignedSource<> */ /** @@ -63,6 +63,10 @@ class ReactNativeFeatureFlagsDefaults : public ReactNativeFeatureFlagsProvider { return true; } + bool enableBridgelessArchitecture() override { + return false; + } + bool enableCleanTextInputYogaNode() override { return false; } @@ -83,6 +87,10 @@ class ReactNativeFeatureFlagsDefaults : public ReactNativeFeatureFlagsProvider { return false; } + bool enableFabricRenderer() override { + return false; + } + bool enableFabricRendererExclusively() override { return false; } @@ -230,6 +238,10 @@ class ReactNativeFeatureFlagsDefaults : public ReactNativeFeatureFlagsProvider { bool useTurboModuleInterop() override { return false; } + + bool useTurboModules() override { + return false; + } }; } // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h index 4e94bf6a34f..9fd1367f2c1 100644 --- a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h +++ b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsProvider.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<727c5ccb59b23aa6e14d58121e0007bd>> + * @generated SignedSource<> */ /** @@ -34,11 +34,13 @@ class ReactNativeFeatureFlagsProvider { virtual bool enableAndroidLineHeightCentering() = 0; virtual bool enableAndroidMixBlendModeProp() = 0; virtual bool enableBackgroundStyleApplicator() = 0; + virtual bool enableBridgelessArchitecture() = 0; virtual bool enableCleanTextInputYogaNode() = 0; virtual bool enableDeletionOfUnmountedViews() = 0; virtual bool enableEagerRootViewAttachment() = 0; virtual bool enableEventEmitterRetentionDuringGesturesOnAndroid() = 0; virtual bool enableFabricLogs() = 0; + virtual bool enableFabricRenderer() = 0; virtual bool enableFabricRendererExclusively() = 0; virtual bool enableGranularShadowTreeStateReconciliation() = 0; virtual bool enableIOSViewClipToPaddingBox() = 0; @@ -76,6 +78,7 @@ class ReactNativeFeatureFlagsProvider { virtual bool useRuntimeShadowNodeReferenceUpdateOnLayout() = 0; virtual bool useStateAlignmentMechanism() = 0; virtual bool useTurboModuleInterop() = 0; + virtual bool useTurboModules() = 0; }; } // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.cpp b/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.cpp index b0450475b28..5316822e3b2 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.cpp +++ b/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.cpp @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<<2b484558d552981e4ec0644d75849dde>> */ /** @@ -82,6 +82,11 @@ bool NativeReactNativeFeatureFlags::enableBackgroundStyleApplicator( return ReactNativeFeatureFlags::enableBackgroundStyleApplicator(); } +bool NativeReactNativeFeatureFlags::enableBridgelessArchitecture( + jsi::Runtime& /*runtime*/) { + return ReactNativeFeatureFlags::enableBridgelessArchitecture(); +} + bool NativeReactNativeFeatureFlags::enableCleanTextInputYogaNode( jsi::Runtime& /*runtime*/) { return ReactNativeFeatureFlags::enableCleanTextInputYogaNode(); @@ -107,6 +112,11 @@ bool NativeReactNativeFeatureFlags::enableFabricLogs( return ReactNativeFeatureFlags::enableFabricLogs(); } +bool NativeReactNativeFeatureFlags::enableFabricRenderer( + jsi::Runtime& /*runtime*/) { + return ReactNativeFeatureFlags::enableFabricRenderer(); +} + bool NativeReactNativeFeatureFlags::enableFabricRendererExclusively( jsi::Runtime& /*runtime*/) { return ReactNativeFeatureFlags::enableFabricRendererExclusively(); @@ -292,4 +302,9 @@ bool NativeReactNativeFeatureFlags::useTurboModuleInterop( return ReactNativeFeatureFlags::useTurboModuleInterop(); } +bool NativeReactNativeFeatureFlags::useTurboModules( + jsi::Runtime& /*runtime*/) { + return ReactNativeFeatureFlags::useTurboModules(); +} + } // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.h b/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.h index 7bbe7c3df81..ded551e76c8 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.h +++ b/packages/react-native/ReactCommon/react/nativemodule/featureflags/NativeReactNativeFeatureFlags.h @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<<596ec10892f79595c352d27574a0c5a3>> + * @generated SignedSource<<94afee988401ba2af586ec8fe310cb8b>> */ /** @@ -53,6 +53,8 @@ class NativeReactNativeFeatureFlags bool enableBackgroundStyleApplicator(jsi::Runtime& runtime); + bool enableBridgelessArchitecture(jsi::Runtime& runtime); + bool enableCleanTextInputYogaNode(jsi::Runtime& runtime); bool enableDeletionOfUnmountedViews(jsi::Runtime& runtime); @@ -63,6 +65,8 @@ class NativeReactNativeFeatureFlags bool enableFabricLogs(jsi::Runtime& runtime); + bool enableFabricRenderer(jsi::Runtime& runtime); + bool enableFabricRendererExclusively(jsi::Runtime& runtime); bool enableGranularShadowTreeStateReconciliation(jsi::Runtime& runtime); @@ -136,6 +140,8 @@ class NativeReactNativeFeatureFlags bool useStateAlignmentMechanism(jsi::Runtime& runtime); bool useTurboModuleInterop(jsi::Runtime& runtime); + + bool useTurboModules(jsi::Runtime& runtime); }; } // namespace facebook::react diff --git a/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js b/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js index b340b7c60d0..7dc63f49a76 100644 --- a/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js +++ b/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.config.js @@ -115,6 +115,14 @@ const definitions: FeatureFlagDefinitions = { purpose: 'experimentation', }, }, + enableBridgelessArchitecture: { + defaultValue: false, + metadata: { + description: + 'Feature flag to enable the new bridgeless architecture. Note: Enabling this will force enable the following flags: `useTurboModules` & `enableFabricRenderer.', + purpose: 'release', + }, + }, enableCleanTextInputYogaNode: { defaultValue: false, metadata: { @@ -157,6 +165,13 @@ const definitions: FeatureFlagDefinitions = { purpose: 'operational', }, }, + enableFabricRenderer: { + defaultValue: false, + metadata: { + description: 'Enables the use of the Fabric renderer in the whole app.', + purpose: 'release', + }, + }, enableFabricRendererExclusively: { defaultValue: false, metadata: { @@ -478,6 +493,14 @@ const definitions: FeatureFlagDefinitions = { purpose: 'experimentation', }, }, + useTurboModules: { + defaultValue: false, + metadata: { + description: + 'When enabled, NativeModules will be executed by using the TurboModule system', + purpose: 'release', + }, + }, }, jsOnly: { diff --git a/packages/react-native/src/private/featureflags/ReactNativeFeatureFlags.js b/packages/react-native/src/private/featureflags/ReactNativeFeatureFlags.js index 3e0099e4619..577d22448e4 100644 --- a/packages/react-native/src/private/featureflags/ReactNativeFeatureFlags.js +++ b/packages/react-native/src/private/featureflags/ReactNativeFeatureFlags.js @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<> * @flow strict */ @@ -58,11 +58,13 @@ export type ReactNativeFeatureFlags = { enableAndroidLineHeightCentering: Getter, enableAndroidMixBlendModeProp: Getter, enableBackgroundStyleApplicator: Getter, + enableBridgelessArchitecture: Getter, enableCleanTextInputYogaNode: Getter, enableDeletionOfUnmountedViews: Getter, enableEagerRootViewAttachment: Getter, enableEventEmitterRetentionDuringGesturesOnAndroid: Getter, enableFabricLogs: Getter, + enableFabricRenderer: Getter, enableFabricRendererExclusively: Getter, enableGranularShadowTreeStateReconciliation: Getter, enableIOSViewClipToPaddingBox: Getter, @@ -100,6 +102,7 @@ export type ReactNativeFeatureFlags = { useRuntimeShadowNodeReferenceUpdateOnLayout: Getter, useStateAlignmentMechanism: Getter, useTurboModuleInterop: Getter, + useTurboModules: Getter, } /** @@ -218,6 +221,10 @@ export const enableAndroidMixBlendModeProp: Getter = createNativeFlagGe * Use BackgroundStyleApplicator in place of other background/border drawing code */ export const enableBackgroundStyleApplicator: Getter = createNativeFlagGetter('enableBackgroundStyleApplicator', true); +/** + * Feature flag to enable the new bridgeless architecture. Note: Enabling this will force enable the following flags: `useTurboModules` & `enableFabricRenderer. + */ +export const enableBridgelessArchitecture: Getter = createNativeFlagGetter('enableBridgelessArchitecture', false); /** * Clean yoga node when does not change. */ @@ -238,6 +245,10 @@ export const enableEventEmitterRetentionDuringGesturesOnAndroid: Getter * This feature flag enables logs for Fabric. */ export const enableFabricLogs: Getter = createNativeFlagGetter('enableFabricLogs', false); +/** + * Enables the use of the Fabric renderer in the whole app. + */ +export const enableFabricRenderer: Getter = createNativeFlagGetter('enableFabricRenderer', false); /** * When the app is completely migrated to Fabric, set this flag to true to disable parts of Paper infrastructure that are not needed anymore but consume memory and CPU. Specifically, UIViewOperationQueue and EventDispatcherImpl will no longer work as they will not subscribe to ReactChoreographer for updates. */ @@ -386,6 +397,10 @@ export const useStateAlignmentMechanism: Getter = createNativeFlagGette * In Bridgeless mode, should legacy NativeModules use the TurboModule system? */ export const useTurboModuleInterop: Getter = createNativeFlagGetter('useTurboModuleInterop', false); +/** + * When enabled, NativeModules will be executed by using the TurboModule system + */ +export const useTurboModules: Getter = createNativeFlagGetter('useTurboModules', false); /** * Overrides the feature flags with the provided methods. diff --git a/packages/react-native/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js b/packages/react-native/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js index 7111c3dd041..fb2d28bfff7 100644 --- a/packages/react-native/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js +++ b/packages/react-native/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<<0467a8715892bbeca0a08681c730aeab>> * @flow strict */ @@ -32,11 +32,13 @@ export interface Spec extends TurboModule { +enableAndroidLineHeightCentering?: () => boolean; +enableAndroidMixBlendModeProp?: () => boolean; +enableBackgroundStyleApplicator?: () => boolean; + +enableBridgelessArchitecture?: () => boolean; +enableCleanTextInputYogaNode?: () => boolean; +enableDeletionOfUnmountedViews?: () => boolean; +enableEagerRootViewAttachment?: () => boolean; +enableEventEmitterRetentionDuringGesturesOnAndroid?: () => boolean; +enableFabricLogs?: () => boolean; + +enableFabricRenderer?: () => boolean; +enableFabricRendererExclusively?: () => boolean; +enableGranularShadowTreeStateReconciliation?: () => boolean; +enableIOSViewClipToPaddingBox?: () => boolean; @@ -74,6 +76,7 @@ export interface Spec extends TurboModule { +useRuntimeShadowNodeReferenceUpdateOnLayout?: () => boolean; +useStateAlignmentMechanism?: () => boolean; +useTurboModuleInterop?: () => boolean; + +useTurboModules?: () => boolean; } const NativeReactNativeFeatureFlags: ?Spec = TurboModuleRegistry.get(