diff --git a/Examples/UIExplorer/ImageExample.js b/Examples/UIExplorer/ImageExample.js index 426909bba18..0c374b19e98 100644 --- a/Examples/UIExplorer/ImageExample.js +++ b/Examples/UIExplorer/ImageExample.js @@ -509,7 +509,6 @@ exports.examples = [ render: function() { return ; }, - platform: 'ios', }, ]; diff --git a/Libraries/Image/Image.android.js b/Libraries/Image/Image.android.js index 3ec42358cc6..91dee727acd 100644 --- a/Libraries/Image/Image.android.js +++ b/Libraries/Image/Image.android.js @@ -113,6 +113,21 @@ var Image = React.createClass({ statics: { resizeMode: ImageResizeMode, + + getSize( + url: string, + success: (width: number, height: number) => void, + failure: (error: any) => void, + ) { + return ImageLoader.getSize(url) + .then(function(sizes) { + success(sizes.width, sizes.height); + }) + .catch(failure || function() { + console.warn('Failed to get size for image: ' + url); + }); + }, + /** * Prefetches a remote image for later use by downloading it to the disk * cache 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 84154ca2a67..3596a46cb63 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 @@ -11,11 +11,16 @@ package com.facebook.react.modules.image; import android.net.Uri; +import com.facebook.react.bridge.Arguments; +import com.facebook.react.bridge.Callback; +import com.facebook.react.bridge.WritableMap; import com.facebook.common.executors.CallerThreadExecutor; +import com.facebook.common.references.CloseableReference; import com.facebook.datasource.BaseDataSubscriber; import com.facebook.datasource.DataSource; import com.facebook.datasource.DataSubscriber; import com.facebook.drawee.backends.pipeline.Fresco; +import com.facebook.imagepipeline.image.CloseableImage; import com.facebook.imagepipeline.request.ImageRequest; import com.facebook.imagepipeline.request.ImageRequestBuilder; import com.facebook.react.bridge.Promise; @@ -27,6 +32,7 @@ public class ImageLoaderModule extends ReactContextBaseJavaModule { private static final String ERROR_INVALID_URI = "E_INVALID_URI"; private static final String ERROR_PREFETCH_FAILURE = "E_PREFETCH_FAILURE"; + private static final String ERROR_GET_SIZE_FAILURE = "E_GET_SIZE_FAILURE"; private final Object mCallerContext; @@ -45,6 +51,64 @@ public class ImageLoaderModule extends ReactContextBaseJavaModule { return "ImageLoader"; } + @ReactMethod + public void getSize( + 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; + } + + Uri uri = Uri.parse(uriString); + ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri).build(); + + DataSource> dataSource = + Fresco.getImagePipeline().fetchDecodedImage(request, mCallerContext); + + 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()); + + image.close(); + promise.resolve(sizes); + } catch (Exception e) { + promise.reject(ERROR_GET_SIZE_FAILURE, e); + } finally { + CloseableReference.closeSafely(ref); + dataSource.close(); + } + } else { + dataSource.close(); + promise.reject(ERROR_GET_SIZE_FAILURE); + } + } + + @Override + protected void onFailureImpl(DataSource> dataSource) { + try { + promise.reject(ERROR_GET_SIZE_FAILURE, dataSource.getFailureCause()); + } finally { + dataSource.close(); + } + } + }; + dataSource.subscribe(dataSubscriber, CallerThreadExecutor.getInstance()); + } + /** * Prefetches the given image to the Fresco image disk cache. *