diff --git a/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java b/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java index 4c2b56099..711e18001 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java @@ -58,6 +58,7 @@ import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactContext; import com.facebook.react.bridge.ReactMarker; import com.facebook.react.bridge.ReactMarkerConstants; +import com.facebook.react.bridge.UIManager; import com.facebook.react.bridge.UiThreadUtil; import com.facebook.react.bridge.queue.ReactQueueConfigurationSpec; import com.facebook.react.common.LifecycleState; @@ -328,40 +329,6 @@ public class ReactInstanceManager { recreateReactContextInBackgroundInner(); } - @ThreadConfined(UI) - public void registerAdditionalPackages(List packages) { - if (packages == null || packages.isEmpty()) { - return; - } - - // CatalystInstance hasn't been created, so add packages for later evaluation - if (!hasStartedCreatingInitialContext()) { - synchronized (mPackages) { - for (ReactPackage p : packages) { - if (!mPackages.contains(p)) { - mPackages.add(p); - } - } - } - return; - } - - ReactContext context = getCurrentReactContext(); - CatalystInstance catalystInstance = context != null ? context.getCatalystInstance() : null; - - Assertions.assertNotNull(catalystInstance, "CatalystInstance null after hasStartedCreatingInitialContext true."); - - final ReactApplicationContext reactContext = getReactApplicationContext(); - - NativeModuleRegistry nativeModuleRegistry = processPackages(reactContext, packages, true); - catalystInstance.extendNativeModules(nativeModuleRegistry); - } - - @VisibleForTesting - public @Nullable ReactApplicationContext getReactApplicationContext() { - return new ReactApplicationContext(mApplicationContext); - } - /** * Recreate the react application and context. This should be called if configuration has changed * or the developer has requested the app to be reloaded. It should only be called after an @@ -1040,8 +1007,7 @@ public class ReactInstanceManager { CatalystInstance catalystInstance) { Log.d(ReactConstants.TAG, "ReactInstanceManager.attachRootViewToInstance()"); Systrace.beginSection(TRACE_TAG_REACT_JAVA_BRIDGE, "attachRootViewToInstance"); - UIManagerModule uiManagerModule = catalystInstance.getNativeModule(UIManagerModule.class); - final int rootTag = uiManagerModule.addRootView(rootView); + final int rootTag = catalystInstance.getNativeModule(UIManagerModule.class).addRootView(rootView); rootView.setRootViewTag(rootTag); rootView.invokeJSEntryPoint(); Systrace.beginAsyncSection( @@ -1097,7 +1063,7 @@ public class ReactInstanceManager { JSBundleLoader jsBundleLoader) { Log.d(ReactConstants.TAG, "ReactInstanceManager.createReactContext()"); ReactMarker.logMarker(CREATE_REACT_CONTEXT_START); - final ReactApplicationContext reactContext = getReactApplicationContext(); + final ReactApplicationContext reactContext = new ReactApplicationContext(mApplicationContext); if (mUseDeveloperSupport) { reactContext.setNativeModuleCallExceptionHandler(mDevSupportManager); @@ -1113,8 +1079,7 @@ public class ReactInstanceManager { .setJSExecutor(jsExecutor) .setRegistry(nativeModuleRegistry) .setJSBundleLoader(jsBundleLoader) - .setNativeModuleCallExceptionHandler(exceptionHandler) - .setBridgeListener(mBridgeListener); + .setNativeModuleCallExceptionHandler(exceptionHandler); ReactMarker.logMarker(CREATE_CATALYST_INSTANCE_START); // CREATE_CATALYST_INSTANCE_END is in JSCExecutor.cpp @@ -1126,6 +1091,9 @@ public class ReactInstanceManager { Systrace.endSection(TRACE_TAG_REACT_JAVA_BRIDGE); ReactMarker.logMarker(CREATE_CATALYST_INSTANCE_END); } + if (mBridgeListener != null) { + mBridgeListener.onBridgeStarted(reactContext, catalystInstance); + } if (mBridgeIdleDebugListener != null) { catalystInstance.addBridgeIdleDebugListener(mBridgeIdleDebugListener); diff --git a/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java b/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java index a19382fbf..711d1795e 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/ReactRootView.java @@ -41,10 +41,10 @@ import com.facebook.react.modules.deviceinfo.DeviceInfoModule; import com.facebook.react.uimanager.DisplayMetricsHolder; import com.facebook.react.uimanager.IllegalViewOperationException; import com.facebook.react.uimanager.JSTouchDispatcher; -import com.facebook.react.uimanager.MeasureSpecProvider; +import com.facebook.react.uimanager.common.MeasureSpecProvider; import com.facebook.react.uimanager.PixelUtil; import com.facebook.react.uimanager.RootView; -import com.facebook.react.uimanager.SizeMonitoringFrameLayout; +import com.facebook.react.uimanager.common.SizeMonitoringFrameLayout; import com.facebook.react.uimanager.UIManagerModule; import com.facebook.react.uimanager.events.EventDispatcher; import com.facebook.systrace.Systrace; diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/BUCK b/ReactAndroid/src/main/java/com/facebook/react/bridge/BUCK index 410201320..69c22f16f 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/BUCK +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/BUCK @@ -27,5 +27,6 @@ rn_android_library( react_native_target("java/com/facebook/debug/holder:holder"), react_native_target("java/com/facebook/react/common:common"), react_native_target("java/com/facebook/react/module/model:model"), + react_native_target("java/com/facebook/react/uimanager/common:common"), ] + ([react_native_target("jni/react/jni:jni")] if not IS_OSS_BUILD else []), ) diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/BridgeListener.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/BridgeListener.java index d39c72b50..70b771ff5 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/BridgeListener.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/BridgeListener.java @@ -9,6 +9,6 @@ public interface BridgeListener { * Called right after the RN Bridge is initialized * @param catalystInstance {@link CatalystInstance} bridge */ - void onBridgeStarted(CatalystInstance catalystInstance); + void onBridgeStarted(ReactApplicationContext reactApplicationContext, CatalystInstance catalystInstance); } diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstance.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstance.java index 361cfda0f..1f277e6ec 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstance.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstance.java @@ -98,4 +98,8 @@ public interface CatalystInstance * synchronized(jsContext) { nativeThingNeedingJsContext(jsContext.get()); } */ JavaScriptContextHolder getJavaScriptContextHolder(); + + void setFabricUIManager(T fabricUIManager); + + T getFabricUIManager(); } diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java index c583fbec1..79233aae2 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java @@ -85,6 +85,7 @@ public class CatalystInstanceImpl implements CatalystInstance { private volatile boolean mAcceptCalls = false; private boolean mJSBundleHasLoaded; + private UIManager mFabricUIManager; private @Nullable String mSourceURL; private JavaScriptContextHolder mJavaScriptContextHolder; @@ -98,8 +99,7 @@ public class CatalystInstanceImpl implements CatalystInstance { final JavaScriptExecutor jsExecutor, final NativeModuleRegistry nativeModuleRegistry, final JSBundleLoader jsBundleLoader, - NativeModuleCallExceptionHandler nativeModuleCallExceptionHandler, - final BridgeListener bridgeListener) { + NativeModuleCallExceptionHandler nativeModuleCallExceptionHandler) { Log.d(ReactConstants.TAG, "Initializing React Xplat Bridge."); mHybridData = initHybrid(); @@ -125,9 +125,6 @@ public class CatalystInstanceImpl implements CatalystInstance { Log.d(ReactConstants.TAG, "Initializing React Xplat Bridge after initializeBridge"); mJavaScriptContextHolder = new JavaScriptContextHolder(getJavaScriptContext()); - if (bridgeListener != null) { - bridgeListener.onBridgeStarted(this); - } } private static class BridgeCallback implements ReactCallback { @@ -456,6 +453,14 @@ public class CatalystInstanceImpl implements CatalystInstance { return mJavaScriptContextHolder; } + public UIManager getFabricUIManager() { + return mFabricUIManager; + } + + public void setFabricUIManager(UIManager fabricUIManager) { + mFabricUIManager = fabricUIManager; + } + private native long getJavaScriptContext(); private void incrementPendingJSCalls() { @@ -555,7 +560,6 @@ public class CatalystInstanceImpl implements CatalystInstance { private @Nullable NativeModuleRegistry mRegistry; private @Nullable JavaScriptExecutor mJSExecutor; private @Nullable NativeModuleCallExceptionHandler mNativeModuleCallExceptionHandler; - private @Nullable BridgeListener mBridgeListener; public Builder setReactQueueConfigurationSpec( @@ -585,20 +589,13 @@ public class CatalystInstanceImpl implements CatalystInstance { return this; } - public Builder setBridgeListener( - BridgeListener listener) { - mBridgeListener = listener; - return this; - } - public CatalystInstanceImpl build() { return new CatalystInstanceImpl( Assertions.assertNotNull(mReactQueueConfigurationSpec), Assertions.assertNotNull(mJSExecutor), Assertions.assertNotNull(mRegistry), Assertions.assertNotNull(mJSBundleLoader), - Assertions.assertNotNull(mNativeModuleCallExceptionHandler), - mBridgeListener); + Assertions.assertNotNull(mNativeModuleCallExceptionHandler)); } } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/UIManager.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/UIManager.java new file mode 100644 index 000000000..ff3e93ca1 --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/UIManager.java @@ -0,0 +1,13 @@ +package com.facebook.react.bridge; + +import com.facebook.react.uimanager.common.MeasureSpecProvider; +import com.facebook.react.uimanager.common.SizeMonitoringFrameLayout; + +public interface UIManager { + + /** + * Registers a new root view. + */ + int addRootView(final T rootView); + +} 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 c920f3d37..e291d2188 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManagerModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManagerModule.java @@ -5,17 +5,17 @@ package com.facebook.react.fabric; import com.facebook.infer.annotation.Assertions; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReadableNativeMap; +import com.facebook.react.bridge.UIManager; import com.facebook.react.modules.i18nmanager.I18nUtil; -import com.facebook.react.uimanager.MeasureSpecProvider; 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; +import com.facebook.react.uimanager.common.MeasureSpecProvider; +import com.facebook.react.uimanager.common.SizeMonitoringFrameLayout; import java.util.ArrayList; import java.util.List; import javax.annotation.Nullable; @@ -24,7 +24,7 @@ import javax.annotation.Nullable; * Fabric API. */ @SuppressWarnings("unused") // used from JNI -public class FabricUIManagerModule implements UIModule { +public class FabricUIManagerModule implements UIManager { private final RootShadowNodeRegistry mRootShadowNodeRegistry = new RootShadowNodeRegistry(); private final ReactApplicationContext mReactApplicationContext; diff --git a/ReactAndroid/src/main/java/com/facebook/react/flat/FlatNativeViewHierarchyManager.java b/ReactAndroid/src/main/java/com/facebook/react/flat/FlatNativeViewHierarchyManager.java index eb2d082bd..ac1e0aadd 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/flat/FlatNativeViewHierarchyManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/flat/FlatNativeViewHierarchyManager.java @@ -19,7 +19,7 @@ import android.view.View.MeasureSpec; import android.view.ViewGroup; import com.facebook.react.uimanager.NativeViewHierarchyManager; -import com.facebook.react.uimanager.SizeMonitoringFrameLayout; +import com.facebook.react.uimanager.common.SizeMonitoringFrameLayout; import com.facebook.react.uimanager.ThemedReactContext; import com.facebook.react.uimanager.ViewGroupManager; import com.facebook.react.uimanager.ViewManagerRegistry; diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/BUCK b/ReactAndroid/src/main/java/com/facebook/react/uimanager/BUCK index 244903500..50a22dfcb 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/BUCK +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/BUCK @@ -14,6 +14,7 @@ rn_android_library( exported_deps = [ ":DisplayMetrics", react_native_dep("third-party/java/jsr-305:jsr-305"), + react_native_target("java/com/facebook/react/uimanager/common:common"), ], provided_deps = [ react_native_dep("third-party/android/support/v4:lib-support-v4"), @@ -40,6 +41,7 @@ rn_android_library( react_native_target("java/com/facebook/react/touch:touch"), react_native_target("java/com/facebook/react/uimanager/annotations:annotations"), react_native_target("java/com/facebook/react/uimanager/util:util"), + react_native_target("java/com/facebook/react/uimanager/common:common"), react_native_target("res:uimanager"), ], ) diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/NativeViewHierarchyManager.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/NativeViewHierarchyManager.java index 95d919ed1..2b259c680 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/NativeViewHierarchyManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/NativeViewHierarchyManager.java @@ -29,6 +29,7 @@ import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.SoftAssertions; import com.facebook.react.bridge.UiThreadUtil; import com.facebook.react.touch.JSResponderHandler; +import com.facebook.react.uimanager.common.SizeMonitoringFrameLayout; import com.facebook.react.uimanager.layoutanimation.LayoutAnimationController; import com.facebook.react.uimanager.layoutanimation.LayoutAnimationListener; import com.facebook.systrace.Systrace; diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/RootViewManager.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/RootViewManager.java index c590a53ea..cc6ebae53 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/RootViewManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/RootViewManager.java @@ -8,6 +8,7 @@ package com.facebook.react.uimanager; import android.view.ViewGroup; +import com.facebook.react.uimanager.common.SizeMonitoringFrameLayout; /** * View manager for ReactRootView components. 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 98e4a592c..c312ff763 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementation.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementation.java @@ -24,6 +24,8 @@ import com.facebook.react.bridge.UiThreadUtil; import com.facebook.react.bridge.WritableArray; import com.facebook.react.common.ReactConstants; import com.facebook.react.modules.i18nmanager.I18nUtil; +import com.facebook.react.uimanager.common.MeasureSpecProvider; +import com.facebook.react.uimanager.common.SizeMonitoringFrameLayout; import com.facebook.react.uimanager.debug.NotThreadSafeViewHierarchyUpdateDebugListener; import com.facebook.react.uimanager.events.EventDispatcher; import com.facebook.systrace.Systrace; diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModule.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModule.java index d4ceecfb6..282c92ca3 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModule.java @@ -28,10 +28,13 @@ import com.facebook.react.bridge.ReactMarker; import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.ReadableArray; import com.facebook.react.bridge.ReadableMap; +import com.facebook.react.bridge.UIManager; import com.facebook.react.bridge.WritableMap; import com.facebook.react.common.MapBuilder; import com.facebook.react.common.ReactConstants; import com.facebook.react.module.annotations.ReactModule; +import com.facebook.react.uimanager.common.MeasureSpecProvider; +import com.facebook.react.uimanager.common.SizeMonitoringFrameLayout; import com.facebook.react.uimanager.debug.NotThreadSafeViewHierarchyUpdateDebugListener; import com.facebook.react.uimanager.events.EventDispatcher; import com.facebook.systrace.Systrace; @@ -72,7 +75,7 @@ import javax.annotation.Nullable; */ @ReactModule(name = UIManagerModule.NAME) public class UIManagerModule extends ReactContextBaseJavaModule implements - OnBatchCompleteListener, LifecycleEventListener, PerformanceCounter, UIModule { + OnBatchCompleteListener, LifecycleEventListener, PerformanceCounter, UIManager { /** * Enables lazy discovery of a specific {@link ViewManager} by its name. diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIModule.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIModule.java deleted file mode 100644 index a3fee6652..000000000 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIModule.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.facebook.react.uimanager; - -public interface UIModule { - - int addRootView(final T rootView); - -} diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIViewOperationQueue.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIViewOperationQueue.java index dcce5b8ed..5cef75341 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIViewOperationQueue.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIViewOperationQueue.java @@ -21,6 +21,7 @@ import com.facebook.react.bridge.SoftAssertions; import com.facebook.react.bridge.UiThreadUtil; import com.facebook.react.common.ReactConstants; import com.facebook.react.modules.core.ReactChoreographer; +import com.facebook.react.uimanager.common.SizeMonitoringFrameLayout; import com.facebook.react.uimanager.debug.NotThreadSafeViewHierarchyUpdateDebugListener; import com.facebook.systrace.Systrace; import com.facebook.systrace.SystraceMessage; diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/common/BUCK b/ReactAndroid/src/main/java/com/facebook/react/uimanager/common/BUCK new file mode 100644 index 000000000..5c4a5b26d --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/common/BUCK @@ -0,0 +1,12 @@ +load("//ReactNative:DEFS.bzl", "rn_android_library", "react_native_dep", "react_native_target") + +rn_android_library( + name = "common", + srcs = glob(["*.java"]), + visibility = [ + "PUBLIC", + ], + deps = [ + react_native_dep("third-party/java/jsr-305:jsr-305"), + ], +) diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/MeasureSpecProvider.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/common/MeasureSpecProvider.java similarity index 90% rename from ReactAndroid/src/main/java/com/facebook/react/uimanager/MeasureSpecProvider.java rename to ReactAndroid/src/main/java/com/facebook/react/uimanager/common/MeasureSpecProvider.java index b03a8362c..7cc657470 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/MeasureSpecProvider.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/common/MeasureSpecProvider.java @@ -1,6 +1,6 @@ // Copyright 2004-present Facebook. All Rights Reserved. -package com.facebook.react.uimanager; +package com.facebook.react.uimanager.common; import android.view.View; diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/SizeMonitoringFrameLayout.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/common/SizeMonitoringFrameLayout.java similarity index 97% rename from ReactAndroid/src/main/java/com/facebook/react/uimanager/SizeMonitoringFrameLayout.java rename to ReactAndroid/src/main/java/com/facebook/react/uimanager/common/SizeMonitoringFrameLayout.java index 9e6c58015..19af1031a 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/SizeMonitoringFrameLayout.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/common/SizeMonitoringFrameLayout.java @@ -5,7 +5,7 @@ * LICENSE file in the root directory of this source tree. */ -package com.facebook.react.uimanager; +package com.facebook.react.uimanager.common; import javax.annotation.Nullable;