Skip to content

Commit

Permalink
Extract logic in Vito Spec
Browse files Browse the repository at this point in the history
Differential Revision: D68560845

fbshipit-source-id: 23a3d084f1c367dec060c697d2b43732f444d8d0
  • Loading branch information
Artem Kholodnyi authored and facebook-github-bot committed Feb 12, 2025
1 parent 868f6d7 commit cc4d169
Show file tree
Hide file tree
Showing 14 changed files with 238 additions and 155 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import com.facebook.drawee.components.DeferredReleaser;
import com.facebook.drawee.components.DraweeEventTracker;
import com.facebook.drawee.components.RetryManager;
import com.facebook.drawee.drawable.ScalingUtils;
import com.facebook.drawee.generic.GenericDraweeHierarchy;
import com.facebook.drawee.gestures.GestureDetector;
import com.facebook.drawee.interfaces.DraweeController;
Expand Down Expand Up @@ -867,11 +868,11 @@ private Extras obtainExtras(
@Nullable Map<String, Object> datasourceExtras,
@Nullable Map<String, Object> imageExtras,
@Nullable Uri mainUri) {
String scaleType = null;
ScalingUtils.ScaleType scaleType = null;
PointF focusPoint = null;
final SettableDraweeHierarchy hierarchy = mSettableDraweeHierarchy;
if (hierarchy instanceof GenericDraweeHierarchy) {
scaleType = String.valueOf(((GenericDraweeHierarchy) hierarchy).getActualImageScaleType());
scaleType = ((GenericDraweeHierarchy) hierarchy).getActualImageScaleType();
focusPoint = ((GenericDraweeHierarchy) hierarchy).getActualImageFocusPoint();
}
return MiddlewareUtils.obtainExtras(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public abstract class BaseCloseableImage implements CloseableImage {
HasExtraData.KEY_IS_ROUNDED,
HasExtraData.KEY_NON_FATAL_DECODE_ERROR,
HasExtraData.KEY_ORIGINAL_URL,
HasExtraData.KEY_MODIFIED_URL,
HasExtraData.KEY_SF_FETCH_STRATEGY,
HasExtraData.KEY_COLOR_SPACE));

private @Nullable ImageInfo mCacheImageInfo;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,8 @@ interface HasExtraData {
/** The original URL if it was modified by Dynamic Image URL */
const val KEY_ORIGINAL_URL = "original_url"
/** Information on if/why the url was modified by Dynamic Image URL */
const val KEY_MODIFIED_URL = "modified_url"
const val KEY_SF_FETCH_STRATEGY = "smart_fetch_strategy"
const val KEY_SF_MOD_RESULT = "smart_mod_result"
const val KEY_IMAGE_SOURCE_TYPE: String = "image_source_type"

const val KEY_ORIGIN = "origin"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ package com.facebook.fresco.middleware
import android.graphics.PointF
import android.graphics.Rect
import android.net.Uri
import com.facebook.drawee.drawable.ScalingUtils
import com.facebook.fresco.ui.common.ControllerListener2.Extras

object MiddlewareUtils {
Expand All @@ -20,7 +21,7 @@ object MiddlewareUtils {
dataSourceExtras: Map<String, Any>?,
imageSourceExtras: Map<String, Any>?,
viewportDimensions: Rect?,
scaleType: String?,
scaleType: ScalingUtils.ScaleType?,
focusPoint: PointF?,
imageExtras: Map<String, Any>?,
callerContext: Any?,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ interface ControllerListener2<INFO> {
@JvmField var focusX: Float? = null
@JvmField var focusY: Float? = null
@JvmField var logWithHighSamplingRate: Boolean = false
@JvmField var modifiedUriStatus: String? = null
@JvmField var smartUrlFetchStrategy: Any? = null
@JvmField var smartUrlModificationResult: Any? = null
@JvmField var originalUri: Uri? = null
@JvmField var uiFramework: String? = null

Expand Down
28 changes: 28 additions & 0 deletions urimod/src/main/java/com/facebook/fresco/urimod/FetchStrategy.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
// (c) Meta Platforms, Inc. and affiliates. Confidential and proprietary.

package com.facebook.fresco.urimod

sealed interface FetchStrategy

data object NoPrefetchInOnPrepareStrategy : FetchStrategy

enum class SmartFetchStrategy : FetchStrategy {
DEFAULT,
MAIN_THREAD,
DISK_CACHE_TIMEOUT,
;

override fun toString(): String = "SmartFetchStrategy: ${this.name}"
}

enum class ClassicFetchStrategy : FetchStrategy {
APP_DISABLED,
PRODUCT_DISABLED,
APP_STARTING,
MAIN_THREAD,
DISK_CACHE_TIMEOUT,
DISK_CACHE_HIT,
;

override fun toString(): String = "ClassicFetchStrategy: ${this.name}"
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ object NopUriModifier : UriModifierInterface {
scaleType: ScalingUtils.ScaleType?,
callerContext: Any?,
contextChain: ContextChain?,
forLoggingOnly: Boolean,
): ModificationResult = ModificationResult.Disabled("NopUriModifier")

override fun modifyPrefetchUri(uri: Uri, callerContext: Any?): Uri = uri
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ interface UriModifierInterface {
scaleType: ScaleType?,
callerContext: Any?,
contextChain: ContextChain? = null,
forLoggingOnly: Boolean = false,
): ModificationResult

fun modifyPrefetchUri(uri: Uri, callerContext: Any?): Uri?
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ fun KFrescoVitoDrawable.obtainExtras(
dataSource?.extras,
null, // FIXME
viewportDimensions,
imageRequest?.imageOptions?.actualImageScaleType.toString(),
imageRequest?.imageOptions?.actualImageScaleType,
imageRequest?.imageOptions?.actualImageFocusPoint,
image?.get()?.extras,
callerContext,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -462,13 +462,14 @@ open class FrescoController2Impl(
dataSource?.extras,
imageSourceExtras,
drawable.viewportDimensions,
drawable.actualImageScaleType.toString(),
drawable.actualImageScaleType,
drawable.actualImageFocusPoint,
imageExtras,
drawable.callerContext,
logWithHighSamplingRate,
sourceUri)
extras.modifiedUriStatus = imageRequest.extras[HasExtraData.KEY_MODIFIED_URL] as? String
extras.smartUrlFetchStrategy = imageRequest.extras[HasExtraData.KEY_SF_FETCH_STRATEGY]
extras.smartUrlModificationResult = imageRequest.extras[HasExtraData.KEY_SF_MOD_RESULT]
extras.originalUri = imageRequest.extras[HasExtraData.KEY_ORIGINAL_URL] as? Uri
extras.uiFramework = drawable.uiFramework
return extras
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,11 @@ import com.facebook.datasource.DataSource
import com.facebook.datasource.DataSources
import com.facebook.fresco.middleware.HasExtraData
import com.facebook.fresco.ui.common.VitoUtils
import com.facebook.fresco.urimod.ClassicFetchStrategy
import com.facebook.fresco.urimod.Dimensions
import com.facebook.fresco.urimod.FetchStrategy
import com.facebook.fresco.urimod.NoPrefetchInOnPrepareStrategy
import com.facebook.fresco.urimod.SmartFetchStrategy
import com.facebook.fresco.urimod.UriModifier
import com.facebook.fresco.urimod.UriModifierInterface
import com.facebook.fresco.vito.core.FrescoVitoConfig
Expand Down Expand Up @@ -55,42 +59,48 @@ class VitoImagePipelineImpl(
viewport: Rect?,
callerContext: Any?,
contextChain: ContextChain?,
forceKeepOriginalSize: Boolean,
forLoggingOnly: Boolean,
fetchStrategy: FetchStrategy?,
): VitoImageRequest {
val imageOptions = options ?: defaults()
val extras: MutableMap<String, Any> = mutableMapOf()
var finalImageSource = imageSource

val modifiedUriValue: String
if (experimentalDynamicSizeVito2() && !forceKeepOriginalSize) {
if (imageSource is UriImageSource) {
val result: UriModifierInterface.ModificationResult =
UriModifier.INSTANCE.modifyUri(
imageSource,
viewport?.let { Dimensions(it.width(), it.height()) },
imageOptions.actualImageScaleType,
callerContext,
contextChain,
forLoggingOnly)
modifiedUriValue = result.toString()
if (result is UriModifierInterface.ModificationResult.Modified) {
finalImageSource = ImageSourceProvider.forUri(result.newUri)
extras[HasExtraData.KEY_ORIGINAL_URL] = imageSource.imageUri
val modifiedUriValue: String?
when (fetchStrategy) {
is SmartFetchStrategy -> {
if (imageSource is UriImageSource) {
val result: UriModifierInterface.ModificationResult =
UriModifier.INSTANCE.modifyUri(
imageSource,
viewport?.let { Dimensions(it.width(), it.height()) },
imageOptions.actualImageScaleType,
callerContext,
contextChain)
modifiedUriValue = result.toString()
if (result is UriModifierInterface.ModificationResult.Modified) {
finalImageSource = ImageSourceProvider.forUri(result.newUri)
extras[HasExtraData.KEY_ORIGINAL_URL] = imageSource.imageUri
}
} else {
modifiedUriValue = "NotSupportedImageSource: ${imageSource.getClassNameString()}"
}
} else {
modifiedUriValue = "NotSupportedImageSource: ${imageSource.getClassNameString()}"
}
} else if (experimentalDynamicSizeVito2() &&
experimentalDynamicSizeWithCacheFallbackVito2() &&
forceKeepOriginalSize) {
modifiedUriValue = "MBPDiskFallbackEnabled"
} else {
modifiedUriValue =
"Disabled(exp=${experimentalDynamicSizeVito2()}, fallback=${experimentalDynamicSizeWithCacheFallbackVito2()}, force=${forceKeepOriginalSize})"

is ClassicFetchStrategy -> {
modifiedUriValue = "classic" // FIXME: no smart fetch
}

is NoPrefetchInOnPrepareStrategy -> {
modifiedUriValue = "noprefetch" // probably should be null (and above) FIXME
}

null -> {
modifiedUriValue = null
}
}

extras[HasExtraData.KEY_MODIFIED_URL] = modifiedUriValue
fetchStrategy?.let { extras[HasExtraData.KEY_SF_FETCH_STRATEGY] = it }
modifiedUriValue?.let { extras[HasExtraData.KEY_SF_MOD_RESULT] = it }
extras[HasExtraData.KEY_IMAGE_SOURCE_TYPE] = imageSource.getClassNameString()

if (imageSource is IncreasingQualityImageSource) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import android.graphics.Rect
import com.facebook.common.callercontext.ContextChain
import com.facebook.common.references.CloseableReference
import com.facebook.datasource.DataSource
import com.facebook.fresco.urimod.FetchStrategy
import com.facebook.fresco.vito.options.ImageOptions
import com.facebook.fresco.vito.source.ImageSource
import com.facebook.imagepipeline.image.CloseableImage
Expand All @@ -36,8 +37,7 @@ interface VitoImagePipeline {
viewport: Rect? = null,
callerContext: Any? = null,
contextChain: ContextChain? = null,
forceKeepOriginalSize: Boolean = false,
forLoggingOnly: Boolean = false,
fetchStrategy: FetchStrategy? = null,
): VitoImageRequest

fun getCachedImage(imageRequest: VitoImageRequest): CloseableReference<CloseableImage>?
Expand Down
Loading

0 comments on commit cc4d169

Please sign in to comment.