/*
* Copyright (c) 2015-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
package com.facebook.imagepipeline.producers;
import com.facebook.imagepipeline.image.EncodedImage;
import com.facebook.imagepipeline.request.ImageRequest;
/**
* Producer that coordinates fetching two separate images.
*
* <p>The first producer is kicked off, and once it has returned all its results, the second
* producer is kicked off if necessary.
*/
public class BranchOnSeparateImagesProducer
implements Producer<EncodedImage> {
private final Producer<EncodedImage> mInputProducer1;
private final Producer<EncodedImage> mInputProducer2;
public BranchOnSeparateImagesProducer(
Producer<EncodedImage> inputProducer1, Producer<EncodedImage> inputProducer2) {
mInputProducer1 = inputProducer1;
mInputProducer2 = inputProducer2;
}
@Override
public void produceResults(
Consumer<EncodedImage> consumer,
ProducerContext context) {
OnFirstImageConsumer onFirstImageConsumer = new OnFirstImageConsumer(consumer, context);
mInputProducer1.produceResults(onFirstImageConsumer, context);
}
private class OnFirstImageConsumer extends DelegatingConsumer<EncodedImage, EncodedImage> {
private ProducerContext mProducerContext;
private OnFirstImageConsumer(
Consumer<EncodedImage> consumer,
ProducerContext producerContext) {
super(consumer);
mProducerContext = producerContext;
}
@Override
protected void onNewResultImpl(EncodedImage newResult, boolean isLast) {
ImageRequest request = mProducerContext.getImageRequest();
boolean isGoodEnough = isResultGoodEnough(newResult, request);
if (newResult != null && (isGoodEnough || request.getLocalThumbnailPreviewsEnabled())) {
getConsumer().onNewResult(newResult, isLast && isGoodEnough);
}
if (isLast && !isGoodEnough) {
mInputProducer2.produceResults(getConsumer(), mProducerContext);
}
}
@Override
protected void onFailureImpl(Throwable t) {
mInputProducer2.produceResults(getConsumer(), mProducerContext);
}
private boolean isResultGoodEnough(EncodedImage encodedImage, ImageRequest imageRequest) {
if (encodedImage == null) {
return false;
}
return encodedImage.getWidth() >= imageRequest.getPreferredWidth() &&
encodedImage.getHeight() >= imageRequest.getPreferredHeight();
}
}
}