Skip to content

Commit faebee4

Browse files
NickGerlemanmeta-codesync[bot]
authored andcommitted
Cleanup Paper Handling of Inline Images and Padding in Text Components (#55437)
Summary: Pull Request resolved: #55437 This deletes some Paper specific paths in Text and image code, related to inline view handling (done in native component layer in Paper), and how padding is set. It also changed `Spannable` to `Spanned` in a couple places, in preparation of reusing `ReactTextViewManager` with state generated by Facsimile (for selectable text). I left the actions performed by Paper ShadowNode as something stublike, since that code should never be executed. `ReactTextUpdate` is made internal, since the shape of native component state is subject to change. Changelog: [Android][Breaking] - Make ReactTextUpdate internal Reviewed By: javache Differential Revision: D92459725 fbshipit-source-id: e1bc0f9a19adbf296fb1873913f9db319eb8b3f9
1 parent 66c603f commit faebee4

8 files changed

Lines changed: 16 additions & 402 deletions

File tree

packages/react-native/ReactAndroid/api/ReactAndroid.api

Lines changed: 0 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -6133,44 +6133,17 @@ public final class com/facebook/react/views/text/ReactTextShadowNode : com/faceb
61336133
public final fun setShouldNotifyOnTextLayout (Z)V
61346134
}
61356135

6136-
public final class com/facebook/react/views/text/ReactTextUpdate {
6137-
public static final field Companion Lcom/facebook/react/views/text/ReactTextUpdate$Companion;
6138-
public fun <init> (Landroid/text/Spannable;IZFFFFI)V
6139-
public fun <init> (Landroid/text/Spannable;IZFFFFIII)V
6140-
public fun <init> (Landroid/text/Spannable;IZIII)V
6141-
public static final fun buildReactTextUpdateFromState (Landroid/text/Spannable;IIII)Lcom/facebook/react/views/text/ReactTextUpdate;
6142-
public final fun containsImages ()Z
6143-
public final fun getContainsImages ()Z
6144-
public final fun getJsEventCounter ()I
6145-
public final fun getJustificationMode ()I
6146-
public final fun getPaddingBottom ()F
6147-
public final fun getPaddingLeft ()F
6148-
public final fun getPaddingRight ()F
6149-
public final fun getPaddingTop ()F
6150-
public final fun getText ()Landroid/text/Spannable;
6151-
public final fun getTextAlign ()I
6152-
public final fun getTextBreakStrategy ()I
6153-
}
6154-
6155-
public final class com/facebook/react/views/text/ReactTextUpdate$Companion {
6156-
public final fun buildReactTextUpdateFromState (Landroid/text/Spannable;IIII)Lcom/facebook/react/views/text/ReactTextUpdate;
6157-
}
6158-
61596136
public class com/facebook/react/views/text/ReactTextView : androidx/appcompat/widget/AppCompatTextView, com/facebook/react/uimanager/ReactCompoundView {
61606137
public fun <init> (Landroid/content/Context;)V
61616138
protected fun dispatchHoverEvent (Landroid/view/MotionEvent;)Z
61626139
public fun dispatchKeyEvent (Landroid/view/KeyEvent;)Z
61636140
public fun getSpanned ()Landroid/text/Spannable;
61646141
public fun hasOverlappingRendering ()Z
6165-
public fun invalidateDrawable (Landroid/graphics/drawable/Drawable;)V
61666142
public fun onAttachedToWindow ()V
6167-
public fun onDetachedFromWindow ()V
61686143
protected fun onDraw (Landroid/graphics/Canvas;)V
6169-
public fun onFinishTemporaryDetach ()V
61706144
public final fun onFocusChanged (ZILandroid/graphics/Rect;)V
61716145
protected fun onLayout (ZIIII)V
61726146
protected fun onMeasure (II)V
6173-
public fun onStartTemporaryDetach ()V
61746147
public fun reactTagForTouch (FF)I
61756148
public fun setAdjustFontSizeToFit (Z)V
61766149
public fun setBackgroundColor (I)V
@@ -6193,7 +6166,6 @@ public class com/facebook/react/views/text/ReactTextView : androidx/appcompat/wi
61936166
public fun setText (Lcom/facebook/react/views/text/ReactTextUpdate;)V
61946167
public fun setTextIsSelectable (Z)V
61956168
public fun updateView ()V
6196-
protected fun verifyDrawable (Landroid/graphics/drawable/Drawable;)Z
61976169
}
61986170

