/*
* Copyright (c) 2015-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
package com.facebook.imagepipeline.core;
import javax.annotation.Nullable;
import android.content.ContentResolver;
import android.content.Context;
import android.content.res.AssetManager;
import android.content.res.Resources;
import com.facebook.cache.common.CacheKey;
import com.facebook.common.memory.ByteArrayPool;
import com.facebook.common.memory.PooledByteBuffer;
import com.facebook.common.memory.PooledByteBufferFactory;
import com.facebook.common.references.CloseableReference;
import com.facebook.imagepipeline.bitmaps.PlatformBitmapFactory;
import com.facebook.imagepipeline.cache.BufferedDiskCache;
import com.facebook.imagepipeline.cache.CacheKeyFactory;
import com.facebook.imagepipeline.cache.MediaIdExtractor;
import com.facebook.imagepipeline.cache.MediaVariationsIndex;
import com.facebook.imagepipeline.cache.MemoryCache;
import com.facebook.imagepipeline.decoder.ImageDecoder;
import com.facebook.imagepipeline.decoder.ProgressiveJpegConfig;
import com.facebook.imagepipeline.image.CloseableImage;
import com.facebook.imagepipeline.image.EncodedImage;
import com.facebook.imagepipeline.producers.AddImageTransformMetaDataProducer;
import com.facebook.imagepipeline.producers.BitmapMemoryCacheGetProducer;
import com.facebook.imagepipeline.producers.BitmapMemoryCacheKeyMultiplexProducer;
import com.facebook.imagepipeline.producers.BitmapMemoryCacheProducer;
import com.facebook.imagepipeline.producers.BranchOnSeparateImagesProducer;
import com.facebook.imagepipeline.producers.DataFetchProducer;
import com.facebook.imagepipeline.producers.DecodeProducer;
import com.facebook.imagepipeline.producers.DiskCacheReadProducer;
import com.facebook.imagepipeline.producers.DiskCacheWriteProducer;
import com.facebook.imagepipeline.producers.EncodedCacheKeyMultiplexProducer;
import com.facebook.imagepipeline.producers.EncodedMemoryCacheProducer;
import com.facebook.imagepipeline.producers.LocalAssetFetchProducer;
import com.facebook.imagepipeline.producers.LocalContentUriFetchProducer;
import com.facebook.imagepipeline.producers.LocalContentUriThumbnailFetchProducer;
import com.facebook.imagepipeline.producers.LocalExifThumbnailProducer;
import com.facebook.imagepipeline.producers.LocalFileFetchProducer;
import com.facebook.imagepipeline.producers.LocalResourceFetchProducer;
import com.facebook.imagepipeline.producers.LocalVideoThumbnailProducer;
import com.facebook.imagepipeline.producers.MediaVariationsFallbackProducer;
import com.facebook.imagepipeline.producers.NetworkFetchProducer;
import com.facebook.imagepipeline.producers.NetworkFetcher;
import com.facebook.imagepipeline.producers.NullProducer;
import com.facebook.imagepipeline.producers.PostprocessedBitmapMemoryCacheProducer;
import com.facebook.imagepipeline.producers.PostprocessorProducer;
import com.facebook.imagepipeline.producers.Producer;
import com.facebook.imagepipeline.producers.QualifiedResourceFetchProducer;
import com.facebook.imagepipeline.producers.ResizeAndRotateProducer;
import com.facebook.imagepipeline.producers.SwallowResultProducer;
import com.facebook.imagepipeline.producers.ThreadHandoffProducer;
import com.facebook.imagepipeline.producers.ThreadHandoffProducerQueue;
import com.facebook.imagepipeline.producers.ThrottlingProducer;
import com.facebook.imagepipeline.producers.ThumbnailBranchProducer;
import com.facebook.imagepipeline.producers.ThumbnailProducer;
import com.facebook.imagepipeline.producers.WebpTranscodeProducer;
public class ProducerFactory {
private static final int MAX_SIMULTANEOUS_REQUESTS = 5;
// Local dependencies
private ContentResolver mContentResolver;
private Resources mResources;
private AssetManager mAssetManager;
// Decode dependencies
private final ByteArrayPool mByteArrayPool;
private final ImageDecoder mImageDecoder;
private final ProgressiveJpegConfig mProgressiveJpegConfig;
private final boolean mDownsampleEnabled;
private final boolean mResizeAndRotateEnabledForNetwork;
private final boolean mDecodeCancellationEnabled;
// Dependencies used by multiple steps
private final ExecutorSupplier mExecutorSupplier;
private final PooledByteBufferFactory mPooledByteBufferFactory;
// Cache dependencies
private final BufferedDiskCache mDefaultBufferedDiskCache;
private final BufferedDiskCache mSmallImageBufferedDiskCache;
private final MemoryCache<CacheKey, PooledByteBuffer> mEncodedMemoryCache;
private final MemoryCache<CacheKey, CloseableImage> mBitmapMemoryCache;
private final CacheKeyFactory mCacheKeyFactory;
private final MediaVariationsIndex mMediaVariationsIndex;
@Nullable private final MediaIdExtractor mMediaIdExtractor;
// Postproc dependencies
private final PlatformBitmapFactory mPlatformBitmapFactory;
public ProducerFactory(
Context context,
ByteArrayPool byteArrayPool,
ImageDecoder imageDecoder,
ProgressiveJpegConfig progressiveJpegConfig,
boolean downsampleEnabled,
boolean resizeAndRotateEnabledForNetwork,
boolean decodeCancellationEnabled,
ExecutorSupplier executorSupplier,
PooledByteBufferFactory pooledByteBufferFactory,
MemoryCache<CacheKey, CloseableImage> bitmapMemoryCache,
MemoryCache<CacheKey, PooledByteBuffer> encodedMemoryCache,
BufferedDiskCache defaultBufferedDiskCache,
BufferedDiskCache smallImageBufferedDiskCache,
MediaVariationsIndex mediaVariationsIndex,
@Nullable MediaIdExtractor mediaIdExtractor,
CacheKeyFactory cacheKeyFactory,
PlatformBitmapFactory platformBitmapFactory) {
mContentResolver = context.getApplicationContext().getContentResolver();
mResources = context.getApplicationContext().getResources();
mAssetManager = context.getApplicationContext().getAssets();
mByteArrayPool = byteArrayPool;
mImageDecoder = imageDecoder;
mProgressiveJpegConfig = progressiveJpegConfig;
mDownsampleEnabled = downsampleEnabled;
mResizeAndRotateEnabledForNetwork = resizeAndRotateEnabledForNetwork;
mDecodeCancellationEnabled = decodeCancellationEnabled;
mExecutorSupplier = executorSupplier;
mPooledByteBufferFactory = pooledByteBufferFactory;
mBitmapMemoryCache = bitmapMemoryCache;
mEncodedMemoryCache = encodedMemoryCache;
mDefaultBufferedDiskCache = defaultBufferedDiskCache;
mSmallImageBufferedDiskCache = smallImageBufferedDiskCache;
mMediaVariationsIndex = mediaVariationsIndex;
mMediaIdExtractor = mediaIdExtractor;
mCacheKeyFactory = cacheKeyFactory;
mPlatformBitmapFactory = platformBitmapFactory;
}
public static AddImageTransformMetaDataProducer newAddImageTransformMetaDataProducer(
Producer<EncodedImage> inputProducer) {
return new AddImageTransformMetaDataProducer(inputProducer);
}
public BitmapMemoryCacheGetProducer newBitmapMemoryCacheGetProducer(
Producer<CloseableReference<CloseableImage>> inputProducer) {
return new BitmapMemoryCacheGetProducer(mBitmapMemoryCache, mCacheKeyFactory, inputProducer);
}
public BitmapMemoryCacheKeyMultiplexProducer newBitmapMemoryCacheKeyMultiplexProducer(
Producer<CloseableReference<CloseableImage>> inputProducer) {
return new BitmapMemoryCacheKeyMultiplexProducer(mCacheKeyFactory, inputProducer);
}
public BitmapMemoryCacheProducer newBitmapMemoryCacheProducer(
Producer<CloseableReference<CloseableImage>> inputProducer) {
return new BitmapMemoryCacheProducer(mBitmapMemoryCache, mCacheKeyFactory, inputProducer);
}
public static BranchOnSeparateImagesProducer newBranchOnSeparateImagesProducer(
Producer<EncodedImage> inputProducer1,
Producer<EncodedImage> inputProducer2) {
return new BranchOnSeparateImagesProducer(inputProducer1, inputProducer2);
}
public DataFetchProducer newDataFetchProducer() {
return new DataFetchProducer(mPooledByteBufferFactory);
}
public DecodeProducer newDecodeProducer(Producer<EncodedImage> inputProducer) {
return new DecodeProducer(
mByteArrayPool,
mExecutorSupplier.forDecode(),
mImageDecoder,
mProgressiveJpegConfig,
mDownsampleEnabled,
mResizeAndRotateEnabledForNetwork,
mDecodeCancellationEnabled,
inputProducer);
}
public DiskCacheReadProducer newDiskCacheReadProducer(
Producer<EncodedImage> inputProducer) {
return new DiskCacheReadProducer(
mDefaultBufferedDiskCache,
mSmallImageBufferedDiskCache,
mCacheKeyFactory,
inputProducer
);
}
public DiskCacheWriteProducer newDiskCacheWriteProducer(
Producer<EncodedImage> inputProducer) {
return new DiskCacheWriteProducer(
mDefaultBufferedDiskCache,
mSmallImageBufferedDiskCache,
mCacheKeyFactory,
inputProducer
);
}
public MediaVariationsFallbackProducer newMediaVariationsProducer(
Producer<EncodedImage> inputProducer) {
return new MediaVariationsFallbackProducer(
mDefaultBufferedDiskCache,
mSmallImageBufferedDiskCache,
mCacheKeyFactory,
mMediaVariationsIndex,
mMediaIdExtractor,
inputProducer);
}
public EncodedCacheKeyMultiplexProducer newEncodedCacheKeyMultiplexProducer(
Producer<EncodedImage> inputProducer) {
return new EncodedCacheKeyMultiplexProducer(
mCacheKeyFactory,
inputProducer);
}
public EncodedMemoryCacheProducer newEncodedMemoryCacheProducer(
Producer<EncodedImage> inputProducer) {
return new EncodedMemoryCacheProducer(
mEncodedMemoryCache,
mCacheKeyFactory,
inputProducer);
}
public LocalAssetFetchProducer newLocalAssetFetchProducer() {
return new LocalAssetFetchProducer(
mExecutorSupplier.forLocalStorageRead(),
mPooledByteBufferFactory,
mAssetManager);
}
public LocalContentUriFetchProducer newLocalContentUriFetchProducer() {
return new LocalContentUriFetchProducer(
mExecutorSupplier.forLocalStorageRead(),
mPooledByteBufferFactory,
mContentResolver);
}
public LocalContentUriThumbnailFetchProducer newLocalContentUriThumbnailFetchProducer() {
return new LocalContentUriThumbnailFetchProducer(
mExecutorSupplier.forLocalStorageRead(),
mPooledByteBufferFactory,
mContentResolver);
}
public LocalExifThumbnailProducer newLocalExifThumbnailProducer() {
return new LocalExifThumbnailProducer(
mExecutorSupplier.forLocalStorageRead(),
mPooledByteBufferFactory,
mContentResolver);
}
public ThumbnailBranchProducer newThumbnailBranchProducer(
ThumbnailProducer<EncodedImage>[] thumbnailProducers) {
return new ThumbnailBranchProducer(thumbnailProducers);
}
public LocalFileFetchProducer newLocalFileFetchProducer() {
return new LocalFileFetchProducer(
mExecutorSupplier.forLocalStorageRead(),
mPooledByteBufferFactory);
}
public QualifiedResourceFetchProducer newQualifiedResourceFetchProducer() {
return new QualifiedResourceFetchProducer(
mExecutorSupplier.forLocalStorageRead(),
mPooledByteBufferFactory,
mContentResolver);
}
public LocalResourceFetchProducer newLocalResourceFetchProducer() {
return new LocalResourceFetchProducer(
mExecutorSupplier.forLocalStorageRead(),
mPooledByteBufferFactory,
mResources);
}
public LocalVideoThumbnailProducer newLocalVideoThumbnailProducer() {
return new LocalVideoThumbnailProducer(mExecutorSupplier.forLocalStorageRead());
}
public NetworkFetchProducer newNetworkFetchProducer(NetworkFetcher networkFetcher) {
return new NetworkFetchProducer(
mPooledByteBufferFactory,
mByteArrayPool,
networkFetcher);
}
public static <T> NullProducer<T> newNullProducer() {
return new NullProducer<T>();
}
public PostprocessedBitmapMemoryCacheProducer newPostprocessorBitmapMemoryCacheProducer(
Producer<CloseableReference<CloseableImage>> inputProducer) {
return new PostprocessedBitmapMemoryCacheProducer(
mBitmapMemoryCache, mCacheKeyFactory, inputProducer);
}
public PostprocessorProducer newPostprocessorProducer(
Producer<CloseableReference<CloseableImage>> inputProducer) {
return new PostprocessorProducer(
inputProducer, mPlatformBitmapFactory, mExecutorSupplier.forBackgroundTasks());
}
public ResizeAndRotateProducer newResizeAndRotateProducer(
Producer<EncodedImage> inputProducer,
boolean resizingEnabledIfNotDownsampling,
boolean useDownsamplingRatio) {
return new ResizeAndRotateProducer(
mExecutorSupplier.forBackgroundTasks(),
mPooledByteBufferFactory,
resizingEnabledIfNotDownsampling && !mDownsampleEnabled,
inputProducer,
useDownsamplingRatio);
}
public static <T> SwallowResultProducer<T> newSwallowResultProducer(Producer<T> inputProducer) {
return new SwallowResultProducer<T>(inputProducer);
}
public <T> ThreadHandoffProducer<T> newBackgroundThreadHandoffProducer(
Producer<T> inputProducer, ThreadHandoffProducerQueue inputThreadHandoffProducerQueue) {
return new ThreadHandoffProducer<T>(
inputProducer,
inputThreadHandoffProducerQueue);
}
public <T> ThrottlingProducer<T> newThrottlingProducer(
Producer<T> inputProducer) {
return new ThrottlingProducer<T>(
MAX_SIMULTANEOUS_REQUESTS,
mExecutorSupplier.forLightweightBackgroundTasks(),
inputProducer);
}
public WebpTranscodeProducer newWebpTranscodeProducer(
Producer<EncodedImage> inputProducer) {
return new WebpTranscodeProducer(
mExecutorSupplier.forBackgroundTasks(),
mPooledByteBufferFactory,
inputProducer);
}
}