package com.bumptech.glide.load.engine; import com.bumptech.glide.GlideContext; import com.bumptech.glide.Priority; import com.bumptech.glide.Registry; import com.bumptech.glide.load.Encoder; import com.bumptech.glide.load.Key; import com.bumptech.glide.load.Options; import com.bumptech.glide.load.ResourceEncoder; import com.bumptech.glide.load.Transformation; import com.bumptech.glide.load.engine.cache.DiskCache; import com.bumptech.glide.load.model.ModelLoader; import com.bumptech.glide.load.model.ModelLoader.LoadData; import com.bumptech.glide.load.resource.UnitTransformation; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Map; final class DecodeHelper<Transcode> { private final List<LoadData<?>> loadData = new ArrayList<>(); private final List<Key> cacheKeys = new ArrayList<>(); private GlideContext glideContext; private Object model; private int width; private int height; private Class<?> resourceClass; private DecodeJob.DiskCacheProvider diskCacheProvider; private Options options; private Map<Class<?>, Transformation<?>> transformations; private Class<Transcode> transcodeClass; private boolean isLoadDataSet; private boolean isCacheKeysSet; private Key signature; private Priority priority; private DiskCacheStrategy diskCacheStrategy; private boolean isTransformationRequired; @SuppressWarnings("unchecked") <R> DecodeHelper<R> init( GlideContext glideContext, Object model, Key signature, int width, int height, DiskCacheStrategy diskCacheStrategy, Class<?> resourceClass, Class<R> transcodeClass, Priority priority, Options options, Map<Class<?>, Transformation<?>> transformations, boolean isTransformationRequired, DecodeJob.DiskCacheProvider diskCacheProvider) { this.glideContext = glideContext; this.model = model; this.signature = signature; this.width = width; this.height = height; this.diskCacheStrategy = diskCacheStrategy; this.resourceClass = resourceClass; this.diskCacheProvider = diskCacheProvider; this.transcodeClass = (Class<Transcode>) transcodeClass; this.priority = priority; this.options = options; this.transformations = transformations; this.isTransformationRequired = isTransformationRequired; return (DecodeHelper<R>) this; } Object getModel() { return model; } void clear() { glideContext = null; model = null; signature = null; resourceClass = null; transcodeClass = null; options = null; priority = null; transformations = null; diskCacheStrategy = null; loadData.clear(); isLoadDataSet = false; cacheKeys.clear(); isCacheKeysSet = false; } DiskCache getDiskCache() { return diskCacheProvider.getDiskCache(); } DiskCacheStrategy getDiskCacheStrategy() { return diskCacheStrategy; } Priority getPriority() { return priority; } Options getOptions() { return options; } Key getSignature() { return signature; } int getWidth() { return width; } int getHeight() { return height; } List<Class<?>> getRegisteredResourceClasses() { return glideContext.getRegistry() .getRegisteredResourceClasses(model.getClass(), resourceClass, transcodeClass); } boolean hasLoadPath(Class<?> dataClass) { return getLoadPath(dataClass) != null; } <Data> LoadPath<Data, ?, Transcode> getLoadPath(Class<Data> dataClass) { return glideContext.getRegistry().getLoadPath(dataClass, resourceClass, transcodeClass); } @SuppressWarnings("unchecked") <Z> Transformation<Z> getTransformation(Class<Z> resourceClass) { Transformation<Z> result = (Transformation<Z>) transformations.get(resourceClass); if (result == null) { if (transformations.isEmpty() && isTransformationRequired) { throw new IllegalArgumentException( "Missing transformation for " + resourceClass + ". If you wish to" + " ignore unknown resource types, use the optional transformation methods."); } else { return UnitTransformation.get(); } } return result; } boolean isResourceEncoderAvailable(Resource<?> resource) { return glideContext.getRegistry().isResourceEncoderAvailable(resource); } <Z> ResourceEncoder<Z> getResultEncoder(Resource<Z> resource) { return glideContext.getRegistry().getResultEncoder(resource); } List<ModelLoader<File, ?>> getModelLoaders(File file) throws Registry.NoModelLoaderAvailableException { return glideContext.getRegistry().getModelLoaders(file); } boolean isSourceKey(Key key) { List<LoadData<?>> loadData = getLoadData(); int size = loadData.size(); for (int i = 0; i < size; i++) { LoadData<?> current = loadData.get(i); if (current.sourceKey.equals(key)) { return true; } } return false; } List<LoadData<?>> getLoadData() { if (!isLoadDataSet) { isLoadDataSet = true; loadData.clear(); List<ModelLoader<Object, ?>> modelLoaders = glideContext.getRegistry().getModelLoaders(model); int size = modelLoaders.size(); for (int i = 0; i < size; i++) { ModelLoader<Object, ?> modelLoader = modelLoaders.get(i); LoadData<?> current = modelLoader.buildLoadData(model, width, height, options); if (current != null) { loadData.add(current); } } } return loadData; } List<Key> getCacheKeys() { if (!isCacheKeysSet) { isCacheKeysSet = true; cacheKeys.clear(); List<LoadData<?>> loadData = getLoadData(); int size = loadData.size(); for (int i = 0; i < size; i++) { LoadData<?> data = loadData.get(i); if (!cacheKeys.contains(data.sourceKey)) { cacheKeys.add(data.sourceKey); } for (int j = 0; j < data.alternateKeys.size(); j++) { if (!cacheKeys.contains(data.alternateKeys.get(j))) { cacheKeys.add(data.alternateKeys.get(j)); } } } } return cacheKeys; } <X> Encoder<X> getSourceEncoder(X data) throws Registry.NoSourceEncoderAvailableException { return glideContext.getRegistry().getSourceEncoder(data); } }