diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java b/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java index 38eea630d..f66b0ce56 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java @@ -177,7 +177,7 @@ public class FabricUIManager implements UIManager { private void assertReactShadowNodeCopy(ReactShadowNode source, ReactShadowNode target) { Assertions.assertCondition(source.getClass().equals(target.getClass()), "Found " + target.getClass() + " class when expecting: " + source.getClass() + - ". Check that " + source.getClass() + " implements the mutableCopy() method correctly."); + ". Check that " + source.getClass() + " implements the copy() method correctly."); } /** diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/LayoutShadowNode.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/LayoutShadowNode.java index b941c2167..86c1a7832 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/LayoutShadowNode.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/LayoutShadowNode.java @@ -74,11 +74,11 @@ public class LayoutShadowNode extends ReactShadowNodeImpl { protected LayoutShadowNode(LayoutShadowNode node) { super(node); - mTempYogaValue = new MutableYogaValue(node.mTempYogaValue); + mTempYogaValue = new MutableYogaValue(); } @Override - public LayoutShadowNode mutableCopy() { + protected LayoutShadowNode copy() { return new LayoutShadowNode(this); } diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactShadowNode.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactShadowNode.java index ab8e26925..75ae4fb8a 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactShadowNode.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactShadowNode.java @@ -18,6 +18,7 @@ import com.facebook.yoga.YogaOverflow; import com.facebook.yoga.YogaPositionType; import com.facebook.yoga.YogaValue; import com.facebook.yoga.YogaWrap; +import java.util.List; import javax.annotation.Nullable; /** @@ -358,4 +359,10 @@ public interface ReactShadowNode { boolean isMeasureDefined(); void dispose(); + + /** + * @return an immutable {@link List} containing the children of this + * {@link ReactShadowNode}. + */ + List getChildrenList(); } diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactShadowNodeImpl.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactShadowNodeImpl.java index dddaf466c..7673c4523 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactShadowNodeImpl.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactShadowNodeImpl.java @@ -28,6 +28,8 @@ import com.facebook.yoga.YogaValue; import com.facebook.yoga.YogaWrap; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; +import java.util.List; import javax.annotation.Nullable; /** @@ -96,7 +98,7 @@ public class ReactShadowNodeImpl implements ReactShadowNode private final Spacing mDefaultPadding = new Spacing(0); private final float[] mPadding = new float[Spacing.ALL + 1]; private final boolean[] mPaddingIsPercent = new boolean[Spacing.ALL + 1]; - private final YogaNode mYogaNode; + private YogaNode mYogaNode; private @Nullable ReactStylesDiffMap mNewProps; @@ -120,8 +122,6 @@ public class ReactShadowNodeImpl implements ReactShadowNode mShouldNotifyOnLayout = original.mShouldNotifyOnLayout; mNodeUpdated = original.mNodeUpdated; mIsLayoutOnly = original.mIsLayoutOnly; - mTotalNativeChildren = original.mTotalNativeChildren; - mNativeParent = original.mNativeParent; mNativeParent = original.mNativeParent; mScreenX = original.mScreenX; mScreenY = original.mScreenY; @@ -131,24 +131,38 @@ public class ReactShadowNodeImpl implements ReactShadowNode arraycopy(original.mPaddingIsPercent, 0, mPaddingIsPercent, 0, original.mPaddingIsPercent.length); mNewProps = null; mParent = null; - mYogaNode = original.mYogaNode; - // TODO: T26729293 clone YogaNode instead of reusing the same instance - //mYogaNode = original.mYogaNode.clone(); - mNativeChildren = original.mNativeChildren == null ? null : new ArrayList<>(original.mNativeChildren); - mChildren = original.mChildren == null ? null : new ArrayList<>(original.mChildren); - mYogaNode.setData(this); } - @Override - public ReactShadowNodeImpl mutableCopy() { + /** + * @return a copy of this object (no including copy of its children or the underlying yogaNode). + */ + protected ReactShadowNodeImpl copy() { return new ReactShadowNodeImpl(this); } + @Override + public ReactShadowNodeImpl mutableCopy() { + ReactShadowNodeImpl copy = copy(); + copy.mYogaNode = mYogaNode; + // TODO: T26729293 clone YogaNode instead of reusing the same instance + //mYogaNode = original.mYogaNode.clone(); + copy.mNativeChildren = mNativeChildren == null ? null : new ArrayList<>(mNativeChildren); + copy.mTotalNativeChildren = mTotalNativeChildren; + copy.mChildren = mChildren == null ? null : new ArrayList<>(mChildren); + copy.mYogaNode.setData(this); + return copy; + } + @Override public ReactShadowNodeImpl mutableCopyWithNewChildren() { - ReactShadowNodeImpl copy = mutableCopy(); + ReactShadowNodeImpl copy = copy(); + copy.mYogaNode = mYogaNode; + // TODO: T26729293 clone YogaNode instead of reusing the same instance + //mYogaNode = original.mYogaNode.cloneWithNewChildren(); copy.mNativeChildren = null; copy.mChildren = null; + copy.mTotalNativeChildren = 0; + copy.mYogaNode.setData(this); return copy; } @@ -253,10 +267,6 @@ public class ReactShadowNodeImpl implements ReactShadowNode @Override public void addChildAt(ReactShadowNodeImpl child, int i) { - if (child.getParent() != null) { - throw new IllegalViewOperationException( - "Tried to add child that already has a parent! Remove it from its parent first."); - } if (mChildren == null) { mChildren = new ArrayList<>(4); } @@ -1056,4 +1066,10 @@ public class ReactShadowNodeImpl implements ReactShadowNode YogaNodePool.get().release(mYogaNode); } } + + @Nullable + @Override + public List getChildrenList() { + return mChildren == null ? null : Collections.unmodifiableList(mChildren); + } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTGroupShadowNode.java b/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTGroupShadowNode.java index 35cf8169c..fdb9f53b3 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTGroupShadowNode.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTGroupShadowNode.java @@ -43,7 +43,7 @@ public class ARTGroupShadowNode extends ARTVirtualNode { } @Override - public ReactShadowNodeImpl mutableCopy() { + protected ReactShadowNodeImpl copy() { return new ARTGroupShadowNode(this); } diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTShapeShadowNode.java b/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTShapeShadowNode.java index e60ad8803..d4bc72e28 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTShapeShadowNode.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTShapeShadowNode.java @@ -72,7 +72,7 @@ public class ARTShapeShadowNode extends ARTVirtualNode { } @Override - public ARTShapeShadowNode mutableCopy() { + protected ARTShapeShadowNode copy() { return new ARTShapeShadowNode(this); } diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTTextShadowNode.java b/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTTextShadowNode.java index 4a52e7a28..accb79e4e 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTTextShadowNode.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/art/ARTTextShadowNode.java @@ -49,7 +49,7 @@ public class ARTTextShadowNode extends ARTShapeShadowNode { } @Override - public ARTShapeShadowNode mutableCopy() { + protected ARTShapeShadowNode copy() { return new ARTTextShadowNode(this); } diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/modal/ModalHostShadowNode.java b/ReactAndroid/src/main/java/com/facebook/react/views/modal/ModalHostShadowNode.java index 5e429ac67..5b63f107d 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/modal/ModalHostShadowNode.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/modal/ModalHostShadowNode.java @@ -28,7 +28,7 @@ class ModalHostShadowNode extends LayoutShadowNode { } @Override - public ModalHostShadowNode mutableCopy() { + protected ModalHostShadowNode copy() { return new ModalHostShadowNode(this); } diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/progressbar/ProgressBarShadowNode.java b/ReactAndroid/src/main/java/com/facebook/react/views/progressbar/ProgressBarShadowNode.java index 5e44b6213..367f4a90b 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/progressbar/ProgressBarShadowNode.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/progressbar/ProgressBarShadowNode.java @@ -53,7 +53,7 @@ public class ProgressBarShadowNode extends LayoutShadowNode implements YogaMeasu } @Override - public ProgressBarShadowNode mutableCopy() { + protected ProgressBarShadowNode copy() { return new ProgressBarShadowNode(this); } diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/slider/ReactSliderManager.java b/ReactAndroid/src/main/java/com/facebook/react/views/slider/ReactSliderManager.java index 9ab464ad0..a73aa6ec7 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/slider/ReactSliderManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/slider/ReactSliderManager.java @@ -64,7 +64,7 @@ public class ReactSliderManager extends SimpleViewManager { } @Override - public ReactSliderShadowNode mutableCopy() { + protected ReactSliderShadowNode copy() { return new ReactSliderShadowNode(this); } diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/switchview/ReactSwitchManager.java b/ReactAndroid/src/main/java/com/facebook/react/views/switchview/ReactSwitchManager.java index 62a3ad3f4..1c9bff1ce 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/switchview/ReactSwitchManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/switchview/ReactSwitchManager.java @@ -56,7 +56,7 @@ public class ReactSwitchManager extends SimpleViewManager { } @Override - public ReactSwitchShadowNode mutableCopy() { + protected ReactSwitchShadowNode copy() { return new ReactSwitchShadowNode(this); } diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactRawTextShadowNode.java b/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactRawTextShadowNode.java index 87f6d5369..488abfe84 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactRawTextShadowNode.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactRawTextShadowNode.java @@ -30,7 +30,7 @@ public class ReactRawTextShadowNode extends ReactShadowNodeImpl { } @Override - public ReactShadowNodeImpl mutableCopy() { + protected ReactShadowNodeImpl copy() { return new ReactRawTextShadowNode(this); } diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextShadowNode.java b/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextShadowNode.java index 72e044ee8..37b13700f 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextShadowNode.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextShadowNode.java @@ -154,7 +154,7 @@ public class ReactTextShadowNode extends ReactBaseTextShadowNode { } @Override - public LayoutShadowNode mutableCopy() { + protected LayoutShadowNode copy() { return new ReactTextShadowNode(this); } diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactVirtualTextShadowNode.java b/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactVirtualTextShadowNode.java index 6506e9697..59ae82cc7 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactVirtualTextShadowNode.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactVirtualTextShadowNode.java @@ -19,7 +19,7 @@ public class ReactVirtualTextShadowNode extends ReactBaseTextShadowNode { } @Override - public ReactVirtualTextShadowNode mutableCopy() { + protected ReactVirtualTextShadowNode copy() { return new ReactVirtualTextShadowNode(this); } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/text/frescosupport/FrescoBasedReactTextInlineImageShadowNode.java b/ReactAndroid/src/main/java/com/facebook/react/views/text/frescosupport/FrescoBasedReactTextInlineImageShadowNode.java index 56298de90..c66f00971 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/text/frescosupport/FrescoBasedReactTextInlineImageShadowNode.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/text/frescosupport/FrescoBasedReactTextInlineImageShadowNode.java @@ -60,7 +60,7 @@ public class FrescoBasedReactTextInlineImageShadowNode extends ReactTextInlineIm } @Override - public FrescoBasedReactTextInlineImageShadowNode mutableCopy() { + protected FrescoBasedReactTextInlineImageShadowNode copy() { return new FrescoBasedReactTextInlineImageShadowNode(this); } diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputShadowNode.java b/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputShadowNode.java index 375c02a62..2fb427ee8 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputShadowNode.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactTextInputShadowNode.java @@ -61,7 +61,7 @@ public class ReactTextInputShadowNode extends ReactBaseTextShadowNode } @Override - public ReactTextInputShadowNode mutableCopy() { + protected ReactTextInputShadowNode copy() { return new ReactTextInputShadowNode(this); }