diff --git a/ReactAndroid/src/main/java/com/facebook/react/flat/TextNodeRegion.java b/ReactAndroid/src/main/java/com/facebook/react/flat/TextNodeRegion.java index 7fd6c6256..434520209 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/flat/TextNodeRegion.java +++ b/ReactAndroid/src/main/java/com/facebook/react/flat/TextNodeRegion.java @@ -70,11 +70,14 @@ import android.text.Spanned; } if (mLayout != null) { - Spanned text = (Spanned) mLayout.getText(); - RCTRawText[] spans = text.getSpans(0, text.length(), RCTRawText.class); - for (RCTRawText span : spans) { - if (span.getReactTag() == tag) { - return true; + CharSequence text = mLayout.getText(); + if (text instanceof Spanned) { + Spanned spannedText = (Spanned) text; + RCTRawText[] spans = spannedText.getSpans(0, text.length(), RCTRawText.class); + for (RCTRawText span : spans) { + if (span.getReactTag() == tag) { + return true; + } } } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextView.java b/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextView.java index c324646ee..41ca82f4c 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextView.java @@ -76,7 +76,7 @@ public class ReactTextView extends TextView implements ReactCompoundView { @Override public int reactTagForTouch(float touchX, float touchY) { - Spanned text = (Spanned) getText(); + CharSequence text = getText(); int target = getId(); int x = (int) touchX; @@ -94,20 +94,21 @@ public class ReactTextView extends TextView implements ReactCompoundView { int lineEndX = (int) layout.getLineRight(line); // TODO(5966918): Consider extending touchable area for text spans by some DP constant - if (x >= lineStartX && x <= lineEndX) { + if (text instanceof Spanned && x >= lineStartX && x <= lineEndX) { + Spanned spannedText = (Spanned) text; int index = layout.getOffsetForHorizontal(line, x); // We choose the most inner span (shortest) containing character at the given index // if no such span can be found we will send the textview's react id as a touch handler // In case when there are more than one spans with same length we choose the last one // from the spans[] array, since it correspond to the most inner react element - ReactTagSpan[] spans = text.getSpans(index, index, ReactTagSpan.class); + ReactTagSpan[] spans = spannedText.getSpans(index, index, ReactTagSpan.class); if (spans != null) { int targetSpanTextLength = text.length(); for (int i = 0; i < spans.length; i++) { - int spanStart = text.getSpanStart(spans[i]); - int spanEnd = text.getSpanEnd(spans[i]); + int spanStart = spannedText.getSpanStart(spans[i]); + int spanEnd = spannedText.getSpanEnd(spans[i]); if (spanEnd > index && (spanEnd - spanStart) <= targetSpanTextLength) { target = spans[i].getReactTag(); targetSpanTextLength = (spanEnd - spanStart); 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 f2e8f968e..9f6c48ff4 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 @@ -525,8 +525,8 @@ public class ReactEditText extends EditText { @Override protected boolean verifyDrawable(Drawable drawable) { - if (mContainsImages && getText() instanceof Spanned) { - Spanned text = (Spanned) getText(); + if (mContainsImages) { + Spanned text = getText(); TextInlineImageSpan[] spans = text.getSpans(0, text.length(), TextInlineImageSpan.class); for (TextInlineImageSpan span : spans) { if (span.getDrawable() == drawable) { @@ -539,8 +539,8 @@ public class ReactEditText extends EditText { @Override public void invalidateDrawable(Drawable drawable) { - if (mContainsImages && getText() instanceof Spanned) { - Spanned text = (Spanned) getText(); + if (mContainsImages) { + Spanned text = getText(); TextInlineImageSpan[] spans = text.getSpans(0, text.length(), TextInlineImageSpan.class); for (TextInlineImageSpan span : spans) { if (span.getDrawable() == drawable) { @@ -554,8 +554,8 @@ public class ReactEditText extends EditText { @Override public void onDetachedFromWindow() { super.onDetachedFromWindow(); - if (mContainsImages && getText() instanceof Spanned) { - Spanned text = (Spanned) getText(); + if (mContainsImages) { + Spanned text = getText(); TextInlineImageSpan[] spans = text.getSpans(0, text.length(), TextInlineImageSpan.class); for (TextInlineImageSpan span : spans) { span.onDetachedFromWindow(); @@ -566,8 +566,8 @@ public class ReactEditText extends EditText { @Override public void onStartTemporaryDetach() { super.onStartTemporaryDetach(); - if (mContainsImages && getText() instanceof Spanned) { - Spanned text = (Spanned) getText(); + if (mContainsImages) { + Spanned text = getText(); TextInlineImageSpan[] spans = text.getSpans(0, text.length(), TextInlineImageSpan.class); for (TextInlineImageSpan span : spans) { span.onStartTemporaryDetach(); @@ -578,8 +578,8 @@ public class ReactEditText extends EditText { @Override public void onAttachedToWindow() { super.onAttachedToWindow(); - if (mContainsImages && getText() instanceof Spanned) { - Spanned text = (Spanned) getText(); + if (mContainsImages) { + Spanned text = getText(); TextInlineImageSpan[] spans = text.getSpans(0, text.length(), TextInlineImageSpan.class); for (TextInlineImageSpan span : spans) { span.onAttachedToWindow(); @@ -590,8 +590,8 @@ public class ReactEditText extends EditText { @Override public void onFinishTemporaryDetach() { super.onFinishTemporaryDetach(); - if (mContainsImages && getText() instanceof Spanned) { - Spanned text = (Spanned) getText(); + if (mContainsImages) { + Spanned text = getText(); TextInlineImageSpan[] spans = text.getSpans(0, text.length(), TextInlineImageSpan.class); for (TextInlineImageSpan span : spans) { span.onFinishTemporaryDetach();