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 2919c6d16f..e3095ff7bb 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 @@ -721,10 +721,6 @@ public class FlutterRenderer implements TextureRegistry { } cleanup(); createNewReader = true; - if (this.callback != null) { - notifiedDestroy = true; - this.callback.onSurfaceDestroyed(); - } } private void releaseInternal() { diff --git a/engine/src/flutter/shell/platform/android/io/flutter/view/TextureRegistry.java b/engine/src/flutter/shell/platform/android/io/flutter/view/TextureRegistry.java index 9e9a5bbf59..a49a038265 100644 --- a/engine/src/flutter/shell/platform/android/io/flutter/view/TextureRegistry.java +++ b/engine/src/flutter/shell/platform/android/io/flutter/view/TextureRegistry.java @@ -116,6 +116,8 @@ public interface TextureRegistry { /** * Invoked when an Android application is resumed after {@link Callback#onSurfaceDestroyed()}. * + *
When this method is overridden, {@link Callback#onSurfaceCreated()} is not called. + * *
Applications should now call {@link SurfaceProducer#getSurface()} to get a new * {@link Surface}, as the previous one was destroyed and released as a result of a low memory * event from the Android OS. @@ -141,17 +143,9 @@ public interface TextureRegistry { } /** - * Invoked when a {@link Surface} returned by {@link SurfaceProducer#getSurface()} is invalid. + * An alias for {@link Callback#onSurfaceCleanup()} with a less accurate name. * - *
In a low memory environment, the Android OS will signal to Flutter to release resources, - * such as surfaces, that are not currently in use, such as when the application is in the - * background, and this method is subsequently called to notify a plugin author to stop using - * or rendering to the last surface. - * - * @deprecated Override and use {@link Callback#onSurfaceCleanup()} instead. This method is - * called after the surface has already been destroyed, which is often too late to tell a - * dependency (which might have already scheduled a render) to stop. - * @see #160933. + * @deprecated Override and use {@link Callback#onSurfaceCleanup()} instead. */ @Deprecated(since = "Flutter 3.28", forRemoval = true) default void onSurfaceDestroyed() {} @@ -160,6 +154,8 @@ public interface TextureRegistry { * Invoked when a {@link Surface} returned by {@link SurfaceProducer#getSurface()} is about * to become invalid. * + *
When this method is overridden, {@link Callback#onSurfaceDestroyed()} is not called. + * *
In a low memory environment, the Android OS will signal to Flutter to release resources, * such as surfaces, that are not currently in use, such as when the application is in the * background, and this method is subsequently called to notify a plugin author to stop @@ -183,7 +179,9 @@ public interface TextureRegistry { * } * */ - default void onSurfaceCleanup() {} + default void onSurfaceCleanup() { + onSurfaceDestroyed(); + } } /** This method is not officially part of the public API surface and will be deprecated. */ 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 3df08d8015..2bb1ef6be0 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 @@ -767,7 +767,7 @@ public class FlutterRendererTest { @Test @SuppressWarnings({"deprecation", "removal"}) - public void ImageReaderSurfaceProducerIsDestroyedOnTrimMemory() { + public void ImageReaderSurfaceProducerIsCleanedUpOnTrimMemory() { FlutterRenderer flutterRenderer = engineRule.getFlutterEngine().getRenderer(); TextureRegistry.SurfaceProducer producer = flutterRenderer.createSurfaceProducer(); @@ -781,7 +781,6 @@ public class FlutterRendererTest { // Verify. verify(callback).onSurfaceCleanup(); - verify(callback).onSurfaceDestroyed(); } private static class TestSurfaceState { @@ -821,6 +820,23 @@ public class FlutterRendererTest { assertFalse("Should be destroyed", state.beingDestroyed.isValid()); } + @Test + @SuppressWarnings({"deprecation", "removal"}) + public void ImageReaderSurfaceProducerSignalsCleanupCallsDestroy() throws Exception { + CountDownLatch latch = new CountDownLatch(1); + TextureRegistry.SurfaceProducer.Callback callback = + new TextureRegistry.SurfaceProducer.Callback() { + @Override + public void onSurfaceDestroyed() { + latch.countDown(); + } + }; + + // Tests that cleanup, if not provided, just calls destroyed. + callback.onSurfaceCleanup(); + latch.await(); + } + @Test @SuppressWarnings({"deprecation", "removal"}) public void ImageReaderSurfaceProducerUnsubscribesWhenReleased() {