Account for current open image in FlutterImageView (flutter/engine#21191)

This commit is contained in:
Emmanuel Garcia 2020-09-15 14:10:55 -07:00 committed by GitHub
parent 3f9d11d771
commit 3a7b283bb3
2 changed files with 31 additions and 7 deletions

View File

@ -195,7 +195,11 @@ public class FlutterImageView extends View implements RenderSurface {
// While the engine will also stop producing frames, there is a race condition.
//
// To avoid exceptions, check if a new image can be acquired.
if (imageQueue.size() < imageReader.getMaxImages()) {
int imageOpenedCount = imageQueue.size();
if (currentImage != null) {
imageOpenedCount++;
}
if (imageOpenedCount < imageReader.getMaxImages()) {
final Image image = imageReader.acquireLatestImage();
if (image != null) {
imageQueue.add(image);

View File

@ -590,11 +590,13 @@ public class FlutterViewTest {
}
@Test
@SuppressLint("WrongCall") /*View#onDraw*/
public void flutterImageView_acquiresMaxImagesAtMost() {
final ImageReader mockReader = mock(ImageReader.class);
when(mockReader.getMaxImages()).thenReturn(2);
when(mockReader.getMaxImages()).thenReturn(3);
final Image mockImage = mock(Image.class);
when(mockImage.getPlanes()).thenReturn(new Plane[0]);
when(mockReader.acquireLatestImage()).thenReturn(mockImage);
final FlutterImageView imageView =
@ -606,13 +608,31 @@ public class FlutterViewTest {
final FlutterJNI jni = mock(FlutterJNI.class);
imageView.attachToRenderer(new FlutterRenderer(jni));
doNothing().when(imageView).invalidate();
assertTrue(imageView.acquireLatestImage());
assertTrue(imageView.acquireLatestImage());
assertTrue(imageView.acquireLatestImage());
verify(mockReader, times(2)).acquireLatestImage();
assertTrue(imageView.acquireLatestImage()); // 1 image
assertTrue(imageView.acquireLatestImage()); // 2 images
assertTrue(imageView.acquireLatestImage()); // 3 images
assertTrue(imageView.acquireLatestImage()); // 3 images
verify(mockReader, times(3)).acquireLatestImage();
imageView.onDraw(mock(Canvas.class)); // 3 images
assertTrue(imageView.acquireLatestImage()); // 3 images
verify(mockReader, times(3)).acquireLatestImage();
imageView.onDraw(mock(Canvas.class)); // 2 images
assertTrue(imageView.acquireLatestImage()); // 3 images
verify(mockReader, times(4)).acquireLatestImage();
imageView.onDraw(mock(Canvas.class)); // 2 images
imageView.onDraw(mock(Canvas.class)); // 1 image
imageView.onDraw(mock(Canvas.class)); // 1 image
assertTrue(imageView.acquireLatestImage()); // 2 images
assertTrue(imageView.acquireLatestImage()); // 3 images
assertTrue(imageView.acquireLatestImage()); // 3 images
assertTrue(imageView.acquireLatestImage()); // 3 images
verify(mockReader, times(6)).acquireLatestImage();
}
@Test