Search in sources :

Example 16 with CloseableReference

use of com.facebook.common.references.CloseableReference in project fresco by facebook.

the class ImagePipelineNotificationFragment method createNotification.

private void createNotification() {
    final ImagePipeline imagePipeline = Fresco.getImagePipeline();
    final ImageRequest imageRequest = ImageRequest.fromUri(sampleUris().createSampleUri(ImageUriProvider.ImageSize.S));
    final DataSource<CloseableReference<CloseableImage>> dataSource = imagePipeline.fetchDecodedImage(imageRequest, null);
    dataSource.subscribe(new BaseBitmapDataSubscriber() {

        @Override
        protected void onNewResultImpl(Bitmap bitmap) {
            displayNotification(bitmap);
        }

        @Override
        protected void onFailureImpl(DataSource<CloseableReference<CloseableImage>> dataSource) {
            showToastText("Failed to fetch image directly: " + dataSource.getFailureCause());
            // In general, failing to fetch the image should not keep us from displaying the
            // notification. We proceed without the bitmap.
            displayNotification(null);
        }
    }, UiThreadImmediateExecutorService.getInstance());
}
Also used : Bitmap(android.graphics.Bitmap) ImageRequest(com.facebook.imagepipeline.request.ImageRequest) CloseableReference(com.facebook.common.references.CloseableReference) ImagePipeline(com.facebook.imagepipeline.core.ImagePipeline) BaseBitmapDataSubscriber(com.facebook.imagepipeline.datasource.BaseBitmapDataSubscriber)

Example 17 with CloseableReference

use of com.facebook.common.references.CloseableReference in project fresco by facebook.

the class LocalVideoThumbnailProducerTest method testLocalVideoMicroThumbnailSuccess.

@Test
public void testLocalVideoMicroThumbnailSuccess() throws Exception {
    when(mImageRequest.getSourceUri()).thenReturn(mLocalVideoUri);
    when(mProducerListener.requiresExtraMap(mProducerContext, PRODUCER_NAME)).thenReturn(true);
    when(android.media.ThumbnailUtils.createVideoThumbnail(mFile.getPath(), MediaStore.Images.Thumbnails.MICRO_KIND)).thenReturn(mBitmap);
    doAnswer(new Answer() {

        @Override
        public Object answer(InvocationOnMock invocation) throws Throwable {
            mCloseableReference = ((CloseableReference) invocation.getArguments()[0]).clone();
            return null;
        }
    }).when(mConsumer).onNewResult(any(CloseableReference.class), eq(Consumer.IS_LAST));
    mLocalVideoThumbnailProducer.produceResults(mConsumer, mProducerContext);
    mExecutor.runUntilIdle();
    assertEquals(1, mCloseableReference.getUnderlyingReferenceTestOnly().getRefCountTestOnly());
    assertEquals(mBitmap, mCloseableReference.getUnderlyingReferenceTestOnly().get().getUnderlyingBitmap());
    verify(mProducerListener).onProducerStart(mProducerContext, PRODUCER_NAME);
    Map<String, String> thumbnailFoundMap = ImmutableMap.of(LocalVideoThumbnailProducer.CREATED_THUMBNAIL, "true");
    verify(mProducerListener).onProducerFinishWithSuccess(mProducerContext, PRODUCER_NAME, thumbnailFoundMap);
    verify(mProducerListener).onUltimateProducerReached(mProducerContext, PRODUCER_NAME, true);
}
Also used : Mockito.doAnswer(org.mockito.Mockito.doAnswer) CloseableReference(com.facebook.common.references.CloseableReference)

Example 18 with CloseableReference

use of com.facebook.common.references.CloseableReference in project fresco by facebook.

the class SingleUsePostprocessorProducerTest method testSuccess.

