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());
}
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);
}
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();
}
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;
}
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);
}
Aggregations