Skip to content

Commit

Permalink
Implement onTextLayout on Text component.
Browse files Browse the repository at this point in the history
Summary:
Changelog: [Internal]

Add `Text.onTextLayout` implementation to Android's Text component.

Reviewed By: JoshuaGross

Differential Revision: D23782311

fbshipit-source-id: fdb5709aaf68efee0ab895a6661396f92cfc768a
  • Loading branch information
sammy-SC authored and facebook-github-bot committed Sep 22, 2020
1 parent c1af56d commit a650696
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 2 deletions.
1 change: 1 addition & 0 deletions ReactAndroid/src/main/java/com/facebook/react/fabric/BUCK
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ rn_android_library(
react_native_target("java/com/facebook/react/common:common"),
react_native_target("java/com/facebook/react/uimanager:uimanager"),
react_native_target("java/com/facebook/react/views/view:view"),
react_native_target("java/com/facebook/react/views/text:text"),
react_native_target("java/com/facebook/react/touch:touch"),
],
exported_deps = [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@
import com.facebook.infer.annotation.ThreadConfined;
import com.facebook.proguard.annotations.DoNotStrip;
import com.facebook.react.ReactRootView;
import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.LifecycleEventListener;
import com.facebook.react.bridge.NativeArray;
import com.facebook.react.bridge.NativeMap;
Expand Down Expand Up @@ -76,6 +75,7 @@
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.PixelUtil;
import com.facebook.react.uimanager.ReactRoot;
import com.facebook.react.uimanager.ReactRootViewTagGenerator;
import com.facebook.react.uimanager.StateWrapper;
Expand All @@ -84,6 +84,7 @@
import com.facebook.react.uimanager.ViewManagerPropertyUpdater;
import com.facebook.react.uimanager.ViewManagerRegistry;
import com.facebook.react.uimanager.events.EventDispatcher;
import com.facebook.react.views.text.TextLayoutManager;
import com.facebook.systrace.Systrace;
import java.util.ArrayDeque;
import java.util.ArrayList;
Expand Down Expand Up @@ -449,7 +450,12 @@ private MountItem createBatchMountItem(
@SuppressWarnings("unused")
private NativeArray measureLines(
ReadableMap attributedString, ReadableMap paragraphAttributes, float width, float height) {
return (NativeArray) Arguments.createArray();
return (NativeArray)
TextLayoutManager.measureLines(
mReactApplicationContext,
attributedString,
paragraphAttributes,
PixelUtil.toPixelFromDIP(width));
}

@DoNotStrip
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.bridge.ReadableNativeMap;
import com.facebook.react.bridge.WritableArray;
import com.facebook.react.config.ReactFeatureFlags;
import com.facebook.react.uimanager.PixelUtil;
import com.facebook.react.uimanager.ReactAccessibilityDelegate;
Expand Down Expand Up @@ -519,6 +520,29 @@ public static long measureText(
return YogaMeasureOutput.make(widthInSP, heightInSP);
}

public static WritableArray measureLines(
@NonNull Context context,
ReadableMap attributedString,
ReadableMap paragraphAttributes,
float width) {
TextPaint textPaint = sTextPaintInstance;
Spannable text = getOrCreateSpannableForText(context, attributedString, null);
BoringLayout.Metrics boring = BoringLayout.isBoring(text, textPaint);

int textBreakStrategy =
TextAttributeProps.getTextBreakStrategy(
paragraphAttributes.getString(TEXT_BREAK_STRATEGY_KEY));
boolean includeFontPadding =
paragraphAttributes.hasKey(INCLUDE_FONT_PADDING_KEY)
? paragraphAttributes.getBoolean(INCLUDE_FONT_PADDING_KEY)
: DEFAULT_INCLUDE_FONT_PADDING;

Layout layout =
createLayout(
text, boring, width, YogaMeasureMode.EXACTLY, includeFontPadding, textBreakStrategy);
return FontMetricsUtil.getFontMetrics(text, layout, sTextPaintInstance, context);
}

// TODO T31905686: This class should be private
public static class SetSpanOperation {
protected int start, end;
Expand Down

0 comments on commit a650696

Please sign in to comment.