diff --git a/drawee/src/main/java/com/facebook/drawee/controller/AbstractDraweeController.java b/drawee/src/main/java/com/facebook/drawee/controller/AbstractDraweeController.java index f7ac8fb39d..35ef33dedd 100644 --- a/drawee/src/main/java/com/facebook/drawee/controller/AbstractDraweeController.java +++ b/drawee/src/main/java/com/facebook/drawee/controller/AbstractDraweeController.java @@ -443,7 +443,7 @@ protected void submitRequest() { mEventTracker.recordEvent(Event.ON_SUBMIT_CACHE_HIT); getControllerListener().onSubmit(mId, mCallerContext); onImageLoadedFromCacheImmediately(mId, closeableImage); - onNewResultInternal(mId, mDataSource, closeableImage, 1.0f, true, true); + onNewResultInternal(mId, mDataSource, closeableImage, 1.0f, true, true, true); FrescoSystrace.endSection(); return; } @@ -470,10 +470,11 @@ public void onNewResultImpl(DataSource dataSource) { // isFinished must be obtained before image, otherwise we might set intermediate result // as final image. boolean isFinished = dataSource.isFinished(); + boolean hasMultipleResults = dataSource.hasMultipleResults(); float progress = dataSource.getProgress(); T image = dataSource.getResult(); if (image != null) { - onNewResultInternal(id, dataSource, image, progress, isFinished, wasImmediate); + onNewResultInternal(id, dataSource, image, progress, isFinished, wasImmediate, hasMultipleResults); } else if (isFinished) { onFailureInternal(id, dataSource, new NullPointerException(), /* isFinished */ true); } @@ -499,7 +500,8 @@ private void onNewResultInternal( @Nullable T image, float progress, boolean isFinished, - boolean wasImmediate) { + boolean wasImmediate, + boolean deliverTempResult) { try { FrescoSystrace.beginSection("AbstractDraweeController#onNewResultInternal"); // ignore late callbacks (data source that returned the new result is not the one we expected) @@ -532,6 +534,10 @@ private void onNewResultInternal( mDataSource = null; mSettableDraweeHierarchy.setImage(drawable, 1f, wasImmediate); getControllerListener().onFinalImageSet(id, getImageInfo(image), getAnimatable()); + } else if (deliverTempResult) { + logMessageAndImage("set_temporary_result @ onNewResult", image); + mSettableDraweeHierarchy.setImage(drawable, 1f, wasImmediate); + getControllerListener().onFinalImageSet(id, getImageInfo(image), getAnimatable()); // IMPORTANT: do not execute any instance-specific code after this point } else { logMessageAndImage("set_intermediate_result @ onNewResult", image); diff --git a/fbcore/src/main/java/com/facebook/datasource/AbstractDataSource.java b/fbcore/src/main/java/com/facebook/datasource/AbstractDataSource.java index dc4c413907..b704fc8424 100644 --- a/fbcore/src/main/java/com/facebook/datasource/AbstractDataSource.java +++ b/fbcore/src/main/java/com/facebook/datasource/AbstractDataSource.java @@ -319,4 +319,9 @@ public void run() { }); } } + + @Override + public boolean hasMultipleResults() { + return false; + } } diff --git a/fbcore/src/main/java/com/facebook/datasource/DataSource.java b/fbcore/src/main/java/com/facebook/datasource/DataSource.java index 266d04bf14..edc4fbb486 100644 --- a/fbcore/src/main/java/com/facebook/datasource/DataSource.java +++ b/fbcore/src/main/java/com/facebook/datasource/DataSource.java @@ -49,6 +49,13 @@ public interface DataSource { */ boolean hasResult(); + /** + * + * @return true if any resources poured in the datasource should be sent to controllers. Usefull + * with a RetainingDataSource to loaded resources are displayed correctly. + */ + boolean hasMultipleResults(); + /** * @return true if request is finished, false otherwise */ diff --git a/fbcore/src/main/java/com/facebook/datasource/RetainingDataSourceSupplier.java b/fbcore/src/main/java/com/facebook/datasource/RetainingDataSourceSupplier.java index 229872d962..7e0b9d3a8d 100644 --- a/fbcore/src/main/java/com/facebook/datasource/RetainingDataSourceSupplier.java +++ b/fbcore/src/main/java/com/facebook/datasource/RetainingDataSourceSupplier.java @@ -139,5 +139,10 @@ public void onProgressUpdate(DataSource dataSource) { RetainingDataSource.this.onDatasourceProgress(dataSource); } } + + @Override + public boolean hasMultipleResults() { + return true; + } } } 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/drawee/RetainingDataSourceSupplierFragment.java index 281f7b8e86..89602c0606 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/drawee/RetainingDataSourceSupplierFragment.java @@ -26,6 +26,10 @@ import com.facebook.fresco.samples.showcase.misc.ImageUriProvider; import com.facebook.imagepipeline.image.CloseableImage; import com.facebook.imagepipeline.request.ImageRequest; +import android.graphics.drawable.Animatable; +import com.facebook.imagepipeline.image.ImageInfo; +import com.facebook.drawee.controller.BaseControllerListener; +import com.facebook.drawee.controller.ControllerListener; import java.util.List; public class RetainingDataSourceSupplierFragment extends BaseShowcaseFragment { @@ -33,12 +37,24 @@ public class RetainingDataSourceSupplierFragment extends BaseShowcaseFragment { private List mSampleUris; private int mUriIndex = 0; + private 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); - mSampleUris = - ImageUriProvider.getInstance(getContext()).getSampleUris(ImageUriProvider.ImageSize.M); + mSampleUris = ImageUriProvider.getInstance(getContext()).getSampleGifUris(); } @Nullable @@ -54,7 +70,10 @@ public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { final RetainingDataSourceSupplier> retainingSupplier = new RetainingDataSourceSupplier<>(); simpleDraweeView.setController( - Fresco.newDraweeControllerBuilder().setDataSourceSupplier(retainingSupplier).build()); + Fresco.newDraweeControllerBuilder() + .setDataSourceSupplier(retainingSupplier) + .setControllerListener(controllerListener) + .build()); replaceImage(retainingSupplier); simpleDraweeView.setOnClickListener( new View.OnClickListener() { diff --git a/samples/showcase/src/main/java/com/facebook/fresco/samples/showcase/misc/ImageUriProvider.java b/samples/showcase/src/main/java/com/facebook/fresco/samples/showcase/misc/ImageUriProvider.java index 5b621ef21d..9a69a1dc51 100644 --- a/samples/showcase/src/main/java/com/facebook/fresco/samples/showcase/misc/ImageUriProvider.java +++ b/samples/showcase/src/main/java/com/facebook/fresco/samples/showcase/misc/ImageUriProvider.java @@ -146,6 +146,13 @@ public enum ImageSize { private static final String SAMPLE_URI_WEBP_ANIMATED = "https://www.gstatic.com/webp/animated/1.webp"; + private static final String[] SAMPLE_URIS_GIFS = + new String [] { + "https://media2.giphy.com/media/3oge84qhopFbFFkwec/giphy.gif", + "https://media3.giphy.com/media/uegrGBitPHtKM/giphy.gif", + "https://media0.giphy.com/media/SWd9mTHEMIxQ4/giphy.gif" + }; + private static ImageUriProvider sInstance; private final SharedPreferences mSharedPreferences; @@ -279,6 +286,14 @@ public List getRandomSampleUris(final ImageSize imageSize, final int numIma return data; } + public List getSampleGifUris(){ + ArrayList uris = new ArrayList<>(); + for (String uri : SAMPLE_URIS_GIFS) { + uris.add(Uri.parse(uri)); + } + return uris; + } + private Uri applyOverrideSettings( String uriString, UriModification urlModification) {