docs: @VisibleForTesting
    void prepareImagePipelineComponents(
        FrescoState frescoState, ImageRequest imageRequest, Object callerContext) {
      if (FrescoSystrace.isTracing()) {
        FrescoSystrace.beginSection("FrescoControllerImpl#prepareImagePipelineComponents");
      }
      try {
        frescoState.setProducerSequence(
            mFrescoContext
                .getImagePipeline()
                .getProducerSequenceFactory()
                .getDecodedImageProducerSequence(imageRequest));
  
        ImageRequest.RequestLevel lowestPermittedRequestLevel =
            ImageRequest.RequestLevel.getMax(
                imageRequest.getLowestPermittedRequestLevel(), ImageRequest.RequestLevel.FULL_FETCH);
  
        setupRequestListener(frescoState, imageRequest);
        frescoState.setSettableProducerContext(
            new SettableProducerContext(
                imageRequest,
                mFrescoContext.getImagePipeline().generateUniqueFutureId(),
                frescoState.getRequestListener(),
                callerContext,
                lowestPermittedRequestLevel,
                /* isPrefetch */ false,
                imageRequest.getProgressiveRenderingEnabled()
                    || !UriUtil.isNetworkUri(imageRequest.getSourceUri()),
                imageRequest.getPriority()));
      } catch (Exception exception) {
        // This is how ImagePipeline handles the error case.
        // Something went wrong and we can't prepare components ahead of time.
      } finally {
        if (FrescoSystrace.isTracing()) {
          FrescoSystrace.endSection();
        }
      }
    }