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