From a511c1bdeefb0b8a89ee804cb55bed793d761404 Mon Sep 17 00:00:00 2001 From: Thomas Nardone Date: Tue, 14 Jan 2025 08:28:03 -0800 Subject: [PATCH] Fix null safety in views/text/frescosupport (#48612) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/48612 Manual fixes to resolve nullsafe issues. Changelog: [Internal] Reviewed By: rshest Differential Revision: D67992722 fbshipit-source-id: a26cde9788bc3456ec756326208b4907ad989d4e --- ...coBasedReactTextInlineImageShadowNode.java | 16 +++---- .../FrescoBasedReactTextInlineImageSpan.java | 44 ++++++++----------- 2 files changed, 26 insertions(+), 34 deletions(-) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/frescosupport/FrescoBasedReactTextInlineImageShadowNode.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/frescosupport/FrescoBasedReactTextInlineImageShadowNode.java index 0c87fa495e0..aea8f6067dd 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/frescosupport/FrescoBasedReactTextInlineImageShadowNode.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/frescosupport/FrescoBasedReactTextInlineImageShadowNode.java @@ -11,6 +11,7 @@ import android.content.Context; import android.content.res.Resources; import android.net.Uri; import androidx.annotation.Nullable; +import androidx.core.util.Preconditions; import com.facebook.common.logging.FLog; import com.facebook.common.util.UriUtil; import com.facebook.drawee.controller.AbstractDraweeControllerBuilder; @@ -32,8 +33,7 @@ import java.util.Locale; class FrescoBasedReactTextInlineImageShadowNode extends ReactTextInlineImageShadowNode { private @Nullable Uri mUri; - // NULLSAFE_FIXME[Field Not Initialized] - private ReadableMap mHeaders; + private @Nullable ReadableMap mHeaders; private final AbstractDraweeControllerBuilder mDraweeControllerBuilder; private final @Nullable Object mCallerContext; private float mWidth = YogaConstants.UNDEFINED; @@ -49,9 +49,10 @@ class FrescoBasedReactTextInlineImageShadowNode extends ReactTextInlineImageShad @ReactProp(name = "src") public void setSource(@Nullable ReadableArray sources) { - final String source = - // NULLSAFE_FIXME[Nullable Dereference] - (sources == null || sources.size() == 0) ? null : sources.getMap(0).getString("uri"); + final @Nullable String source = + (sources == null || sources.size() == 0 || sources.getType(0) != ReadableType.Map) + ? null + : Preconditions.checkNotNull(sources.getMap(0)).getString("uri"); Uri uri = null; if (source != null) { try { @@ -74,7 +75,7 @@ class FrescoBasedReactTextInlineImageShadowNode extends ReactTextInlineImageShad } @ReactProp(name = "headers") - public void setHeaders(ReadableMap headers) { + public void setHeaders(@Nullable ReadableMap headers) { mHeaders = headers; } @@ -113,7 +114,7 @@ class FrescoBasedReactTextInlineImageShadowNode extends ReactTextInlineImageShad return mUri; } - public ReadableMap getHeaders() { + public @Nullable ReadableMap getHeaders() { return mHeaders; } @@ -149,7 +150,6 @@ class FrescoBasedReactTextInlineImageShadowNode extends ReactTextInlineImageShad getHeaders(), getDraweeControllerBuilder(), getCallerContext(), - // NULLSAFE_FIXME[Parameter Not Nullable] mResizeMode); } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/frescosupport/FrescoBasedReactTextInlineImageSpan.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/frescosupport/FrescoBasedReactTextInlineImageSpan.java index 2bc55a1a0da..4b44ddc717e 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/frescosupport/FrescoBasedReactTextInlineImageSpan.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/frescosupport/FrescoBasedReactTextInlineImageSpan.java @@ -15,8 +15,8 @@ import android.graphics.drawable.Drawable; import android.net.Uri; import android.widget.TextView; import androidx.annotation.Nullable; +import androidx.core.util.Preconditions; import com.facebook.drawee.controller.AbstractDraweeControllerBuilder; -import com.facebook.drawee.drawable.ScalingUtils; import com.facebook.drawee.generic.GenericDraweeHierarchy; import com.facebook.drawee.generic.GenericDraweeHierarchyBuilder; import com.facebook.drawee.interfaces.DraweeController; @@ -53,8 +53,8 @@ class FrescoBasedReactTextInlineImageSpan extends TextInlineImageSpan { private int mTintColor; private Uri mUri; private int mWidth; - private ReadableMap mHeaders; - private String mResizeMode; + private @Nullable ReadableMap mHeaders; + private @Nullable String mResizeMode; private @Nullable TextView mTextView; @@ -64,10 +64,10 @@ class FrescoBasedReactTextInlineImageSpan extends TextInlineImageSpan { int width, int tintColor, @Nullable Uri uri, - ReadableMap headers, + @Nullable ReadableMap headers, AbstractDraweeControllerBuilder draweeControllerBuilder, @Nullable Object callerContext, - String resizeMode) { + @Nullable String resizeMode) { mDraweeHolder = new DraweeHolder(GenericDraweeHierarchyBuilder.newInstance(resources).build()); mDraweeControllerBuilder = draweeControllerBuilder; mCallerContext = callerContext; @@ -118,8 +118,8 @@ class FrescoBasedReactTextInlineImageSpan extends TextInlineImageSpan { return mWidth; } - // NULLSAFE_FIXME[Inconsistent Subclass Parameter Annotation] - public void setTextView(TextView textView) { + @Override + public void setTextView(@Nullable TextView textView) { mTextView = textView; } @@ -138,26 +138,24 @@ class FrescoBasedReactTextInlineImageSpan extends TextInlineImageSpan { ImageRequestBuilder imageRequestBuilder = ImageRequestBuilder.newBuilderWithSource(mUri); ImageRequest imageRequest = ReactNetworkImageRequest.fromBuilderWithHeaders(imageRequestBuilder, mHeaders); - mDraweeHolder.getHierarchy().setActualImageScaleType(getResizeMode(mResizeMode)); - DraweeController draweeController = - mDraweeControllerBuilder - .reset() - .setOldController(mDraweeHolder.getController()) - // NULLSAFE_FIXME[Parameter Not Nullable] - .setCallerContext(mCallerContext) - .setImageRequest(imageRequest) - .build(); + mDraweeHolder + .getHierarchy() + .setActualImageScaleType(ImageResizeMode.toScaleType(mResizeMode)); + mDraweeControllerBuilder.reset(); + mDraweeControllerBuilder.setOldController(mDraweeHolder.getController()); + if (mCallerContext != null) { + mDraweeControllerBuilder.setCallerContext(mCallerContext); + } + mDraweeControllerBuilder.setImageRequest(imageRequest); + DraweeController draweeController = mDraweeControllerBuilder.build(); mDraweeHolder.setController(draweeController); mDraweeControllerBuilder.reset(); - mDrawable = mDraweeHolder.getTopLevelDrawable(); - // NULLSAFE_FIXME[Nullable Dereference] + mDrawable = Preconditions.checkNotNull(mDraweeHolder.getTopLevelDrawable()); mDrawable.setBounds(0, 0, mWidth, mHeight); if (mTintColor != 0) { - // NULLSAFE_FIXME[Nullable Dereference] mDrawable.setColorFilter(mTintColor, PorterDuff.Mode.SRC_IN); } - // NULLSAFE_FIXME[Nullable Dereference] mDrawable.setCallback(mTextView); } @@ -168,19 +166,13 @@ class FrescoBasedReactTextInlineImageSpan extends TextInlineImageSpan { // Align to center int fontHeight = (int) (paint.descent() - paint.ascent()); int centerY = y + (int) paint.descent() - fontHeight / 2; - // NULLSAFE_FIXME[Nullable Dereference] int transY = centerY - (mDrawable.getBounds().bottom - mDrawable.getBounds().top) / 2; canvas.translate(x, transY); - // NULLSAFE_FIXME[Nullable Dereference] mDrawable.draw(canvas); canvas.restore(); } - private ScalingUtils.ScaleType getResizeMode(String resizeMode) { - return ImageResizeMode.toScaleType(resizeMode); - } - @Override public int getWidth() { return mWidth;