diff --git a/ReactAndroid/src/main/java/com/facebook/react/BUCK b/ReactAndroid/src/main/java/com/facebook/react/BUCK index 1c925ed23..cec9acd07 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/BUCK +++ b/ReactAndroid/src/main/java/com/facebook/react/BUCK @@ -9,6 +9,7 @@ DEPS = [ react_native_target('java/com/facebook/react/modules/debug:debug'), react_native_target('java/com/facebook/react/modules/systeminfo:systeminfo'), react_native_target('java/com/facebook/react/modules/toast:toast'), + react_native_target('java/com/facebook/react/views/imagehelper:imagehelper'), react_native_target('java/com/facebook/react/uimanager:uimanager'), react_native_dep('java/com/facebook/systrace:systrace'), react_native_dep('libraries/fbcore/src/main/java/com/facebook/common/logging:logging'), diff --git a/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerImpl.java b/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerImpl.java index 8e7007c9b..68d024369 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerImpl.java +++ b/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerImpl.java @@ -61,6 +61,7 @@ import com.facebook.react.devsupport.ReactInstanceDevCommandsHandler; import com.facebook.react.devsupport.RedBoxHandler; import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler; import com.facebook.react.modules.core.DeviceEventManagerModule; +import com.facebook.react.views.imagehelper.ResourceDrawableIdHelper; import com.facebook.react.uimanager.AppRegistry; import com.facebook.react.uimanager.DisplayMetricsHolder; import com.facebook.react.uimanager.UIImplementationProvider; @@ -562,6 +563,8 @@ import static com.facebook.react.bridge.ReactMarkerConstants.RUN_JS_BUNDLE_START mHasStartedCreatingInitialContext = false; } mCurrentActivity = null; + + ResourceDrawableIdHelper.getInstance().clear(); } private void moveToResumedLifecycleState(boolean force) { diff --git a/ReactAndroid/src/main/java/com/facebook/react/XReactInstanceManagerImpl.java b/ReactAndroid/src/main/java/com/facebook/react/XReactInstanceManagerImpl.java index 588cd37f2..437095a6e 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/XReactInstanceManagerImpl.java +++ b/ReactAndroid/src/main/java/com/facebook/react/XReactInstanceManagerImpl.java @@ -63,6 +63,7 @@ import com.facebook.react.devsupport.RedBoxHandler; import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler; import com.facebook.react.modules.core.DeviceEventManagerModule; import com.facebook.react.modules.debug.DeveloperSettings; +import com.facebook.react.views.imagehelper.ResourceDrawableIdHelper; import com.facebook.react.uimanager.AppRegistry; import com.facebook.react.uimanager.DisplayMetricsHolder; import com.facebook.react.uimanager.UIImplementationProvider; @@ -547,6 +548,8 @@ import static com.facebook.systrace.Systrace.TRACE_TAG_REACT_JAVA_BRIDGE; mHasStartedCreatingInitialContext = false; } mCurrentActivity = null; + + ResourceDrawableIdHelper.getInstance().clear(); } private void moveToResumedLifecycleState(boolean force) { diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/image/BUCK b/ReactAndroid/src/main/java/com/facebook/react/views/image/BUCK index 84e25e32a..60239e672 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/image/BUCK +++ b/ReactAndroid/src/main/java/com/facebook/react/views/image/BUCK @@ -9,6 +9,7 @@ android_library( react_native_target('java/com/facebook/csslayout:csslayout'), react_native_target('java/com/facebook/react/uimanager:uimanager'), react_native_target('java/com/facebook/react/uimanager/annotations:annotations'), + react_native_target('java/com/facebook/react/views/imagehelper:imagehelper'), react_native_dep('libraries/fresco/fresco-react-native:fbcore'), react_native_dep('libraries/fresco/fresco-react-native:fresco-react-native'), react_native_dep('libraries/fresco/fresco-react-native:fresco-drawee'), diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageManager.java b/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageManager.java index 518ea9e0e..fdae0e2db 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageManager.java @@ -37,7 +37,6 @@ public class ReactImageManager extends SimpleViewManager { return REACT_CLASS; } - private ResourceDrawableIdHelper mResourceDrawableIdHelper; private @Nullable AbstractDraweeControllerBuilder mDraweeControllerBuilder; private final @Nullable Object mCallerContext; @@ -46,14 +45,12 @@ public class ReactImageManager extends SimpleViewManager { Object callerContext) { mDraweeControllerBuilder = draweeControllerBuilder; mCallerContext = callerContext; - mResourceDrawableIdHelper = new ResourceDrawableIdHelper(); } public ReactImageManager() { // Lazily initialize as FrescoModule have not been initialized yet mDraweeControllerBuilder = null; mCallerContext = null; - mResourceDrawableIdHelper = new ResourceDrawableIdHelper(); } public AbstractDraweeControllerBuilder getDraweeControllerBuilder() { @@ -72,8 +69,7 @@ public class ReactImageManager extends SimpleViewManager { return new ReactImageView( context, getDraweeControllerBuilder(), - getCallerContext(), - mResourceDrawableIdHelper); + getCallerContext()); } // In JS this is Image.props.source diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageView.java b/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageView.java index 616042cee..7102b8738 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageView.java @@ -59,6 +59,7 @@ import com.facebook.react.common.SystemClock; import com.facebook.react.uimanager.PixelUtil; import com.facebook.react.uimanager.UIManagerModule; import com.facebook.react.uimanager.events.EventDispatcher; +import com.facebook.react.views.imagehelper.ResourceDrawableIdHelper; /** * Wrapper class around Fresco's GenericDraweeView, enabling persisting props across multiple view @@ -190,7 +191,7 @@ public class ReactImageView extends GenericDraweeView { // ignore malformed uri, then attempt to extract resource ID. } if (mUri == null) { - mUri = mResourceDrawableIdHelper.getResourceDrawableUri(getContext(), mSource); + mUri = ResourceDrawableIdHelper.getInstance().getResourceDrawableUri(getContext(), mSource); mIsLocalImage = true; } else { mIsLocalImage = false; @@ -198,7 +199,6 @@ public class ReactImageView extends GenericDraweeView { } } - private final ResourceDrawableIdHelper mResourceDrawableIdHelper; private final List mSources; private @Nullable ImageSource mImageSource; @@ -229,14 +229,12 @@ public class ReactImageView extends GenericDraweeView { public ReactImageView( Context context, AbstractDraweeControllerBuilder draweeControllerBuilder, - @Nullable Object callerContext, - ResourceDrawableIdHelper resourceDrawableIdHelper) { + @Nullable Object callerContext) { super(context, buildHierarchy(context)); mScaleType = ImageResizeMode.defaultValue(); mDraweeControllerBuilder = draweeControllerBuilder; mRoundedCornerPostprocessor = new RoundedCornerPostprocessor(); mCallerContext = callerContext; - mResourceDrawableIdHelper = resourceDrawableIdHelper; mSources = new LinkedList<>(); } @@ -344,7 +342,7 @@ public class ReactImageView extends GenericDraweeView { } public void setLoadingIndicatorSource(@Nullable String name) { - Drawable drawable = mResourceDrawableIdHelper.getResourceDrawable(getContext(), name); + Drawable drawable = ResourceDrawableIdHelper.getInstance().getResourceDrawable(getContext(), name); mLoadingImageDrawable = drawable != null ? (Drawable) new AutoRotateDrawable(drawable, 1000) : null; mIsDirty = true; diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/imagehelper/BUCK b/ReactAndroid/src/main/java/com/facebook/react/views/imagehelper/BUCK new file mode 100644 index 000000000..baf75d4f6 --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/react/views/imagehelper/BUCK @@ -0,0 +1,17 @@ +include_defs('//ReactAndroid/DEFS') + +android_library( + name = 'imagehelper', + srcs = glob(['*.java']), + deps = [ + react_native_dep('third-party/java/infer-annotations:infer-annotations'), + react_native_dep('third-party/java/jsr-305:jsr-305'), + ], + visibility = [ + 'PUBLIC', + ], +) + +project_config( + src_target = ':imagehelper', +) diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/image/ResourceDrawableIdHelper.java b/ReactAndroid/src/main/java/com/facebook/react/views/imagehelper/ResourceDrawableIdHelper.java similarity index 70% rename from ReactAndroid/src/main/java/com/facebook/react/views/image/ResourceDrawableIdHelper.java rename to ReactAndroid/src/main/java/com/facebook/react/views/imagehelper/ResourceDrawableIdHelper.java index 17d930601..009c4ca47 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/image/ResourceDrawableIdHelper.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/imagehelper/ResourceDrawableIdHelper.java @@ -1,6 +1,6 @@ // Copyright 2004-present Facebook. All Rights Reserved. -package com.facebook.react.views.image; +package com.facebook.react.views.imagehelper; import javax.annotation.Nullable; @@ -11,19 +11,31 @@ import android.content.Context; import android.graphics.drawable.Drawable; import android.net.Uri; -import com.facebook.common.util.UriUtil; - /** * Helper class for obtaining information about local images. */ -/* package */ class ResourceDrawableIdHelper { +public class ResourceDrawableIdHelper { private Map mResourceDrawableIdMap; - public ResourceDrawableIdHelper() { + private static final String LOCAL_RESOURCE_SCHEME = "res"; + private static ResourceDrawableIdHelper sResourceDrawableIdHelper; + + private ResourceDrawableIdHelper() { mResourceDrawableIdMap = new HashMap(); } + public static ResourceDrawableIdHelper getInstance() { + if (sResourceDrawableIdHelper == null) { + sResourceDrawableIdHelper = new ResourceDrawableIdHelper(); + } + return sResourceDrawableIdHelper; + } + + public void clear() { + mResourceDrawableIdMap.clear(); + } + public int getResourceDrawableId(Context context, @Nullable String name) { if (name == null || name.isEmpty()) { return 0; @@ -48,7 +60,7 @@ import com.facebook.common.util.UriUtil; public Uri getResourceDrawableUri(Context context, @Nullable String name) { int resId = getResourceDrawableId(context, name); return resId > 0 ? new Uri.Builder() - .scheme(UriUtil.LOCAL_RESOURCE_SCHEME) + .scheme(LOCAL_RESOURCE_SCHEME) .path(String.valueOf(resId)) .build() : Uri.EMPTY; }