private IDataSource <CloseableReference <T> > SubmitFetchRequest <T>(
            IProducer <CloseableReference <T> > producerSequence,
            ImageRequest imageRequest,
            RequestLevel lowestPermittedRequestLevelOnSubmit,
            object callerContext)
        {
            IRequestListener requestListener = GetRequestListenerForRequest(imageRequest);

            try
            {
                RequestLevel lowestPermittedRequestLevel = RequestLevel.GetMax(
                    imageRequest.LowestPermittedRequestLevel,
                    lowestPermittedRequestLevelOnSubmit);

                SettableProducerContext settableProducerContext = new SettableProducerContext(
                    imageRequest,
                    GenerateUniqueFutureId(),
                    requestListener,
                    callerContext,
                    lowestPermittedRequestLevel.Value,
                    /* isPrefetch */ false,
                    imageRequest.IsProgressiveRenderingEnabled ||
                    !UriUtil.IsNetworkUri(imageRequest.SourceUri),
                    imageRequest.Priority);

                return(CloseableProducerToDataSourceAdapter <T> .Create(
                           producerSequence,
                           settableProducerContext,
                           requestListener));
            }
            catch (Exception exception)
            {
                return(DataSources.ImmediateFailedDataSource <CloseableReference <T> >(exception));
            }
        }
Example #2
0
 private static void ValidateEncodedImageRequest(ImageRequest imageRequest)
 {
     Preconditions.CheckNotNull(imageRequest);
     Preconditions.CheckArgument(UriUtil.IsNetworkUri(imageRequest.SourceUri));
     Preconditions.CheckArgument(
         imageRequest.LowestPermittedRequestLevel.Value <= RequestLevel.ENCODED_MEMORY_CACHE);
 }
        private IProducer <CloseableReference <IPooledByteBuffer> > GetBasicEncodedImageSequence(
            ImageRequest imageRequest)
        {
            Preconditions.CheckNotNull(imageRequest);

            Uri uri = imageRequest.SourceUri;

            Preconditions.CheckNotNull(uri, "Uri is null.");
            if (UriUtil.IsNetworkUri(uri))
            {
                lock (_gate)
                {
                    if (_encodedImageProducerSequence == null)
                    {
                        _encodedImageProducerSequence = new RemoveImageTransformMetaDataProducer(
                            GetBackgroundNetworkFetchToEncodedMemorySequence());
                    }
                }

                return(_encodedImageProducerSequence);
            }
            else if (UriUtil.IsAppDataUri(uri))
            {
                return(GetEncodedLocalImageFileFetchSequence());
            }
            else if (UriUtil.IsAppPackageUri(uri))
            {
                return(GetEncodedLocalAssetFetchSequence());
            }
            else if (UriUtil.IsAppResourceUri(uri))
            {
                return(GetEncodedLocalResourceFetchSequence());
            }
            else if (UriUtil.IsDataUri(uri))
            {
                return(GetEncodedDataFetchSequence());
            }
            else if (UriUtil.IsFileUri(uri))
            {
                return(GetEncodedLocalImageFileFetchSequence());
            }
            else if (UriUtil.IsFutureAccessListUri(uri))
            {
                return(GetEncodedFutureAccessListFetchSequence());
            }
            else
            {
                string uriString = uri.ToString();
                if (uriString.Length > 30)
                {
                    uriString = uriString.Substring(0, 30) + "...";
                }

                throw new Exception("Unsupported uri scheme! Uri is: " + uriString);
            }
        }
        private IProducer <CloseableReference <CloseableImage> > GetBasicDecodedImageSequence(
            ImageRequest imageRequest)
        {
            Preconditions.CheckNotNull(imageRequest);

            Uri uri = imageRequest.SourceUri;

            Preconditions.CheckNotNull(uri, "Uri is null.");
            if (UriUtil.IsNetworkUri(uri))
            {
                return(GetNetworkFetchSequence());
            }
            else if (UriUtil.IsAppDataUri(uri))
            {
                if (MediaUtils.IsVideo(MediaUtils.ExtractMime(uri.ToString())))
                {
                    return(GetLocalVideoFileFetchSequence());
                }
                else
                {
                    return(GetLocalImageFileFetchSequence());
                }
            }
            else if (UriUtil.IsAppPackageUri(uri))
            {
                return(GetLocalAssetFetchSequence());
            }
            else if (UriUtil.IsAppResourceUri(uri))
            {
                return(GetLocalResourceFetchSequence());
            }
            else if (UriUtil.IsDataUri(uri))
            {
                return(GetDataFetchSequence());
            }
            else if (UriUtil.IsFileUri(uri))
            {
                return(GetLocalImageFileFetchSequence());
            }
            else if (UriUtil.IsFutureAccessListUri(uri))
            {
                return(GetFutureAccessListFetchSequence());
            }
            else
            {
                string uriString = uri.ToString();
                if (uriString.Length > 30)
                {
                    uriString = uriString.Substring(0, 30) + "...";
                }

                throw new Exception("Unsupported uri scheme! Uri is: " + uriString);
            }
        }
            /// <summary>
            /// Instantiates the <see cref="ProgressiveDecoder"/>.
            /// </summary>
            public ProgressiveDecoder(
                DecodeProducer parent,
                IConsumer <CloseableReference <CloseableImage> > consumer,
                IProducerContext producerContext) :
                base(consumer)
            {
                _parent             = parent;
                _producerContext    = producerContext;
                _producerListener   = producerContext.Listener;
                _imageDecodeOptions = producerContext.ImageRequest.ImageDecodeOptions;
                _isFinished         = false;
                Func <EncodedImage, bool, Task> job = (encodedImage, isLast) =>
                {
                    if (encodedImage != null)
                    {
                        if (_parent._downsampleEnabled)
                        {
                            ImageRequest request = producerContext.ImageRequest;
                            if (_parent._downsampleEnabledForNetwork ||
                                !UriUtil.IsNetworkUri(request.SourceUri))
                            {
                                encodedImage.SampleSize = DownsampleUtil.DetermineSampleSize(
                                    request, encodedImage);
                            }
                        }

                        return(DoDecode(encodedImage, isLast));
                    }

                    return(Task.CompletedTask);
                };

                _jobScheduler = new JobScheduler(
                    _parent._executor, job, _imageDecodeOptions.MinDecodeIntervalMs);

                _producerContext.AddCallbacks(
                    new BaseProducerContextCallbacks(
                        () => { },
                        () => { },
                        () =>
                {
                    if (_producerContext.IsIntermediateResultExpected)
                    {
                        _jobScheduler.ScheduleJob();
                    }
                },
                        () => { }));
            }
        /// <summary>
        /// Start producing results for given context.
        /// Provided consumer is notified whenever progress is made
        /// (new value is ready or error occurs).
        /// </summary>
        public void ProduceResults(
            IConsumer <CloseableReference <CloseableImage> > consumer,
            IProducerContext producerContext)
        {
            ImageRequest       imageRequest = producerContext.ImageRequest;
            ProgressiveDecoder progressiveDecoder;

            if (!UriUtil.IsNetworkUri(imageRequest.SourceUri))
            {
                progressiveDecoder = new LocalImagesProgressiveDecoder(this, consumer, producerContext);
            }
            else
            {
                ProgressiveJpegParser jpegParser = new ProgressiveJpegParser(_byteArrayPool);
                progressiveDecoder = new NetworkImagesProgressiveDecoder(
                    this,
                    consumer,
                    producerContext,
                    jpegParser,
                    _progressiveJpegConfig);
            }

            _inputProducer.ProduceResults(progressiveDecoder, producerContext);
        }