Add support for providing AbstractDraweeControllerBuilder to TextInlineImageSpan similar to ImageView

Reviewed By: andreicoman11

Differential Revision: D2690762

fb-gh-sync-id: 80596575d3fa577f8eb05d9f44f72337a640a3db
This commit is contained in:
Dave Miller 2015-11-24 07:17:14 -08:00 коммит произвёл facebook-github-bot-7
Родитель 918ef31e10
Коммит 7bfbc5dd00
4 изменённых файлов: 65 добавлений и 6 удалений

Просмотреть файл

@ -17,6 +17,7 @@ import android.content.Context;
import android.net.Uri;
import com.facebook.common.util.UriUtil;
import com.facebook.drawee.controller.AbstractDraweeControllerBuilder;
import com.facebook.react.uimanager.LayoutShadowNode;
import com.facebook.react.uimanager.ReactProp;
import com.facebook.react.uimanager.ReactShadowNode;
@ -28,6 +29,15 @@ import com.facebook.react.uimanager.ReactShadowNode;
public class ReactTextInlineImageShadowNode extends LayoutShadowNode {
private @Nullable Uri mUri;
private final AbstractDraweeControllerBuilder mDraweeControllerBuilder;
private final @Nullable Object mCallerContext;
public ReactTextInlineImageShadowNode(
AbstractDraweeControllerBuilder draweeControllerBuilder,
@Nullable Object callerContext) {
mDraweeControllerBuilder = draweeControllerBuilder;
mCallerContext = callerContext;
}
@ReactProp(name = "src")
public void setSource(@Nullable String source) {
@ -77,4 +87,12 @@ public class ReactTextInlineImageShadowNode extends LayoutShadowNode {
return true;
}
public AbstractDraweeControllerBuilder getDraweeControllerBuilder() {
return mDraweeControllerBuilder;
}
public @Nullable Object getCallerContext() {
return mCallerContext;
}
}

Просмотреть файл

@ -9,8 +9,12 @@
package com.facebook.react.views.text;
import javax.annotation.Nullable;
import android.view.View;
import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.drawee.controller.AbstractDraweeControllerBuilder;
import com.facebook.react.uimanager.ThemedReactContext;
import com.facebook.react.uimanager.ViewManager;
@ -23,6 +27,20 @@ public class ReactTextInlineImageViewManager
static final String REACT_CLASS = "RCTTextInlineImage";
private final @Nullable AbstractDraweeControllerBuilder mDraweeControllerBuilder;
private final @Nullable Object mCallerContext;
public ReactTextInlineImageViewManager() {
this(null, null);
}
public ReactTextInlineImageViewManager(
@Nullable AbstractDraweeControllerBuilder draweeControllerBuilder,
@Nullable Object callerContext) {
mDraweeControllerBuilder = draweeControllerBuilder;
mCallerContext = callerContext;
}
@Override
public String getName() {
return REACT_CLASS;
@ -35,7 +53,12 @@ public class ReactTextInlineImageViewManager
@Override
public ReactTextInlineImageShadowNode createShadowNodeInstance() {
return new ReactTextInlineImageShadowNode();
return new ReactTextInlineImageShadowNode(
(mDraweeControllerBuilder != null) ?
mDraweeControllerBuilder :
Fresco.newDraweeControllerBuilder(),
mCallerContext
);
}
@Override

Просмотреть файл

@ -148,8 +148,13 @@ public class ReactTextShadowNode extends LayoutShadowNode {
Resources resources = node.getThemedContext().getResources();
int height = (int) PixelUtil.toDIPFromPixel(node.getStyleHeight());
int width = (int) PixelUtil.toDIPFromPixel(node.getStyleWidth());
TextInlineImageSpan imageSpan =
new TextInlineImageSpan(resources, height, width, node.getUri());
TextInlineImageSpan imageSpan = new TextInlineImageSpan(
resources,
height,
width,
node.getUri(),
node.getDraweeControllerBuilder(),
node.getCallerContext());
// We make the image take up 1 character in the span and put a corresponding character into the
// text so that the image doesn't run over any following text.
sb.append(INLINE_IMAGE_PLACEHOLDER);

Просмотреть файл

@ -21,6 +21,7 @@ import android.text.style.ReplacementSpan;
import android.widget.TextView;
import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.drawee.controller.AbstractDraweeControllerBuilder;
import com.facebook.drawee.generic.GenericDraweeHierarchy;
import com.facebook.drawee.generic.GenericDraweeHierarchyBuilder;
import com.facebook.drawee.interfaces.DraweeController;
@ -42,7 +43,9 @@ import com.facebook.imagepipeline.request.ImageRequestBuilder;
public class TextInlineImageSpan extends ReplacementSpan {
private @Nullable Drawable mDrawable;
private DraweeHolder<GenericDraweeHierarchy> mDraweeHolder;
private final AbstractDraweeControllerBuilder mDraweeControllerBuilder;
private final DraweeHolder<GenericDraweeHierarchy> mDraweeHolder;
private final @Nullable Object mCallerContext;
private int mHeight;
private Uri mUri;
@ -50,11 +53,19 @@ public class TextInlineImageSpan extends ReplacementSpan {
private @Nullable TextView mTextView;
public TextInlineImageSpan(Resources resources, int height, int width, @Nullable Uri uri) {
public TextInlineImageSpan(
Resources resources,
int height,
int width,
@Nullable Uri uri,
AbstractDraweeControllerBuilder draweeControllerBuilder,
@Nullable Object callerContext) {
mDraweeHolder = new DraweeHolder(
GenericDraweeHierarchyBuilder.newInstance(resources)
.build()
);
mDraweeControllerBuilder = draweeControllerBuilder;
mCallerContext = callerContext;
mHeight = height;
mWidth = width;
@ -116,8 +127,10 @@ public class TextInlineImageSpan extends ReplacementSpan {
ImageRequest imageRequest = ImageRequestBuilder.newBuilderWithSource(mUri)
.build();
DraweeController draweeController = Fresco.newDraweeControllerBuilder()
DraweeController draweeController = mDraweeControllerBuilder
.reset()
.setOldController(mDraweeHolder.getController())
.setCallerContext(mCallerContext)
.setImageRequest(imageRequest)
.build();
mDraweeHolder.setController(draweeController);