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

Allow request builder re-use.

上级 4c0c22e7
......@@ -16,7 +16,6 @@ import org.robolectric.annotation.Config;
import static com.bumptech.glide.tests.Util.arg;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyObject;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
......@@ -26,20 +25,18 @@ import static org.mockito.Mockito.when;
@Config(shadows = GlideShadowLooper.class)
public class BitmapTypeRequestTest {
private RequestManager.OptionsApplier optionsApplier;
private String model;
private BitmapTypeRequest request;
@SuppressWarnings("unchecked")
@Before
public void setUp() {
optionsApplier = mock(RequestManager.OptionsApplier.class);
when(optionsApplier.apply(anyObject(), any(GenericRequestBuilder.class))).thenAnswer(arg(1));
when(optionsApplier.apply(any(GenericRequestBuilder.class))).thenAnswer(arg(0));
Glide glide = mock(Glide.class);
when(glide.buildTranscoder(any(Class.class), any(Class.class))).thenReturn(mock(ResourceTranscoder.class));
when(glide.buildDataProvider(any(Class.class), any(Class.class))).thenReturn(mock(DataLoadProvider.class));
model = "testModel";
GenericRequestBuilder original = new GenericRequestBuilder(Robolectric.application, model,
GenericRequestBuilder original = new GenericRequestBuilder(Robolectric.application, Object.class,
mock(LoadProvider.class), null, glide, null, null);
request = new BitmapTypeRequest(original, mock(ModelLoader.class), mock(ModelLoader.class), optionsApplier);
}
......@@ -52,19 +49,19 @@ public class BitmapTypeRequestTest {
@Test
public void testAppliesDefaultOptionsOnToBytes() {
BitmapRequestBuilder builder = request.toBytes();
verify(optionsApplier).apply(eq(model), eq(builder));
verify(optionsApplier).apply(eq(builder));
}
@Test
public void testAppliesDefaultOptionsOnToBytesWithArgs() {
BitmapRequestBuilder builder = request.toBytes(Bitmap.CompressFormat.PNG, 2);
verify(optionsApplier).apply(eq(model), eq(builder));
verify(optionsApplier).apply(eq(builder));
}
@Test
public void testAppliesDefaultOptionsOnTranscode() {
ResourceTranscoder<Bitmap, Object> transcoder = mock(ResourceTranscoder.class);
BitmapRequestBuilder builder = request.transcode(transcoder, Object.class);
verify(optionsApplier).apply(eq(model), eq(builder));
verify(optionsApplier).apply(eq(builder));
}
}
\ No newline at end of file
......@@ -14,7 +14,6 @@ import org.robolectric.annotation.Config;
import static com.bumptech.glide.tests.Util.arg;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyObject;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
......@@ -31,9 +30,8 @@ public class DrawableTypeRequestTest {
@Before
public void setUp() {
optionsApplier = mock(RequestManager.OptionsApplier.class);
when(optionsApplier.apply(anyObject(), any(GenericRequestBuilder.class))).thenAnswer(arg(1));
model = "testModel";
request = new DrawableTypeRequest<String>(model, mock(ModelLoader.class),
when(optionsApplier.apply(any(GenericRequestBuilder.class))).thenAnswer(arg(0));
request = new DrawableTypeRequest<String>(String.class, mock(ModelLoader.class),
mock(ModelLoader.class), Robolectric.application, Glide.get(Robolectric.application),
mock(RequestTracker.class), mock(Lifecycle.class), optionsApplier);
}
......@@ -46,12 +44,12 @@ public class DrawableTypeRequestTest {
@Test
public void testDefaultOptionsAreAppliedOnAsBitmap() {
BitmapTypeRequest<String> builder = request.asBitmap();
verify(optionsApplier).apply(eq(model), eq(builder));
verify(optionsApplier).apply(eq(builder));
}
@Test
public void testDefaultOptionsAreAppliedOnAsGif() {
GifTypeRequest<String> builder = request.asGif();
verify(optionsApplier).apply(eq(model), eq(builder));
verify(optionsApplier).apply(eq(builder));
}
}
\ No newline at end of file
......@@ -36,13 +36,13 @@ public class GenericRequestBuilderTest {
@Test(expected = NullPointerException.class)
public void testThrowsIfContextIsNull() {
new GenericRequestBuilder(null, new Object(), mock(LoadProvider.class), Object.class, mock(Glide.class),
new GenericRequestBuilder(null, Object.class, mock(LoadProvider.class), Object.class, mock(Glide.class),
requestTracker, mock(Lifecycle.class));
}
@Test(expected = NullPointerException.class)
public void testThrowsIfNonNullModelAndNullLoadProvider() {
new GenericRequestBuilder(Robolectric.application, new Object(), null, Object.class, mock(Glide.class),
new GenericRequestBuilder(Robolectric.application, Object.class, null, Object.class, mock(Glide.class),
requestTracker, mock(Lifecycle.class));
}
......@@ -157,6 +157,6 @@ public class GenericRequestBuilderTest {
when(glide.buildImageViewTarget(any(ImageView.class), any(Class.class))).thenReturn(
mock(Target.class));
return new GenericRequestBuilder(Robolectric.application, null, null, Object.class, glide, requestTracker,
mock(Lifecycle.class));
mock(Lifecycle.class)).load(null);
}
}
......@@ -15,7 +15,6 @@ import org.robolectric.annotation.Config;
import static com.bumptech.glide.tests.Util.arg;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyObject;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
......@@ -25,17 +24,15 @@ import static org.mockito.Mockito.when;
@Config(shadows = GlideShadowLooper.class)
public class GenericTranscodeRequestTest {
private RequestManager.OptionsApplier optionsApplier;
private String model;
private GenericTranscodeRequest<String, Object, Object> request;
@SuppressWarnings("unchecked")
@Before
public void setUp() {
optionsApplier = mock(RequestManager.OptionsApplier.class);
when(optionsApplier.apply(anyObject(), any(GenericRequestBuilder.class))).thenAnswer(arg(1));
model = "testModel";
when(optionsApplier.apply(any(GenericRequestBuilder.class))).thenAnswer(arg(0));
request = new GenericTranscodeRequest<String, Object, Object>(Robolectric.application,
Glide.get(Robolectric.application), model, mock(ModelLoader.class), Object.class,
Glide.get(Robolectric.application), String.class, mock(ModelLoader.class), Object.class,
Object.class, mock(RequestTracker.class), mock(Lifecycle.class), optionsApplier);
}
......@@ -48,6 +45,6 @@ public class GenericTranscodeRequestTest {
public void testTranscodeAppliesDefaultOptions() {
ResourceTranscoder<Object, Object> transcoder = mock(ResourceTranscoder.class);
GenericRequestBuilder<String, Object, Object, Object> builder = request.transcode(transcoder, Object.class);
verify(optionsApplier).apply(eq(model), eq(builder));
verify(optionsApplier).apply(eq(builder));
}
}
\ No newline at end of file
......@@ -18,7 +18,6 @@ import java.io.InputStream;
import static com.bumptech.glide.tests.Util.arg;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyObject;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
......@@ -28,21 +27,19 @@ import static org.mockito.Mockito.when;
@Config(shadows = GlideShadowLooper.class)
public class GifTypeRequestTest {
private RequestManager.OptionsApplier optionsApplier;
private String model;
private GifTypeRequest<String> request;
@SuppressWarnings("unchecked")
@Before
public void setUp() {
optionsApplier = mock(RequestManager.OptionsApplier.class);
when(optionsApplier.apply(anyObject(), any(GenericRequestBuilder.class))).thenAnswer(arg(1));
when(optionsApplier.apply(any(GenericRequestBuilder.class))).thenAnswer(arg(0));
Glide glide = mock(Glide.class);
when(glide.buildTranscoder(any(Class.class), any(Class.class))).thenReturn(mock(ResourceTranscoder.class));
when(glide.buildDataProvider(any(Class.class), any(Class.class))).thenReturn(mock(DataLoadProvider.class));
model = "testModel";
GenericRequestBuilder original = new GenericRequestBuilder(Robolectric.application, model,
GenericRequestBuilder original = new GenericRequestBuilder(Robolectric.application, String.class,
mock(LoadProvider.class), null, glide, null, null);
request = new GifTypeRequest<String>(original, mock(ModelLoader.class), optionsApplier);
}
......@@ -57,12 +54,12 @@ public class GifTypeRequestTest {
ResourceTranscoder<GifDrawable, GifDrawable> transcoder = mock(ResourceTranscoder.class);
GenericRequestBuilder<String, InputStream, GifDrawable, GifDrawable> builder = request.transcode(transcoder,
GifDrawable.class);
verify(optionsApplier).apply(eq(model), eq(builder));
verify(optionsApplier).apply(eq(builder));
}
@Test
public void testToBytesApplesDefaultOptions() {
GenericRequestBuilder<String, InputStream, GifDrawable, byte[]> builder = request.toBytes();
verify(optionsApplier).apply(eq(model), eq(builder));
verify(optionsApplier).apply(eq(builder));
}
}
\ No newline at end of file
......@@ -77,7 +77,7 @@ public class RequestManagerTest {
.load(model)
.as(Bitmap.class);
verify(options).apply(eq(model), eq(builder));
verify(options).apply(eq(builder));
}
@Test
......@@ -87,7 +87,7 @@ public class RequestManagerTest {
DrawableTypeRequest<String> builder = manager.using(modelLoader)
.load(model);
verify(options).apply(eq(model), eq(builder));
verify(options).apply(eq(builder));
}
@Test
......@@ -97,7 +97,7 @@ public class RequestManagerTest {
DrawableTypeRequest<byte[]> builder = manager.using(loader)
.load(model);
verify(options).apply(eq(model), eq(builder));
verify(options).apply(eq(builder));
}
@Test
......@@ -107,21 +107,21 @@ public class RequestManagerTest {
DrawableTypeRequest<String> builder = manager.using(modelLoader)
.load(model);
verify(options).apply(eq(model), eq(builder));
verify(options).apply(eq(builder));
}
@Test
public void testAppliesDefaultOptionsToLoadString() {
String model = "fake";
DrawableTypeRequest<String> builder = manager.load(model);
verify(options).apply(eq(model), eq(builder));
verify(options).apply(eq(builder));
}
@Test
public void testAppliesDefaultOptionsToLoadUri() {
Uri uri = Uri.EMPTY;
DrawableTypeRequest<Uri> builder = manager.load(uri);
verify(options).apply(eq(uri), eq(builder));
verify(options).apply(eq(builder));
}
@Test
......@@ -129,7 +129,7 @@ public class RequestManagerTest {
Uri uri = Uri.EMPTY;
DrawableTypeRequest<Uri> builder = manager.loadFromMediaStore(uri, "image/jpeg", 123L, 0);
verify(options).apply(eq(uri), eq(builder));
verify(options).apply(eq(builder));
}
@Test
......@@ -137,7 +137,7 @@ public class RequestManagerTest {
int id = 123;
DrawableTypeRequest<Integer> builder = manager.load(id);
verify(options).apply(eq(id), eq(builder));
verify(options).apply(eq(builder));
}
@Test
......@@ -148,7 +148,7 @@ public class RequestManagerTest {
Double model = 2.2;
DrawableTypeRequest<Double> builder = manager.load(model);
verify(options).apply(eq(model), eq(builder));
verify(options).apply(eq(builder));
Glide.get(Robolectric.application).unregister(Double.class, InputStream.class);
}
......@@ -157,7 +157,7 @@ public class RequestManagerTest {
URL url = new URL("http://www.google.com");
DrawableTypeRequest<URL> builder = manager.load(url);
verify(options).apply(eq(url), eq(builder));
verify(options).apply(eq(builder));
}
@Test
......@@ -165,7 +165,7 @@ public class RequestManagerTest {
byte[] model = new byte[] { 1, 2, 4 };
DrawableTypeRequest<byte[]> builder = manager.load(model, "fakeId");
verify(options).apply(eq(model), eq(builder));
verify(options).apply(eq(builder));
}
@Test
......@@ -173,7 +173,7 @@ public class RequestManagerTest {
byte[] model = new byte[] { 5, 9, 23 };
DrawableTypeRequest<byte[]> builder = manager.load(model);
verify(options).apply(eq(model), eq(builder));
verify(options).apply(eq(builder));
}
@Test
......@@ -184,7 +184,7 @@ public class RequestManagerTest {
Float model = 23.2f;
DrawableTypeRequest<Float> builder = manager.load(model);
verify(options).apply(eq(model), eq(builder));
verify(options).apply(eq(builder));
Glide.get(Robolectric.application).unregister(Float.class, InputStream.class);
}
......
......@@ -62,6 +62,10 @@ public class Util {
@SuppressWarnings("unchecked")
@Override
public T answer(InvocationOnMock invocation) {
if (argumentIndex >= invocation.getArguments().length) {
throw new IllegalArgumentException("Cannot invoke argument " + argumentIndex
+ " greater than arguments length " + invocation.getArguments().length);
}
return (T) invocation.getArguments()[argumentIndex];
}
};
......
......@@ -455,6 +455,12 @@ public class BitmapRequestBuilder<ModelType, TranscodeType>
return this;
}
@Override
public BitmapRequestBuilder<ModelType, TranscodeType> load(ModelType model) {
super.load(model);
return this;
}
/**
* {@inheritDoc}
*
......
......@@ -20,7 +20,6 @@ import java.io.InputStream;
* @param <ModelType> The type of model to load the {@link Bitmap} or transcoded class from.
*/
public class BitmapTypeRequest<ModelType> extends BitmapRequestBuilder<ModelType, Bitmap> {
private final ModelType model;
private final ModelLoader<ModelType, InputStream> streamModelLoader;
private final ModelLoader<ModelType, ParcelFileDescriptor> fileDescriptorModelLoader;
private final Glide glide;
......@@ -53,7 +52,6 @@ public class BitmapTypeRequest<ModelType> extends BitmapRequestBuilder<ModelType
Bitmap.class, other);
this.streamModelLoader = streamModelLoader;
this.fileDescriptorModelLoader = fileDescriptorModelLoader;
this.model = other.model;
this.glide = other.glide;
this.optionsApplier = optionsApplier;
}
......@@ -68,7 +66,7 @@ public class BitmapTypeRequest<ModelType> extends BitmapRequestBuilder<ModelType
*/
public <R> BitmapRequestBuilder<ModelType, R> transcode(ResourceTranscoder<Bitmap, R> transcoder,
Class<R> transcodeClass) {
return optionsApplier.apply(model, new BitmapRequestBuilder<ModelType, R>(
return optionsApplier.apply(new BitmapRequestBuilder<ModelType, R>(
buildProvider(glide, streamModelLoader, fileDescriptorModelLoader, transcodeClass, transcoder),
transcodeClass, this));
}
......
......@@ -41,10 +41,10 @@ public class DrawableRequestBuilder<ModelType>
extends GenericRequestBuilder<ModelType, ImageVideoWrapper, GifBitmapWrapper, GlideDrawable>
implements BitmapOptions, DrawableOptions {
DrawableRequestBuilder(Context context, ModelType model,
DrawableRequestBuilder(Context context, Class<ModelType> modelClass,
LoadProvider<ModelType, ImageVideoWrapper, GifBitmapWrapper, GlideDrawable> loadProvider, Glide glide,
RequestTracker requestTracker, Lifecycle lifecycle) {
super(context, model, loadProvider, GlideDrawable.class, glide, requestTracker, lifecycle);
super(context, modelClass, loadProvider, GlideDrawable.class, glide, requestTracker, lifecycle);
// Default to animating.
crossFade();
}
......@@ -406,6 +406,12 @@ public class DrawableRequestBuilder<ModelType>
return this;
}
@Override
public DrawableRequestBuilder<ModelType> load(ModelType model) {
super.load(model);
return this;
}
/**
* {@inheritDoc}
*
......
......@@ -50,10 +50,10 @@ public class DrawableTypeRequest<ModelType> extends DrawableRequestBuilder<Model
return new FixedLoadProvider<A, ImageVideoWrapper, Z, R>(modelLoader, transcoder, dataLoadProvider);
}
DrawableTypeRequest(ModelType model, ModelLoader<ModelType, InputStream> streamModelLoader,
DrawableTypeRequest(Class<ModelType> modelClass, ModelLoader<ModelType, InputStream> streamModelLoader,
ModelLoader<ModelType, ParcelFileDescriptor> fileDescriptorModelLoader, Context context, Glide glide,
RequestTracker requestTracker, Lifecycle lifecycle, RequestManager.OptionsApplier optionsApplier) {
super(context, model,
super(context, modelClass,
buildProvider(glide, streamModelLoader, fileDescriptorModelLoader, GifBitmapWrapper.class,
GlideDrawable.class, null),
glide, requestTracker, lifecycle);
......@@ -68,7 +68,7 @@ public class DrawableTypeRequest<ModelType> extends DrawableRequestBuilder<Model
* @return A new request builder for loading a {@link android.graphics.Bitmap}
*/
public BitmapTypeRequest<ModelType> asBitmap() {
return optionsApplier.apply(model, new BitmapTypeRequest<ModelType>(this, streamModelLoader,
return optionsApplier.apply(new BitmapTypeRequest<ModelType>(this, streamModelLoader,
fileDescriptorModelLoader, optionsApplier));
}
......@@ -85,7 +85,7 @@ public class DrawableTypeRequest<ModelType> extends DrawableRequestBuilder<Model
* @return A new request builder for loading a {@link com.bumptech.glide.load.resource.gif.GifDrawable}.
*/
public GifTypeRequest<ModelType> asGif() {
return optionsApplier.apply(model, new GifTypeRequest<ModelType>(this, streamModelLoader, optionsApplier));
return optionsApplier.apply(new GifTypeRequest<ModelType>(this, streamModelLoader, optionsApplier));
}
/**
......@@ -103,7 +103,7 @@ public class DrawableTypeRequest<ModelType> extends DrawableRequestBuilder<Model
}
private GenericTranscodeRequest<ModelType, InputStream, File> getDownloadOnlyRequest() {
return optionsApplier.apply(model, new GenericTranscodeRequest<ModelType, InputStream, File>(File.class, this,
return optionsApplier.apply(new GenericTranscodeRequest<ModelType, InputStream, File>(File.class, this,
streamModelLoader, InputStream.class, File.class, optionsApplier));
}
}
......@@ -38,11 +38,6 @@ import java.io.File;
/**
* A generic class that can handle setting options and staring loads for generic resource types.
*
* <p>
* Warning - It is <em>not</em> safe to use this builder after calling <code>into()</code>, it may be pooled and
* reused.
* </p>
*
* @param <ModelType> The type of model representing the resource.
* @param <DataType> The data type that the resource {@link com.bumptech.glide.load.model.ModelLoader} will provide that
* can be decoded by the {@link com.bumptech.glide.load.ResourceDecoder}.
......@@ -50,9 +45,9 @@ import java.io.File;
* @param <TranscodeType> The type of resource the decoded resource will be transcoded to.
*/
public class GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> {
protected final Class<ModelType> modelClass;
protected final Context context;
protected final Glide glide;
protected final ModelType model;
protected final Class<TranscodeType> transcodeClass;
protected final RequestTracker requestTracker;
protected final Lifecycle lifecycle;
......@@ -60,6 +55,10 @@ public class GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeT
private Key signature = EmptySignature.obtain();
private ModelType model;
// model may occasionally be null, so to enforce that load() was called, set a boolean rather than relying on model
// not to be null.
private boolean isModelSet;
private int placeholderId;
private int errorId;
private RequestListener<ModelType, TranscodeType> requestListener;
......@@ -79,18 +78,20 @@ public class GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeT
GenericRequestBuilder(LoadProvider<ModelType, DataType, ResourceType, TranscodeType> loadProvider,
Class<TranscodeType> transcodeClass, GenericRequestBuilder<ModelType, ?, ?, ?> other) {
this(other.context, other.model, loadProvider, transcodeClass, other.glide, other.requestTracker,
this(other.context, other.modelClass, loadProvider, transcodeClass, other.glide, other.requestTracker,
other.lifecycle);
this.signature = other.signature;
this.diskCacheStrategy = other.diskCacheStrategy;
this.isCacheable = other.isCacheable;
this.model = other.model;
this.isModelSet = other.isModelSet;
}
GenericRequestBuilder(Context context, ModelType model,
GenericRequestBuilder(Context context, Class<ModelType> modelClass,
LoadProvider<ModelType, DataType, ResourceType, TranscodeType> loadProvider,
Class<TranscodeType> transcodeClass, Glide glide, RequestTracker requestTracker, Lifecycle lifecycle) {
this.context = context;
this.model = model;
this.modelClass = modelClass;
this.transcodeClass = transcodeClass;
this.glide = glide;
this.requestTracker = requestTracker;
......@@ -101,7 +102,7 @@ public class GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeT
if (context == null) {
throw new NullPointerException("Context can't be null");
}
if (model != null && loadProvider == null) {
if (modelClass != null && loadProvider == null) {
throw new NullPointerException("LoadProvider must not be null");
}
}
......@@ -541,6 +542,24 @@ public class GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeT
return this;
}
/**
* Sets the specific model to load data for.
*
* <p>
* This method must be called at least once before {@link #into(com.bumptech.glide.request.target.Target)} is
* called.
* </p>
*
* @param model The model to load data for, or null.
* @return This request builder.
*/
public GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> load(ModelType model) {
this.model = model;
isModelSet = true;
return this;
}
/**
* Set the target the resource will be loaded into.
*
......@@ -554,6 +573,9 @@ public class GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeT
if (target == null) {
throw new IllegalArgumentException("You must pass in a non null Target");
}
if (!isModelSet) {
throw new IllegalArgumentException("You must first set a model (try #load())");
}
Request previous = target.getRequest();
......
......@@ -53,11 +53,11 @@ public class GenericTranscodeRequest<ModelType, DataType, ResourceType>
this.optionsApplier = optionsApplier;
}
GenericTranscodeRequest(Context context, Glide glide, ModelType model, ModelLoader<ModelType, DataType> modelLoader,
Class<DataType> dataClass, Class<ResourceType> resourceClass, RequestTracker requestTracker,
Lifecycle lifecycle, RequestManager.OptionsApplier optionsApplier) {
super(context, model, build(glide, modelLoader, dataClass, resourceClass, UnitTranscoder.<ResourceType>get()),
resourceClass, glide, requestTracker, lifecycle);
GenericTranscodeRequest(Context context, Glide glide, Class<ModelType> modelClass,
ModelLoader<ModelType, DataType> modelLoader, Class<DataType> dataClass, Class<ResourceType> resourceClass,
RequestTracker requestTracker, Lifecycle lifecycle, RequestManager.OptionsApplier optionsApplier) {
super(context, modelClass, build(glide, modelLoader, dataClass, resourceClass,
UnitTranscoder.<ResourceType>get()), resourceClass, glide, requestTracker, lifecycle);
this.modelLoader = modelLoader;
this.dataClass = dataClass;
this.resourceClass = resourceClass;
......@@ -77,9 +77,8 @@ public class GenericTranscodeRequest<ModelType, DataType, ResourceType>
LoadProvider<ModelType, DataType, ResourceType, TranscodeType> loadProvider = build(glide, modelLoader,
dataClass, resourceClass, transcoder);
return optionsApplier.apply(model,
new GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType>(loadProvider,
transcodeClass, this));
return optionsApplier.apply(new GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType>(
loadProvider, transcodeClass, this));
}
/**
......@@ -101,7 +100,7 @@ public class GenericTranscodeRequest<ModelType, DataType, ResourceType>
DataLoadProvider<DataType, File> dataLoadProvider = glide.buildDataProvider(dataClass, File.class);
FixedLoadProvider<ModelType, DataType, File, File> fixedLoadProvider =
new FixedLoadProvider<ModelType, DataType, File, File>(modelLoader, transcoder, dataLoadProvider);
return optionsApplier.apply(model, new GenericRequestBuilder<ModelType, DataType, File, File>(fixedLoadProvider,
return optionsApplier.apply(new GenericRequestBuilder<ModelType, DataType, File, File>(fixedLoadProvider,
File.class, this))
.priority(Priority.LOW)
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
......
......@@ -397,6 +397,12 @@ public class GifRequestBuilder<ModelType>
return this;
}
@Override
public GifRequestBuilder<ModelType> load(ModelType model) {
super.load(model);
return this;
}
@Override
void applyFitCenter() {
fitCenter();
......
......@@ -62,8 +62,8 @@ public class GifTypeRequest<ModelType> extends GifRequestBuilder<ModelType> {
ResourceTranscoder<GifDrawable, R> transcoder, Class<R> transcodeClass) {
FixedLoadProvider<ModelType, InputStream, GifDrawable, R> provider = buildProvider(glide, streamModelLoader,
transcodeClass, transcoder);
return optionsApplier.apply(model,
new GenericRequestBuilder<ModelType, InputStream, GifDrawable, R>(provider, transcodeClass, this));
return optionsApplier.apply(new GenericRequestBuilder<ModelType, InputStream, GifDrawable, R>(provider,
transcodeClass, this));
}
/**
......
......@@ -85,11 +85,10 @@ public class RequestManager implements LifecycleListener {
/**
* Allows the implementor to apply some options to the given request.
*
* @param model The model that is being loaded.
* @param requestBuilder The request builder being used to construct the load.
* @param <T> The type of the model.
*/
<T> void apply(T model, GenericRequestBuilder<T, ?, ?, ?> requestBuilder);
<T> void apply(GenericRequestBuilder<T, ?, ?, ?> requestBuilder);
}
/**
......@@ -328,8 +327,9 @@ public class RequestManager implements LifecycleListener {
ModelLoader<Uri, ParcelFileDescriptor> fileDescriptorModelLoader = Glide.buildFileDescriptorModelLoader(uri,
context);
return optionsApplier.apply(uri, new DrawableTypeRequest<Uri>(uri, mediaStoreLoader,
fileDescriptorModelLoader, context, glide, requestTracker, lifecycle, optionsApplier));
return (DrawableTypeRequest<Uri>) optionsApplier.apply(new DrawableTypeRequest<Uri>(Uri.class, mediaStoreLoader,
fileDescriptorModelLoader, context, glide, requestTracker, lifecycle, optionsApplier))
.load(uri);
}
/**
......@@ -461,6 +461,7 @@ public class RequestManager implements LifecycleListener {
return loadGeneric(model);
}
@SuppressWarnings("unchecked")
private <T> DrawableTypeRequest<T> loadGeneric(T model) {
ModelLoader<T, InputStream> streamModelLoader = Glide.buildStreamModelLoader(model, context);
ModelLoader<T, ParcelFileDescriptor> fileDescriptorModelLoader =
......@@ -470,8 +471,16 @@ public class RequestManager implements LifecycleListener {
+ " which there is a registered ModelLoader, if you are using a custom model, you must first call"
+ " Glide#register with a ModelLoaderFactory for your custom model class");
}
return optionsApplier.apply(model, new DrawableTypeRequest<T>(model, streamModelLoader,
fileDescriptorModelLoader, context, glide, requestTracker, lifecycle, optionsApplier));
return (DrawableTypeRequest<T>) optionsApplier.apply(
new DrawableTypeRequest<T>(getSafeClass(model), streamModelLoader, fileDescriptorModelLoader, context,
glide, requestTracker, lifecycle, optionsApplier))
.load(model);
}
@SuppressWarnings("unchecked")
private static <T> Class<T> getSafeClass(T model) {
return model != null ? (Class<T>) model.getClass() : null;
}
/**
......@@ -488,8 +497,9 @@ public class RequestManager implements LifecycleListener {
}
public DrawableTypeRequest<T> load(T model) {
return optionsApplier.apply(model, new DrawableTypeRequest<T>(model, null, loader, context,
glide, requestTracker, lifecycle, optionsApplier));
return (DrawableTypeRequest<T>) optionsApplier.apply(new DrawableTypeRequest<T>(getSafeClass(model), null,
loader, context, glide, requestTracker, lifecycle, optionsApplier))
.load(model);
}
}
......@@ -507,8 +517,9 @@ public class RequestManager implements LifecycleListener {
}
public DrawableTypeRequest<T> load(T model) {
return optionsApplier.apply(model, new DrawableTypeRequest<T>(model, loader, null, context,
glide, requestTracker, lifecycle, optionsApplier));
return (DrawableTypeRequest<T>) optionsApplier.apply(new DrawableTypeRequest<T>(getSafeClass(model), loader,
null, context, glide, requestTracker, lifecycle, optionsApplier))
.load(model);
}
}
......@@ -559,17 +570,19 @@ public class RequestManager implements LifecycleListener {
* @return This request builder.
*/
public <Z> GenericTranscodeRequest<A, T, Z> as(Class<Z> resourceClass) {
return optionsApplier.apply(model, new GenericTranscodeRequest<A, T, Z>(context, glide, model,
modelLoader, dataClass, resourceClass, requestTracker, lifecycle, optionsApplier));
return (GenericTranscodeRequest<A, T, Z>) optionsApplier.apply(
new GenericTranscodeRequest<A, T, Z>(context, glide, getSafeClass(model), modelLoader,
dataClass, resourceClass, requestTracker, lifecycle, optionsApplier))
.load(model);
}
}
}
class OptionsApplier {
public <A, X extends GenericRequestBuilder<A, ?, ?, ?>> X apply(A model, X builder) {
public <A, X extends GenericRequestBuilder<A, ?, ?, ?>> X apply(X builder) {
if (options != null) {
options.apply(model, builder);
options.apply(builder);
}
return builder;
}
......
......@@ -16,7 +16,6 @@ import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
/**
* The primary activity in the Giphy sample that allows users to view trending animated GIFs from Giphy's api.
*/
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册