blob: ca62923699408634187ba74c11d928e9b8977201 [file] [log] [blame]
package com.bumptech.glide;
import android.content.Context;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.load.model.ModelLoader;
import com.bumptech.glide.load.resource.transcode.ResourceTranscoder;
import com.bumptech.glide.load.resource.transcode.UnitTranscoder;
import com.bumptech.glide.manager.Lifecycle;
import com.bumptech.glide.manager.RequestTracker;
import com.bumptech.glide.provider.DataLoadProvider;
import com.bumptech.glide.provider.FixedLoadProvider;
import com.bumptech.glide.provider.LoadProvider;
import com.bumptech.glide.request.FutureTarget;
import com.bumptech.glide.request.target.Target;
import java.io.File;
/**
* A class for handling requests to load a generic resource type or transcode the generic resource type into another
* generic resource type.
*
* <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 the model used to retrieve data.
* @param <DataType> The type of data retrieved.
* @param <ResourceType> The type of resource to be decoded from the the data.
*/
public class GenericTranscodeRequest<ModelType, DataType, ResourceType>
extends GenericRequestBuilder<ModelType, DataType, ResourceType, ResourceType> implements DownloadOptions {
private final ModelLoader<ModelType, DataType> modelLoader;
private final Class<DataType> dataClass;
private final Class<ResourceType> resourceClass;
private final RequestManager.OptionsApplier optionsApplier;
private static <A, T, Z, R> LoadProvider<A, T, Z, R> build(Glide glide, ModelLoader<A, T> modelLoader,
Class<T> dataClass, Class<Z> resourceClass, ResourceTranscoder<Z, R> transcoder) {
DataLoadProvider<T, Z> dataLoadProvider = glide.buildDataProvider(dataClass, resourceClass);
return new FixedLoadProvider<A, T, Z, R>(modelLoader, transcoder, dataLoadProvider);
}
GenericTranscodeRequest(
Class<ResourceType> transcodeClass, GenericRequestBuilder<ModelType, ?, ?, ?> other,
ModelLoader<ModelType, DataType> modelLoader, Class<DataType> dataClass, Class<ResourceType> resourceClass,
RequestManager.OptionsApplier optionsApplier) {
super(build(other.glide, modelLoader, dataClass, resourceClass, UnitTranscoder.<ResourceType>get()),
transcodeClass, other);
this.modelLoader = modelLoader;
this.dataClass = dataClass;
this.resourceClass = resourceClass;
this.optionsApplier = optionsApplier;
}
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;
this.optionsApplier = optionsApplier;
}
/**
* Adds a transcoder to this request to transcode from the resource type to the given transcode type.
*
* @param transcoder The transcoder to use.
* @param transcodeClass The class of the resource type that will be transcoded to.
* @param <TranscodeType> The type of the resource that will be transcoded to.
* @return A new request builder to set options for the transcoded load.
*/
public <TranscodeType> GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType> transcode(
ResourceTranscoder<ResourceType, TranscodeType> transcoder, Class<TranscodeType> transcodeClass) {
LoadProvider<ModelType, DataType, ResourceType, TranscodeType> loadProvider = build(glide, modelLoader,
dataClass, resourceClass, transcoder);
return optionsApplier.apply(new GenericRequestBuilder<ModelType, DataType, ResourceType, TranscodeType>(
loadProvider, transcodeClass, this));
}
/**
* {@inheritDoc}
*/
public <Y extends Target<File>> Y downloadOnly(Y target) {
return getDownloadOnlyRequest().into(target);
}
/**
* {@inheritDoc}
*/
public FutureTarget<File> downloadOnly(int width, int height) {
return getDownloadOnlyRequest().into(width, height);
}
private GenericRequestBuilder<ModelType, DataType, File, File> getDownloadOnlyRequest() {
ResourceTranscoder<File, File> transcoder = UnitTranscoder.get();
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(new GenericRequestBuilder<ModelType, DataType, File, File>(fixedLoadProvider,
File.class, this))
.priority(Priority.LOW)
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.skipMemoryCache(true);
}
}