61996171
public final class com/facebook/react/views/text/ReactTextViewManager : com/facebook/react/views/text/ReactTextAnchorViewManager, com/facebook/react/uimanager/IViewManagerWithChildren, com/facebook/react/views/text/ReactTextViewManagerCallback {
@@ -6344,7 +6316,6 @@ public class com/facebook/react/views/textinput/ReactEditText : androidx/appcomp
63446316
public final fun canUpdateWithEventCount (I)Z
63456317
protected final fun finalize ()V
63466318
public final fun getBorderColor (I)I
6347-
protected final fun getContainsImages ()Z
63486319
public final fun getDisableFullscreenUI ()Z
63496320
public final fun getDragAndDropFilter ()Ljava/util/List;
63506321
protected final fun getNativeEventCount ()I
@@ -6354,27 +6325,21 @@ public class com/facebook/react/views/textinput/ReactEditText : androidx/appcomp
63546325
public final fun getSubmitBehavior ()Ljava/lang/String;
63556326
protected final fun hideSoftKeyboard ()V
63566327
public final fun incrementAndGetEventCounter ()I
6357-
public fun invalidateDrawable (Landroid/graphics/drawable/Drawable;)V
63586328
public fun isLayoutRequested ()Z
63596329
protected final fun isSettingTextFromJS ()Z
63606330
protected final fun isSettingTextFromState ()Z
63616331
public final fun maybeSetSelection (III)V
6362-
public final fun maybeSetTextFromJS (Lcom/facebook/react/views/text/ReactTextUpdate;)V
6363-
public final fun maybeSetTextFromState (Lcom/facebook/react/views/text/ReactTextUpdate;)V
63646332
public final fun maybeUpdateTypeface ()V
63656333
public fun onAttachedToWindow ()V
63666334
public fun onConfigurationChanged (Landroid/content/res/Configuration;)V
63676335
public fun onCreateInputConnection (Landroid/view/inputmethod/EditorInfo;)Landroid/view/inputmethod/InputConnection;
6368-
public fun onDetachedFromWindow ()V
63696336
public fun onDragEvent (Landroid/view/DragEvent;)Z
63706337
public fun onDraw (Landroid/graphics/Canvas;)V
6371-
public fun onFinishTemporaryDetach ()V
63726338
protected fun onFocusChanged (ZILandroid/graphics/Rect;)V
63736339
public fun onKeyUp (ILandroid/view/KeyEvent;)Z
63746340
protected fun onLayout (ZIIII)V
63756341
protected fun onScrollChanged (IIII)V
63766342
protected fun onSelectionChanged (II)V
6377-
public fun onStartTemporaryDetach ()V
63786343
public fun onTextContextMenuItem (I)Z
63796344
public fun onTouchEvent (Landroid/view/MotionEvent;)Z
63806345
public fun removeTextChangedListener (Landroid/text/TextWatcher;)V
@@ -6387,7 +6352,6 @@ public class com/facebook/react/views/textinput/ReactEditText : androidx/appcomp
63876352
public final fun setBorderRadius (FI)V
63886353
public final fun setBorderStyle (Ljava/lang/String;)V
63896354
public final fun setBorderWidth (IF)V
6390-
protected final fun setContainsImages (Z)V
63916355
public final fun setContentSizeWatcher (Lcom/facebook/react/views/textinput/ContentSizeWatcher;)V
63926356
public final fun setContextMenuHidden (Z)V
63936357
public final fun setDisableFullscreenUI (Z)V
@@ -6418,7 +6382,6 @@ public class com/facebook/react/views/textinput/ReactEditText : androidx/appcomp
64186382
public final fun shouldBlurOnReturn ()Z
64196383
public final fun shouldSubmitOnReturn ()Z
64206384
protected final fun showSoftKeyboard ()Z
6421-
protected fun verifyDrawable (Landroid/graphics/drawable/Drawable;)Z
64226385
}
64236386

