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.
*