diff --git a/ReactAndroid/src/main/java/com/facebook/react/flat/DrawImage.java b/ReactAndroid/src/main/java/com/facebook/react/flat/DrawImage.java index 4d3de822c..03f5f28d4 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/flat/DrawImage.java +++ b/ReactAndroid/src/main/java/com/facebook/react/flat/DrawImage.java @@ -11,8 +11,9 @@ package com.facebook.react.flat; import javax.annotation.Nullable; +import android.content.Context; + import com.facebook.drawee.drawable.ScalingUtils.ScaleType; -import com.facebook.imagepipeline.request.ImageRequest; /** * Common interface for DrawImageWithPipeline and DrawImageWithDrawee. @@ -25,9 +26,9 @@ import com.facebook.imagepipeline.request.ImageRequest; boolean hasImageRequest(); /** - * Assigns a new image request to the DrawImage, or null to clear the image request. + * Assigns a new image source to the DrawImage, or null to clear the image request. */ - void setImageRequest(@Nullable ImageRequest imageRequest); + void setSource(Context context, @Nullable String source); /** * Assigns a tint color to apply to the image drawn. diff --git a/ReactAndroid/src/main/java/com/facebook/react/flat/DrawImageWithDrawee.java b/ReactAndroid/src/main/java/com/facebook/react/flat/DrawImageWithDrawee.java index 61695751d..1f2b5a3b5 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/flat/DrawImageWithDrawee.java +++ b/ReactAndroid/src/main/java/com/facebook/react/flat/DrawImageWithDrawee.java @@ -11,6 +11,7 @@ package com.facebook.react.flat; import javax.annotation.Nullable; +import android.content.Context; import android.graphics.Canvas; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; @@ -33,6 +34,8 @@ import com.facebook.react.views.image.ReactImageView; /* package */ final class DrawImageWithDrawee extends AbstractDrawCommand implements DrawImage, ControllerListener { + private @Nullable String mSource; + private @Nullable Context mContext; private @Nullable DraweeRequestHelper mRequestHelper; private @Nullable PorterDuffColorFilter mColorFilter; private ScaleType mScaleType = ImageResizeMode.defaultValue(); @@ -45,16 +48,13 @@ import com.facebook.react.views.image.ReactImageView; @Override public boolean hasImageRequest() { - return mRequestHelper != null; + return mSource != null; } @Override - public void setImageRequest(@Nullable ImageRequest imageRequest) { - if (imageRequest == null) { - mRequestHelper = null; - } else { - mRequestHelper = new DraweeRequestHelper(imageRequest, this); - } + public void setSource(Context context, @Nullable String source) { + mSource = source; + mContext = context; } @Override @@ -199,6 +199,26 @@ import com.facebook.react.views.image.ReactImageView; public void onRelease(String id) { } + @Override + protected void onBoundsChanged() { + super.onBoundsChanged(); + maybeComputeRequestHelper(); + } + + private void maybeComputeRequestHelper() { + if (mRequestHelper != null) { + return; + } + + if (mSource == null) { + mRequestHelper = null; + return; + } + ImageRequest imageRequest = + ImageRequestHelper.createImageRequest(Assertions.assertNotNull(mContext), mSource); + mRequestHelper = new DraweeRequestHelper(Assertions.assertNotNull(imageRequest), this); + } + private boolean shouldDisplayBorder() { return mBorderColor != 0 || mBorderRadius >= 0.5f; } diff --git a/ReactAndroid/src/main/java/com/facebook/react/flat/DrawImageWithPipeline.java b/ReactAndroid/src/main/java/com/facebook/react/flat/DrawImageWithPipeline.java index f54b9c683..7da5e4d33 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/flat/DrawImageWithPipeline.java +++ b/ReactAndroid/src/main/java/com/facebook/react/flat/DrawImageWithPipeline.java @@ -11,6 +11,7 @@ package com.facebook.react.flat; import javax.annotation.Nullable; +import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapShader; import android.graphics.Canvas; @@ -37,6 +38,8 @@ import com.facebook.react.views.image.ReactImageView; private static final Paint PAINT = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG); private static final int BORDER_BITMAP_PATH_DIRTY = 1 << 1; + private @Nullable String mSource; + private @Nullable Context mContext; private final Matrix mTransform = new Matrix(); private ScaleType mScaleType = ImageResizeMode.defaultValue(); private @Nullable PipelineRequestHelper mRequestHelper; @@ -58,14 +61,10 @@ import com.facebook.react.views.image.ReactImageView; } @Override - public void setImageRequest(@Nullable ImageRequest imageRequest) { + public void setSource(Context context, @Nullable String source) { + mSource = source; + mContext = context; mBitmapShader = null; - - if (imageRequest == null) { - mRequestHelper = null; - } else { - mRequestHelper = new PipelineRequestHelper(imageRequest); - } } @Override @@ -184,6 +183,7 @@ import com.facebook.react.views.image.ReactImageView; protected void onBoundsChanged() { super.onBoundsChanged(); setFlag(BORDER_BITMAP_PATH_DIRTY); + maybeComputeRequestHelper(); } @Override @@ -203,6 +203,20 @@ import com.facebook.react.views.image.ReactImageView; } } + private void maybeComputeRequestHelper() { + if (mRequestHelper == null) { + return; + } + + if (mSource == null) { + mRequestHelper = null; + return; + } + ImageRequest imageRequest = + ImageRequestHelper.createImageRequest(Assertions.assertNotNull(mContext), mSource); + mRequestHelper = new PipelineRequestHelper(Assertions.assertNotNull(imageRequest)); + } + /* package */ void updateBounds(Bitmap bitmap) { Assertions.assumeNotNull(mCallback).invalidate(); diff --git a/ReactAndroid/src/main/java/com/facebook/react/flat/RCTImageView.java b/ReactAndroid/src/main/java/com/facebook/react/flat/RCTImageView.java index 420681981..75b32c478 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/flat/RCTImageView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/flat/RCTImageView.java @@ -15,8 +15,8 @@ import com.facebook.csslayout.Spacing; import com.facebook.drawee.drawable.ScalingUtils.ScaleType; import com.facebook.react.bridge.ReadableArray; import com.facebook.react.uimanager.PixelUtil; -import com.facebook.react.uimanager.annotations.ReactProp; import com.facebook.react.uimanager.ViewProps; +import com.facebook.react.uimanager.annotations.ReactProp; import com.facebook.react.views.image.ImageResizeMode; /** @@ -90,8 +90,7 @@ import com.facebook.react.views.image.ImageResizeMode; public void setSource(@Nullable ReadableArray sources) { final String source = (sources == null || sources.size() == 0) ? null : sources.getMap(0).getString("uri"); - getMutableDrawImage().setImageRequest( - ImageRequestHelper.createImageRequest(getThemedContext(), source)); + getMutableDrawImage().setSource(getThemedContext(), source); } @ReactProp(name = "tintColor") @@ -143,8 +142,4 @@ import com.facebook.react.views.image.ImageResizeMode; return mDrawImage; } - - private static boolean isNetworkResource(String source) { - return source.startsWith("http://") || source.startsWith("https://"); - } }