Refactor nodes to lazy-load image from source

Summary:
This is needed for the upcoming loading from multiple sources (D3364550 for the non-nodes version) and cache interrogation (D3392751 for non-nodes version).
This postpones creating the DraweeRequestHelper until the image size is known, which in the nodes universe is when `onBoundsChanged` is called.

Reviewed By: foghina, ahmedre

Differential Revision: D3413467
This commit is contained in:
Andrei Coman
2016-06-16 07:13:56 -07:00
committed by Ahmed El-Helw
parent 4ecfa0c800
commit f2a6570b07
4 changed files with 54 additions and 24 deletions

View File

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

View File

@@ -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;
}

View File

@@ -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();

View File

@@ -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://");
}
}