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 deleted file mode 100644 index a2a286f9e1d..00000000000 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/ShadowNodeRegistry.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * 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. - */ - -package com.facebook.react.uimanager; - -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; -import com.facebook.react.common.annotations.internal.LegacyArchitectureLogLevel; -import com.facebook.react.common.annotations.internal.LegacyArchitectureLogger; - -/** - * Simple container class to keep track of {@link ReactShadowNode}s associated with a particular - * UIManagerModule instance. - */ -@LegacyArchitecture -class ShadowNodeRegistry { - - static { - LegacyArchitectureLogger.assertWhenLegacyArchitectureMinifyingEnabled( - "ShadowNodeRegistry", LegacyArchitectureLogLevel.WARNING); - } - - private final SparseArray mTagsToCSSNodes; - private final SparseBooleanArray mRootTags; - private final SingleThreadAsserter mThreadAsserter; - - public ShadowNodeRegistry() { - mTagsToCSSNodes = new SparseArray<>(); - mRootTags = new SparseBooleanArray(); - mThreadAsserter = new SingleThreadAsserter(); - } - - public void addRootNode(ReactShadowNode node) { - mThreadAsserter.assertNow(); - int tag = node.getReactTag(); - mTagsToCSSNodes.put(tag, node); - mRootTags.put(tag, true); - } - - public void removeRootNode(int tag) { - mThreadAsserter.assertNow(); - if (tag == View.NO_ID) { - // This root node has already been removed (likely due to a threading issue caused by async js - // execution). Ignore this root removal. - return; - } - if (!mRootTags.get(tag)) { - throw new IllegalViewOperationException( - "View with tag " + tag + " is not registered as a root view"); - } - - mTagsToCSSNodes.remove(tag); - mRootTags.delete(tag); - } - - public void addNode(ReactShadowNode node) { - mThreadAsserter.assertNow(); - mTagsToCSSNodes.put(node.getReactTag(), node); - } - - public void removeNode(int tag) { - mThreadAsserter.assertNow(); - if (mRootTags.get(tag)) { - throw new IllegalViewOperationException( - "Trying to remove root node " + tag + " without using removeRootNode!"); - } - mTagsToCSSNodes.remove(tag); - } - - public ReactShadowNode getNode(int tag) { - mThreadAsserter.assertNow(); - return mTagsToCSSNodes.get(tag); - } - - public boolean isRootNode(int tag) { - mThreadAsserter.assertNow(); - return mRootTags.get(tag); - } - - public int getRootNodeCount() { - mThreadAsserter.assertNow(); - return mRootTags.size(); - } - - public int getRootTag(int index) { - mThreadAsserter.assertNow(); - return mRootTags.keyAt(index); - } -} diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/ShadowNodeRegistry.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/ShadowNodeRegistry.kt new file mode 100644 index 00000000000..d7ade8a4be7 --- /dev/null +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/ShadowNodeRegistry.kt @@ -0,0 +1,91 @@ +/* + * 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. + */ + +package com.facebook.react.uimanager + +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 +import com.facebook.react.common.annotations.internal.LegacyArchitectureLogLevel +import com.facebook.react.common.annotations.internal.LegacyArchitectureLogger + +/** + * Simple container class to keep track of [ReactShadowNode]s associated with a particular + * UIManagerModule instance. + */ +@LegacyArchitecture +internal class ShadowNodeRegistry { + private val tagsToCSSNodes = SparseArray>() + private val rootTags = SparseBooleanArray() + private val threadAsserter = SingleThreadAsserter() + + fun addRootNode(node: ReactShadowNode<*>) { + threadAsserter.assertNow() + val tag = node.reactTag + tagsToCSSNodes.put(tag, node) + rootTags.put(tag, true) + } + + fun removeRootNode(tag: Int) { + threadAsserter.assertNow() + if (tag == View.NO_ID) { + // This root node has already been removed (likely due to a threading issue caused by async js + // execution). Ignore this root removal. + return + } + if (!rootTags[tag]) { + throw IllegalViewOperationException("View with tag $tag is not registered as a root view") + } + + tagsToCSSNodes.remove(tag) + rootTags.delete(tag) + } + + fun addNode(node: ReactShadowNode<*>) { + threadAsserter.assertNow() + tagsToCSSNodes.put(node.reactTag, node) + } + + fun removeNode(tag: Int) { + threadAsserter.assertNow() + if (rootTags[tag]) { + throw IllegalViewOperationException( + "Trying to remove root node $tag without using removeRootNode!") + } + tagsToCSSNodes.remove(tag) + } + + fun getNode(tag: Int): ReactShadowNode<*>? { + threadAsserter.assertNow() + return tagsToCSSNodes[tag] + } + + fun isRootNode(tag: Int): Boolean { + threadAsserter.assertNow() + return rootTags[tag] + } + + val rootNodeCount: Int + get() { + threadAsserter.assertNow() + return rootTags.size() + } + + fun getRootTag(index: Int): Int { + threadAsserter.assertNow() + return rootTags.keyAt(index) + } + + private companion object { + init { + LegacyArchitectureLogger.assertWhenLegacyArchitectureMinifyingEnabled( + "ShadowNodeRegistry", LegacyArchitectureLogLevel.WARNING) + } + } +}