From b4a69f00f93f33240d646a6db053481d4afedc38 Mon Sep 17 00:00:00 2001
From: Jason Simmons <jason-simmons@users.noreply.github.com>
Date: Tue, 25 Mar 2025 21:10:58 +0000
Subject: [PATCH] Release the SurfaceTextureSurfaceProducer's surface in the
 release method (#165835)

The TextureRegistry.SurfaceProducer interface specifies that callers of
getSurface should not cache the returned surface. Therefore, it should
be safe for SurfaceTextureSurfaceProducer to release this surface when
releasing the texture.

Fixes https://github.com/flutter/flutter/issues/163235
---
 .../renderer/SurfaceTextureSurfaceProducer.java |  2 ++
 .../SurfaceTextureSurfaceProducerTest.java      | 17 +++++++++++++++++
 2 files changed, 19 insertions(+)

diff --git a/engine/src/flutter/shell/platform/android/io/flutter/embedding/engine/renderer/SurfaceTextureSurfaceProducer.java b/engine/src/flutter/shell/platform/android/io/flutter/embedding/engine/renderer/SurfaceTextureSurfaceProducer.java
index 6f522a65c37..ed18f804768 100644
--- a/engine/src/flutter/shell/platform/android/io/flutter/embedding/engine/renderer/SurfaceTextureSurfaceProducer.java
+++ b/engine/src/flutter/shell/platform/android/io/flutter/embedding/engine/renderer/SurfaceTextureSurfaceProducer.java
@@ -52,6 +52,8 @@ final class SurfaceTextureSurfaceProducer
   @Override
   public void release() {
     texture.release();
+    surface.release();
+    surface = null;
     released = true;
   }
 
diff --git a/engine/src/flutter/shell/platform/android/test/io/flutter/embedding/engine/renderer/SurfaceTextureSurfaceProducerTest.java b/engine/src/flutter/shell/platform/android/test/io/flutter/embedding/engine/renderer/SurfaceTextureSurfaceProducerTest.java
index c4491c50921..e451ca51b49 100644
--- a/engine/src/flutter/shell/platform/android/test/io/flutter/embedding/engine/renderer/SurfaceTextureSurfaceProducerTest.java
+++ b/engine/src/flutter/shell/platform/android/test/io/flutter/embedding/engine/renderer/SurfaceTextureSurfaceProducerTest.java
@@ -6,6 +6,8 @@ package io.flutter.embedding.engine.renderer;
 
 import static io.flutter.Build.API_LEVELS;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.mock;
 import static org.robolectric.Shadows.shadowOf;
 
@@ -67,4 +69,19 @@ public final class SurfaceTextureSurfaceProducerTest {
     fakeJNI.detachFromNativeAndReleaseResources();
     producer.release();
   }
+
+  @Test
+  public void releaseWillReleaseSurface() {
+    final FlutterRenderer flutterRenderer = new FlutterRenderer(fakeJNI);
+
+    // Create a surface and set the initial size.
+    final Handler handler = new Handler(Looper.getMainLooper());
+    final SurfaceTextureSurfaceProducer producer =
+        new SurfaceTextureSurfaceProducer(
+            0, handler, fakeJNI, flutterRenderer.registerSurfaceTexture(new SurfaceTexture(0)));
+    final Surface surface = producer.getSurface();
+    assertTrue(surface.isValid());
+    producer.release();
+    assertFalse(surface.isValid());
+  }
 }
-- 
GitLab