/** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. */ package com.facebook.react.flat; import javax.annotation.Nullable; import com.facebook.drawee.drawable.ScalingUtils.ScaleType; import com.facebook.react.bridge.ReadableArray; import com.facebook.react.uimanager.PixelUtil; import com.facebook.react.uimanager.Spacing; import com.facebook.react.uimanager.ViewProps; import com.facebook.react.uimanager.annotations.ReactProp; import com.facebook.react.views.image.ImageResizeMode; /** * RCTImageView is a top-level node for Image. It can display either a remote image * (source must start wtih http:// or https://) or a local resource (a BitmapDrawable). */ /* package */ class RCTImageView<T extends AbstractDrawCommand & DrawImage> extends FlatShadowNode { static Object sCallerContext = RCTImageView.class; /** * Assignes a CallerContext to execute network requests with. */ /* package */ static void setCallerContext(Object callerContext) { sCallerContext = callerContext; } /* package */ static Object getCallerContext() { return sCallerContext; } private T mDrawImage; /* package */ RCTImageView(T drawImage) { mDrawImage = drawImage; } @Override protected void collectState( StateBuilder stateBuilder, float left, float top, float right, float bottom, float clipLeft, float clipTop, float clipRight, float clipBottom) { super.collectState( stateBuilder, left, top, right, bottom, clipLeft, clipTop, clipRight, clipBottom); if (mDrawImage.hasImageRequest()) { mDrawImage = (T) mDrawImage.updateBoundsAndFreeze( left, top, right, bottom, clipLeft, clipTop, clipRight, clipBottom); stateBuilder.addDrawCommand(mDrawImage); stateBuilder.addAttachDetachListener(mDrawImage); } } @Override boolean doesDraw() { return mDrawImage.hasImageRequest() || super.doesDraw(); } @ReactProp(name = "shouldNotifyLoadEvents") public void setShouldNotifyLoadEvents(boolean shouldNotifyLoadEvents) { getMutableDrawImage().setReactTag(shouldNotifyLoadEvents ? getReactTag() : 0); } @ReactProp(name = "src") public void setSource(@Nullable ReadableArray sources) { getMutableDrawImage().setSource(getThemedContext(), sources); } @ReactProp(name = "tintColor") public void setTintColor(int tintColor) { getMutableDrawImage().setTintColor(tintColor); } @ReactProp(name = ViewProps.RESIZE_MODE) public void setResizeMode(@Nullable String resizeMode) { ScaleType scaleType = ImageResizeMode.toScaleType(resizeMode); if (mDrawImage.getScaleType() != scaleType) { getMutableDrawImage().setScaleType(scaleType); } } @ReactProp(name = "borderColor", customType = "Color") public void setBorderColor(int borderColor) { if (mDrawImage.getBorderColor() != borderColor) { getMutableDrawImage().setBorderColor(borderColor); } } @Override public void setBorder(int spacingType, float borderWidth) { super.setBorder(spacingType, borderWidth); if (spacingType == Spacing.ALL && mDrawImage.getBorderWidth() != borderWidth) { getMutableDrawImage().setBorderWidth(borderWidth); } } @ReactProp(name = "borderRadius") public void setBorderRadius(float borderRadius) { if (mDrawImage.getBorderRadius() != borderRadius) { getMutableDrawImage().setBorderRadius(PixelUtil.toPixelFromDIP(borderRadius)); } } @ReactProp(name = "fadeDuration") public void setFadeDuration(int durationMs) { getMutableDrawImage().setFadeDuration(durationMs); } @ReactProp(name = "progressiveRenderingEnabled") public void setProgressiveRenderingEnabled(boolean enabled) { getMutableDrawImage().setProgressiveRenderingEnabled(enabled); } private T getMutableDrawImage() { if (mDrawImage.isFrozen()) { mDrawImage = (T) mDrawImage.mutableCopy(); invalidate(); } return mDrawImage; } }