From d07ab35bfbdfcddd9d26840842335a7d241f77e3 Mon Sep 17 00:00:00 2001 From: David Vacca Date: Tue, 2 Jul 2019 14:40:01 -0700 Subject: [PATCH] Expose LayoutDirection to Fabric android Summary: This diff exposes LayoutDirection as part of UpdateLayoutMountItem Reviewed By: JoshuaGross Differential Revision: D16060521 fbshipit-source-id: 163bf2a0bdca62dcecb03a8aaa2f4bf595b18c8f --- .../react/fabric/FabricUIManager.java | 5 ++-- .../com/facebook/react/fabric/jni/Binding.cpp | 6 ++-- .../mountitems/UpdateLayoutMountItem.java | 30 +++++++++++++++++-- .../views/text/ReactTextViewManager.java | 2 +- ReactCommon/fabric/core/conversions.h | 11 +++++++ 5 files changed, 47 insertions(+), 7 deletions(-) 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 98e7296546b..4786eec204b 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java @@ -265,8 +265,9 @@ public class FabricUIManager implements UIManager, LifecycleEventListener { @DoNotStrip @SuppressWarnings("unused") - private MountItem updateLayoutMountItem(int reactTag, int x, int y, int width, int height) { - return new UpdateLayoutMountItem(reactTag, x, y, width, height); + private MountItem updateLayoutMountItem( + int reactTag, int x, int y, int width, int height, int layoutDirection) { + return new UpdateLayoutMountItem(reactTag, x, y, width, height, layoutDirection); } @DoNotStrip 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 9a6556372c0..4b54b40b364 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 @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -315,7 +316,7 @@ local_ref createUpdateLayoutMountItem( oldChildShadowView.layoutMetrics != newChildShadowView.layoutMetrics) { static auto updateLayoutInstruction = jni::findClassStatic(UIManagerJavaDescriptor) - ->getMethod(jint, jint, jint, jint, jint)>( + ->getMethod(jint, jint, jint, jint, jint, jint)>( "updateLayoutMountItem"); auto layoutMetrics = newChildShadowView.layoutMetrics; auto pointScaleFactor = layoutMetrics.pointScaleFactor; @@ -325,8 +326,9 @@ local_ref createUpdateLayoutMountItem( int y = round(frame.origin.y * pointScaleFactor); int w = round(frame.size.width * pointScaleFactor); int h = round(frame.size.height * pointScaleFactor); + auto layoutDirection = toInt(newChildShadowView.layoutMetrics.layoutDirection); return updateLayoutInstruction( - javaUIManager, newChildShadowView.tag, x, y, w, h); + javaUIManager, newChildShadowView.tag, x, y, w, h, layoutDirection); } return nullptr; diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/mountitems/UpdateLayoutMountItem.java b/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/mountitems/UpdateLayoutMountItem.java index 2beee834ccf..f89bb61506c 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/mountitems/UpdateLayoutMountItem.java +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/mountitems/UpdateLayoutMountItem.java @@ -6,6 +6,9 @@ */ package com.facebook.react.fabric.mounting.mountitems; +import android.annotation.TargetApi; +import android.os.Build; +import android.util.LayoutDirection; import com.facebook.react.fabric.mounting.MountingManager; public class UpdateLayoutMountItem implements MountItem { @@ -15,13 +18,30 @@ public class UpdateLayoutMountItem implements MountItem { private final int mY; private final int mWidth; private final int mHeight; + private final int mLayoutDirection; - public UpdateLayoutMountItem(int reactTag, int x, int y, int width, int height) { + public UpdateLayoutMountItem( + int reactTag, int x, int y, int width, int height, int layoutDirection) { mReactTag = reactTag; mX = x; mY = y; mWidth = width; mHeight = height; + mLayoutDirection = convertLayoutDirection(layoutDirection); + } + + @TargetApi(Build.VERSION_CODES.KITKAT) + private int convertLayoutDirection(int layoutDirection) { + switch (layoutDirection) { + case 0: + return LayoutDirection.INHERIT; + case 1: + return LayoutDirection.LTR; + case 2: + return LayoutDirection.RTL; + default: + throw new IllegalArgumentException("Unsupported layout direction: " + layoutDirection); + } } @Override @@ -45,6 +65,10 @@ public class UpdateLayoutMountItem implements MountItem { return mWidth; } + public int getLayoutDirection() { + return mLayoutDirection; + } + @Override public String toString() { return "UpdateLayoutMountItem [" @@ -56,6 +80,8 @@ public class UpdateLayoutMountItem implements MountItem { + " - height: " + mHeight + " - width: " - + mWidth; + + mWidth + + " - layoutDirection: " + + +mLayoutDirection; } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextViewManager.java b/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextViewManager.java index 7eab1eaf6cb..1e44afd2c64 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextViewManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextViewManager.java @@ -96,7 +96,7 @@ public class ReactTextViewManager textViewProps.getTopPadding(), textViewProps.getEndPadding(), textViewProps.getBottomPadding(), - textViewProps.getTextAlign(), + 0, textBreakStrategy, justificationMode); } diff --git a/ReactCommon/fabric/core/conversions.h b/ReactCommon/fabric/core/conversions.h index d9066d8a514..05ced94cc04 100644 --- a/ReactCommon/fabric/core/conversions.h +++ b/ReactCommon/fabric/core/conversions.h @@ -23,6 +23,17 @@ inline std::string toString(const LayoutDirection &layoutDirection) { } } +inline int toInt(const LayoutDirection &layoutDirection) { + switch (layoutDirection) { + case LayoutDirection::Undefined: + return 0; + case LayoutDirection::LeftToRight: + return 1; + case LayoutDirection::RightToLeft: + return 2; + } +} + inline std::string toString(const DisplayType &displayType) { switch (displayType) { case DisplayType::None: