From 25d501df7ef8886c415f27db7b96cbec2084e288 Mon Sep 17 00:00:00 2001 From: David Vacca Date: Mon, 3 Mar 2025 17:31:27 -0800 Subject: [PATCH] Annotate LegacyArchitecture classes for com/facebook/react/uimanager package (#49764) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/49764 Annotate LegacyArchitecture classes for com/facebook/react/uimanager package changelog: [internal] internal Reviewed By: rshest Differential Revision: D70441495 fbshipit-source-id: fd3e5b3a40dffc31197df2153cde528bc723a2ab --- .../java/com/facebook/react/uimanager/LayoutDirectionUtil.kt | 2 ++ .../java/com/facebook/react/uimanager/LayoutShadowNode.java | 2 ++ .../src/main/java/com/facebook/react/uimanager/NativeKind.kt | 4 +++- .../facebook/react/uimanager/NativeViewHierarchyManager.java | 2 ++ .../react/uimanager/NativeViewHierarchyOptimizer.java | 2 ++ .../com/facebook/react/uimanager/NoSuchNativeViewException.kt | 3 +++ .../main/java/com/facebook/react/uimanager/OnLayoutEvent.java | 2 ++ .../java/com/facebook/react/uimanager/ReactShadowNode.java | 2 ++ .../com/facebook/react/uimanager/ReactShadowNodeImpl.java | 2 ++ .../com/facebook/react/uimanager/ReactYogaConfigProvider.kt | 2 ++ .../java/com/facebook/react/uimanager/ShadowNodeRegistry.java | 2 ++ .../java/com/facebook/react/uimanager/UIImplementation.java | 2 ++ .../java/com/facebook/react/uimanager/UIManagerModule.java | 2 ++ .../com/facebook/react/uimanager/UIManagerModuleListener.kt | 3 +++ .../com/facebook/react/uimanager/UIViewOperationQueue.java | 2 ++ .../main/java/com/facebook/react/uimanager/ViewAtIndex.java | 2 ++ .../main/java/com/facebook/react/uimanager/YogaNodePool.kt | 2 ++ .../debug/NotThreadSafeViewHierarchyUpdateDebugListener.kt | 3 +++ 18 files changed, 40 insertions(+), 1 deletion(-) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/LayoutDirectionUtil.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/LayoutDirectionUtil.kt index f992454f15e..d4155d13158 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/LayoutDirectionUtil.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/LayoutDirectionUtil.kt @@ -8,8 +8,10 @@ package com.facebook.react.uimanager import android.view.View +import com.facebook.react.common.annotations.internal.LegacyArchitecture import com.facebook.yoga.YogaDirection +@LegacyArchitecture internal object LayoutDirectionUtil { @JvmStatic fun toAndroidFromYoga(direction: YogaDirection): Int = diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/LayoutShadowNode.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/LayoutShadowNode.java index d62808ae4ff..87ed9a575f5 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/LayoutShadowNode.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/LayoutShadowNode.java @@ -12,6 +12,7 @@ import com.facebook.common.logging.FLog; import com.facebook.react.bridge.Dynamic; import com.facebook.react.bridge.ReadableType; import com.facebook.react.common.ReactConstants; +import com.facebook.react.common.annotations.internal.LegacyArchitecture; import com.facebook.react.modules.i18nmanager.I18nUtil; import com.facebook.react.uimanager.annotations.ReactProp; import com.facebook.react.uimanager.annotations.ReactPropGroup; @@ -34,6 +35,7 @@ import com.facebook.yoga.YogaWrap; * may or may not be embedded in a parent text. There are better solutions that should probably be * explored, namely using the VirtualText class in JS and setting the correct set of validAttributes */ +@LegacyArchitecture public class LayoutShadowNode extends ReactShadowNodeImpl { /** A Mutable version of com.facebook.yoga.YogaValue */ diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/NativeKind.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/NativeKind.kt index ee000bbb142..d60a64f7b8f 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/NativeKind.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/NativeKind.kt @@ -7,10 +7,12 @@ package com.facebook.react.uimanager +import com.facebook.react.common.annotations.internal.LegacyArchitecture + // Common conditionals: // - `kind == PARENT` checks whether the node can host children in the native tree. // - `kind != NONE` checks whether the node appears in the native tree. - +@LegacyArchitecture internal enum class NativeKind { // Node is in the native hierarchy and the HierarchyOptimizer should assume it can host children // (e.g. because it's a ViewGroup). Note that it's okay if the node doesn't support children. When diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/NativeViewHierarchyManager.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/NativeViewHierarchyManager.java index 9f37e762035..f4e6b1c3ec7 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/NativeViewHierarchyManager.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/NativeViewHierarchyManager.java @@ -26,6 +26,7 @@ import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.RetryableMountingLayerException; import com.facebook.react.bridge.SoftAssertions; import com.facebook.react.bridge.UiThreadUtil; +import com.facebook.react.common.annotations.internal.LegacyArchitecture; import com.facebook.react.common.build.ReactBuildConfig; import com.facebook.react.touch.JSResponderHandler; import com.facebook.react.uimanager.layoutanimation.LayoutAnimationController; @@ -64,6 +65,7 @@ import javax.annotation.concurrent.NotThreadSafe; *

TODO(5483031): Only dispatch updates when shadow views have changed */ @NotThreadSafe +@LegacyArchitecture public class NativeViewHierarchyManager { private static final String TAG = NativeViewHierarchyManager.class.getSimpleName(); diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/NativeViewHierarchyOptimizer.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/NativeViewHierarchyOptimizer.java index e57eadd2630..ccc0cc55655 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/NativeViewHierarchyOptimizer.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/NativeViewHierarchyOptimizer.java @@ -13,6 +13,7 @@ import com.facebook.common.logging.FLog; import com.facebook.infer.annotation.Assertions; import com.facebook.react.bridge.ReadableArray; import com.facebook.react.bridge.ReadableMapKeySetIterator; +import com.facebook.react.common.annotations.internal.LegacyArchitecture; /** * Class responsible for optimizing the native view hierarchy while still respecting the final UI @@ -45,6 +46,7 @@ import com.facebook.react.bridge.ReadableMapKeySetIterator; * manageChildren calls for various parent views may be issued to the native view hierarchy * depending on where the views being added/removed are attached in the optimized hierarchy */ +@LegacyArchitecture public class NativeViewHierarchyOptimizer { private static final String TAG = "NativeViewHierarchyOptimizer"; diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/NoSuchNativeViewException.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/NoSuchNativeViewException.kt index a0d4448d13c..0197c7bed25 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/NoSuchNativeViewException.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/NoSuchNativeViewException.kt @@ -7,9 +7,12 @@ package com.facebook.react.uimanager +import com.facebook.react.common.annotations.internal.LegacyArchitecture + /** * Exception thrown when a class tries to access a native view by a tag that has no native view * associated with it. */ +@LegacyArchitecture internal class NoSuchNativeViewException(detailMessage: String) : IllegalViewOperationException(detailMessage) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/OnLayoutEvent.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/OnLayoutEvent.java index 37fc1905004..4666b9a8038 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/OnLayoutEvent.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/OnLayoutEvent.java @@ -12,10 +12,12 @@ import androidx.core.util.Pools; import com.facebook.infer.annotation.Nullsafe; import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.WritableMap; +import com.facebook.react.common.annotations.internal.LegacyArchitecture; import com.facebook.react.uimanager.events.Event; /** Event used to notify JS component about changes of its position or dimensions */ @Nullsafe(Nullsafe.Mode.LOCAL) +@LegacyArchitecture public class OnLayoutEvent extends Event { private static final Pools.SynchronizedPool EVENTS_POOL = diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactShadowNode.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactShadowNode.java index ef3464a2e2d..14643f01ed6 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactShadowNode.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactShadowNode.java @@ -8,6 +8,7 @@ package com.facebook.react.uimanager; import androidx.annotation.Nullable; +import com.facebook.react.common.annotations.internal.LegacyArchitecture; import com.facebook.yoga.YogaAlign; import com.facebook.yoga.YogaBaselineFunction; import com.facebook.yoga.YogaDirection; @@ -44,6 +45,7 @@ import com.facebook.yoga.YogaWrap; * separately native children (e.g. {@link #getNativeChildCount()}). See {@link * NativeViewHierarchyOptimizer} for more information. */ +@LegacyArchitecture public interface ReactShadowNode { /** diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactShadowNodeImpl.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactShadowNodeImpl.java index 7e764a4ec33..c5d9e606646 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactShadowNodeImpl.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactShadowNodeImpl.java @@ -9,6 +9,7 @@ package com.facebook.react.uimanager; import androidx.annotation.Nullable; import com.facebook.infer.annotation.Assertions; +import com.facebook.react.common.annotations.internal.LegacyArchitecture; import com.facebook.react.uimanager.annotations.ReactPropertyHolder; import com.facebook.yoga.YogaAlign; import com.facebook.yoga.YogaBaselineFunction; @@ -54,6 +55,7 @@ import java.util.Arrays; * NativeViewHierarchyOptimizer} for more information. */ @ReactPropertyHolder +@LegacyArchitecture public class ReactShadowNodeImpl implements ReactShadowNode { private static final YogaConfig sYogaConfig; diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactYogaConfigProvider.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactYogaConfigProvider.kt index e04c0d9edd6..5b5fcf560b5 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactYogaConfigProvider.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactYogaConfigProvider.kt @@ -7,10 +7,12 @@ package com.facebook.react.uimanager +import com.facebook.react.common.annotations.internal.LegacyArchitecture import com.facebook.yoga.YogaConfig import com.facebook.yoga.YogaConfigFactory import com.facebook.yoga.YogaErrata +@LegacyArchitecture internal object ReactYogaConfigProvider { val yogaConfig: YogaConfig by diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/ShadowNodeRegistry.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/ShadowNodeRegistry.java index c14a06d26ed..6c10f3561f4 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/ShadowNodeRegistry.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/ShadowNodeRegistry.java @@ -11,11 +11,13 @@ import android.util.SparseArray; import android.util.SparseBooleanArray; import android.view.View; import com.facebook.react.common.SingleThreadAsserter; +import com.facebook.react.common.annotations.internal.LegacyArchitecture; /** * Simple container class to keep track of {@link ReactShadowNode}s associated with a particular * UIManagerModule instance. */ +@LegacyArchitecture class ShadowNodeRegistry { private final SparseArray mTagsToCSSNodes; diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementation.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementation.java index afa1d3a968d..ce25a598a76 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementation.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementation.java @@ -21,6 +21,7 @@ import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.UiThreadUtil; import com.facebook.react.bridge.WritableArray; import com.facebook.react.common.ReactConstants; +import com.facebook.react.common.annotations.internal.LegacyArchitecture; import com.facebook.react.common.build.ReactBuildConfig; import com.facebook.react.modules.i18nmanager.I18nUtil; import com.facebook.react.uimanager.debug.NotThreadSafeViewHierarchyUpdateDebugListener; @@ -38,6 +39,7 @@ import java.util.Map; * A class that is used to receive React commands from JS and translate them into a shadow node * hierarchy that is then mapped to a native view hierarchy. */ +@LegacyArchitecture public class UIImplementation { protected Object uiImplementationThreadLock = new Object(); diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModule.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModule.java index 7a3cfc55ae6..6584507545a 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModule.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModule.java @@ -39,6 +39,7 @@ import com.facebook.react.bridge.UiThreadUtil; import com.facebook.react.bridge.WritableMap; import com.facebook.react.common.MapBuilder; import com.facebook.react.common.ReactConstants; +import com.facebook.react.common.annotations.internal.LegacyArchitecture; import com.facebook.react.module.annotations.ReactModule; import com.facebook.react.uimanager.common.ViewUtil; import com.facebook.react.uimanager.debug.NotThreadSafeViewHierarchyUpdateDebugListener; @@ -82,6 +83,7 @@ import java.util.concurrent.CopyOnWriteArrayList; * Don't dispatch the view hierarchy at the end of a batch if no UI changes occurred */ @ReactModule(name = UIManagerModule.NAME) +@LegacyArchitecture public class UIManagerModule extends ReactContextBaseJavaModule implements OnBatchCompleteListener, LifecycleEventListener, UIManager { public static final String TAG = UIManagerModule.class.getSimpleName(); diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModuleListener.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModuleListener.kt index 3648611ad9c..a498bbb0477 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModuleListener.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModuleListener.kt @@ -7,8 +7,11 @@ package com.facebook.react.uimanager +import com.facebook.react.common.annotations.internal.LegacyArchitecture + /** Listener used to hook into the UIManager update process. */ @Deprecated("Use UIManagerListener instead. This will be deleted in some future release.") +@LegacyArchitecture public interface UIManagerModuleListener { /** * Called right before view updates are dispatched at the end of a batch. This is useful if a diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIViewOperationQueue.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIViewOperationQueue.java index c279e522ee1..e809f955934 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIViewOperationQueue.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIViewOperationQueue.java @@ -25,6 +25,7 @@ import com.facebook.react.bridge.RetryableMountingLayerException; import com.facebook.react.bridge.SoftAssertions; import com.facebook.react.bridge.UiThreadUtil; import com.facebook.react.common.ReactConstants; +import com.facebook.react.common.annotations.internal.LegacyArchitecture; import com.facebook.react.modules.core.ReactChoreographer; import com.facebook.react.uimanager.debug.NotThreadSafeViewHierarchyUpdateDebugListener; import com.facebook.systrace.Systrace; @@ -45,6 +46,7 @@ import java.util.Map; *

TODO(7135923): Pooling of operation objects TODO(5694019): Consider a better data structure * for operations queue to save on allocations */ +@LegacyArchitecture public class UIViewOperationQueue { public static final int DEFAULT_MIN_TIME_LEFT_IN_FRAME_FOR_NONBATCHED_OPERATION_MS = 8; diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewAtIndex.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewAtIndex.java index 3ad0bc67baf..335313d7121 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewAtIndex.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewAtIndex.java @@ -7,12 +7,14 @@ package com.facebook.react.uimanager; +import com.facebook.react.common.annotations.internal.LegacyArchitecture; import java.util.Comparator; /** * Data structure that couples view tag to it's index in parent view. Used for managing children * operation. */ +@LegacyArchitecture public class ViewAtIndex { public static Comparator COMPARATOR = new Comparator() { diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/YogaNodePool.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/YogaNodePool.kt index d76399e8f83..e50bfd52f4b 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/YogaNodePool.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/YogaNodePool.kt @@ -8,9 +8,11 @@ package com.facebook.react.uimanager import com.facebook.react.common.ClearableSynchronizedPool +import com.facebook.react.common.annotations.internal.LegacyArchitecture import com.facebook.yoga.YogaNode /** Static holder for a recycling pool of YogaNodes. */ +@LegacyArchitecture internal object YogaNodePool { private val pool: ClearableSynchronizedPool by diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/debug/NotThreadSafeViewHierarchyUpdateDebugListener.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/debug/NotThreadSafeViewHierarchyUpdateDebugListener.kt index 894a4e59439..4ccd2a1476d 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/debug/NotThreadSafeViewHierarchyUpdateDebugListener.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/debug/NotThreadSafeViewHierarchyUpdateDebugListener.kt @@ -7,6 +7,8 @@ package com.facebook.react.uimanager.debug +import com.facebook.react.common.annotations.internal.LegacyArchitecture + /** * A listener that is notified about view hierarchy update events. This listener should only be used * for debug purposes and should not affect application state. @@ -16,6 +18,7 @@ package com.facebook.react.uimanager.debug */ @Deprecated( "NotThreadSafeViewHierarchyUpdateDebugListener will be deleted in the new architecture.") +@LegacyArchitecture internal interface NotThreadSafeViewHierarchyUpdateDebugListener { /** Called when `UIManagerModule` enqueues a UI batch to be dispatched to the main thread. */ fun onViewHierarchyUpdateEnqueued()