in vito/core-impl/src/main/java/com/facebook/fresco/vito/core/impl/KFrescoController.kt [63:152]
override fun fetch(
frescoDrawable: FrescoDrawableInterface,
imageRequest: VitoImageRequest,
callerContext: Any?,
contextChain: ContextChain?,
listener: ImageListener?,
onFadeListener: OnFadeListener?,
viewportDimensions: Rect?
): Boolean {
val drawable = frescoDrawable as KFrescoVitoDrawable
// Check if we already fetched that image
if (drawable.imageRequest == imageRequest) {
ImageReleaseScheduler.cancelAllReleasing(drawable)
return true
}
if (drawable.isFetchSubmitted) {
drawable.imagePerfListener.onDrawableReconfigured(drawable)
}
// We didn't -> reset everything and set up new fetch
// TODO(T105148151): move to new package so that no legacy impl dep
val imageId: Long = VitoUtils.generateIdentifier()
drawable.apply {
reset()
setImageRequest(imageRequest)
setCallerContext(callerContext)
imageListener = listener
listenerManager.setVitoImageRequestListener(globalImageRequestListener)
_imageId = imageId
this.viewportDimensions = viewportDimensions
}
drawable.listenerManager.onSubmit(imageId, imageRequest, callerContext, drawable.obtainExtras())
drawable.imagePerfListener.onImageFetch(drawable)
val options = imageRequest.imageOptions
drawable.overlayImageLayer.setOverlay(imageRequest.resources, options)
// Check if the image is in cache
val cachedImage = vitoImagePipeline.getCachedImage(imageRequest)
try {
if (CloseableReference.isValid(cachedImage)) {
// Immediately display the actual image.
val image = cachedImage?.get()
if (image != null) {
drawable.isFetchSubmitted = true
drawable.setCloseable(cachedImage.clone())
drawable.actualImageLayer.setActualImage(options, image, imageToDataModelMapper)
// TODO(T105148151): trigger listeners
drawable.invalidateSelf()
drawable.listenerManager.onFinalImageSet(
imageId,
imageRequest,
ImageOrigin.MEMORY_BITMAP_SHORTCUT,
image,
drawable.obtainExtras(null, cachedImage),
drawable.actualImageDrawable)
debugOverlayHandler?.update(drawable)
return true
}
}
} finally {
CloseableReference.closeSafely(cachedImage)
}
// The image is not in cache -> Set up layers visible until the image is available
drawable.placeholderLayer.setPlaceholder(imageRequest.resources, options)
drawable.listenerManager.onPlaceholderSet(
imageId, imageRequest, drawable.placeholderLayer.getDataModel().maybeGetDrawable())
drawable.setupProgressLayer(imageRequest.resources, options)
// Fetch the image
lightweightBackgroundThreadExecutor.execute {
if (imageId != drawable.imageId) {
return@execute
}
val dataSource: DataSource<CloseableReference<CloseableImage>> =
vitoImagePipeline.fetchDecodedImage(imageRequest, callerContext, null, imageId)
dataSource.subscribe(
ImageFetchSubscriber(
imageId, drawable, imageToDataModelMapper, debugOverlayHandler, null),
uiThreadExecutor) // Keyframes require callbacks to be on the main thread.
}
drawable.isFetchSubmitted = true
drawable.invalidateSelf()
debugOverlayHandler?.update(drawable)
return false
}