From 55e7bffa651c96b8082ea2b4948257aa5562aa4e Mon Sep 17 00:00:00 2001 From: garyqian Date: Tue, 7 Jul 2020 02:04:48 -0700 Subject: [PATCH 1/4] Add check and fix doics --- .../embedding/engine/renderer/FlutterRenderer.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/shell/platform/android/io/flutter/embedding/engine/renderer/FlutterRenderer.java b/shell/platform/android/io/flutter/embedding/engine/renderer/FlutterRenderer.java index 8dec2a05052dc..f0cd24adea675 100644 --- a/shell/platform/android/io/flutter/embedding/engine/renderer/FlutterRenderer.java +++ b/shell/platform/android/io/flutter/embedding/engine/renderer/FlutterRenderer.java @@ -131,11 +131,11 @@ final class SurfaceTextureRegistryEntry implements TextureRegistry.SurfaceTextur new SurfaceTexture.OnFrameAvailableListener() { @Override public void onFrameAvailable(@NonNull SurfaceTexture texture) { - if (released) { - // Even though we make sure to unregister the callback before releasing, as of Android - // O - // SurfaceTexture has a data race when accessing the callback, so the callback may - // still be called by a stale reference after released==true and mNativeView==null. + if (released || !flutterJNI.isAttached()) { + // Even though we make sure to unregister the callback before releasing, as of + // Android O, SurfaceTexture has a data race when accessing the callback, so the + // callback may still be called by a stale reference after released==true and + // mNativeView==null. return; } markTextureFrameAvailable(id); From 858773fb5b647a983541fe5cb2c1af8d89be0e6d Mon Sep 17 00:00:00 2001 From: garyqian Date: Fri, 10 Jul 2020 14:01:39 -0700 Subject: [PATCH 2/4] Begin test --- .../engine/renderer/FlutterRendererTest.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/shell/platform/android/test/io/flutter/embedding/engine/renderer/FlutterRendererTest.java b/shell/platform/android/test/io/flutter/embedding/engine/renderer/FlutterRendererTest.java index 4b3884085b93b..1271cdc558c47 100644 --- a/shell/platform/android/test/io/flutter/embedding/engine/renderer/FlutterRendererTest.java +++ b/shell/platform/android/test/io/flutter/embedding/engine/renderer/FlutterRendererTest.java @@ -97,4 +97,18 @@ public void itStopsRenderingToSurfaceWhenRequested() { // Verify behavior under test. verify(fakeFlutterJNI, times(1)).onSurfaceDestroyed(); } + + @Test + public void itStopsSurfaceTextureCallbackWhenDetached() { + // Setup the test. + FlutterRenderer flutterRenderer = new FlutterRenderer(fakeFlutterJNI); + + flutterRenderer.startRenderingToSurface(fakeSurface); + + // Execute the behavior under test. + flutterRenderer.stopRenderingToSurface(); + + // Verify behavior under test. + verify(fakeFlutterJNI, times(1)).onSurfaceDestroyed(); + } } From 4707e91fc97aa9a13b833fbb7b53f05dfe424fc4 Mon Sep 17 00:00:00 2001 From: garyqian Date: Sat, 11 Jul 2020 03:56:41 -0700 Subject: [PATCH 3/4] Add tests --- .../embedding/engine/renderer/FlutterRendererTest.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/shell/platform/android/test/io/flutter/embedding/engine/renderer/FlutterRendererTest.java b/shell/platform/android/test/io/flutter/embedding/engine/renderer/FlutterRendererTest.java index 1271cdc558c47..a5b48b1dc98b9 100644 --- a/shell/platform/android/test/io/flutter/embedding/engine/renderer/FlutterRendererTest.java +++ b/shell/platform/android/test/io/flutter/embedding/engine/renderer/FlutterRendererTest.java @@ -104,11 +104,15 @@ public void itStopsSurfaceTextureCallbackWhenDetached() { FlutterRenderer flutterRenderer = new FlutterRenderer(fakeFlutterJNI); flutterRenderer.startRenderingToSurface(fakeSurface); + flutterRenderer.stopRenderingToSurface(); + + fakeFlutterJNI.detachFromNativeAndReleaseResources() + flutterRenderer.startRenderingToSurface(fakeSurface); // Execute the behavior under test. flutterRenderer.stopRenderingToSurface(); // Verify behavior under test. - verify(fakeFlutterJNI, times(1)).onSurfaceDestroyed(); + verify(fakeFlutterJNI, times(1)).markTextureFrameAvailable(); } } From 73ba72aad648bb5d767e1f84fedbd2c1fac18aa8 Mon Sep 17 00:00:00 2001 From: garyqian Date: Sat, 11 Jul 2020 04:13:29 -0700 Subject: [PATCH 4/4] Rework test --- .../embedding/engine/renderer/FlutterRendererTest.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/shell/platform/android/test/io/flutter/embedding/engine/renderer/FlutterRendererTest.java b/shell/platform/android/test/io/flutter/embedding/engine/renderer/FlutterRendererTest.java index a5b48b1dc98b9..185ed43fa08c2 100644 --- a/shell/platform/android/test/io/flutter/embedding/engine/renderer/FlutterRendererTest.java +++ b/shell/platform/android/test/io/flutter/embedding/engine/renderer/FlutterRendererTest.java @@ -103,16 +103,17 @@ public void itStopsSurfaceTextureCallbackWhenDetached() { // Setup the test. FlutterRenderer flutterRenderer = new FlutterRenderer(fakeFlutterJNI); - flutterRenderer.startRenderingToSurface(fakeSurface); - flutterRenderer.stopRenderingToSurface(); + fakeFlutterJNI.detachFromNativeAndReleaseResources(); - fakeFlutterJNI.detachFromNativeAndReleaseResources() + FlutterRenderer.SurfaceTextureRegistryEntry entry = + (FlutterRenderer.SurfaceTextureRegistryEntry) flutterRenderer.createSurfaceTexture(); flutterRenderer.startRenderingToSurface(fakeSurface); + // Execute the behavior under test. flutterRenderer.stopRenderingToSurface(); // Verify behavior under test. - verify(fakeFlutterJNI, times(1)).markTextureFrameAvailable(); + verify(fakeFlutterJNI, times(0)).markTextureFrameAvailable(eq(entry.id())); } }