Account for current open image in FlutterImageView (#21191)
diff --git a/shell/platform/android/io/flutter/embedding/android/FlutterImageView.java b/shell/platform/android/io/flutter/embedding/android/FlutterImageView.java
index 7482c1f..85f3ce4 100644
--- a/shell/platform/android/io/flutter/embedding/android/FlutterImageView.java
+++ b/shell/platform/android/io/flutter/embedding/android/FlutterImageView.java
@@ -195,7 +195,11 @@
// 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);
diff --git a/shell/platform/android/test/io/flutter/embedding/android/FlutterViewTest.java b/shell/platform/android/test/io/flutter/embedding/android/FlutterViewTest.java
index ccafbc1..204799d 100644
--- a/shell/platform/android/test/io/flutter/embedding/android/FlutterViewTest.java
+++ b/shell/platform/android/test/io/flutter/embedding/android/FlutterViewTest.java
@@ -590,11 +590,13 @@
}
@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 @@
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