diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java b/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java index 4847b9b5d86..77ab6bb365b 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/textinput/ReactEditText.java @@ -555,6 +555,10 @@ public class ReactEditText extends AppCompatEditText new SpannableStringBuilder(reactTextUpdate.getText()); manageSpans(spannableStringBuilder, reactTextUpdate.mContainsMultipleFragments); + + // Mitigation for https://github.com/facebook/react-native/issues/35936 (S318090) + stripAbsoluteSizeSpans(spannableStringBuilder); + mContainsImages = reactTextUpdate.containsImages(); // When we update text, we trigger onChangeText code that will @@ -628,6 +632,27 @@ public class ReactEditText extends AppCompatEditText } } + private void stripAbsoluteSizeSpans(SpannableStringBuilder sb) { + // We have already set a font size on the EditText itself. We can safely remove sizing spans + // which are the same as the set font size, and not otherwise overlapped. + final int effectiveFontSize = mTextAttributes.getEffectiveFontSize(); + ReactAbsoluteSizeSpan[] spans = sb.getSpans(0, sb.length(), ReactAbsoluteSizeSpan.class); + + outerLoop: + for (ReactAbsoluteSizeSpan span : spans) { + ReactAbsoluteSizeSpan[] overlappingSpans = + sb.getSpans(sb.getSpanStart(span), sb.getSpanEnd(span), ReactAbsoluteSizeSpan.class); + + for (ReactAbsoluteSizeSpan overlappingSpan : overlappingSpans) { + if (span.getSize() != effectiveFontSize) { + continue outerLoop; + } + } + + sb.removeSpan(span); + } + } + private static boolean sameTextForSpan( final Editable oldText, final SpannableStringBuilder newText,