Skip to content

Commit 3f5a7fc

Browse files
NickGerlemanfacebook-github-bot
authored andcommitted
Minimize EditText Spans 6/9: letterSpacing (facebook#36548)
Summary: Pull Request resolved: facebook#36548 This is part of a series of changes to minimize the number of spans committed to EditText, as a mitigation for platform issues on Samsung devices. See this [GitHub thread]( facebook#35936 (comment)) for greater context on the platform behavior. This change lets us set `letterSpacing` on the EditText instead of using our custom span. Changelog: [Android][Fixed] - Minimize EditText Spans 6/N: letterSpacing Reviewed By: rshest Differential Revision: D44240777 fbshipit-source-id: 597f4fe2cea85d8f726725db2f719433fd2b1a13
1 parent 8190f33 commit 3f5a7fc

File tree

2 files changed

+26
-1
lines changed

2 files changed

+26
-1
lines changed

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ public void updateMeasureState(TextPaint paint) {
3737
apply(paint);
3838
}
3939

40+
public float getSpacing() {
41+
return mLetterSpacing;
42+
}
43+
4044
private void apply(TextPaint paint) {
4145
if (!Float.isNaN(mLetterSpacing)) {
4246
paint.setLetterSpacing(mLetterSpacing);

packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -726,6 +726,18 @@ public boolean test(ReactUnderlineSpan span) {
726726
return (getPaintFlags() & Paint.UNDERLINE_TEXT_FLAG) != 0;
727727
}
728728
});
729+
730+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
731+
stripSpansOfKind(
732+
sb,
733+
CustomLetterSpacingSpan.class,
734+
new SpanPredicate<CustomLetterSpacingSpan>() {
735+
@Override
736+
public boolean test(CustomLetterSpacingSpan span) {
737+
return span.getSpacing() == mTextAttributes.getEffectiveLetterSpacing();
738+
}
739+
});
740+
}
729741
}
730742

731743
private <T> void stripSpansOfKind(
@@ -780,6 +792,13 @@ private void restoreStyleEquivalentSpans(SpannableStringBuilder workingText) {
780792
spans.add(new ReactUnderlineSpan());
781793
}
782794

795+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
796+
float effectiveLetterSpacing = mTextAttributes.getEffectiveLetterSpacing();
797+
if (!Float.isNaN(effectiveLetterSpacing)) {
798+
spans.add(new CustomLetterSpacingSpan(effectiveLetterSpacing));
799+
}
800+
}
801+
783802
for (Object span : spans) {
784803
workingText.setSpan(span, 0, workingText.length(), spanFlags);
785804
}
@@ -1137,7 +1156,9 @@ protected void applyTextAttributes() {
11371156

11381157
float effectiveLetterSpacing = mTextAttributes.getEffectiveLetterSpacing();
11391158
if (!Float.isNaN(effectiveLetterSpacing)) {
1140-
setLetterSpacing(effectiveLetterSpacing);
1159+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
1160+
setLetterSpacing(effectiveLetterSpacing);
1161+
}
11411162
}
11421163
}
11431164

0 commit comments

Comments
 (0)