diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/Binding.java b/ReactAndroid/src/main/java/com/facebook/react/fabric/Binding.java index c41b5bcbe46..c77f2f1c0e8 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/Binding.java +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/Binding.java @@ -41,6 +41,8 @@ public class Binding { public native void startSurface(int surfaceId, String moduleName, NativeMap initialProps); + public native void startSurfaceWithConstraints(int surfaceId, String moduleName, NativeMap initialProps, float minWidth, float maxWidth, float minHeight, float maxHeight); + public native void renderTemplateToSurface(int surfaceId, String uiTemplate); public native void stopSurface(int surfaceId); 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 271cdc81f12..1363f230fb0 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java @@ -130,23 +130,33 @@ public class FabricUIManager implements UIManager, LifecycleEventListener { @Override public int addRootView( final T rootView, final WritableMap initialProps, final @Nullable String initialUITemplate) { - return addRootView(rootView, ((ReactRoot) rootView).getJSModuleName(), initialProps, initialUITemplate); - } - - public int addRootView( - final T rootView, final String moduleName, final WritableMap initialProps, final @Nullable String initialUITemplate) { final int rootTag = ReactRootViewTagGenerator.getNextRootViewTag(); ThemedReactContext reactContext = new ThemedReactContext(mReactApplicationContext, rootView.getContext()); mMountingManager.addRootView(rootTag, rootView); mReactContextForRootTag.put(rootTag, reactContext); - mBinding.startSurface(rootTag, moduleName, (NativeMap) initialProps); + mBinding.startSurface(rootTag, ((ReactRoot) rootView).getJSModuleName(), (NativeMap) initialProps); if (initialUITemplate != null) { mBinding.renderTemplateToSurface(rootTag, initialUITemplate); } return rootTag; } + public int addRootView( + final T rootView, final String moduleName, final WritableMap initialProps, int widthMeasureSpec, int heightMeasureSpec) { + final int rootTag = ReactRootViewTagGenerator.getNextRootViewTag(); + ThemedReactContext reactContext = + new ThemedReactContext(mReactApplicationContext, rootView.getContext()); + mMountingManager.addRootView(rootTag, rootView); + mReactContextForRootTag.put(rootTag, reactContext); + mBinding.startSurfaceWithConstraints(rootTag, moduleName, (NativeMap) initialProps, + getMinSize(widthMeasureSpec), + getMaxSize(widthMeasureSpec), + getMinSize(heightMeasureSpec), + getMaxSize(heightMeasureSpec)); + return rootTag; + } + /** Method called when an event has been dispatched on the C++ side. */ @DoNotStrip @SuppressWarnings("unused") diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/Binding.cpp b/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/Binding.cpp index 319f9bd8ab8..78b4305470a 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/Binding.cpp +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/Binding.cpp @@ -57,6 +57,35 @@ void Binding::startSurface( } } +void Binding::startSurfaceWithConstraints( + jint surfaceId, + jni::alias_ref moduleName, + NativeMap *initialProps, + jfloat minWidth, + jfloat maxWidth, + jfloat minHeight, + jfloat maxHeight) { + if (scheduler_) { + auto minimumSize = + Size{minWidth / pointScaleFactor_, minHeight / pointScaleFactor_}; + auto maximumSize = + Size{maxWidth / pointScaleFactor_, maxHeight / pointScaleFactor_}; + + LayoutContext context; + context.pointScaleFactor = {pointScaleFactor_}; + LayoutConstraints constraints = {}; + constraints.minimumSize = minimumSize; + constraints.maximumSize = maximumSize; + + scheduler_->startSurface( + surfaceId, + moduleName->toStdString(), + initialProps->consume(), + constraints, + context); + } +} + void Binding::renderTemplateToSurface(jint surfaceId, jstring uiTemplate) { SystraceSection s("FabricUIManagerBinding::renderTemplateToSurface"); if (scheduler_) { @@ -571,6 +600,8 @@ void Binding::registerNatives() { makeNativeMethod( "installFabricUIManager", Binding::installFabricUIManager), makeNativeMethod("startSurface", Binding::startSurface), + makeNativeMethod( + "startSurfaceWithConstraints", Binding::startSurfaceWithConstraints), makeNativeMethod( "renderTemplateToSurface", Binding::renderTemplateToSurface), makeNativeMethod("stopSurface", Binding::stopSurface), diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/Binding.h b/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/Binding.h index 2a880bc2d8b..7c674a962b8 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/Binding.h +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/Binding.h @@ -21,7 +21,7 @@ class Instance; class Binding : public jni::HybridClass, public SchedulerDelegate { public: - constexpr static const char* const kJavaDescriptor = + constexpr static const char *const kJavaDescriptor = "Lcom/facebook/react/fabric/Binding;"; static void registerNatives(); @@ -55,6 +55,15 @@ class Binding : public jni::HybridClass, public SchedulerDelegate { jni::alias_ref moduleName, NativeMap *initialProps); + void startSurfaceWithConstraints( + jint surfaceId, + jni::alias_ref moduleName, + NativeMap *initialProps, + jfloat minWidth, + jfloat maxWidth, + jfloat minHeight, + jfloat maxHeight); + void renderTemplateToSurface(jint surfaceId, jstring uiTemplate); void stopSurface(jint surfaceId);