From 3ac914478d9636e7fffe29751e916ac16f311652 Mon Sep 17 00:00:00 2001 From: David Vacca Date: Mon, 14 May 2018 09:22:13 -0700 Subject: [PATCH] Add support for View Manager commands in Fabric Reviewed By: achen1 Differential Revision: D7879104 fbshipit-source-id: fd89acb3941bb03364d18ddedf68a081aef934a0 --- .../facebook/react/ReactInstanceManager.java | 4 +-- .../com/facebook/react/ReactRootView.java | 8 ++--- .../com/facebook/react/bridge/UIManager.java | 17 ++++++++++ .../react/fabric/FabricUIManager.java | 18 +++++++++++ .../react/uimanager/UIImplementation.java | 2 +- .../react/uimanager/UIManagerHelper.java | 32 +++++++++++++++++++ .../react/uimanager/UIManagerModule.java | 16 ++++++++-- .../react/uimanager/UIViewOperationQueue.java | 2 +- 8 files changed, 89 insertions(+), 10 deletions(-) create mode 100644 ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerHelper.java diff --git a/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java b/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java index 9687065e250101..a50a17b2fd1c54 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java @@ -79,7 +79,7 @@ import com.facebook.react.modules.fabric.ReactFabric; import com.facebook.react.uimanager.DisplayMetricsHolder; import com.facebook.react.uimanager.UIImplementationProvider; -import com.facebook.react.uimanager.UIManagerModule; +import com.facebook.react.uimanager.UIManagerHelper; import com.facebook.react.uimanager.ViewManager; import com.facebook.react.views.imagehelper.ResourceDrawableIdHelper; import com.facebook.soloader.SoLoader; @@ -1011,7 +1011,7 @@ private void attachRootViewToInstance( CatalystInstance catalystInstance) { Log.d(ReactConstants.TAG, "ReactInstanceManager.attachRootViewToInstance()"); Systrace.beginSection(TRACE_TAG_REACT_JAVA_BRIDGE, "attachRootViewToInstance"); - UIManager uiManagerModule = rootView.isFabric() ? catalystInstance.getJSIModule(UIManager.class) : catalystInstance.getNativeModule(UIManagerModule.class); + UIManager uiManagerModule = UIManagerHelper.getUIManager(mCurrentReactContext, rootView.isFabric()); final int rootTag = uiManagerModule.addRootView(rootView); rootView.setRootViewTag(rootTag); rootView.invokeJSEntryPoint(); diff --git a/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java b/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java index 6fbe25e82eb417..ddf80d63c04636 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java @@ -44,6 +44,7 @@ import com.facebook.react.uimanager.JSTouchDispatcher; import com.facebook.react.uimanager.PixelUtil; import com.facebook.react.uimanager.RootView; +import com.facebook.react.uimanager.UIManagerHelper; import com.facebook.react.uimanager.UIManagerModule; import com.facebook.react.uimanager.common.MeasureSpecProvider; import com.facebook.react.uimanager.common.SizeMonitoringFrameLayout; @@ -402,10 +403,9 @@ private void updateRootLayoutSpecs(final int widthMeasureSpec, final int heightM new GuardedRunnable(reactApplicationContext) { @Override public void runGuarded() { - reactApplicationContext - .getCatalystInstance() - .getNativeModule(UIManagerModule.class) - .updateRootLayoutSpecs(getRootViewTag(), widthMeasureSpec, heightMeasureSpec); + UIManagerHelper + .getUIManager(reactApplicationContext, isFabric()) + .updateRootLayoutSpecs(getRootViewTag(), widthMeasureSpec, heightMeasureSpec); } }); } diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/UIManager.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/UIManager.java index 6cbca5de698f86..924f8418977176 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/UIManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/UIManager.java @@ -3,6 +3,8 @@ import com.facebook.react.uimanager.common.MeasureSpecProvider; import com.facebook.react.uimanager.common.SizeMonitoringFrameLayout; +import javax.annotation.Nullable; + public interface UIManager extends JSIModule { /** @@ -10,4 +12,19 @@ public interface UIManager extends JSIModule { */ int addRootView(final T rootView); + /** + * Updates the layout specs of the RootShadowNode based on the Measure specs received by + * parameters. + */ + void updateRootLayoutSpecs(int rootTag, int widthMeasureSpec, int heightMeasureSpec); + + /** + * Dispatches the commandId received by parameter to the view associated with the reactTag. + * The command will be processed in the UIThread. + * + * @param reactTag {@link int} that identifies the view that will receive this command + * @param commandId {@link int} command id + * @param commandArgs {@link ReadableArray} parameters associated with the command + */ + void dispatchViewManagerCommand(int reactTag, int commandId, @Nullable ReadableArray commandArgs); } 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 ce8046092b299a..31a2a866f6a447 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java @@ -16,6 +16,7 @@ import com.facebook.infer.annotation.Assertions; import com.facebook.react.bridge.GuardedRunnable; import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReadableArray; import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.ReadableNativeMap; import com.facebook.react.bridge.UIManager; @@ -35,8 +36,10 @@ import com.facebook.react.uimanager.common.MeasureSpecProvider; import com.facebook.react.uimanager.common.SizeMonitoringFrameLayout; import java.util.ArrayList; +import java.util.HashSet; import java.util.LinkedList; import java.util.List; +import java.util.Set; import javax.annotation.Nullable; /** @@ -280,6 +283,11 @@ public synchronized void completeRoot(int rootTag, @Nullable List