提交 b96adbed 编写于 作者: S Sam Judd

Avoid throwing on invalid resource ids.

Fixes #413
上级 899e41b8
package com.bumptech.glide.load.model.stream;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.net.Uri;
import com.bumptech.glide.load.model.ModelLoader;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
......@@ -27,17 +29,27 @@ import java.io.InputStream;
@Config(manifest = Config.NONE, emulateSdk = 18)
public class ResourceLoaderTest {
@Mock ModelLoader<Uri, InputStream> streamUriLoader;
private StreamResourceLoader resourceLoader;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
resourceLoader = new StreamResourceLoader(Robolectric.application, streamUriLoader);
}
@Test
public void testCanHandleId() {
ModelLoader<Uri, InputStream> streamUriLoader = mock(ModelLoader.class);
when(streamUriLoader.getResourceFetcher(any(Uri.class), anyInt(), anyInt())).thenReturn(null);
int id = android.R.drawable.star_off;
StreamResourceLoader resourceLoader = new StreamResourceLoader(Robolectric.application, streamUriLoader);
resourceLoader.getResourceFetcher(id, 0, 0);
Uri contentUri = Uri.parse("android.resource://android/drawable/star_off");
verify(streamUriLoader, atLeastOnce()).getResourceFetcher(eq(contentUri), anyInt(), anyInt());
verify(streamUriLoader).getResourceFetcher(eq(contentUri), anyInt(), anyInt());
}
@Test
public void testDoesNotThrowOnInvalidOrMissingId() {
assertThat(resourceLoader.getResourceFetcher(1234, 0, 0)).isNull();
verify(streamUriLoader, never()).getResourceFetcher(any(Uri.class), anyInt(), anyInt());
}
}
......@@ -4,6 +4,7 @@ import android.content.ContentResolver;
import android.content.Context;
import android.content.res.Resources;
import android.net.Uri;
import android.util.Log;
import com.bumptech.glide.load.data.DataFetcher;
......@@ -14,6 +15,7 @@ import com.bumptech.glide.load.data.DataFetcher;
* @param <T> The type of data that will be loaded for the given android resource.
*/
public class ResourceLoader<T> implements ModelLoader<Integer, T> {
private static final String TAG = "ResourceLoader";
private final ModelLoader<Uri, T> uriLoader;
private final Resources resources;
......@@ -29,11 +31,22 @@ public class ResourceLoader<T> implements ModelLoader<Integer, T> {
@Override
public DataFetcher<T> getResourceFetcher(Integer model, int width, int height) {
Uri uri = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://"
+ resources.getResourcePackageName(model) + '/'
+ resources.getResourceTypeName(model) + '/'
+ resources.getResourceEntryName(model));
return uriLoader.getResourceFetcher(uri, width, height);
Uri uri = null;
try {
uri = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://"
+ resources.getResourcePackageName(model) + '/'
+ resources.getResourceTypeName(model) + '/'
+ resources.getResourceEntryName(model));
} catch (Resources.NotFoundException e) {
if (Log.isLoggable(TAG, Log.WARN)) {
Log.w(TAG, "Received invalid resource id: " + model, e);
}
}
if (uri != null) {
return uriLoader.getResourceFetcher(uri, width, height);
} else {
return null;
}
}
}
......@@ -417,7 +417,7 @@ public final class GenericRequest<A, T, Z, R> implements Request, SizeReadyCallb
final DataFetcher<T> dataFetcher = modelLoader.getResourceFetcher(model, width, height);
if (dataFetcher == null) {
onException(new Exception("Got null fetcher from model loader"));
onException(new Exception("Failed to load model: " + model));
return;
}
ResourceTranscoder<Z, R> transcoder = loadProvider.getTranscoder();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册