diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/BUCK b/ReactAndroid/src/main/java/com/facebook/react/fabric/BUCK index 3ff8cc422d..a5c3d74099 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/BUCK +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/BUCK @@ -1,6 +1,6 @@ load("//ReactNative:DEFS.bzl", "rn_android_library", "react_native_dep", "react_native_target") -android_library( +rn_android_library( name = "fabric", srcs = glob(["*.java"]), provided_deps = [ @@ -13,10 +13,11 @@ android_library( deps = [ react_native_dep("third-party/java/infer-annotations:infer-annotations"), react_native_dep("third-party/java/jsr-305:jsr-305"), - react_native_target("java/com/facebook/react:reactAndroid"), - react_native_target("java/com/facebook/react/bridge:bridgeAndroid"), - react_native_target("java/com/facebook/react/uimanager:uimanagerAndroid"), - react_native_target("java/com/facebook/react/uimanager/annotations:annotationsAndroid"), - react_native_target("java/com/facebook/react/module/annotations:annotationsAndroid"), + react_native_target("java/com/facebook/react:react"), + react_native_target("java/com/facebook/react/bridge:bridge"), + react_native_target("java/com/facebook/react/uimanager:uimanager"), + react_native_target("java/com/facebook/react/uimanager/annotations:annotations"), + react_native_target("java/com/facebook/react/module/annotations:annotations"), + react_native_target("java/com/facebook/react/modules/i18nmanager:i18nmanager"), ], ) diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManagerModule.java b/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManagerModule.java index 10acfbc278..473eee7f62 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManagerModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManagerModule.java @@ -4,12 +4,14 @@ package com.facebook.react.fabric; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReadableMap; +import com.facebook.react.modules.i18nmanager.I18nUtil; import com.facebook.react.uimanager.MeasureSpecProvider; -import com.facebook.react.uimanager.NativeViewHierarchyOptimizer; import com.facebook.react.uimanager.ReactRootViewTagGenerator; import com.facebook.react.uimanager.ReactShadowNode; +import com.facebook.react.uimanager.ReactShadowNodeImpl; import com.facebook.react.uimanager.ReactStylesDiffMap; import com.facebook.react.uimanager.SizeMonitoringFrameLayout; +import com.facebook.react.uimanager.ThemedReactContext; import com.facebook.react.uimanager.UIModule; import com.facebook.react.uimanager.ViewManager; import com.facebook.react.uimanager.ViewManagerRegistry; @@ -24,6 +26,7 @@ import javax.annotation.Nullable; @SuppressWarnings("unused") // used from JNI public class FabricUIManagerModule implements UIModule { + private final RootShadowNodeRegistry mRootShadowNodeRegistry = new RootShadowNodeRegistry(); private final ReactApplicationContext mReactApplicationContext; private final ViewManagerRegistry mViewManagerRegistry; @@ -43,19 +46,23 @@ public class FabricUIManagerModule implements UIModule { ReadableMap props) { ViewManager viewManager = mViewManagerRegistry.get(viewName); - ReactShadowNode shadowNode = viewManager.createShadowNodeInstance(mReactApplicationContext); - shadowNode.setRootTag(rootTag); - shadowNode.setReactTag(reactTag); - ReactStylesDiffMap styles = updateProps(props, shadowNode); + ReactShadowNode node = viewManager.createShadowNodeInstance(mReactApplicationContext); + node.setRootNode(getRootNode(rootTag)); + node.setReactTag(reactTag); + ReactStylesDiffMap styles = updateProps(props, node); - return shadowNode; + return node; } - private ReactStylesDiffMap updateProps(ReadableMap props, ReactShadowNode shadowNode) { + private ReactShadowNode getRootNode(int rootTag) { + return mRootShadowNodeRegistry.getNode(rootTag); + } + + private ReactStylesDiffMap updateProps(ReadableMap props, ReactShadowNode node) { ReactStylesDiffMap styles = null; if (props != null) { styles = new ReactStylesDiffMap(props); - shadowNode.updateProperties(styles); + node.updateProperties(styles); } return styles; } @@ -134,15 +141,34 @@ public class FabricUIManagerModule implements UIModule { } public void completeRoot(int rootTag, List childList) { - // TODO Diffing old Tree with new Tree? + // TODO Diffing old Tree with new Tree // Do we need to hold references to old and new tree? } @Override public int addRootView( final T rootView) { - // TODO: complete with actual implementation - return ReactRootViewTagGenerator.getNextRootViewTag(); + int rootTag = ReactRootViewTagGenerator.getNextRootViewTag(); + ThemedReactContext themedRootContext = new ThemedReactContext( + mReactApplicationContext, + rootView.getContext()); + + mRootShadowNodeRegistry.addNode(createRootShadowNode(rootTag, themedRootContext)); + return rootTag; + } + + public void removeRootView(int rootTag) { + mRootShadowNodeRegistry.removeNode(rootTag); + } + + private ReactShadowNode createRootShadowNode(int rootTag, ThemedReactContext themedReactContext) { + ReactShadowNode rootNode = new ReactShadowNodeImpl(); + I18nUtil sharedI18nUtilInstance = I18nUtil.getInstance(); + // TODO: setLayoutDirection for the rootNode + rootNode.setViewClassName("Root"); + rootNode.setReactTag(rootTag); + rootNode.setThemedContext(themedReactContext); + return rootNode; } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/RootShadowNodeRegistry.java b/ReactAndroid/src/main/java/com/facebook/react/fabric/RootShadowNodeRegistry.java new file mode 100644 index 0000000000..5aeff65500 --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/RootShadowNodeRegistry.java @@ -0,0 +1,29 @@ +package com.facebook.react.fabric; + +import android.util.SparseArray; +import com.facebook.react.uimanager.ReactShadowNode; + +/** + * Simple container class to keep track of {@link ReactShadowNode}s that represents the Root + * Shadow Nodes of a {@link FabricUIManagerModule} + */ +public class RootShadowNodeRegistry { + + private final SparseArray mTagsToRootNodes; + + public RootShadowNodeRegistry() { + mTagsToRootNodes = new SparseArray<>(); + } + + public void addNode(ReactShadowNode node) { + mTagsToRootNodes.put(node.getReactTag(), node); + } + + public void removeNode(int tag) { + mTagsToRootNodes.remove(tag); + } + + public ReactShadowNode getNode(int tag) { + return mTagsToRootNodes.get(tag); + } +} 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 92e5badc69..69c130aa80 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactShadowNode.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactShadowNode.java @@ -132,11 +132,8 @@ public interface ReactShadowNode { T getRootNode(); - @Deprecated() //Replaced by setRootTag method. void setRootNode(T rootNode); - void setRootTag(int rootTag); - void setViewClassName(String viewClassName); @Nullable 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 cf0b8b37a1..c12f5fb9ff 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactShadowNodeImpl.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactShadowNodeImpl.java @@ -410,11 +410,6 @@ public class ReactShadowNodeImpl implements ReactShadowNode mRootNode = rootNode; } - @Override - public void setRootTag(int rootTag) { - mRootTag = rootTag; - } - @Override public final void setViewClassName(String viewClassName) { mViewClassName = viewClassName; diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementation.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementation.java index 7c59caafb6..98e4a592c6 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementation.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementation.java @@ -277,7 +277,6 @@ public class UIImplementation { cssNode.setReactTag(tag); cssNode.setViewClassName(className); cssNode.setRootNode(rootNode); - if (rootNode != null) cssNode.setRootTag(rootNode.getReactTag()); cssNode.setThemedContext(rootNode.getThemedContext()); mShadowNodeRegistry.addNode(cssNode);