diff --git a/engine/src/flutter/shell/platform/android/io/flutter/embedding/engine/renderer/FlutterRenderer.java b/engine/src/flutter/shell/platform/android/io/flutter/embedding/engine/renderer/FlutterRenderer.java index 1f4c601d98..f66ea69fc9 100644 --- a/engine/src/flutter/shell/platform/android/io/flutter/embedding/engine/renderer/FlutterRenderer.java +++ b/engine/src/flutter/shell/platform/android/io/flutter/embedding/engine/renderer/FlutterRenderer.java @@ -705,6 +705,7 @@ public class FlutterRenderer implements TextureRegistry { private void releaseInternal() { cleanup(); released = true; + removeOnTrimMemoryListener(this); imageReaderProducers.remove(this); } diff --git a/engine/src/flutter/shell/platform/android/test/io/flutter/embedding/engine/renderer/FlutterRendererTest.java b/engine/src/flutter/shell/platform/android/test/io/flutter/embedding/engine/renderer/FlutterRendererTest.java index fe4699de9f..953a3e490b 100644 --- a/engine/src/flutter/shell/platform/android/test/io/flutter/embedding/engine/renderer/FlutterRendererTest.java +++ b/engine/src/flutter/shell/platform/android/test/io/flutter/embedding/engine/renderer/FlutterRendererTest.java @@ -4,6 +4,7 @@ package io.flutter.embedding.engine.renderer; +import static android.content.ComponentCallbacks2.TRIM_MEMORY_BACKGROUND; import static android.content.ComponentCallbacks2.TRIM_MEMORY_COMPLETE; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; @@ -671,7 +672,7 @@ public class FlutterRendererTest { // Invoke the onTrimMemory callback with level 40. // This should result in a trim. - texture.onTrimMemory(40); + texture.onTrimMemory(TRIM_MEMORY_BACKGROUND); shadowOf(Looper.getMainLooper()).idle(); assertEquals(0, texture.numImageReaders()); @@ -769,12 +770,33 @@ public class FlutterRendererTest { producer.setCallback(callback); // Trim memory. - ((FlutterRenderer.ImageReaderSurfaceProducer) producer).onTrimMemory(40); + flutterRenderer.onTrimMemory(TRIM_MEMORY_BACKGROUND); // Verify. verify(callback).onSurfaceDestroyed(); } + @Test + public void ImageReaderSurfaceProducerUnsubscribesWhenReleased() { + // Regression test for https://github.com/flutter/flutter/issues/156434. + FlutterRenderer flutterRenderer = engineRule.getFlutterEngine().getRenderer(); + TextureRegistry.SurfaceProducer producer = flutterRenderer.createSurfaceProducer(); + + // Create and set a mock callback. + TextureRegistry.SurfaceProducer.Callback callback = + mock(TextureRegistry.SurfaceProducer.Callback.class); + producer.setCallback(callback); + + // Release the surface. + producer.release(); + + // Call trim memory. + flutterRenderer.onTrimMemory(TRIM_MEMORY_BACKGROUND); + + // Verify was not called. + verify(callback, never()).onSurfaceDestroyed(); + } + @Test public void ImageReaderSurfaceProducerIsCreatedOnLifecycleResume() throws Exception { FlutterRenderer flutterRenderer = engineRule.getFlutterEngine().getRenderer(); @@ -795,7 +817,7 @@ public class FlutterRendererTest { producer.setCallback(callback); // Trim memory. - ((FlutterRenderer.ImageReaderSurfaceProducer) producer).onTrimMemory(40); + flutterRenderer.onTrimMemory(TRIM_MEMORY_BACKGROUND); // Trigger a resume. ((LifecycleRegistry) ProcessLifecycleOwner.get().getLifecycle())