From ac0cdb4c81989af63d1b2a718544eef2011b8f87 Mon Sep 17 00:00:00 2001 From: Marces Engel Date: Mon, 10 Jan 2022 15:55:46 +0100 Subject: [PATCH 1/8] Add headers support when passing source array Simplified code flow Removed native headers prop in favour of passing them in the src array --- Libraries/Image/Image.android.js | 22 +++++++++---------- .../react/views/image/ReactImageManager.java | 5 ----- .../react/views/image/ReactImageView.java | 13 +++++------ .../react/views/imagehelper/ImageSource.java | 14 +++++++++--- 4 files changed, 26 insertions(+), 28 deletions(-) diff --git a/Libraries/Image/Image.android.js b/Libraries/Image/Image.android.js index 2bd3dce70efa..a064e10ddb7c 100644 --- a/Libraries/Image/Image.android.js +++ b/Libraries/Image/Image.android.js @@ -159,26 +159,24 @@ let Image = (props: ImagePropsType, forwardedRef) => { source = null; } - let style; - let sources; - if (source?.uri != null) { - const {width, height} = source; - style = flattenStyle([{width, height}, styles.base, props.style]); - sources = [{uri: source.uri}]; - } else { - style = flattenStyle([styles.base, props.style]); - sources = source; - } + const sourceIsSingleImage = !Array.isArray(source) && source != null; + const style = flattenStyle( + sourceIsSingleImage && { + width: source.width, + height: source.height, + }, + styles.base, + props.style, + ); const {onLoadStart, onLoad, onLoadEnd, onError} = props; const nativeProps = { ...props, style, shouldNotifyLoadEvents: !!(onLoadStart || onLoad || onLoadEnd || onError), - src: sources, + src: sourceIsSingleImage ? [source] : source, /* $FlowFixMe(>=0.78.0 site=react_native_android_fb) This issue was found * when making Flow check .android.js files. */ - headers: source?.headers, defaultSrc: defaultSource ? defaultSource.uri : null, loadingIndicatorSrc: loadingIndicatorSource ? loadingIndicatorSource.uri diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageManager.java b/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageManager.java index 187958c6ee4d..619bbc301d55 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageManager.java @@ -239,11 +239,6 @@ public void setLoadHandlersRegistered(ReactImageView view, boolean shouldNotifyL view.setShouldNotifyLoadEvents(shouldNotifyLoadEvents); } - @ReactProp(name = "headers") - public void setHeaders(ReactImageView view, ReadableMap headers) { - view.setHeaders(headers); - } - @Override public @Nullable Map getExportedCustomDirectEventTypeConstants() { @Nullable diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageView.java b/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageView.java index b841ddbec1b5..132190ebcc93 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageView.java @@ -207,7 +207,6 @@ public CloseableReference process(Bitmap source, PlatformBitmapFactory b private @Nullable Object mCallerContext; private int mFadeDurationMs = -1; private boolean mProgressiveRenderingEnabled; - private ReadableMap mHeaders; // We can't specify rounding in XML, so have to do so here private static GenericDraweeHierarchy buildHierarchy(Context context) { @@ -392,7 +391,8 @@ public void setSource(@Nullable ReadableArray sources) { if (sources.size() == 1) { ReadableMap source = sources.getMap(0); String uri = source.getString("uri"); - ImageSource imageSource = new ImageSource(getContext(), uri); + ReadableMap headers = source.getMap("headers"); + ImageSource imageSource = new ImageSource(getContext(), uri, headers); tmpSources.add(imageSource); if (Uri.EMPTY.equals(imageSource.getUri())) { warnImageSource(uri); @@ -401,9 +401,10 @@ public void setSource(@Nullable ReadableArray sources) { for (int idx = 0; idx < sources.size(); idx++) { ReadableMap source = sources.getMap(idx); String uri = source.getString("uri"); + ReadableMap headers = source.getMap("headers"); ImageSource imageSource = new ImageSource( - getContext(), uri, source.getDouble("width"), source.getDouble("height")); + getContext(), uri, headers, source.getDouble("width"), source.getDouble("height")); tmpSources.add(imageSource); if (Uri.EMPTY.equals(imageSource.getUri())) { warnImageSource(uri); @@ -475,10 +476,6 @@ private void getCornerRadii(float[] computedCorners) { : defaultBorderRadius; } - public void setHeaders(ReadableMap headers) { - mHeaders = headers; - } - public void maybeUpdateView() { if (!mIsDirty) { return; @@ -568,7 +565,7 @@ public void maybeUpdateView() { .setProgressiveRenderingEnabled(mProgressiveRenderingEnabled); ImageRequest imageRequest = - ReactNetworkImageRequest.fromBuilderWithHeaders(imageRequestBuilder, mHeaders); + ReactNetworkImageRequest.fromBuilderWithHeaders(imageRequestBuilder, mImageSource.getHeaders()); if (mGlobalImageLoadListener != null) { mGlobalImageLoadListener.onLoadAttempt(mImageSource.getUri()); diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/imagehelper/ImageSource.java b/ReactAndroid/src/main/java/com/facebook/react/views/imagehelper/ImageSource.java index 94a3e1c8ace9..75827d351764 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/imagehelper/ImageSource.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/imagehelper/ImageSource.java @@ -11,18 +11,21 @@ import android.net.Uri; import androidx.annotation.Nullable; import com.facebook.infer.annotation.Assertions; +import com.facebook.react.bridge.ReadableMap; import java.util.Objects; /** Class describing an image source (network URI or resource) and size. */ public class ImageSource { private @Nullable Uri mUri; + private ReadableMap mHeaders; private String mSource; private double mSize; private boolean isResource; - public ImageSource(Context context, String source, double width, double height) { + public ImageSource(Context context, String source, ReadableMap headers, double width, double height) { mSource = source; + mHeaders = headers; mSize = width * height; // Important: we compute the URI here so that we don't need to hold a reference to the context, @@ -46,8 +49,8 @@ public int hashCode() { return Objects.hash(mUri, mSource, mSize, isResource); } - public ImageSource(Context context, String source) { - this(context, source, 0.0d, 0.0d); + public ImageSource(Context context, String source, ReadableMap headers) { + this(context, source, headers, 0.0d, 0.0d); } /** Get the source of this image, as it was passed to the constructor. */ @@ -60,6 +63,11 @@ public Uri getUri() { return Assertions.assertNotNull(mUri); } + /** Get the headers for this image. */ + public ReadableMap getHeaders() { + return mHeaders; + } + /** Get the area of this image. */ public double getSize() { return mSize; From 29a5f914eb504f2ee223332c66ac4f43757b7ec2 Mon Sep 17 00:00:00 2001 From: Marces Engel Date: Sun, 16 Jan 2022 13:46:29 +0100 Subject: [PATCH 2/8] Added missing headers argument to ImageSource --- .../com/facebook/react/modules/image/ImageLoaderModule.java | 4 ++-- .../java/com/facebook/react/views/image/ReactImageView.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/image/ImageLoaderModule.java b/ReactAndroid/src/main/java/com/facebook/react/modules/image/ImageLoaderModule.java index c2fb799d34e7..b6081952f093 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/image/ImageLoaderModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/image/ImageLoaderModule.java @@ -101,7 +101,7 @@ public void getSize(final String uriString, final Promise promise) { return; } - ImageSource source = new ImageSource(getReactApplicationContext(), uriString); + ImageSource source = new ImageSource(getReactApplicationContext(), uriString, null); ImageRequest request = ImageRequestBuilder.newBuilderWithSource(source.getUri()).build(); DataSource> dataSource = @@ -159,7 +159,7 @@ public void getSizeWithHeaders( return; } - ImageSource source = new ImageSource(getReactApplicationContext(), uriString); + ImageSource source = new ImageSource(getReactApplicationContext(), uriString, headers); ImageRequestBuilder imageRequestBuilder = ImageRequestBuilder.newBuilderWithSource(source.getUri()); ImageRequest request = diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageView.java b/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageView.java index 132190ebcc93..8c5052bcc60e 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageView.java @@ -384,7 +384,7 @@ public void setSource(@Nullable ReadableArray sources) { List tmpSources = new LinkedList<>(); if (sources == null || sources.size() == 0) { - ImageSource imageSource = new ImageSource(getContext(), REMOTE_TRANSPARENT_BITMAP_URI); + ImageSource imageSource = new ImageSource(getContext(), REMOTE_TRANSPARENT_BITMAP_URI, null); tmpSources.add(imageSource); } else { // Optimize for the case where we have just one uri, case in which we don't need the sizes @@ -653,7 +653,7 @@ private boolean shouldUseRoundedCornerPostprocessing() { private void setSourceImage() { mImageSource = null; if (mSources.isEmpty()) { - ImageSource imageSource = new ImageSource(getContext(), REMOTE_TRANSPARENT_BITMAP_URI); + ImageSource imageSource = new ImageSource(getContext(), REMOTE_TRANSPARENT_BITMAP_URI, null); mSources.add(imageSource); } else if (hasMultipleSources()) { MultiSourceResult multiSource = From c4c60746a8570071e48d5f23ed278f2c1e93b7f2 Mon Sep 17 00:00:00 2001 From: Marces Engel Date: Sun, 16 Jan 2022 13:46:52 +0100 Subject: [PATCH 3/8] Removed code duplication --- .../modules/image/ImageLoaderModule.java | 46 +------------------ 1 file changed, 1 insertion(+), 45 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/image/ImageLoaderModule.java b/ReactAndroid/src/main/java/com/facebook/react/modules/image/ImageLoaderModule.java index b6081952f093..e484ef64061d 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/image/ImageLoaderModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/image/ImageLoaderModule.java @@ -96,51 +96,7 @@ private ImagePipeline getImagePipeline() { */ @ReactMethod public void getSize(final String uriString, final Promise promise) { - if (uriString == null || uriString.isEmpty()) { - promise.reject(ERROR_INVALID_URI, "Cannot get the size of an image for an empty URI"); - return; - } - - ImageSource source = new ImageSource(getReactApplicationContext(), uriString, null); - ImageRequest request = ImageRequestBuilder.newBuilderWithSource(source.getUri()).build(); - - DataSource> dataSource = - getImagePipeline().fetchDecodedImage(request, getCallerContext()); - - DataSubscriber> dataSubscriber = - new BaseDataSubscriber>() { - @Override - protected void onNewResultImpl( - DataSource> dataSource) { - if (!dataSource.isFinished()) { - return; - } - CloseableReference ref = dataSource.getResult(); - if (ref != null) { - try { - CloseableImage image = ref.get(); - - WritableMap sizes = Arguments.createMap(); - sizes.putInt("width", image.getWidth()); - sizes.putInt("height", image.getHeight()); - - promise.resolve(sizes); - } catch (Exception e) { - promise.reject(ERROR_GET_SIZE_FAILURE, e); - } finally { - CloseableReference.closeSafely(ref); - } - } else { - promise.reject(ERROR_GET_SIZE_FAILURE); - } - } - - @Override - protected void onFailureImpl(DataSource> dataSource) { - promise.reject(ERROR_GET_SIZE_FAILURE, dataSource.getFailureCause()); - } - }; - dataSource.subscribe(dataSubscriber, CallerThreadExecutor.getInstance()); + getSizeWithHeaders(uriString, null, promise); } /** From 52cc85814dbb2b107efa2b3a9a63b9db4c7f5587 Mon Sep 17 00:00:00 2001 From: Marces Engel Date: Sun, 16 Jan 2022 13:47:18 +0100 Subject: [PATCH 4/8] Made immutable fields final --- .../com/facebook/react/views/imagehelper/ImageSource.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/imagehelper/ImageSource.java b/ReactAndroid/src/main/java/com/facebook/react/views/imagehelper/ImageSource.java index 75827d351764..abe95cc76960 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/imagehelper/ImageSource.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/imagehelper/ImageSource.java @@ -17,10 +17,10 @@ /** Class describing an image source (network URI or resource) and size. */ public class ImageSource { - private @Nullable Uri mUri; - private ReadableMap mHeaders; - private String mSource; - private double mSize; + private final @Nullable Uri mUri; + private final ReadableMap mHeaders; + private final String mSource; + private final double mSize; private boolean isResource; public ImageSource(Context context, String source, ReadableMap headers, double width, double height) { From a3a6c055b4ea924425473376a9342cdc64ddb448 Mon Sep 17 00:00:00 2001 From: Marces Engel Date: Sun, 16 Jan 2022 13:48:27 +0100 Subject: [PATCH 5/8] Added Fresco utility functions to ImageSource --- .../modules/image/ImageLoaderModule.java | 5 +--- .../react/views/image/ReactImageView.java | 6 ++--- .../react/views/imagehelper/ImageSource.java | 24 +++++++++++++++---- 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/image/ImageLoaderModule.java b/ReactAndroid/src/main/java/com/facebook/react/modules/image/ImageLoaderModule.java index e484ef64061d..9537e8108ae8 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/image/ImageLoaderModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/image/ImageLoaderModule.java @@ -116,10 +116,7 @@ public void getSizeWithHeaders( } ImageSource source = new ImageSource(getReactApplicationContext(), uriString, headers); - ImageRequestBuilder imageRequestBuilder = - ImageRequestBuilder.newBuilderWithSource(source.getUri()); - ImageRequest request = - ReactNetworkImageRequest.fromBuilderWithHeaders(imageRequestBuilder, headers); + ImageRequest request = source.createImageRequest(); DataSource> dataSource = getImagePipeline().fetchDecodedImage(request, getCallerContext()); diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageView.java b/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageView.java index 8c5052bcc60e..27f821153dd4 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageView.java @@ -558,14 +558,14 @@ public void maybeUpdateView() { ResizeOptions resizeOptions = doResize ? new ResizeOptions(getWidth(), getHeight()) : null; ImageRequestBuilder imageRequestBuilder = - ImageRequestBuilder.newBuilderWithSource(mImageSource.getUri()) + mImageSource.createImageRequestBuilder() .setPostprocessor(postprocessor) .setResizeOptions(resizeOptions) .setAutoRotateEnabled(true) .setProgressiveRenderingEnabled(mProgressiveRenderingEnabled); ImageRequest imageRequest = - ReactNetworkImageRequest.fromBuilderWithHeaders(imageRequestBuilder, mImageSource.getHeaders()); + mImageSource.createImageRequestFromBuilder(imageRequestBuilder); if (mGlobalImageLoadListener != null) { mGlobalImageLoadListener.onLoadAttempt(mImageSource.getUri()); @@ -582,7 +582,7 @@ public void maybeUpdateView() { if (mCachedImageSource != null) { ImageRequest cachedImageRequest = - ImageRequestBuilder.newBuilderWithSource(mCachedImageSource.getUri()) + mCachedImageSource.createImageRequestBuilder() .setPostprocessor(postprocessor) .setResizeOptions(resizeOptions) .setAutoRotateEnabled(true) diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/imagehelper/ImageSource.java b/ReactAndroid/src/main/java/com/facebook/react/views/imagehelper/ImageSource.java index abe95cc76960..65a2563c7899 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/imagehelper/ImageSource.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/imagehelper/ImageSource.java @@ -10,8 +10,13 @@ import android.content.Context; import android.net.Uri; import androidx.annotation.Nullable; + +import com.facebook.imagepipeline.request.ImageRequest; +import com.facebook.imagepipeline.request.ImageRequestBuilder; import com.facebook.infer.annotation.Assertions; import com.facebook.react.bridge.ReadableMap; +import com.facebook.react.modules.fresco.ReactNetworkImageRequest; + import java.util.Objects; /** Class describing an image source (network URI or resource) and size. */ @@ -53,6 +58,20 @@ public ImageSource(Context context, String source, ReadableMap headers) { this(context, source, headers, 0.0d, 0.0d); } + public ImageRequestBuilder createImageRequestBuilder() { + return ImageRequestBuilder.newBuilderWithSource(getUri()); + } + + public ImageRequest createImageRequestFromBuilder(final ImageRequestBuilder imageRequestBuilder) { + return ReactNetworkImageRequest.fromBuilderWithHeaders(imageRequestBuilder, mHeaders); + } + + public ImageRequest createImageRequest() { + return createImageRequestFromBuilder( + createImageRequestBuilder() + ); + } + /** Get the source of this image, as it was passed to the constructor. */ public String getSource() { return mSource; @@ -63,11 +82,6 @@ public Uri getUri() { return Assertions.assertNotNull(mUri); } - /** Get the headers for this image. */ - public ReadableMap getHeaders() { - return mHeaders; - } - /** Get the area of this image. */ public double getSize() { return mSize; From dcd10a02189364eba97c5486c9d374ef3f160c06 Mon Sep 17 00:00:00 2001 From: Marces Engel Date: Mon, 17 Jan 2022 13:43:00 +0100 Subject: [PATCH 6/8] Added ImageSource constructor without headers for backwards compatibility --- .../com/facebook/react/views/imagehelper/ImageSource.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/imagehelper/ImageSource.java b/ReactAndroid/src/main/java/com/facebook/react/views/imagehelper/ImageSource.java index 65a2563c7899..d7fa4665b7e7 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/imagehelper/ImageSource.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/imagehelper/ImageSource.java @@ -58,6 +58,11 @@ public ImageSource(Context context, String source, ReadableMap headers) { this(context, source, headers, 0.0d, 0.0d); } + /** @deprecated for library backwards compatibility only */ + public ImageSource(Context context, String source) { + this(context, source, null); + } + public ImageRequestBuilder createImageRequestBuilder() { return ImageRequestBuilder.newBuilderWithSource(getUri()); } From d4ee56902ee91ebee8d76e0b8d700c3c225a3580 Mon Sep 17 00:00:00 2001 From: Marces Engel Date: Tue, 18 Jan 2022 13:21:12 +0100 Subject: [PATCH 7/8] Fixed style flattening --- Libraries/Image/Image.android.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Libraries/Image/Image.android.js b/Libraries/Image/Image.android.js index a064e10ddb7c..18de3c4152ea 100644 --- a/Libraries/Image/Image.android.js +++ b/Libraries/Image/Image.android.js @@ -160,14 +160,14 @@ let Image = (props: ImagePropsType, forwardedRef) => { } const sourceIsSingleImage = !Array.isArray(source) && source != null; - const style = flattenStyle( + const style = flattenStyle([ sourceIsSingleImage && { width: source.width, height: source.height, }, styles.base, props.style, - ); + ]); const {onLoadStart, onLoad, onLoadEnd, onError} = props; const nativeProps = { From 730346ca175e0d234d7025b016cca22e8e9a7fac Mon Sep 17 00:00:00 2001 From: Marces Engel Date: Wed, 19 Jan 2022 13:26:08 +0100 Subject: [PATCH 8/8] Fixed ImageSource dependencies --- .../com/facebook/react/modules/image/BUCK | 2 +- .../java/com/facebook/react/views/image/BUCK | 1 + .../com/facebook/react/views/imagehelper/BUCK | 21 ++++++++++++++++++- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/modules/image/BUCK b/ReactAndroid/src/main/java/com/facebook/react/modules/image/BUCK index 7ebd194664fa..0bc96be168ba 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/modules/image/BUCK +++ b/ReactAndroid/src/main/java/com/facebook/react/modules/image/BUCK @@ -21,7 +21,7 @@ rn_android_library( react_native_target("java/com/facebook/react/common:common"), react_native_target("java/com/facebook/react/modules/fresco:fresco"), react_native_target("java/com/facebook/react/module/annotations:annotations"), - react_native_target("java/com/facebook/react/views/imagehelper:imagehelper"), + react_native_target("java/com/facebook/react/views/imagehelper:imagesource"), react_native_target("java/com/facebook/react/views/image:image"), ], exported_deps = [ diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/image/BUCK b/ReactAndroid/src/main/java/com/facebook/react/views/image/BUCK index a13531e19271..4b0cfcef618a 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/image/BUCK +++ b/ReactAndroid/src/main/java/com/facebook/react/views/image/BUCK @@ -61,6 +61,7 @@ rn_android_library( react_native_target("java/com/facebook/react/modules/fresco:fresco"), react_native_target("java/com/facebook/react/uimanager/annotations:annotations"), react_native_target("java/com/facebook/react/views/imagehelper:withmultisource"), + react_native_target("java/com/facebook/react/views/imagehelper:imagesource"), ], exported_deps = [ ":imageevents", diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/imagehelper/BUCK b/ReactAndroid/src/main/java/com/facebook/react/views/imagehelper/BUCK index 3776c3389f84..cb5d50c8e9c1 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/imagehelper/BUCK +++ b/ReactAndroid/src/main/java/com/facebook/react/views/imagehelper/BUCK @@ -4,7 +4,7 @@ rn_android_library( name = "imagehelper", srcs = glob( ["*.java"], - exclude = ["MultiSourceHelper.java"], + exclude = ["MultiSourceHelper.java","ImageSource.java"], ), autoglob = False, is_androidx = True, @@ -38,3 +38,22 @@ rn_android_library( ":imagehelper", ], ) + +rn_android_library( + name = "imagesource", + srcs = ["ImageSource.java"], + autoglob = False, + is_androidx = True, + labels = ["supermodule:xplat/default/public.react_native.infra"], + visibility = [ + "PUBLIC", + ], + deps = [ + react_native_dep("third-party/android/androidx:annotation"), + react_native_dep("third-party/java/infer-annotations:infer-annotations"), + react_native_dep("third-party/java/jsr-305:jsr-305"), + react_native_dep("libraries/fresco/fresco-react-native:imagepipeline"), + react_native_target("java/com/facebook/react/bridge:bridge"), + react_native_target("java/com/facebook/react/modules/fresco:fresco"), + ] +)