Search in sources :

Example 1 with Extras

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;
}
Also used : Drawable(android.graphics.drawable.Drawable) ScaleTypeDrawable(com.facebook.drawee.drawable.ScaleTypeDrawable) NopDrawable(com.facebook.fresco.vito.core.NopDrawable) CloseableReference(com.facebook.common.references.CloseableReference) CloseableImage(com.facebook.imagepipeline.image.CloseableImage) Extras(com.facebook.fresco.ui.common.ControllerListener2.Extras)

Example 2 with Extras

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;
}
Also used : Extras(com.facebook.fresco.ui.common.ControllerListener2.Extras)

Example 3 with 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);
}
Also used : Extras(com.facebook.fresco.ui.common.ControllerListener2.Extras)

Example 4 with 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);
}
Also used : Drawable(android.graphics.drawable.Drawable) ScaleTypeDrawable(com.facebook.drawee.drawable.ScaleTypeDrawable) NopDrawable(com.facebook.fresco.vito.core.NopDrawable) Animatable(android.graphics.drawable.Animatable) Extras(com.facebook.fresco.ui.common.ControllerListener2.Extras) ScaleTypeDrawable(com.facebook.drawee.drawable.ScaleTypeDrawable)

Example 5 with 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);
}
Also used : Drawable(android.graphics.drawable.Drawable) ScaleTypeDrawable(com.facebook.drawee.drawable.ScaleTypeDrawable) NopDrawable(com.facebook.fresco.vito.core.NopDrawable) Extras(com.facebook.fresco.ui.common.ControllerListener2.Extras)

Aggregations

Extras (com.facebook.fresco.ui.common.ControllerListener2.Extras)5 Drawable (android.graphics.drawable.Drawable)3 ScaleTypeDrawable (com.facebook.drawee.drawable.ScaleTypeDrawable)3 NopDrawable (com.facebook.fresco.vito.core.NopDrawable)3 Animatable (android.graphics.drawable.Animatable)1 CloseableReference (com.facebook.common.references.CloseableReference)1 CloseableImage (com.facebook.imagepipeline.image.CloseableImage)1