From 3a7b283bb3bbcb8d9f66fc9facaae80895c78887 Mon Sep 17 00:00:00 2001 From: Emmanuel Garcia Date: Tue, 15 Sep 2020 14:10:55 -0700 Subject: [PATCH] Account for current open image in FlutterImageView (flutter/engine#21191) --- .../embedding/android/FlutterImageView.java | 6 +++- .../embedding/android/FlutterViewTest.java | 32 +++++++++++++++---- 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/engine/src/flutter/shell/platform/android/io/flutter/embedding/android/FlutterImageView.java b/engine/src/flutter/shell/platform/android/io/flutter/embedding/android/FlutterImageView.java index 7482c1f398e..85f3ce4c273 100644 --- a/engine/src/flutter/shell/platform/android/io/flutter/embedding/android/FlutterImageView.java +++ b/engine/src/flutter/shell/platform/android/io/flutter/embedding/android/FlutterImageView.java @@ -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); diff --git a/engine/src/flutter/shell/platform/android/test/io/flutter/embedding/android/FlutterViewTest.java b/engine/src/flutter/shell/platform/android/test/io/flutter/embedding/android/FlutterViewTest.java index ccafbc1c160..204799d3618 100644 --- a/engine/src/flutter/shell/platform/android/test/io/flutter/embedding/android/FlutterViewTest.java +++ b/engine/src/flutter/shell/platform/android/test/io/flutter/embedding/android/FlutterViewTest.java @@ -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