@Test
public void testSuccess() {
    SingleUsePostprocessorConsumer postprocessorConsumer = produceResults();
    doReturn(mDestinationCloseableBitmapRef).when(mPostprocessor).process(mSourceBitmap, mPlatformBitmapFactory);
    postprocessorConsumer.onNewResult(mSourceCloseableImageRef, Consumer.IS_LAST);
    mSourceCloseableImageRef.close();
    mTestExecutorService.runUntilIdle();
    mInOrder.verify(mProducerListener).onProducerStart(mProducerContext, PostprocessorProducer.NAME);
    mInOrder.verify(mPostprocessor).process(mSourceBitmap, mPlatformBitmapFactory);
    mInOrder.verify(mProducerListener).requiresExtraMap(mProducerContext, PostprocessorProducer.NAME);
    mInOrder.verify(mProducerListener).onProducerFinishWithSuccess(mProducerContext, PostprocessorProducer.NAME, mExtraMap);
    mInOrder.verify(mConsumer).onNewResult(any(CloseableReference.class), eq(Consumer.IS_LAST));
    mInOrder.verifyNoMoreInteractions();
    assertEquals(1, mResults.size());
    CloseableReference<CloseableImage> res0 = mResults.get(0);
    assertTrue(CloseableReference.isValid(res0));
    assertSame(mDestinationBitmap, ((CloseableStaticBitmap) res0.get()).getUnderlyingBitmap());
    res0.close();
    verify(mBitmapResourceReleaser).release(mDestinationBitmap);
    verify(mSourceCloseableStaticBitmap).close();
}
Also used : CloseableReference(com.facebook.common.references.CloseableReference) CloseableImage(com.facebook.imagepipeline.image.CloseableImage) SingleUsePostprocessorConsumer(com.facebook.imagepipeline.producers.PostprocessorProducer.SingleUsePostprocessorConsumer)

Example 19 with CloseableReference

use of com.facebook.common.references.CloseableReference in project fresco by facebook.

the class ProducerSequenceFactory method getPostprocessorSequence.

/**
 * post-processor producer -> copy producer -> inputProducer
 */
private synchronized Producer<CloseableReference<CloseableImage>> getPostprocessorSequence(Producer<CloseableReference<CloseableImage>> inputProducer) {
    Producer<CloseableReference<CloseableImage>> result = mPostprocessorSequences.get(inputProducer);
    if (result == null) {
        PostprocessorProducer postprocessorProducer = mProducerFactory.newPostprocessorProducer(inputProducer);
        result = mProducerFactory.newPostprocessorBitmapMemoryCacheProducer(postprocessorProducer);
        mPostprocessorSequences.put(inputProducer, result);
    }
    return result;
}
Also used : CloseableReference(com.facebook.common.references.CloseableReference) PostprocessorProducer(com.facebook.imagepipeline.producers.PostprocessorProducer)

Example 20 with CloseableReference

use of com.facebook.common.references.CloseableReference in project fresco by facebook.

the class AbstractAdaptiveCountingMemoryCacheTest method testTrimming.

