use of com.facebook.fresco.ui.common.ControllerListener2.Extras in project fresco by facebook.
the class FrescoController2Impl method fetch.
@Override
public boolean fetch(final FrescoDrawableInterface drawable, final VitoImageRequest imageRequest, @Nullable final Object callerContext, @Nullable final ContextChain contextChain, @Nullable final ImageListener listener, @Nullable final OnFadeListener onFadeListener, @Nullable final 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 (frescoDrawable.getDrawableDataSubscriber() == this && frescoDrawable.isFetchSubmitted() && imageRequest.equals(frescoDrawable.getImageRequest())) {
frescoDrawable.cancelReleaseNextFrame();
frescoDrawable.cancelReleaseDelayed();
// already set
return true;
}
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()) {
// We're trying to load a different image -> ignore
return;
}
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;
}
use of com.facebook.fresco.ui.common.ControllerListener2.Extras in project fresco by facebook.
the class MiddlewareUtils method obtainExtras.
public static Extras obtainExtras(Map<String, Object> componentAttribution, Map<String, Object> shortcutAttribution, @Nullable Map<String, Object> dataSourceExtras, @Nullable Rect viewportDimensions, @Nullable String scaleType, @Nullable PointF focusPoint, @Nullable Map<String, Object> imageExtras, @Nullable Object callerContext, @Nullable Uri mainUri) {
final Extras extras = new Extras();
if (viewportDimensions != null) {
extras.viewportWidth = viewportDimensions.width();
extras.viewportHeight = viewportDimensions.height();
}
extras.scaleType = scaleType;
if (focusPoint != null) {
extras.focusX = focusPoint.x;
extras.focusY = focusPoint.y;
}
extras.callerContext = callerContext;
extras.mainUri = mainUri;
extras.datasourceExtras = dataSourceExtras;
extras.imageExtras = imageExtras;
extras.shortcutExtras = shortcutAttribution;
extras.componentExtras = componentAttribution;
return extras;
}
use of com.facebook.fresco.ui.common.ControllerListener2.Extras in project fresco by facebook.
the class AbstractDraweeController method reportFailure.
private void reportFailure(Throwable throwable, @Nullable DataSource<T> dataSource) {
final Extras extras = obtainExtras(dataSource, null, null);
getControllerListener().onFailure(mId, throwable);
getControllerListener2().onFailure(mId, throwable, extras);
}
use of com.facebook.fresco.ui.common.ControllerListener2.Extras in project fresco by facebook.
the class FrescoController2Impl method setActualImage.
private void setActualImage(FrescoDrawable2Impl drawable, VitoImageRequest imageRequest, CloseableReference<CloseableImage> image, boolean isImmediate, @Nullable DataSource<CloseableReference<CloseableImage>> dataSource) {
ScaleTypeDrawable actualImageWrapperDrawable = drawable.getActualImageWrapper();
mHierarcher.setupActualImageWrapper(actualImageWrapperDrawable, imageRequest.imageOptions, drawable.getCallerContext());
Drawable actualDrawable = mHierarcher.buildActualImageDrawable(imageRequest.resources, imageRequest.imageOptions, image);
actualImageWrapperDrawable.setCurrent(actualDrawable != null ? actualDrawable : NopDrawable.INSTANCE);
drawable.setImage(actualImageWrapperDrawable, image);
if (isImmediate || imageRequest.imageOptions.getFadeDurationMs() <= 0) {
drawable.showImageImmediately();
} else {
drawable.fadeInImage(imageRequest.imageOptions.getFadeDurationMs());
}
if (imageRequest.imageOptions.shouldAutoPlay() && actualDrawable instanceof Animatable) {
((Animatable) actualDrawable).start();
}
Extras extras = obtainExtras(dataSource, image, drawable);
if (notifyFinalResult(dataSource)) {
drawable.getInternalListener().onFinalImageSet(drawable.getImageId(), imageRequest, drawable.getImageOrigin(), image.get(), extras, actualDrawable);
} else {
drawable.getInternalListener().onIntermediateImageSet(drawable.getImageId(), imageRequest, image.get());
}
drawable.getImagePerfListener().onImageSuccess(drawable, isImmediate);
float progress = 1f;
if (dataSource != null && !dataSource.isFinished()) {
progress = dataSource.getProgress();
}
drawable.setProgress(progress);
mDebugOverlayFactory.update(drawable, extras);
}
use of com.facebook.fresco.ui.common.ControllerListener2.Extras in project fresco by facebook.
the class FrescoController2Impl method onFailure.
@Override
public void onFailure(FrescoDrawable2Impl drawable, VitoImageRequest imageRequest, DataSource<CloseableReference<CloseableImage>> dataSource) {
Drawable errorDrawable = mHierarcher.buildErrorDrawable(imageRequest.resources, imageRequest.imageOptions);
drawable.setProgress(1f);
drawable.setImageDrawable(errorDrawable);
if (!drawable.isDefaultLayerIsOn()) {
if (imageRequest.imageOptions.getFadeDurationMs() <= 0) {
drawable.showImageImmediately();
} else {
drawable.fadeInImage(imageRequest.imageOptions.getFadeDurationMs());
}
} else {
drawable.setPlaceholderDrawable(null);
drawable.setProgressDrawable(null);
}
Extras extras = obtainExtras(dataSource, dataSource.getResult(), drawable);
if (notifyFinalResult(dataSource)) {
drawable.getInternalListener().onFailure(drawable.getImageId(), imageRequest, errorDrawable, dataSource.getFailureCause(), extras);
} else {
drawable.getInternalListener().onIntermediateImageFailed(drawable.getImageId(), imageRequest, dataSource.getFailureCause());
}
drawable.getImagePerfListener().onImageError(drawable);
mDebugOverlayFactory.update(drawable, extras);
}
Aggregations