diff --git a/packages/react-native/ReactAndroid/api/ReactAndroid.api b/packages/react-native/ReactAndroid/api/ReactAndroid.api index 386775c2b129..7a3a8f2c05b3 100644 --- a/packages/react-native/ReactAndroid/api/ReactAndroid.api +++ b/packages/react-native/ReactAndroid/api/ReactAndroid.api @@ -1906,7 +1906,6 @@ public class com/facebook/react/config/ReactFeatureFlags { public static field enableMountHooks Z public static field enableOnDemandReactChoreographer Z public static field enableRemoveDeleteTreeInstruction Z - public static field enableSpannableBuildingUnification Z public static field enableTextSpannableCache Z public static field enableViewRecycling Z public static field excludeYogaFromRawProps Z 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 c6cf4ac18809..c335549d909d 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 @@ -152,7 +152,4 @@ public class ReactFeatureFlags { * when there is work to do. */ public static boolean enableOnDemandReactChoreographer = false; - - /** Enables the new unified {@link android.text.Spannable} building logic. */ - public static boolean enableSpannableBuildingUnification = false; } 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 580bbde3a530..f72fdaed61a3 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<<52367278b4d0fdf7f436bd8c511d4ffe>> + * @generated SignedSource<<82a7973a820b75c46977931a8b178493>> */ /** @@ -31,23 +31,33 @@ object ReactNativeFeatureFlags { /** * Common flag for testing. Do NOT modify. */ + @JvmStatic fun commonTestFlag() = accessor.commonTestFlag() /** * When enabled, it uses the modern fork of RuntimeScheduler that allows scheduling tasks with priorities from any thread. */ + @JvmStatic fun useModernRuntimeScheduler() = accessor.useModernRuntimeScheduler() /** * Enables the use of microtasks in Hermes (scheduling) and RuntimeScheduler (execution). */ + @JvmStatic fun enableMicrotasks() = accessor.enableMicrotasks() /** * When enabled, the RuntimeScheduler processing the event loop will batch all rendering updates and dispatch them together at the end of each iteration of the loop. */ + @JvmStatic fun batchRenderingUpdatesInEventLoop() = accessor.batchRenderingUpdatesInEventLoop() + /** + * Uses new, deduplicated logic for constructing Android Spannables from text fragments + */ + @JvmStatic + fun enableSpannableBuildingUnification() = accessor.enableSpannableBuildingUnification() + /** * 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 ed422f43ff68..76e8066ac9ab 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<<920bb26d238f935f63a77943df7ef6e2>> + * @generated SignedSource<<881b7f9eb6b1765764b70719155a457c>> */ /** @@ -24,6 +24,7 @@ class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAccessor { private var useModernRuntimeSchedulerCache: Boolean? = null private var enableMicrotasksCache: Boolean? = null private var batchRenderingUpdatesInEventLoopCache: Boolean? = null + private var enableSpannableBuildingUnificationCache: Boolean? = null override fun commonTestFlag(): Boolean { var cached = commonTestFlagCache @@ -61,6 +62,15 @@ class ReactNativeFeatureFlagsCxxAccessor : ReactNativeFeatureFlagsAccessor { return cached } + override fun enableSpannableBuildingUnification(): Boolean { + var cached = enableSpannableBuildingUnificationCache + if (cached == null) { + cached = ReactNativeFeatureFlagsCxxInterop.enableSpannableBuildingUnification() + enableSpannableBuildingUnificationCache = cached + } + return cached + } + override fun override(provider: ReactNativeFeatureFlagsProvider) = 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 1f6071f724d8..bfb2f4fb25ba 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<<19d0606854e3e34efe67acf9dc1d26b4>> + * @generated SignedSource<> */ /** @@ -36,6 +36,8 @@ object ReactNativeFeatureFlagsCxxInterop { @DoNotStrip @JvmStatic external fun batchRenderingUpdatesInEventLoop(): Boolean + @DoNotStrip @JvmStatic external fun enableSpannableBuildingUnification(): Boolean + @DoNotStrip @JvmStatic external fun override(provider: Any) @DoNotStrip @JvmStatic 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 49700a9c9f49..10c18f349202 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<<932fd2768c81d5a5f49929c89d6659ff>> + * @generated SignedSource<<44159bbcf15dc403e40656c71d84516a>> */ /** @@ -30,4 +30,6 @@ open class ReactNativeFeatureFlagsDefaults : ReactNativeFeatureFlagsProvider { override fun enableMicrotasks(): Boolean = false override fun batchRenderingUpdatesInEventLoop(): Boolean = false + + override fun enableSpannableBuildingUnification(): 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 8ff0a2c2778d..4646c8ed0693 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<<6254686d99a8bfd0531ed629655cf673>> + * @generated SignedSource<<85d0ebc43b7c390be7dd89c58f1b7a7a>> */ /** @@ -28,6 +28,7 @@ class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAccessor { private var useModernRuntimeSchedulerCache: Boolean? = null private var enableMicrotasksCache: Boolean? = null private var batchRenderingUpdatesInEventLoopCache: Boolean? = null + private var enableSpannableBuildingUnificationCache: Boolean? = null override fun commonTestFlag(): Boolean { var cached = commonTestFlagCache @@ -69,6 +70,16 @@ class ReactNativeFeatureFlagsLocalAccessor : ReactNativeFeatureFlagsAccessor { return cached } + override fun enableSpannableBuildingUnification(): Boolean { + var cached = enableSpannableBuildingUnificationCache + if (cached == null) { + cached = currentProvider.enableSpannableBuildingUnification() + accessedFeatureFlags.add("enableSpannableBuildingUnification") + enableSpannableBuildingUnificationCache = 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 3d0620719780..9ad99119168c 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<> + * @generated SignedSource<> */ /** @@ -30,4 +30,6 @@ interface ReactNativeFeatureFlagsProvider { @DoNotStrip fun enableMicrotasks(): Boolean @DoNotStrip fun batchRenderingUpdatesInEventLoop(): Boolean + + @DoNotStrip fun enableSpannableBuildingUnification(): Boolean } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactBaseTextShadowNode.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactBaseTextShadowNode.java index b7627dc98634..c5cabecf7047 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactBaseTextShadowNode.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactBaseTextShadowNode.java @@ -21,7 +21,7 @@ import com.facebook.react.bridge.ReadableArray; import com.facebook.react.bridge.ReadableMap; import com.facebook.react.common.ReactConstants; -import com.facebook.react.config.ReactFeatureFlags; +import com.facebook.react.internal.featureflags.ReactNativeFeatureFlags; import com.facebook.react.uimanager.IllegalViewOperationException; import com.facebook.react.uimanager.LayoutShadowNode; import com.facebook.react.uimanager.NativeViewHierarchyOptimizer; @@ -93,7 +93,7 @@ private static void buildSpannedFromShadowNode( boolean supportsInlineViews, @Nullable Map inlineViews, int start) { - if (ReactFeatureFlags.enableSpannableBuildingUnification) { + if (ReactNativeFeatureFlags.enableSpannableBuildingUnification()) { buildSpannedFromShadowNodeUnified( textShadowNode, sb, ops, parentTextAttributes, supportsInlineViews, inlineViews, start); } else { diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.java index 8c555f2f9786..b912f89e13ee 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.java @@ -31,7 +31,7 @@ import com.facebook.react.bridge.WritableArray; import com.facebook.react.common.ReactConstants; import com.facebook.react.common.build.ReactBuildConfig; -import com.facebook.react.config.ReactFeatureFlags; +import com.facebook.react.internal.featureflags.ReactNativeFeatureFlags; import com.facebook.react.uimanager.PixelUtil; import com.facebook.react.uimanager.ReactAccessibilityDelegate.AccessibilityRole; import com.facebook.react.uimanager.ReactAccessibilityDelegate.Role; @@ -118,7 +118,7 @@ private static void buildSpannableFromFragments( ReadableArray fragments, SpannableStringBuilder sb, List ops) { - if (ReactFeatureFlags.enableSpannableBuildingUnification) { + if (ReactNativeFeatureFlags.enableSpannableBuildingUnification()) { buildSpannableFromFragmentsUnified(context, fragments, sb, ops); } else { buildSpannableFromFragmentsDuplicated(context, fragments, sb, ops); diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManagerMapBuffer.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManagerMapBuffer.java index 8f8ce7f1a011..a44e3d1c06ea 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManagerMapBuffer.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManagerMapBuffer.java @@ -32,7 +32,7 @@ import com.facebook.react.common.build.ReactBuildConfig; import com.facebook.react.common.mapbuffer.MapBuffer; import com.facebook.react.common.mapbuffer.ReadableMapBuffer; -import com.facebook.react.config.ReactFeatureFlags; +import com.facebook.react.internal.featureflags.ReactNativeFeatureFlags; import com.facebook.react.uimanager.PixelUtil; import com.facebook.react.uimanager.ReactAccessibilityDelegate.AccessibilityRole; import com.facebook.react.uimanager.ReactAccessibilityDelegate.Role; @@ -140,7 +140,7 @@ public static boolean isRTL(MapBuffer attributedString) { private static void buildSpannableFromFragments( Context context, MapBuffer fragments, SpannableStringBuilder sb, List ops) { - if (ReactFeatureFlags.enableSpannableBuildingUnification) { + if (ReactNativeFeatureFlags.enableSpannableBuildingUnification()) { buildSpannableFromFragmentsUnified(context, fragments, sb, ops); } else { buildSpannableFromFragmentsDuplicated(context, fragments, sb, ops); 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 4a123e471a46..c6c2475efe2a 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<> + * @generated SignedSource<<36acddfcb6c038dbf523ad669bcedeba>> */ /** @@ -43,6 +43,11 @@ bool JReactNativeFeatureFlagsCxxInterop::batchRenderingUpdatesInEventLoop( return ReactNativeFeatureFlags::batchRenderingUpdatesInEventLoop(); } +bool JReactNativeFeatureFlagsCxxInterop::enableSpannableBuildingUnification( + facebook::jni::alias_ref /*unused*/) { + return ReactNativeFeatureFlags::enableSpannableBuildingUnification(); +} + void JReactNativeFeatureFlagsCxxInterop::override( facebook::jni::alias_ref /*unused*/, jni::alias_ref provider) { @@ -72,6 +77,9 @@ void JReactNativeFeatureFlagsCxxInterop::registerNatives() { makeNativeMethod( "batchRenderingUpdatesInEventLoop", JReactNativeFeatureFlagsCxxInterop::batchRenderingUpdatesInEventLoop), + makeNativeMethod( + "enableSpannableBuildingUnification", + JReactNativeFeatureFlagsCxxInterop::enableSpannableBuildingUnification), }); } 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 0a2e6b9c7f23..0f1d0701aa3d 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<> + * @generated SignedSource<> */ /** @@ -42,6 +42,9 @@ class JReactNativeFeatureFlagsCxxInterop static bool batchRenderingUpdatesInEventLoop( facebook::jni::alias_ref); + static bool enableSpannableBuildingUnification( + facebook::jni::alias_ref); + static void override( facebook::jni::alias_ref, jni::alias_ref provider); diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/ReactNativeFeatureFlagsProviderHolder.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/ReactNativeFeatureFlagsProviderHolder.cpp index ff15f87f473e..b0307d199fb0 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/ReactNativeFeatureFlagsProviderHolder.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/ReactNativeFeatureFlagsProviderHolder.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<<91f988022fbff7eba632f2ba46056025>> + * @generated SignedSource<<5f99c47d357e45524b359e6517d1f2eb>> */ /** @@ -51,4 +51,10 @@ bool ReactNativeFeatureFlagsProviderHolder::batchRenderingUpdatesInEventLoop() { return method(javaProvider_); } +bool ReactNativeFeatureFlagsProviderHolder::enableSpannableBuildingUnification() { + static const auto method = + getJClass()->getMethod("enableSpannableBuildingUnification"); + return method(javaProvider_); +} + } // namespace facebook::react diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/ReactNativeFeatureFlagsProviderHolder.h b/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/ReactNativeFeatureFlagsProviderHolder.h index 056c4ae634fa..858ac784dc58 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/ReactNativeFeatureFlagsProviderHolder.h +++ b/packages/react-native/ReactAndroid/src/main/jni/react/featureflags/ReactNativeFeatureFlagsProviderHolder.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<<3550f7ee28a53a4024a48301ee38ce7e>> + * @generated SignedSource<<6aaa06ae0c12de2f432374d0cd048460>> */ /** @@ -39,6 +39,7 @@ class ReactNativeFeatureFlagsProviderHolder bool useModernRuntimeScheduler() override; bool enableMicrotasks() override; bool batchRenderingUpdatesInEventLoop() override; + bool enableSpannableBuildingUnification() override; private: jni::global_ref javaProvider_; diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.cpp b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlags.cpp index b524ab794b6f..76a0c4b0fb13 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<<809c23db6d36e18d448554900e462aa0>> */ /** @@ -37,6 +37,10 @@ bool ReactNativeFeatureFlags::batchRenderingUpdatesInEventLoop() { return getAccessor().batchRenderingUpdatesInEventLoop(); } +bool ReactNativeFeatureFlags::enableSpannableBuildingUnification() { + return getAccessor().enableSpannableBuildingUnification(); +} + 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 eab8e4fe357f..336f98fd3262 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<> + * @generated SignedSource<> */ /** @@ -52,6 +52,11 @@ class ReactNativeFeatureFlags { */ static bool batchRenderingUpdatesInEventLoop(); + /** + * Uses new, deduplicated logic for constructing Android Spannables from text fragments + */ + static bool enableSpannableBuildingUnification(); + /** * 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 566c870dee00..4a895702e31a 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<<5df50987338c0541436b11cd5433013c>> + * @generated SignedSource<<15858c6ab96e90350aa5f29eb108b051>> */ /** @@ -96,6 +96,23 @@ bool ReactNativeFeatureFlagsAccessor::batchRenderingUpdatesInEventLoop() { return batchRenderingUpdatesInEventLoop_.value(); } +bool ReactNativeFeatureFlagsAccessor::enableSpannableBuildingUnification() { + if (!enableSpannableBuildingUnification_.has_value()) { + // Mark the flag as accessed. + static const char* flagName = "enableSpannableBuildingUnification"; + if (std::find( + accessedFeatureFlags_.begin(), + accessedFeatureFlags_.end(), + flagName) == accessedFeatureFlags_.end()) { + accessedFeatureFlags_.push_back(flagName); + } + + enableSpannableBuildingUnification_.emplace(currentProvider_->enableSpannableBuildingUnification()); + } + + return enableSpannableBuildingUnification_.value(); +} + void ReactNativeFeatureFlagsAccessor::override( std::unique_ptr provider) { if (!accessedFeatureFlags_.empty()) { diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsAccessor.h index e6d2e177599a..08dce4ade84e 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<<11335a9c0d793a3a5a0dfdb01cd43efd>> + * @generated SignedSource<<938f1f3ad6aa3343beb3ad7707a49a87>> */ /** @@ -34,6 +34,7 @@ class ReactNativeFeatureFlagsAccessor { bool useModernRuntimeScheduler(); bool enableMicrotasks(); bool batchRenderingUpdatesInEventLoop(); + bool enableSpannableBuildingUnification(); void override(std::unique_ptr provider); @@ -45,6 +46,7 @@ class ReactNativeFeatureFlagsAccessor { std::optional useModernRuntimeScheduler_; std::optional enableMicrotasks_; std::optional batchRenderingUpdatesInEventLoop_; + std::optional enableSpannableBuildingUnification_; }; } // namespace facebook::react diff --git a/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h b/packages/react-native/ReactCommon/react/featureflags/ReactNativeFeatureFlagsDefaults.h index 6e9965979bbb..a01456bcb1dd 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<> + * @generated SignedSource<<18dc9a1aa23d156bc94e426ee1864359>> */ /** @@ -42,6 +42,10 @@ class ReactNativeFeatureFlagsDefaults : public ReactNativeFeatureFlagsProvider { bool batchRenderingUpdatesInEventLoop() override { return false; } + + bool enableSpannableBuildingUnification() 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 68c16ecad83e..866ea57bde0d 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<<6bf1fc0d7b32a36041c2371fe191792b>> + * @generated SignedSource<<2828ad8eb7ea0a0ea9cb0240eadedeb8>> */ /** @@ -29,6 +29,7 @@ class ReactNativeFeatureFlagsProvider { virtual bool useModernRuntimeScheduler() = 0; virtual bool enableMicrotasks() = 0; virtual bool batchRenderingUpdatesInEventLoop() = 0; + virtual bool enableSpannableBuildingUnification() = 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 421e4b3925f4..9ae531631094 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<<01b940f6716765f9359c42180db497c0>> + * @generated SignedSource<> */ /** @@ -55,4 +55,9 @@ bool NativeReactNativeFeatureFlags::batchRenderingUpdatesInEventLoop( return ReactNativeFeatureFlags::batchRenderingUpdatesInEventLoop(); } +bool NativeReactNativeFeatureFlags::enableSpannableBuildingUnification( + jsi::Runtime& /*runtime*/) { + return ReactNativeFeatureFlags::enableSpannableBuildingUnification(); +} + } // 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 d3f46b1a667e..66c8a516fe78 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<<200fe2cf84a044164c60f6dd3c5569dd>> + * @generated SignedSource<> */ /** @@ -37,6 +37,8 @@ class NativeReactNativeFeatureFlags bool enableMicrotasks(jsi::Runtime& runtime); bool batchRenderingUpdatesInEventLoop(jsi::Runtime& runtime); + + bool enableSpannableBuildingUnification(jsi::Runtime& runtime); }; } // namespace facebook::react diff --git a/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.json b/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.json index dc94424def49..67d228bd464b 100644 --- a/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.json +++ b/packages/react-native/scripts/featureflags/ReactNativeFeatureFlags.json @@ -15,6 +15,10 @@ "batchRenderingUpdatesInEventLoop": { "description": "When enabled, the RuntimeScheduler processing the event loop will batch all rendering updates and dispatch them together at the end of each iteration of the loop.", "defaultValue": false + }, + "enableSpannableBuildingUnification": { + "description": "Uses new, deduplicated logic for constructing Android Spannables from text fragments", + "defaultValue": false } }, "jsOnly": { diff --git a/packages/react-native/scripts/featureflags/templates/android/ReactNativeFeatureFlags.kt-template.js b/packages/react-native/scripts/featureflags/templates/android/ReactNativeFeatureFlags.kt-template.js index 21bc02730a5d..148e6c364aff 100644 --- a/packages/react-native/scripts/featureflags/templates/android/ReactNativeFeatureFlags.kt-template.js +++ b/packages/react-native/scripts/featureflags/templates/android/ReactNativeFeatureFlags.kt-template.js @@ -41,6 +41,7 @@ ${Object.entries(config.common) ` /** * ${flagConfig.description} */ + @JvmStatic fun ${flagName}() = accessor.${flagName}()`, ) .join('\n\n')} diff --git a/packages/react-native/src/private/featureflags/NativeReactNativeFeatureFlags.js b/packages/react-native/src/private/featureflags/NativeReactNativeFeatureFlags.js index f7f7cfc43347..4a8588eb2d30 100644 --- a/packages/react-native/src/private/featureflags/NativeReactNativeFeatureFlags.js +++ b/packages/react-native/src/private/featureflags/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<<564159837241d197ebc3084ff9e72b7c>> + * @generated SignedSource<<80726297990981a85ae106f8566ec662>> * @flow strict-local */ @@ -27,6 +27,7 @@ export interface Spec extends TurboModule { +useModernRuntimeScheduler?: () => boolean; +enableMicrotasks?: () => boolean; +batchRenderingUpdatesInEventLoop?: () => boolean; + +enableSpannableBuildingUnification?: () => boolean; } const NativeReactNativeFeatureFlags: ?Spec = TurboModuleRegistry.get( diff --git a/packages/react-native/src/private/featureflags/ReactNativeFeatureFlags.js b/packages/react-native/src/private/featureflags/ReactNativeFeatureFlags.js index 09fa4b1a8c68..7db3a1463a7d 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<<4e4ce58c1ce1a95355bba0dfe099e26e>> + * @generated SignedSource<> * @flow strict-local */ @@ -37,6 +37,7 @@ export type ReactNativeFeatureFlags = { useModernRuntimeScheduler: Getter, enableMicrotasks: Getter, batchRenderingUpdatesInEventLoop: Getter, + enableSpannableBuildingUnification: Getter, } /** @@ -60,6 +61,10 @@ export const enableMicrotasks: Getter = createNativeFlagGetter('enableM * When enabled, the RuntimeScheduler processing the event loop will batch all rendering updates and dispatch them together at the end of each iteration of the loop. */ export const batchRenderingUpdatesInEventLoop: Getter = createNativeFlagGetter('batchRenderingUpdatesInEventLoop', false); +/** + * Uses new, deduplicated logic for constructing Android Spannables from text fragments + */ +export const enableSpannableBuildingUnification: Getter = createNativeFlagGetter('enableSpannableBuildingUnification', false); /** * Overrides the feature flags with the provided methods.