@Test
public void testTrimming() {
    MemoryTrimType memoryTrimType = MemoryTrimType.OnCloseToDalvikHeapLimit;
    mParams = new MemoryCacheParams(2200, 16, 2200, 16, 110, PARAMS_CHECK_INTERVAL_MS);
    when(mParamsSupplier.get()).thenReturn(mParams);
    mCache = createDummyAdaptiveCountingMemoryCache(mParamsSupplier, mCacheTrimStrategy, mValueDescriptor, 100, 1, 2, initialLFUCacheFractionPromil);
    PowerMockito.when(SystemClock.uptimeMillis()).thenReturn(PARAMS_CHECK_INTERVAL_MS);
    InOrder inOrder = inOrder(mReleaser);
    // create original references
    CloseableReference<Integer>[] originalRefs = new CloseableReference[10];
    for (int i = 0; i < 10; i++) {
        originalRefs[i] = newReference(100 + i);
    }
    // cache items & close the original references
    CloseableReference<Integer>[] cachedRefs = new CloseableReference[10];
    for (int i = 0; i < 10; i++) {
        cachedRefs[i] = mCache.cache(KEYS[i], originalRefs[i]);
        originalRefs[i].close();
    }
    // cache should keep alive the items until evicted
    inOrder.verify(mReleaser, never()).release(anyInt());
    // trimming cannot evict shared entries
    when(mCacheTrimStrategy.getTrimRatio(memoryTrimType)).thenReturn(1.00);
    mCache.trim(memoryTrimType);
    assertSharedWithCount(KEYS[0], 100, 1);
    assertSharedWithCount(KEYS[1], 101, 1);
    assertSharedWithCount(KEYS[2], 102, 1);
    assertSharedWithCount(KEYS[3], 103, 1);
    assertSharedWithCount(KEYS[4], 104, 1);
    assertSharedWithCount(KEYS[5], 105, 1);
    assertSharedWithCount(KEYS[6], 106, 1);
    assertSharedWithCount(KEYS[7], 107, 1);
    assertSharedWithCount(KEYS[8], 108, 1);
    assertSharedWithCount(KEYS[9], 109, 1);
    assertTotalSize(10, 1045);
    assertExclusivelyOwnedSize(0, 0);
    // close 6 client references
    cachedRefs[4].close();
    cachedRefs[2].close();
    cachedRefs[7].close();
    cachedRefs[3].close();
    cachedRefs[6].close();
    cachedRefs[8].close();
    assertSharedWithCount(KEYS[0], 100, 1);
    assertSharedWithCount(KEYS[1], 101, 1);
    assertSharedWithCount(KEYS[5], 105, 1);
    assertSharedWithCount(KEYS[9], 109, 1);
    assertExclusivelyOwned(KEYS[8], 108);
    assertExclusivelyOwned(KEYS[2], 102);
    assertExclusivelyOwned(KEYS[7], 107);
    assertExclusivelyOwned(KEYS[3], 103);
    assertExclusivelyOwned(KEYS[6], 106);
    assertExclusivelyOwned(KEYS[4], 104);
    assertTotalSize(10, 1045);
    assertExclusivelyOwnedSize(6, 630);
    // Trim cache by 45%. This means that out of total of 1045 bytes cached, 574 should remain.
    // 415 bytes ars used by the clients, which leaves 159 for the exclusively owned items.
    // Only the the most recent exclusively owned item fits, and it occupies 108 bytes.
    when(mCacheTrimStrategy.getTrimRatio(memoryTrimType)).thenReturn(0.45);
    mCache.trim(memoryTrimType);
    assertSharedWithCount(KEYS[0], 100, 1);
    assertSharedWithCount(KEYS[1], 101, 1);
    assertSharedWithCount(KEYS[5], 105, 1);
    assertSharedWithCount(KEYS[9], 109, 1);
    assertExclusivelyOwned(KEYS[8], 108);
    assertNotCached(KEYS[4], 104);
    assertNotCached(KEYS[2], 102);
    assertNotCached(KEYS[7], 107);
    assertNotCached(KEYS[3], 103);
    assertNotCached(KEYS[6], 106);
    assertTotalSize(5, 523);
    assertExclusivelyOwnedSize(1, 108);
    inOrder.verify(mReleaser).release(102);
    inOrder.verify(mReleaser).release(107);
    inOrder.verify(mReleaser).release(103);
    inOrder.verify(mReleaser).release(106);
    cachedRefs[5].close();
    // Full trim. All exclusively owned items should be evicted.
    when(mCacheTrimStrategy.getTrimRatio(memoryTrimType)).thenReturn(1.00);
    mCache.trim(memoryTrimType);
    assertSharedWithCount(KEYS[0], 100, 1);
    assertSharedWithCount(KEYS[1], 101, 1);
    assertSharedWithCount(KEYS[9], 109, 1);
    assertNotCached(KEYS[8], 108);
    assertNotCached(KEYS[2], 102);
    assertNotCached(KEYS[7], 107);
    assertNotCached(KEYS[3], 103);
    assertNotCached(KEYS[6], 106);
    assertNotCached(KEYS[4], 104);
    assertNotCached(KEYS[5], 105);
    assertTotalSize(3, 310);
    assertExclusivelyOwnedSize(0, 0);
    inOrder.verify(mReleaser).release(105);
}
Also used : MemoryTrimType(com.facebook.common.memory.MemoryTrimType) InOrder(org.mockito.InOrder) CloseableReference(com.facebook.common.references.CloseableReference) PrepareForTest(org.powermock.core.classloader.annotations.PrepareForTest) Test(org.junit.Test)

Aggregations

CloseableReference (com.facebook.common.references.CloseableReference)50 ImageRequest (com.facebook.imagepipeline.request.ImageRequest)24 Bitmap (android.graphics.Bitmap)17 ImagePipeline (com.facebook.imagepipeline.core.ImagePipeline)16 CloseableImage (com.facebook.imagepipeline.image.CloseableImage)14 DataSource (com.facebook.datasource.DataSource)9 BaseBitmapDataSubscriber (com.facebook.imagepipeline.datasource.BaseBitmapDataSubscriber)8 Uri (android.net.Uri)7 CloseableStaticBitmap (com.facebook.imagepipeline.image.CloseableStaticBitmap)7 AnimatedImageResult (com.facebook.imagepipeline.animated.base.AnimatedImageResult)5 CloseableAnimatedImage (com.facebook.imagepipeline.image.CloseableAnimatedImage)5 ImageRequestBuilder (com.facebook.imagepipeline.request.ImageRequestBuilder)5 Nullable (javax.annotation.Nullable)5 Test (org.junit.Test)5 SuppressLint (android.annotation.SuppressLint)4 CacheKey (com.facebook.cache.common.CacheKey)3 MemoryTrimType (com.facebook.common.memory.MemoryTrimType)3 ResizeOptions (com.facebook.imagepipeline.common.ResizeOptions)3 CloseableBitmap (com.facebook.imagepipeline.image.CloseableBitmap)3 FakeClock (com.facebook.imagepipeline.testing.FakeClock)3