From e653cb06f8cde0c19d485d532673e2fcfac530bc Mon Sep 17 00:00:00 2001 From: Samuel Susla Date: Wed, 1 Apr 2020 08:37:07 -0700 Subject: [PATCH] Pass isRTL flag from FabricUIManager Fabric core Summary: Changelog: [Internal] Send `isRTL` flag and `doLeftAndRightSwapInRTL` flags from Java to Fabric Core. Reviewed By: JoshuaGross, mdvacca Differential Revision: D20776005 fbshipit-source-id: 946c239d9a11ebea958b0a6d04f2316b7cd77311 --- .../java/com/facebook/react/fabric/Binding.java | 12 ++++++++++-- .../com/facebook/react/fabric/FabricUIManager.java | 10 +++++++--- .../java/com/facebook/react/fabric/jni/Binding.cpp | 14 ++++++++++++-- .../java/com/facebook/react/fabric/jni/Binding.h | 8 ++++++-- 4 files changed, 35 insertions(+), 9 deletions(-) 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 20bb2eca6e9..81ab4e76829 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/Binding.java +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/Binding.java @@ -51,7 +51,9 @@ public class Binding { float minWidth, float maxWidth, float minHeight, - float maxHeight); + float maxHeight, + boolean isRTL, + boolean doLeftAndRightSwapInRTL); public native void renderTemplateToSurface(int surfaceId, String uiTemplate); @@ -60,7 +62,13 @@ public class Binding { public native void setPixelDensity(float pointScaleFactor); public native void setConstraints( - int surfaceId, float minWidth, float maxWidth, float minHeight, float maxHeight); + int surfaceId, + float minWidth, + float maxWidth, + float minHeight, + float maxHeight, + boolean isRTL, + boolean doLeftAndRightSwapInRTL); public void register( @NonNull JavaScriptContextHolder jsContext, 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 6e8a1984647..9554b262eda 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java @@ -67,6 +67,7 @@ import com.facebook.react.fabric.mounting.mountitems.UpdatePaddingMountItem; import com.facebook.react.fabric.mounting.mountitems.UpdatePropsMountItem; import com.facebook.react.fabric.mounting.mountitems.UpdateStateMountItem; import com.facebook.react.modules.core.ReactChoreographer; +import com.facebook.react.modules.i18nmanager.I18nUtil; import com.facebook.react.uimanager.ReactRoot; import com.facebook.react.uimanager.ReactRootViewTagGenerator; import com.facebook.react.uimanager.StateWrapper; @@ -217,7 +218,9 @@ public class FabricUIManager implements UIManager, LifecycleEventListener { getMinSize(widthMeasureSpec), getMaxSize(widthMeasureSpec), getMinSize(heightMeasureSpec), - getMaxSize(heightMeasureSpec)); + getMaxSize(heightMeasureSpec), + I18nUtil.getInstance().isRTL(rootView.getContext()), + I18nUtil.getInstance().doLeftAndRightSwapInRTL(rootView.getContext())); return rootTag; } @@ -813,13 +816,14 @@ public class FabricUIManager implements UIManager, LifecycleEventListener { if (ENABLE_FABRIC_LOGS) { FLog.d(TAG, "Updating Root Layout Specs"); } - mBinding.setConstraints( rootTag, getMinSize(widthMeasureSpec), getMaxSize(widthMeasureSpec), getMinSize(heightMeasureSpec), - getMaxSize(heightMeasureSpec)); + getMaxSize(heightMeasureSpec), + I18nUtil.getInstance().isRTL(mReactContextForRootTag.get(rootTag)), + I18nUtil.getInstance().doLeftAndRightSwapInRTL(mReactContextForRootTag.get(rootTag))); } public void receiveEvent(int reactTag, String eventName, @Nullable WritableMap params) { 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 daf70b9afb6..908b0e73eab 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 @@ -101,7 +101,9 @@ void Binding::startSurfaceWithConstraints( jfloat minWidth, jfloat maxWidth, jfloat minHeight, - jfloat maxHeight) { + jfloat maxHeight, + jboolean isRTL, + jboolean doLeftAndRightSwapInRTL) { SystraceSection s("FabricUIManagerBinding::startSurfaceWithConstraints"); LOG(WARNING) << "Binding::startSurfaceWithConstraints() was called (address: " @@ -120,9 +122,12 @@ void Binding::startSurfaceWithConstraints( LayoutContext context; context.pointScaleFactor = {pointScaleFactor_}; + context.swapLeftAndRightInRTL = doLeftAndRightSwapInRTL; LayoutConstraints constraints = {}; constraints.minimumSize = minimumSize; constraints.maximumSize = maximumSize; + constraints.layoutDirection = + isRTL ? LayoutDirection::RightToLeft : LayoutDirection::LeftToRight; scheduler->startSurface( surfaceId, @@ -167,7 +172,9 @@ void Binding::setConstraints( jfloat minWidth, jfloat maxWidth, jfloat minHeight, - jfloat maxHeight) { + jfloat maxHeight, + jboolean isRTL, + jboolean doLeftAndRightSwapInRTL) { SystraceSection s("FabricUIManagerBinding::setConstraints"); std::shared_ptr scheduler = getScheduler(); @@ -183,9 +190,12 @@ void Binding::setConstraints( LayoutContext context; context.pointScaleFactor = {pointScaleFactor_}; + context.swapLeftAndRightInRTL = doLeftAndRightSwapInRTL; LayoutConstraints constraints = {}; constraints.minimumSize = minimumSize; constraints.maximumSize = maximumSize; + constraints.layoutDirection = + isRTL ? LayoutDirection::RightToLeft : LayoutDirection::LeftToRight; scheduler->constraintSurfaceLayout(surfaceId, constraints, context); } 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 ddd87cd11f4..1145d7ea8f0 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 @@ -38,7 +38,9 @@ class Binding : public jni::HybridClass, public SchedulerDelegate { jfloat minWidth, jfloat maxWidth, jfloat minHeight, - jfloat maxHeight); + jfloat maxHeight, + jboolean isRTL, + jboolean doLeftAndRightSwapInRTL); static jni::local_ref initHybrid(jni::alias_ref); @@ -62,7 +64,9 @@ class Binding : public jni::HybridClass, public SchedulerDelegate { jfloat minWidth, jfloat maxWidth, jfloat minHeight, - jfloat maxHeight); + jfloat maxHeight, + jboolean isRTL, + jboolean doLeftAndRightSwapInRTL); void renderTemplateToSurface(jint surfaceId, jstring uiTemplate);