From 3b5ffde166f48e73136abf5fb8252fafa1ee95ba Mon Sep 17 00:00:00 2001 From: sunnylqm Date: Sun, 25 Feb 2024 23:36:25 +0800 Subject: [PATCH 1/4] feat: new downsample mode --- .../imagepipeline/core/ImagePipelineConfig.kt | 27 +++++++++++++++---- .../core/ImagePipelineConfigInterface.kt | 2 +- .../core/ImagePipelineExperiments.kt | 6 ++--- .../core/ImagePipelineFactory.java | 4 +-- .../imagepipeline/core/ProducerFactory.java | 8 +++--- .../core/ProducerSequenceFactory.kt | 4 +-- .../imagepipeline/producers/DecodeProducer.kt | 6 +++-- 7 files changed, 38 insertions(+), 19 deletions(-) diff --git a/imagepipeline/src/main/java/com/facebook/imagepipeline/core/ImagePipelineConfig.kt b/imagepipeline/src/main/java/com/facebook/imagepipeline/core/ImagePipelineConfig.kt index 6124fe1816..ecee4a74ea 100644 --- a/imagepipeline/src/main/java/com/facebook/imagepipeline/core/ImagePipelineConfig.kt +++ b/imagepipeline/src/main/java/com/facebook/imagepipeline/core/ImagePipelineConfig.kt @@ -81,7 +81,7 @@ class ImagePipelineConfig private constructor(builder: Builder) : ImagePipelineC override val bitmapMemoryCacheEntryStateObserver: EntryStateObserver? override val cacheKeyFactory: CacheKeyFactory override val context: Context - override val isDownsampleEnabled: Boolean + override val downsampleMode: DownsampleMode override val fileCacheFactory: FileCacheFactory override val encodedMemoryCacheParamsSupplier: Supplier override val executorSupplier: ExecutorSupplier @@ -137,7 +137,7 @@ class ImagePipelineConfig private constructor(builder: Builder) : ImagePipelineC context = checkNotNull(builder.context) fileCacheFactory = builder.fileCacheFactory ?: DiskStorageCacheFactory(DynamicDefaultDiskStorageFactory()) - isDownsampleEnabled = builder.downsampleEnabled + downsampleMode = builder.downsampleMode encodedMemoryCacheParamsSupplier = builder.encodedMemoryCacheParamsSupplier ?: DefaultEncodedMemoryCacheParamsSupplier() imageCacheStatsTracker = @@ -200,6 +200,7 @@ class ImagePipelineConfig private constructor(builder: Builder) : ImagePipelineC } } + /** Contains default configuration that can be personalized for all the request */ class DefaultImageRequestConfig { var isProgressiveRenderingEnabled = false @@ -225,7 +226,8 @@ class ImagePipelineConfig private constructor(builder: Builder) : ImagePipelineC private set val context: Context - var downsampleEnabled = false + + var downsampleMode = DownsampleMode.AUTO private set var encodedMemoryCacheParamsSupplier: Supplier? = null @@ -350,10 +352,19 @@ class ImagePipelineConfig private constructor(builder: Builder) : ImagePipelineC this.fileCacheFactory = fileCacheFactory } - fun isDownsampleEnabled(): Boolean = this.downsampleEnabled + fun isDownsampleEnabled(): Boolean = this.downsampleMode === DownsampleMode.ALWAYS + + fun setDownsampleMode(downsampleMode: DownsampleMode): Builder = apply { + this.downsampleMode = downsampleMode + } + @Deprecated("Use the new setDownsampleMode() method") fun setDownsampleEnabled(downsampleEnabled: Boolean): Builder = apply { - this.downsampleEnabled = downsampleEnabled + if (downsampleEnabled) { + setDownsampleMode(DownsampleMode.ALWAYS) + } else { + setDownsampleMode(DownsampleMode.AUTO) + } } fun isDiskCacheEnabled(): Boolean = this.diskCacheEnabled @@ -559,3 +570,9 @@ class ImagePipelineConfig private constructor(builder: Builder) : ImagePipelineC } } } + +enum class DownsampleMode { + ALWAYS, + AUTO, + NEVER +} diff --git a/imagepipeline/src/main/java/com/facebook/imagepipeline/core/ImagePipelineConfigInterface.kt b/imagepipeline/src/main/java/com/facebook/imagepipeline/core/ImagePipelineConfigInterface.kt index 1adaedd39a..925af4bc3b 100644 --- a/imagepipeline/src/main/java/com/facebook/imagepipeline/core/ImagePipelineConfigInterface.kt +++ b/imagepipeline/src/main/java/com/facebook/imagepipeline/core/ImagePipelineConfigInterface.kt @@ -46,7 +46,7 @@ interface ImagePipelineConfigInterface { val cacheKeyFactory: CacheKeyFactory val context: Context val fileCacheFactory: FileCacheFactory - val isDownsampleEnabled: Boolean + val downsampleMode: DownsampleMode val isDiskCacheEnabled: Boolean val encodedMemoryCacheParamsSupplier: Supplier val executorSupplier: ExecutorSupplier diff --git a/imagepipeline/src/main/java/com/facebook/imagepipeline/core/ImagePipelineExperiments.kt b/imagepipeline/src/main/java/com/facebook/imagepipeline/core/ImagePipelineExperiments.kt index 48902b41f4..6d19277768 100644 --- a/imagepipeline/src/main/java/com/facebook/imagepipeline/core/ImagePipelineExperiments.kt +++ b/imagepipeline/src/main/java/com/facebook/imagepipeline/core/ImagePipelineExperiments.kt @@ -340,7 +340,7 @@ class ImagePipelineExperiments private constructor(builder: Builder) { byteArrayPool: ByteArrayPool, imageDecoder: ImageDecoder, progressiveJpegConfig: ProgressiveJpegConfig, - downsampleEnabled: Boolean, + downsampleMode: DownsampleMode, resizeAndRotateEnabledForNetwork: Boolean, decodeCancellationEnabled: Boolean, executorSupplier: ExecutorSupplier, @@ -368,7 +368,7 @@ class ImagePipelineExperiments private constructor(builder: Builder) { byteArrayPool: ByteArrayPool, imageDecoder: ImageDecoder, progressiveJpegConfig: ProgressiveJpegConfig, - downsampleEnabled: Boolean, + downsampleMode: DownsampleMode, resizeAndRotateEnabledForNetwork: Boolean, decodeCancellationEnabled: Boolean, executorSupplier: ExecutorSupplier, @@ -393,7 +393,7 @@ class ImagePipelineExperiments private constructor(builder: Builder) { byteArrayPool!!, imageDecoder!!, progressiveJpegConfig!!, - downsampleEnabled, + downsampleMode, resizeAndRotateEnabledForNetwork, decodeCancellationEnabled, executorSupplier!!, diff --git a/imagepipeline/src/main/java/com/facebook/imagepipeline/core/ImagePipelineFactory.java b/imagepipeline/src/main/java/com/facebook/imagepipeline/core/ImagePipelineFactory.java index a0789e4e8b..ddef5dd718 100644 --- a/imagepipeline/src/main/java/com/facebook/imagepipeline/core/ImagePipelineFactory.java +++ b/imagepipeline/src/main/java/com/facebook/imagepipeline/core/ImagePipelineFactory.java @@ -361,7 +361,7 @@ private ProducerFactory getProducerFactory() { mConfig.getPoolFactory().getSmallByteArrayPool(), getImageDecoder(), mConfig.getProgressiveJpegConfig(), - mConfig.isDownsampleEnabled(), + mConfig.getDownsampleMode(), mConfig.isResizeAndRotateEnabledForNetwork(), mConfig.getExperiments().isDecodeCancellationEnabled(), mConfig.getExecutorSupplier(), @@ -399,7 +399,7 @@ private ProducerSequenceFactory getProducerSequenceFactory() { mConfig.isResizeAndRotateEnabledForNetwork(), mConfig.getExperiments().isWebpSupportEnabled(), mThreadHandoffProducerQueue, - mConfig.isDownsampleEnabled(), + mConfig.getDownsampleMode(), useBitmapPrepareToDraw, mConfig.getExperiments().isPartialImageCachingEnabled(), mConfig.isDiskCacheEnabled(), diff --git a/imagepipeline/src/main/java/com/facebook/imagepipeline/core/ProducerFactory.java b/imagepipeline/src/main/java/com/facebook/imagepipeline/core/ProducerFactory.java index 82c72a14ef..326837a00a 100644 --- a/imagepipeline/src/main/java/com/facebook/imagepipeline/core/ProducerFactory.java +++ b/imagepipeline/src/main/java/com/facebook/imagepipeline/core/ProducerFactory.java @@ -83,7 +83,7 @@ public class ProducerFactory { protected final ByteArrayPool mByteArrayPool; protected final ImageDecoder mImageDecoder; protected final ProgressiveJpegConfig mProgressiveJpegConfig; - protected final boolean mDownsampleEnabled; + protected final DownsampleMode mDownsampleMode; protected final boolean mResizeAndRotateEnabledForNetwork; protected final boolean mDecodeCancellationEnabled; @@ -120,7 +120,7 @@ public ProducerFactory( ByteArrayPool byteArrayPool, ImageDecoder imageDecoder, ProgressiveJpegConfig progressiveJpegConfig, - boolean downsampleEnabled, + DownsampleMode downsampleMode, boolean resizeAndRotateEnabledForNetwork, boolean decodeCancellationEnabled, ExecutorSupplier executorSupplier, @@ -145,7 +145,7 @@ public ProducerFactory( mByteArrayPool = byteArrayPool; mImageDecoder = imageDecoder; mProgressiveJpegConfig = progressiveJpegConfig; - mDownsampleEnabled = downsampleEnabled; + mDownsampleMode = downsampleMode; mResizeAndRotateEnabledForNetwork = resizeAndRotateEnabledForNetwork; mDecodeCancellationEnabled = decodeCancellationEnabled; @@ -206,7 +206,7 @@ public DecodeProducer newDecodeProducer(Producer inputProducer) { mExecutorSupplier.forDecode(), mImageDecoder, mProgressiveJpegConfig, - mDownsampleEnabled, + mDownsampleMode, mResizeAndRotateEnabledForNetwork, mDecodeCancellationEnabled, inputProducer, diff --git a/imagepipeline/src/main/java/com/facebook/imagepipeline/core/ProducerSequenceFactory.kt b/imagepipeline/src/main/java/com/facebook/imagepipeline/core/ProducerSequenceFactory.kt index dfa3a19ca3..259f216d88 100644 --- a/imagepipeline/src/main/java/com/facebook/imagepipeline/core/ProducerSequenceFactory.kt +++ b/imagepipeline/src/main/java/com/facebook/imagepipeline/core/ProducerSequenceFactory.kt @@ -37,7 +37,7 @@ class ProducerSequenceFactory( private val resizeAndRotateEnabledForNetwork: Boolean, private val webpSupportEnabled: Boolean, private val threadHandoffProducerQueue: ThreadHandoffProducerQueue, - private val downSampleEnabled: Boolean, + private val downsampleMode: DownsampleMode, private val useBitmapPrepareToDraw: Boolean, private val partialImageCachingEnabled: Boolean, private val diskCacheEnabled: Boolean, @@ -276,7 +276,7 @@ class ProducerSequenceFactory( networkFetchToEncodedMemorySequence = producerFactory.newResizeAndRotateProducer( networkFetchToEncodedMemorySequence, - resizeAndRotateEnabledForNetwork && !downSampleEnabled, + resizeAndRotateEnabledForNetwork && downsampleMode != DownsampleMode.NEVER, imageTranscoderFactory) return networkFetchToEncodedMemorySequence } diff --git a/imagepipeline/src/main/java/com/facebook/imagepipeline/producers/DecodeProducer.kt b/imagepipeline/src/main/java/com/facebook/imagepipeline/producers/DecodeProducer.kt index 0caf698c72..4615a1eb1e 100644 --- a/imagepipeline/src/main/java/com/facebook/imagepipeline/producers/DecodeProducer.kt +++ b/imagepipeline/src/main/java/com/facebook/imagepipeline/producers/DecodeProducer.kt @@ -19,6 +19,7 @@ import com.facebook.fresco.middleware.HasExtraData import com.facebook.imageformat.DefaultImageFormats import com.facebook.imagepipeline.common.ImageDecodeOptions import com.facebook.imagepipeline.core.CloseableReferenceFactory +import com.facebook.imagepipeline.core.DownsampleMode import com.facebook.imagepipeline.decoder.DecodeException import com.facebook.imagepipeline.decoder.ImageDecoder import com.facebook.imagepipeline.decoder.ProgressiveJpegConfig @@ -49,7 +50,7 @@ class DecodeProducer( val executor: Executor, val imageDecoder: ImageDecoder, val progressiveJpegConfig: ProgressiveJpegConfig, - val downsampleEnabled: Boolean, + val downsampleMode: DownsampleMode, val downsampleEnabledForNetwork: Boolean, val decodeCancellationEnabled: Boolean, val inputProducer: Producer, @@ -391,7 +392,8 @@ class DecodeProducer( producerContext.putExtra(HasExtraData.KEY_IMAGE_FORMAT, encodedImage.imageFormat.name) encodedImage.source = request.sourceUri?.toString() - if (downsampleEnabled || !statusHasFlag(status, IS_RESIZING_DONE)) { + val isResizingDone = statusHasFlag(status, IS_RESIZING_DONE) + if (downsampleMode == DownsampleMode.ALWAYS || (downsampleMode == DownsampleMode.AUTO && !isResizingDone)) { if (downsampleEnabledForNetwork || !UriUtil.isNetworkUri(request.sourceUri)) { encodedImage.sampleSize = DownsampleUtil.determineSampleSize( From 6ae78921a6ecb02a387c699f5dcabb4a4c9ab287 Mon Sep 17 00:00:00 2001 From: sunnylqm Date: Mon, 26 Feb 2024 08:33:30 +0800 Subject: [PATCH 2/4] fix: test --- .../imagepipeline/core/ProducerSequenceFactoryTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/imagepipeline/src/test/java/com/facebook/imagepipeline/core/ProducerSequenceFactoryTest.java b/imagepipeline/src/test/java/com/facebook/imagepipeline/core/ProducerSequenceFactoryTest.java index eabb5eb268..d195dc1883 100644 --- a/imagepipeline/src/test/java/com/facebook/imagepipeline/core/ProducerSequenceFactoryTest.java +++ b/imagepipeline/src/test/java/com/facebook/imagepipeline/core/ProducerSequenceFactoryTest.java @@ -92,7 +92,7 @@ public void setUp() { true, false, mThreadHandoffProducerQueue, - false, + DownsampleMode.AUTO, false, false, true, @@ -371,7 +371,7 @@ private void internalUseSequenceFactoryWithBitmapPrepare() { true, false, mThreadHandoffProducerQueue, - false, + DownsampleMode.AUTO, /* useBitmapPrepareToDraw */ true, false, true, @@ -395,7 +395,7 @@ private void internalUseSequenceFactoryWithCustomSequence( true, false, mThreadHandoffProducerQueue, - false, + DownsampleMode.AUTO, false, false, true, From 0d48073576a926752712f49c11622087f27b86dd Mon Sep 17 00:00:00 2001 From: sunnylqm Date: Thu, 29 Feb 2024 21:42:46 +0800 Subject: [PATCH 3/4] fix: keep deprecated factory constructor --- .../imagepipeline/core/ProducerFactory.java | 30 ++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/imagepipeline/src/main/java/com/facebook/imagepipeline/core/ProducerFactory.java b/imagepipeline/src/main/java/com/facebook/imagepipeline/core/ProducerFactory.java index 326837a00a..ac0285d12b 100644 --- a/imagepipeline/src/main/java/com/facebook/imagepipeline/core/ProducerFactory.java +++ b/imagepipeline/src/main/java/com/facebook/imagepipeline/core/ProducerFactory.java @@ -171,7 +171,35 @@ public ProducerFactory( mKeepCancelledFetchAsLowPriority = keepCancelledFetchAsLowPriority; } - public static AddImageTransformMetaDataProducer newAddImageTransformMetaDataProducer( + @Deprecated + public ProducerFactory( + Context context, + ByteArrayPool byteArrayPool, + ImageDecoder imageDecoder, + ProgressiveJpegConfig progressiveJpegConfig, + boolean downsampleEnabled, + boolean resizeAndRotateEnabledForNetwork, + boolean decodeCancellationEnabled, + ExecutorSupplier executorSupplier, + PooledByteBufferFactory pooledByteBufferFactory, + MemoryCache bitmapMemoryCache, + MemoryCache encodedMemoryCache, + BufferedDiskCache defaultBufferedDiskCache, + BufferedDiskCache smallImageBufferedDiskCache, + CacheKeyFactory cacheKeyFactory, + PlatformBitmapFactory platformBitmapFactory, + int bitmapPrepareToDrawMinSizeBytes, + int bitmapPrepareToDrawMaxSizeBytes, + boolean bitmapPrepareToDrawForPrefetch, + int maxBitmapSize, + CloseableReferenceFactory closeableReferenceFactory, + boolean keepCancelledFetchAsLowPriority, + int trackedKeysSize) { + return new ProducerFactory(context, byteArrayPool, imageDecoder, progressiveJpegConfig, downsampleEnabled ? DownsampleMode.ALWAYS : DownsampleMode.AUTO, resizeAndRotateEnabledForNetwork, decodeCancellationEnabled, executorSupplier, pooledByteBufferFactory, null, encodedMemoryCache, smallImageBufferedDiskCache, smallImageBufferedDiskCache, cacheKeyFactory, platformBitmapFactory, bitmapPrepareToDrawMinSizeBytes, bitmapPrepareToDrawMaxSizeBytes, bitmapPrepareToDrawForPrefetch, maxBitmapSize, closeableReferenceFactory, keepCancelledFetchAsLowPriority, trackedKeysSize) + } + + + public static AddImageTransformMetaDataProducer newAddImageTransformMetaDataProducer( Producer inputProducer) { return new AddImageTransformMetaDataProducer(inputProducer); } From 8fcb3e35278f878b7e6f7fc7a7dc09e9749d137a Mon Sep 17 00:00:00 2001 From: sunnylqm Date: Sat, 2 Mar 2024 10:13:42 +0800 Subject: [PATCH 4/4] fix: constructor --- .../java/com/facebook/imagepipeline/core/ProducerFactory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/imagepipeline/src/main/java/com/facebook/imagepipeline/core/ProducerFactory.java b/imagepipeline/src/main/java/com/facebook/imagepipeline/core/ProducerFactory.java index ac0285d12b..1a5ebfaba0 100644 --- a/imagepipeline/src/main/java/com/facebook/imagepipeline/core/ProducerFactory.java +++ b/imagepipeline/src/main/java/com/facebook/imagepipeline/core/ProducerFactory.java @@ -195,7 +195,7 @@ public ProducerFactory( CloseableReferenceFactory closeableReferenceFactory, boolean keepCancelledFetchAsLowPriority, int trackedKeysSize) { - return new ProducerFactory(context, byteArrayPool, imageDecoder, progressiveJpegConfig, downsampleEnabled ? DownsampleMode.ALWAYS : DownsampleMode.AUTO, resizeAndRotateEnabledForNetwork, decodeCancellationEnabled, executorSupplier, pooledByteBufferFactory, null, encodedMemoryCache, smallImageBufferedDiskCache, smallImageBufferedDiskCache, cacheKeyFactory, platformBitmapFactory, bitmapPrepareToDrawMinSizeBytes, bitmapPrepareToDrawMaxSizeBytes, bitmapPrepareToDrawForPrefetch, maxBitmapSize, closeableReferenceFactory, keepCancelledFetchAsLowPriority, trackedKeysSize) + this(context, byteArrayPool, imageDecoder, progressiveJpegConfig, downsampleEnabled ? DownsampleMode.ALWAYS : DownsampleMode.AUTO, resizeAndRotateEnabledForNetwork, decodeCancellationEnabled, executorSupplier, pooledByteBufferFactory, null, encodedMemoryCache, smallImageBufferedDiskCache, smallImageBufferedDiskCache, cacheKeyFactory, platformBitmapFactory, bitmapPrepareToDrawMinSizeBytes, bitmapPrepareToDrawMaxSizeBytes, bitmapPrepareToDrawForPrefetch, maxBitmapSize, closeableReferenceFactory, keepCancelledFetchAsLowPriority, trackedKeysSize); }