64246387
public final class com/facebook/react/views/textinput/ReactEditText$Companion {

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextUpdate.kt

Lines changed: 4 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -7,80 +7,20 @@
77

88
package com.facebook.react.views.text
99

10-
import android.text.Layout
11-
import android.text.Spannable
12-
import com.facebook.react.common.ReactConstants
10+
import android.text.Spanned
1311

1412
/** Class that contains the data needed for a text update. Used by both <Text/> and <TextInput/>. */
15-
public class ReactTextUpdate(
16-
public val text: Spannable,
13+
internal class ReactTextUpdate(
14+
public val text: Spanned,
1715
public val jsEventCounter: Int,
18-
public val containsImages: Boolean,
19-
public val paddingLeft: Float,
20-
public val paddingTop: Float,
21-
public val paddingRight: Float,
22-
public val paddingBottom: Float,
2316
public val textAlign: Int,
2417
public val textBreakStrategy: Int,
2518
public val justificationMode: Int,
2619
) {
27-
28-
/**
29-
* @deprecated Use a non-deprecated constructor for ReactTextUpdate instead. This one remains
30-
* because it's being used by a unit test that isn't currently open source.
31-
*/
32-
public constructor(
33-
text: Spannable,
34-
jsEventCounter: Int,
35-
containsImages: Boolean,
36-
paddingStart: Float,
37-
paddingTop: Float,
38-
paddingEnd: Float,
39-
paddingBottom: Float,
40-
textAlign: Int,
41-
) : this(
42-
text,
43-
jsEventCounter,
44-
containsImages,
45-
paddingStart,
46-
paddingTop,
47-
paddingEnd,
48-
paddingBottom,
49-
textAlign,
50-
Layout.BREAK_STRATEGY_HIGH_QUALITY,
51-
Layout.JUSTIFICATION_MODE_NONE,
52-
)
53-
54-
public constructor(
55-
text: Spannable,
56-
jsEventCounter: Int,
57-
containsImages: Boolean,
58-
textAlign: Int,
59-
textBreakStrategy: Int,
60-
justificationMode: Int,
61-
) : this(
62-
text,
63-
jsEventCounter,
64-
containsImages,
65-
ReactConstants.UNSET.toFloat(),
66-
ReactConstants.UNSET.toFloat(),
67-
ReactConstants.UNSET.toFloat(),
68-
ReactConstants.UNSET.toFloat(),
69-
textAlign,
70-
textBreakStrategy,
71-
justificationMode,
72-
)
73-
74-
@Deprecated(
75-
"This is just for backwards compatibility and will be removed some time in the future",
76-
ReplaceWith("containsImages"),
77-
)
78-
public fun containsImages(): Boolean = containsImages
79-
8020
public companion object {
8121
@JvmStatic
8222
public fun buildReactTextUpdateFromState(
83-
text: Spannable,
23+
text: Spanned,
8424
jsEventCounter: Int,
8525
textAlign: Int,
8626
textBreakStrategy: Int,
@@ -89,7 +29,6 @@ public class ReactTextUpdate(
8929
ReactTextUpdate(
9030
text,
9131
jsEventCounter,
92-
false,
9332
textAlign,
9433
textBreakStrategy,
9534
justificationMode,

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextView.java

Lines changed: 7 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@
1010
import android.content.Context;
1111
import android.graphics.Canvas;
1212
import android.graphics.Rect;
13-
import android.graphics.drawable.Drawable;
1413
import android.os.Build;
1514
import android.text.Layout;
1615
import android.text.Spannable;
16+
import android.text.SpannableString;
1717
import android.text.Spanned;
1818
import android.text.TextUtils;
1919
import android.text.method.LinkMovementMethod;
@@ -53,7 +53,6 @@
5353
import com.facebook.react.uimanager.style.LogicalEdge;
5454
import com.facebook.react.uimanager.style.Overflow;
5555
import com.facebook.react.views.text.internal.span.ReactTagSpan;
56-
import com.facebook.react.views.text.internal.span.TextInlineImageSpan;
5756
import com.facebook.react.views.text.internal.span.TextInlineViewPlaceholderSpan;
5857
import com.facebook.yoga.YogaMeasureMode;
5958

@@ -66,7 +65,6 @@ public class ReactTextView extends AppCompatTextView implements ReactCompoundVie
6665
// https://github.com/aosp-mirror/platform_frameworks_base/blob/master/core/java/android/widget/TextView.java#L854
6766
private static final int DEFAULT_GRAVITY = Gravity.TOP | Gravity.START;
6867

69-
private boolean mContainsImages;
7068
private int mNumberOfLines;
7169
private @Nullable TextUtils.TruncateAt mEllipsizeLocation;
7270
private boolean mAdjustsFontSizeToFit;
@@ -377,38 +375,21 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
377375

378376
public void setText(ReactTextUpdate update) {
379377
try (SystraceSection s = new SystraceSection("ReactTextView.setText(ReactTextUpdate)")) {
380-
mContainsImages = update.containsImages();
381378
// Android's TextView crashes when it tries to relayout if LayoutParams are
382379
// null; explicitly set the LayoutParams to prevent this crash. See:
383380
// https://github.com/facebook/react-native/pull/7011
384381
if (getLayoutParams() == null) {
385382
setLayoutParams(EMPTY_LAYOUT_PARAMS);
386383
}
387-
Spannable spannable = update.getText();
384+
Spanned spanned = update.getText();
388385
if (mLinkifyMaskType > 0) {
389-
Linkify.addLinks(spannable, mLinkifyMaskType);
386+
if (!(spanned instanceof Spannable)) {
387+
spanned = new SpannableString(spanned);
388+
}
389+
Linkify.addLinks((Spannable) spanned, mLinkifyMaskType);
390390
setMovementMethod(LinkMovementMethod.getInstance());
391391
}
392-
setText(spannable);
393-
float paddingLeft = update.getPaddingLeft();
394-
float paddingTop = update.getPaddingTop();
395-
float paddingRight = update.getPaddingRight();
396-
float paddingBottom = update.getPaddingBottom();
397-
398-
// In Fabric padding is set by the update of Layout Metrics and not as part of the "setText"
399-
// operation
400-
// TODO T56559197: remove this condition when we migrate 100% to Fabric
401-
if (paddingLeft != ReactConstants.UNSET
402-
&& paddingTop != ReactConstants.UNSET
403-
&& paddingRight != ReactConstants.UNSET
404-
&& paddingBottom != ReactConstants.UNSET) {
405-
406-
setPadding(
407-
(int) Math.floor(paddingLeft),
408-
(int) Math.floor(paddingTop),
409-
(int) Math.floor(paddingRight),
410-
(int) Math.floor(paddingBottom));
411-
}
392+
setText(spanned);
412393

413394
int nextTextAlign = update.getTextAlign();
414395
if (nextTextAlign != getGravityHorizontal()) {
@@ -481,58 +462,6 @@ public int reactTagForTouch(float touchX, float touchY) {
481462
return target;
482463
}
483464

484-
@Override
485-
protected boolean verifyDrawable(Drawable drawable) {
486-
if (mContainsImages && getText() instanceof Spanned) {
487-
Spanned text = (Spanned) getText();
488-
TextInlineImageSpan[] spans = text.getSpans(0, text.length(), TextInlineImageSpan.class);
489-
for (TextInlineImageSpan span : spans) {
490-
if (span.getDrawable() == drawable) {
491-
return true;
492-
}
493-
}
494-
}
495-
return super.verifyDrawable(drawable);
496-
}
497-
498-
@Override
499-
public void invalidateDrawable(Drawable drawable) {
500-
if (mContainsImages && getText() instanceof Spanned) {
501-
Spanned text = (Spanned) getText();
502-
TextInlineImageSpan[] spans = text.getSpans(0, text.length(), TextInlineImageSpan.class);
503-
for (TextInlineImageSpan span : spans) {
504-
if (span.getDrawable() == drawable) {
505-
invalidate();
506-
}
507-
}
508-
}
509-
super.invalidateDrawable(drawable);
510-
}
511-
512-
@Override
513-
public void onDetachedFromWindow() {
514-
super.onDetachedFromWindow();
515-
if (mContainsImages && getText() instanceof Spanned) {
516-
Spanned text = (Spanned) getText();
517-
TextInlineImageSpan[] spans = text.getSpans(0, text.length(), TextInlineImageSpan.class);
518-
for (TextInlineImageSpan span : spans) {
519-
span.onDetachedFromWindow();
520-
}
521-
}
522-
}
523-
524-
@Override
525-
public void onStartTemporaryDetach() {
526-
super.onStartTemporaryDetach();
527-
if (mContainsImages && getText() instanceof Spanned) {
528-
Spanned text = (Spanned) getText();
529-
TextInlineImageSpan[] spans = text.getSpans(0, text.length(), TextInlineImageSpan.class);
530-
for (TextInlineImageSpan span : spans) {
531-
span.onStartTemporaryDetach();
532-
}
533-
}
534-
}
535-
536465
@Override
537466
public void setTextIsSelectable(boolean selectable) {
538467
mTextIsSelectable = selectable;
@@ -551,26 +480,6 @@ public void onAttachedToWindow() {
551480
} else {
552481
setTextIsSelectable(false);
553482
}
554-
555-
if (mContainsImages && getText() instanceof Spanned) {
556-
Spanned text = (Spanned) getText();
557-
TextInlineImageSpan[] spans = text.getSpans(0, text.length(), TextInlineImageSpan.class);
558-
for (TextInlineImageSpan span : spans) {
559-
span.onAttachedToWindow();
560-
}
561-
}
562-
}
563-
564-
@Override
565-
public void onFinishTemporaryDetach() {
566-
super.onFinishTemporaryDetach();
567-
if (mContainsImages && getText() instanceof Spanned) {
568-
Spanned text = (Spanned) getText();
569-
TextInlineImageSpan[] spans = text.getSpans(0, text.length(), TextInlineImageSpan.class);
570-
for (TextInlineImageSpan span : spans) {
571-
span.onFinishTemporaryDetach();
572-
}
573-
}
574483
}
575484

576485
@Override

0 commit comments

Comments
 (0)