From 8bc7ad605daa626ad6f7103c543e615a84e5452a Mon Sep 17 00:00:00 2001 From: David Vacca Date: Tue, 25 Feb 2020 12:51:55 -0800 Subject: [PATCH] Extend Fabric measure function to support attachment positions parameters Summary: This diff changes the Fabric measure API in order to support attachments parameters changelog: [internal] Reviewed By: JoshuaGross Differential Revision: D20087252 fbshipit-source-id: 20e1526aaa3695d38d0805416df8a32adb8296ad --- .../react/fabric/FabricUIManager.java | 29 ++++++++++++++++++- .../fabric/mounting/MountingManager.java | 14 +++++++-- .../facebook/react/uimanager/ViewManager.java | 25 +++++++++++++++- .../views/slider/ReactSliderManager.java | 3 +- .../views/switchview/ReactSwitchManager.java | 3 +- .../views/text/ReactTextViewManager.java | 3 +- 6 files changed, 70 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 a5d30309eff..b77e2bbbe78 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java @@ -429,6 +429,32 @@ public class FabricUIManager implements UIManager, LifecycleEventListener { float maxWidth, float minHeight, float maxHeight) { + return measure( + rootTag, + componentName, + localData, + props, + state, + minWidth, + maxWidth, + minHeight, + maxHeight, + null); + } + + @DoNotStrip + @SuppressWarnings("unused") + private long measure( + int rootTag, + String componentName, + ReadableMap localData, + ReadableMap props, + ReadableMap state, + float minWidth, + float maxWidth, + float minHeight, + float maxHeight, + @Nullable int[] attachmentsPositions) { ReactContext context = rootTag < 0 ? mReactApplicationContext : mReactContextForRootTag.get(rootTag); return mMountingManager.measure( @@ -440,7 +466,8 @@ public class FabricUIManager implements UIManager, LifecycleEventListener { getYogaSize(minWidth, maxWidth), getYogaMeasureMode(minWidth, maxWidth), getYogaSize(minHeight, maxHeight), - getYogaMeasureMode(minHeight, maxHeight)); + getYogaMeasureMode(minHeight, maxHeight), + attachmentsPositions); } @Override diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/MountingManager.java b/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/MountingManager.java index 4bcda7a343a..bcae8b9fb52 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/MountingManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/MountingManager.java @@ -518,11 +518,21 @@ public class MountingManager { float width, @NonNull YogaMeasureMode widthMode, float height, - @NonNull YogaMeasureMode heightMode) { + @NonNull YogaMeasureMode heightMode, + @Nullable int[] attachmentsPositions) { return mViewManagerRegistry .get(componentName) - .measure(context, localData, props, state, width, widthMode, height, heightMode); + .measure( + context, + localData, + props, + state, + width, + widthMode, + height, + heightMode, + attachmentsPositions); } @AnyThread diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewManager.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewManager.java index f86028e321b..bd9bfb7b4f1 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewManager.java @@ -287,6 +287,28 @@ public abstract class ViewManager return null; } + /** + * Subclasses can override this method to implement custom measure functions for the ViewManager + * + * @param context {@link com.facebook.react.bridge.ReactContext} used for the view. + * @param localData {@link ReadableMap} containing "local data" defined in C++ + * @param props {@link ReadableMap} containing JS props + * @param state {@link ReadableMap} containing state defined in C++ + * @param width width of the view (usually zero) + * @param widthMode widthMode used during calculation of layout + * @param height height of the view (usually zero) + * @param heightMode widthMode used during calculation of layout + * @param attachmentsPositions {@link int[]} array containing 2x times the amount of attachments + * of the view. An attachment represents the position of an inline view that needs to be + * rendered inside a component and it requires the content of the parent view in order to be + * positioned. This array is meant to be used by the platform to RETURN the position of each + * attachment, as a result of the calculation of layout. (e.g. this array is used to measure + * inlineViews that are rendered inside Text components). On most of the components this array + * will be contain a null value. + *

Even values will represent the TOP of each attachment, Odd values represent the LEFT of + * each attachment. + * @return result of calculation of layout for the arguments received as a parameter. + */ public long measure( Context context, ReadableMap localData, @@ -295,7 +317,8 @@ public abstract class ViewManager float width, YogaMeasureMode widthMode, float height, - YogaMeasureMode heightMode) { + YogaMeasureMode heightMode, + @Nullable int[] attachmentsPositions) { return 0; } diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/slider/ReactSliderManager.java b/ReactAndroid/src/main/java/com/facebook/react/views/slider/ReactSliderManager.java index 312c2ddff0c..9215864a9c6 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/slider/ReactSliderManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/slider/ReactSliderManager.java @@ -250,7 +250,8 @@ public class ReactSliderManager extends SimpleViewManager float width, YogaMeasureMode widthMode, float height, - YogaMeasureMode heightMode) { + YogaMeasureMode heightMode, + @Nullable int[] attachmentsPositions) { SeekBar reactSlider = new ReactSlider(context, null, STYLE); final int spec = View.MeasureSpec.makeMeasureSpec( diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/switchview/ReactSwitchManager.java b/ReactAndroid/src/main/java/com/facebook/react/views/switchview/ReactSwitchManager.java index 17e0df0ad47..bd5336ad6b9 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/switchview/ReactSwitchManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/switchview/ReactSwitchManager.java @@ -203,7 +203,8 @@ public class ReactSwitchManager extends SimpleViewManager float width, YogaMeasureMode widthMode, float height, - YogaMeasureMode heightMode) { + YogaMeasureMode heightMode, + @Nullable int[] attachmentsPositions) { ReactSwitch view = new ReactSwitch(context); view.setShowText(false); int measureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); 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 f239fd6506d..e198a472a71 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 @@ -145,7 +145,8 @@ public class ReactTextViewManager float width, YogaMeasureMode widthMode, float height, - YogaMeasureMode heightMode) { + YogaMeasureMode heightMode, + @Nullable int[] attachmentsPositions) { return TextLayoutManager.measureText( context,