Skip to content

Commit fef4196

Browse files
andreicoman11facebook-github-bot-5
authored andcommitted
Cache image resource ids
Reviewed By: AaaChiuuu Differential Revision: D2895691 fb-gh-sync-id: 40824c6fdf5bdd8f0b724a7c81645d3ea911bccf
1 parent 10c0758 commit fef4196

File tree

3 files changed

+68
-30
lines changed

3 files changed

+68
-30
lines changed

ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageManager.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ public String getName() {
3232
return REACT_CLASS;
3333
}
3434

35+
private ResourceDrawableIdHelper mResourceDrawableIdHelper;
3536
private @Nullable AbstractDraweeControllerBuilder mDraweeControllerBuilder;
3637
private final @Nullable Object mCallerContext;
3738

@@ -40,12 +41,14 @@ public ReactImageManager(
4041
Object callerContext) {
4142
mDraweeControllerBuilder = draweeControllerBuilder;
4243
mCallerContext = callerContext;
44+
mResourceDrawableIdHelper = new ResourceDrawableIdHelper();
4345
}
4446

4547
public ReactImageManager() {
4648
// Lazily initialize as FrescoModule have not been initialized yet
4749
mDraweeControllerBuilder = null;
4850
mCallerContext = null;
51+
mResourceDrawableIdHelper = new ResourceDrawableIdHelper();
4952
}
5053

5154
public AbstractDraweeControllerBuilder getDraweeControllerBuilder() {
@@ -70,13 +73,13 @@ public ReactImageView createViewInstance(ThemedReactContext context) {
7073
// In JS this is Image.props.source.uri
7174
@ReactProp(name = "src")
7275
public void setSource(ReactImageView view, @Nullable String source) {
73-
view.setSource(source);
76+
view.setSource(source, mResourceDrawableIdHelper);
7477
}
7578

7679
// In JS this is Image.props.loadingIndicatorSource.uri
7780
@ReactProp(name = "loadingIndicatorSrc")
7881
public void setLoadingIndicatorSource(ReactImageView view, @Nullable String source) {
79-
view.setLoadingIndicatorSource(source);
82+
view.setLoadingIndicatorSource(source, mResourceDrawableIdHelper);
8083
}
8184

8285
@ReactProp(name = "borderColor", customType = "Color")

ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageView.java

Lines changed: 8 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
import android.graphics.Bitmap;
1616
import android.graphics.BitmapShader;
1717
import android.graphics.Canvas;
18-
import android.graphics.drawable.Drawable;
1918
import android.graphics.Color;
2019
import android.graphics.Matrix;
2120
import android.graphics.Paint;
@@ -208,7 +207,9 @@ public void setScaleType(ScalingUtils.ScaleType scaleType) {
208207
mIsDirty = true;
209208
}
210209

211-
public void setSource(@Nullable String source) {
210+
public void setSource(
211+
@Nullable String source,
212+
ResourceDrawableIdHelper resourceDrawableIdHelper) {
212213
mUri = null;
213214
if (source != null) {
214215
try {
@@ -221,7 +222,7 @@ public void setSource(@Nullable String source) {
221222
// ignore malformed uri, then attempt to extract resource ID.
222223
}
223224
if (mUri == null) {
224-
mUri = getResourceDrawableUri(getContext(), source);
225+
mUri = resourceDrawableIdHelper.getResourceDrawableUri(getContext(), source);
225226
mIsLocalImage = true;
226227
} else {
227228
mIsLocalImage = false;
@@ -230,8 +231,10 @@ public void setSource(@Nullable String source) {
230231
mIsDirty = true;
231232
}
232233

233-
public void setLoadingIndicatorSource(@Nullable String name) {
234-
Drawable drawable = getResourceDrawable(getContext(), name);
234+
public void setLoadingIndicatorSource(
235+
@Nullable String name,
236+
ResourceDrawableIdHelper resourceDrawableIdHelper) {
237+
Drawable drawable = resourceDrawableIdHelper.getResourceDrawable(getContext(), name);
235238
mLoadingImageDrawable =
236239
drawable != null ? (Drawable) new AutoRotateDrawable(drawable, 1000) : null;
237240
mIsDirty = true;
@@ -349,27 +352,4 @@ private static boolean shouldResize(@Nullable Uri uri) {
349352
// has no control over the original size
350353
return uri != null && (UriUtil.isLocalContentUri(uri) || UriUtil.isLocalFileUri(uri));
351354
}
352-
353-
private static int getResourceDrawableId(Context context, @Nullable String name) {
354-
if (name == null || name.isEmpty()) {
355-
return 0;
356-
}
357-
return context.getResources().getIdentifier(
358-
name.toLowerCase().replace("-", "_"),
359-
"drawable",
360-
context.getPackageName());
361-
}
362-
363-
private static @Nullable Drawable getResourceDrawable(Context context, @Nullable String name) {
364-
int resId = getResourceDrawableId(context, name);
365-
return resId > 0 ? context.getResources().getDrawable(resId) : null;
366-
}
367-
368-
private static Uri getResourceDrawableUri(Context context, @Nullable String name) {
369-
int resId = getResourceDrawableId(context, name);
370-
return resId > 0 ? new Uri.Builder()
371-
.scheme(UriUtil.LOCAL_RESOURCE_SCHEME)
372-
.path(String.valueOf(resId))
373-
.build() : Uri.EMPTY;
374-
}
375355
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
// Copyright 2004-present Facebook. All Rights Reserved.
2+
3+
package com.facebook.react.views.image;
4+
5+
import javax.annotation.Nullable;
6+
7+
import java.util.HashMap;
8+
import java.util.Map;
9+
10+
import android.content.Context;
11+
import android.graphics.drawable.Drawable;
12+
import android.net.Uri;
13+
14+
import com.facebook.common.util.UriUtil;
15+
16+
/**
17+
* Helper class for obtaining information about local images.
18+
*/
19+
/* package */ class ResourceDrawableIdHelper {
20+
21+
private Map<String, Integer> mResourceDrawableIdMap;
22+
23+
public ResourceDrawableIdHelper() {
24+
mResourceDrawableIdMap = new HashMap<String, Integer>();
25+
}
26+
27+
public int getResourceDrawableId(Context context, @Nullable String name) {
28+
if (name == null || name.isEmpty()) {
29+
return 0;
30+
}
31+
name = name.toLowerCase().replace("-", "_");
32+
if (mResourceDrawableIdMap.containsKey(name)) {
33+
return mResourceDrawableIdMap.get(name);
34+
}
35+
int id = context.getResources().getIdentifier(
36+
name,
37+
"drawable",
38+
context.getPackageName());
39+
mResourceDrawableIdMap.put(name, id);
40+
return id;
41+
}
42+
43+
public @Nullable Drawable getResourceDrawable(Context context, @Nullable String name) {
44+
int resId = getResourceDrawableId(context, name);
45+
return resId > 0 ? context.getResources().getDrawable(resId) : null;
46+
}
47+
48+
public Uri getResourceDrawableUri(Context context, @Nullable String name) {
49+
int resId = getResourceDrawableId(context, name);
50+
return resId > 0 ? new Uri.Builder()
51+
.scheme(UriUtil.LOCAL_RESOURCE_SCHEME)
52+
.path(String.valueOf(resId))
53+
.build() : Uri.EMPTY;
54+
}
55+
}

0 commit comments

Comments
 (0)