From b7daf22b199f996694c32e0a8d4bf3cff2de4f80 Mon Sep 17 00:00:00 2001 From: Alexander Oprisnik Date: Tue, 14 Jan 2025 05:14:09 -0800 Subject: [PATCH] Added DataSourceImageSource and migrate Showcase sample to Vito Summary: This adds a new `DataSourceImageSource that is specific to the Fresco ImagePipeline (due to DataSource, CloseableImage etc.), hence in the module that also has `ImagePipelineImageSource` that is similarly specific. This allows folks to use any data source supplier as an image source, such as the `RetainingDataSourceSupplier` Reviewed By: kartavya-ramnani Differential Revision: D68023529 fbshipit-source-id: d60f66b96953c3102b593eeb6772283b14e03ac6 --- samples/showcase/build.gradle | 1 + .../samples/showcase/ExampleDatabase.kt | 6 +-- .../RetainingDataSourceSupplierFragment.java | 43 +++++++------------ ...l => fragment_vito_retaining_supplier.xml} | 6 +-- .../showcase/src/main/res/values/strings.xml | 2 +- .../impl/ImageSourceToImagePipelineAdapter.kt | 2 + .../core/impl/source/DataSourceImageSource.kt | 19 ++++++++ 7 files changed, 45 insertions(+), 34 deletions(-) rename samples/showcase/src/main/java/com/facebook/fresco/samples/showcase/{drawee => vito}/RetainingDataSourceSupplierFragment.java (60%) rename samples/showcase/src/main/res/layout/{fragment_drawee_retaining_supplier.xml => fragment_vito_retaining_supplier.xml} (83%) create mode 100644 vito/core-java-impl/src/main/java/com/facebook/fresco/vito/core/impl/source/DataSourceImageSource.kt diff --git a/samples/showcase/build.gradle b/samples/showcase/build.gradle index 6152899000..c3eea8be17 100644 --- a/samples/showcase/build.gradle +++ b/samples/showcase/build.gradle @@ -141,6 +141,7 @@ dependencies { implementation project(':vito:core') implementation project(':vito:core-common-impl') implementation project(':vito:core-impl') + implementation project(':vito:core-java-impl') implementation project(':vito:drawee-support') implementation project(':vito:init') implementation project(':vito:ktx') diff --git a/samples/showcase/src/main/java/com/facebook/fresco/samples/showcase/ExampleDatabase.kt b/samples/showcase/src/main/java/com/facebook/fresco/samples/showcase/ExampleDatabase.kt index be07bb5f7b..b4a1ced2ac 100644 --- a/samples/showcase/src/main/java/com/facebook/fresco/samples/showcase/ExampleDatabase.kt +++ b/samples/showcase/src/main/java/com/facebook/fresco/samples/showcase/ExampleDatabase.kt @@ -39,9 +39,6 @@ object ExampleDatabase { "Drawee", listOf( ExampleItem("Simple DraweeSpan") { DraweeSpanSimpleTextFragment() }, - ExampleItem("Retaining Data Source Supplier") { - RetainingDataSourceSupplierFragment() - }, )), ExampleCategory( "Image Pipeline", @@ -115,6 +112,9 @@ object ExampleDatabase { ExampleItem("Placeholder, Progress, Failure") { ImageLayersFragment() }, ExampleItem("Rounded Corners") { VitoRoundedCornersFragment() }, ExampleItem("Image Transition") { VitoTransitionFragment() }, + ExampleItem("Retaining Data Source Supplier") { + RetainingDataSourceSupplierFragment() + }, )), ExampleCategory( "Vito Renderer", diff --git a/samples/showcase/src/main/java/com/facebook/fresco/samples/showcase/drawee/RetainingDataSourceSupplierFragment.java b/samples/showcase/src/main/java/com/facebook/fresco/samples/showcase/vito/RetainingDataSourceSupplierFragment.java similarity index 60% rename from samples/showcase/src/main/java/com/facebook/fresco/samples/showcase/drawee/RetainingDataSourceSupplierFragment.java rename to samples/showcase/src/main/java/com/facebook/fresco/samples/showcase/vito/RetainingDataSourceSupplierFragment.java index 3f5f55efdc..940dc221a3 100644 --- a/samples/showcase/src/main/java/com/facebook/fresco/samples/showcase/drawee/RetainingDataSourceSupplierFragment.java +++ b/samples/showcase/src/main/java/com/facebook/fresco/samples/showcase/vito/RetainingDataSourceSupplierFragment.java @@ -5,45 +5,35 @@ * LICENSE file in the root directory of this source tree. */ -package com.facebook.fresco.samples.showcase.drawee; +package com.facebook.fresco.samples.showcase.vito; -import android.graphics.drawable.Animatable; import android.net.Uri; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.ImageView; import androidx.annotation.Nullable; import com.facebook.common.references.CloseableReference; import com.facebook.datasource.RetainingDataSourceSupplier; import com.facebook.drawee.backends.pipeline.Fresco; -import com.facebook.drawee.controller.BaseControllerListener; -import com.facebook.drawee.controller.ControllerListener; -import com.facebook.drawee.view.SimpleDraweeView; import com.facebook.fresco.samples.showcase.BaseShowcaseFragment; import com.facebook.fresco.samples.showcase.R; +import com.facebook.fresco.vito.core.impl.source.DataSourceImageSource; +import com.facebook.fresco.vito.options.ImageOptions; +import com.facebook.fresco.vito.view.VitoView; import com.facebook.imagepipeline.image.CloseableImage; -import com.facebook.imagepipeline.image.ImageInfo; import com.facebook.imagepipeline.request.ImageRequest; import java.util.List; public class RetainingDataSourceSupplierFragment extends BaseShowcaseFragment { + private static final String CALLER_CONTEXT = "RetainingDataSourceSupplierFragment"; + + private final ImageOptions mImageOptions = ImageOptions.create().autoPlay(true).build(); private List mSampleUris; private int mUriIndex = 0; - private final ControllerListener controllerListener = - new BaseControllerListener() { - @Override - public void onFinalImageSet( - String id, @Nullable ImageInfo imageInfo, @Nullable Animatable anim) { - if (anim != null) { - // app-specific logic to enable animation starting - anim.start(); - } - } - }; - @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -55,21 +45,18 @@ public void onCreate(@Nullable Bundle savedInstanceState) { @Override public View onCreateView( LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - return inflater.inflate(R.layout.fragment_drawee_retaining_supplier, container, false); + return inflater.inflate(R.layout.fragment_vito_retaining_supplier, container, false); } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { - final SimpleDraweeView simpleDraweeView = view.findViewById(R.id.drawee_view); + final ImageView imageView = view.findViewById(R.id.image_view); final RetainingDataSourceSupplier> retainingSupplier = new RetainingDataSourceSupplier<>(); - simpleDraweeView.setController( - Fresco.newDraweeControllerBuilder() - .setDataSourceSupplier(retainingSupplier) - .setControllerListener(controllerListener) - .build()); + VitoView.show( + new DataSourceImageSource(retainingSupplier), mImageOptions, CALLER_CONTEXT, imageView); replaceImage(retainingSupplier); - simpleDraweeView.setOnClickListener(v -> replaceImage(retainingSupplier)); + imageView.setOnClickListener(v -> replaceImage(retainingSupplier)); } private void replaceImage( @@ -78,7 +65,9 @@ private void replaceImage( retainingSupplier.replaceSupplier( Fresco.getImagePipeline() .getDataSourceSupplier( - ImageRequest.fromUri(getNextUri()), null, ImageRequest.RequestLevel.FULL_FETCH)); + ImageRequest.fromUri(getNextUri()), + CALLER_CONTEXT, + ImageRequest.RequestLevel.FULL_FETCH)); } private synchronized Uri getNextUri() { diff --git a/samples/showcase/src/main/res/layout/fragment_drawee_retaining_supplier.xml b/samples/showcase/src/main/res/layout/fragment_vito_retaining_supplier.xml similarity index 83% rename from samples/showcase/src/main/res/layout/fragment_drawee_retaining_supplier.xml rename to samples/showcase/src/main/res/layout/fragment_vito_retaining_supplier.xml index 39fd01c485..becd73a130 100644 --- a/samples/showcase/src/main/res/layout/fragment_drawee_retaining_supplier.xml +++ b/samples/showcase/src/main/res/layout/fragment_vito_retaining_supplier.xml @@ -7,8 +7,8 @@ android:orientation="vertical" > - @@ -19,7 +19,7 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/margin_medium" android:gravity="center" - android:text="@string/drawee_retaining_supplier_help" + android:text="@string/image_retaining_supplier_help" android:textAppearance="?android:attr/textAppearanceSmall" /> diff --git a/samples/showcase/src/main/res/values/strings.xml b/samples/showcase/src/main/res/values/strings.xml index f27c0105ed..d2c522cd92 100644 --- a/samples/showcase/src/main/res/values/strings.xml +++ b/samples/showcase/src/main/res/values/strings.xml @@ -29,7 +29,7 @@ Image Detail Activity This is the second activity. Press back to reverse the transition. - Click on the image to show the next one. The previous one will be retained until the new image is ready. + Click on the image to show the next one. The previous one will be retained until the new image is ready. Example to load an image based on a set of URIs, either as "first available" or with "increasing quality". diff --git a/vito/core-java-impl/src/main/java/com/facebook/fresco/vito/core/impl/ImageSourceToImagePipelineAdapter.kt b/vito/core-java-impl/src/main/java/com/facebook/fresco/vito/core/impl/ImageSourceToImagePipelineAdapter.kt index b5147c65f1..b07be1705f 100644 --- a/vito/core-java-impl/src/main/java/com/facebook/fresco/vito/core/impl/ImageSourceToImagePipelineAdapter.kt +++ b/vito/core-java-impl/src/main/java/com/facebook/fresco/vito/core/impl/ImageSourceToImagePipelineAdapter.kt @@ -15,6 +15,7 @@ import com.facebook.datasource.FirstAvailableDataSourceSupplier import com.facebook.datasource.IncreasingQualityDataSourceSupplier import com.facebook.fresco.middleware.Extras import com.facebook.fresco.vito.core.ImagePipelineUtils +import com.facebook.fresco.vito.core.impl.source.DataSourceImageSource import com.facebook.fresco.vito.core.impl.source.ImagePipelineImageSource import com.facebook.fresco.vito.options.ImageOptions import com.facebook.fresco.vito.source.EmptyImageSource @@ -141,6 +142,7 @@ object ImageSourceToImagePipelineAdapter { requestListener, uiComponentId, extras))) + is DataSourceImageSource -> imageSource.dataSourceSupplier else -> NO_REQUEST_SUPPLIER } } diff --git a/vito/core-java-impl/src/main/java/com/facebook/fresco/vito/core/impl/source/DataSourceImageSource.kt b/vito/core-java-impl/src/main/java/com/facebook/fresco/vito/core/impl/source/DataSourceImageSource.kt new file mode 100644 index 0000000000..2dfe4dcd81 --- /dev/null +++ b/vito/core-java-impl/src/main/java/com/facebook/fresco/vito/core/impl/source/DataSourceImageSource.kt @@ -0,0 +1,19 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +package com.facebook.fresco.vito.core.impl.source + +import com.facebook.common.internal.Supplier +import com.facebook.common.references.CloseableReference +import com.facebook.datasource.DataSource +import com.facebook.fresco.vito.source.ImageSource +import com.facebook.imagepipeline.image.CloseableImage + +/** ImageSource that directly supplies a DataSource */ +class DataSourceImageSource( + val dataSourceSupplier: Supplier>> +) : ImageSource