in vito/core/src/main/java/com/facebook/fresco/vito/core/impl/FrescoController2Impl.java [91:195]
public boolean fetch(
final FrescoDrawableInterface drawable,
final VitoImageRequest imageRequest,
final @Nullable Object callerContext,
final @Nullable ContextChain contextChain,
final @Nullable ImageListener listener,
final @Nullable OnFadeListener onFadeListener,
final @Nullable Rect viewportDimensions) {
if (!(drawable instanceof FrescoDrawable2Impl)) {
throw new IllegalArgumentException("Drawable not supported " + drawable);
}
final FrescoDrawable2Impl frescoDrawable = (FrescoDrawable2Impl) drawable;
// Save viewport dimension for future use
frescoDrawable.setViewportDimensions(viewportDimensions);
// Check if we already fetched the image
if (isAlreadyLoadingImage(frescoDrawable, imageRequest)) {
frescoDrawable.cancelReleaseNextFrame();
frescoDrawable.cancelReleaseDelayed();
return true; // already set
}
if (frescoDrawable.isFetchSubmitted()) {
frescoDrawable.getImagePerfListener().onDrawableReconfigured(frescoDrawable);
}
// We didn't -> Reset everything
frescoDrawable.close();
// Basic setup
frescoDrawable.setDrawableDataSubscriber(this);
frescoDrawable.setImageRequest(imageRequest);
frescoDrawable.setCallerContext(callerContext);
frescoDrawable.setImageListener(listener);
frescoDrawable.setVitoImageRequestListener(mGlobalImageListener);
frescoDrawable.setOnFadeListener(onFadeListener);
// Set layers that are always visible
frescoDrawable.setOverlayDrawable(
mHierarcher.buildOverlayDrawable(imageRequest.resources, imageRequest.imageOptions));
// We're fetching a new image, so we're updating the ID
final long imageId = VitoUtils.generateIdentifier();
frescoDrawable.setImageId(imageId);
Extras extras = obtainExtras(null, null, frescoDrawable);
// Notify listeners that we're about to fetch an image
frescoDrawable.getInternalListener().onSubmit(imageId, imageRequest, callerContext, extras);
frescoDrawable.getImagePerfListener().onImageFetch(frescoDrawable);
// Check if the image is in cache
CloseableReference<CloseableImage> cachedImage = mImagePipeline.getCachedImage(imageRequest);
try {
if (CloseableReference.isValid(cachedImage)) {
frescoDrawable.setImageOrigin(ImageOrigin.MEMORY_BITMAP_SHORTCUT);
// Immediately display the actual image.
setActualImage(frescoDrawable, imageRequest, cachedImage, true, null);
frescoDrawable.setFetchSubmitted(true);
mDebugOverlayFactory.update(frescoDrawable, extras);
return true;
}
} finally {
CloseableReference.closeSafely(cachedImage);
}
// The image is not in cache -> Set up layers visible until the image is available
frescoDrawable.setProgressDrawable(
mHierarcher.buildProgressDrawable(imageRequest.resources, imageRequest.imageOptions));
// Immediately show the progress image and set progress to 0
frescoDrawable.setProgress(0f);
frescoDrawable.showProgressImmediately();
Drawable placeholder =
mHierarcher.buildPlaceholderDrawable(imageRequest.resources, imageRequest.imageOptions);
frescoDrawable.setPlaceholderDrawable(placeholder);
frescoDrawable.setImageDrawable(null);
frescoDrawable.getInternalListener().onPlaceholderSet(imageId, imageRequest, placeholder);
// Fetch the image
final Runnable fetchRunnable =
new Runnable() {
@Override
public void run() {
if (imageId != frescoDrawable.getImageId()) {
return; // We're trying to load a different image -> ignore
}
DataSource<CloseableReference<CloseableImage>> dataSource =
mImagePipeline.fetchDecodedImage(
imageRequest, callerContext, frescoDrawable.getImageOriginListener(), imageId);
frescoDrawable.setDataSource(imageId, dataSource);
dataSource.subscribe(frescoDrawable, mUiThreadExecutor);
}
};
if (mConfig.submitFetchOnBgThread()) {
mLightweightBackgroundThreadExecutor.execute(fetchRunnable);
} else {
fetchRunnable.run();
}
frescoDrawable.setFetchSubmitted(true);
mDebugOverlayFactory.update(frescoDrawable, null);
return false;
}