override fun fetch()

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
  }