diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextShadowNode.java b/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextShadowNode.java index 53111f41275..f350bccf872 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextShadowNode.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextShadowNode.java @@ -231,7 +231,14 @@ public class ReactTextShadowNode extends ReactBaseTextShadowNode { // than the width of the text. layout = BoringLayout.make( - text, textPaint, boring.width, alignment, 1.f, 0.f, boring, mIncludeFontPadding); + text, + textPaint, + Math.max(boring.width, 0), + alignment, + 1.f, + 0.f, + boring, + mIncludeFontPadding); } else { // Is used for multiline, boring text and the width is known. diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.java b/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.java index cae80df050d..bbb57f87e88 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.java @@ -24,6 +24,8 @@ import android.view.View; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.facebook.common.logging.FLog; +import com.facebook.react.bridge.ReactNoCrashSoftException; +import com.facebook.react.bridge.ReactSoftException; import com.facebook.react.bridge.ReadableArray; import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.ReadableNativeMap; @@ -284,13 +286,20 @@ public class TextLayoutManager { } } else if (boring != null && (unconstrainedWidth || boring.width <= width)) { + int boringLayoutWidth = boring.width; + if (boring.width < 0) { + ReactSoftException.logSoftException( + TAG, new ReactNoCrashSoftException("Text width is invalid: " + boring.width)); + boringLayoutWidth = 0; + } + // Is used for single-line, boring text when the width is either unknown or bigger // than the width of the text. layout = BoringLayout.make( text, textPaint, - boring.width, + boringLayoutWidth, Layout.Alignment.ALIGN_NORMAL, 1.f, 0.f, diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManagerMapBuffer.java b/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManagerMapBuffer.java index 7af9a540f86..422d986a636 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManagerMapBuffer.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManagerMapBuffer.java @@ -24,6 +24,8 @@ import android.view.View; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.facebook.common.logging.FLog; +import com.facebook.react.bridge.ReactNoCrashSoftException; +import com.facebook.react.bridge.ReactSoftException; import com.facebook.react.bridge.WritableArray; import com.facebook.react.common.build.ReactBuildConfig; import com.facebook.react.common.mapbuffer.ReadableMapBuffer; @@ -298,13 +300,19 @@ public class TextLayoutManagerMapBuffer { } } else if (boring != null && (unconstrainedWidth || boring.width <= width)) { + int boringLayoutWidth = boring.width; + if (boring.width < 0) { + ReactSoftException.logSoftException( + TAG, new ReactNoCrashSoftException("Text width is invalid: " + boring.width)); + boringLayoutWidth = 0; + } // Is used for single-line, boring text when the width is either unknown or bigger // than the width of the text. layout = BoringLayout.make( text, textPaint, - boring.width, + boringLayoutWidth, Layout.Alignment.ALIGN_NORMAL, 1.f, 0.f,