From 9bf2fec119a405b013d9a601b9dfbfe25bccb502 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rulong=20Chen=EF=BC=88=E9=99=88=E6=B1=9D=E9=BE=99=EF=BC=89?= Date: Tue, 24 Aug 2021 17:27:13 +0800 Subject: [PATCH 1/3] [shared engine][android] The platform view using hybrid composition is invisible when it is opened for the second time. Fixs: #88558 --- .../android/io/flutter/embedding/android/FlutterView.java | 5 +++++ .../io/flutter/plugin/platform/PlatformViewsController.java | 1 + 2 files changed, 6 insertions(+) diff --git a/shell/platform/android/io/flutter/embedding/android/FlutterView.java b/shell/platform/android/io/flutter/embedding/android/FlutterView.java index a224d34b26b10..2618784441bc2 100644 --- a/shell/platform/android/io/flutter/embedding/android/FlutterView.java +++ b/shell/platform/android/io/flutter/embedding/android/FlutterView.java @@ -1085,6 +1085,11 @@ public void detachFromFlutterEngine() { flutterRenderer.setSemanticsEnabled(false); renderSurface.detachFromRenderer(); + // Revert the image view to previous surface + if (previousRenderSurface != null && renderSurface == flutterImageView) { + renderSurface = previousRenderSurface; + } + flutterImageView = null; previousRenderSurface = null; flutterEngine = null; diff --git a/shell/platform/android/io/flutter/plugin/platform/PlatformViewsController.java b/shell/platform/android/io/flutter/plugin/platform/PlatformViewsController.java index 862c63d9de9db..c34c539f3f384 100644 --- a/shell/platform/android/io/flutter/plugin/platform/PlatformViewsController.java +++ b/shell/platform/android/io/flutter/plugin/platform/PlatformViewsController.java @@ -503,6 +503,7 @@ public void attachToView(@NonNull View flutterView) { public void detachFromView() { destroyOverlaySurfaces(); this.flutterView = null; + flutterViewConvertedToImageView = false; // Inform all existing platform views that they are no longer associated with // a Flutter View. From 25c2de8edd26dc2bdae89669eb22dd1c7b6c9641 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rulong=20Chen=EF=BC=88=E9=99=88=E6=B1=9D=E9=BE=99=EF=BC=89?= Date: Thu, 2 Sep 2021 12:29:27 +0800 Subject: [PATCH 2/3] Add a test to FlutterViewTest --- .../flutter/embedding/android/FlutterView.java | 5 +++-- .../embedding/android/FlutterViewTest.java | 16 ++++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/shell/platform/android/io/flutter/embedding/android/FlutterView.java b/shell/platform/android/io/flutter/embedding/android/FlutterView.java index 2618784441bc2..fcb43be2fb77f 100644 --- a/shell/platform/android/io/flutter/embedding/android/FlutterView.java +++ b/shell/platform/android/io/flutter/embedding/android/FlutterView.java @@ -86,7 +86,8 @@ public class FlutterView extends FrameLayout implements MouseCursorPlugin.MouseC @Nullable private FlutterSurfaceView flutterSurfaceView; @Nullable private FlutterTextureView flutterTextureView; @Nullable private FlutterImageView flutterImageView; - @Nullable private RenderSurface renderSurface; + // This member is not intended for public use and is only visible for testing. + @Nullable RenderSurface renderSurface; @Nullable private RenderSurface previousRenderSurface; private final Set flutterUiDisplayListeners = new HashSet<>(); private boolean isFlutterUiDisplayed; @@ -1083,12 +1084,12 @@ public void detachFromFlutterEngine() { flutterRenderer.removeIsDisplayingFlutterUiListener(flutterUiDisplayListener); flutterRenderer.stopRenderingToSurface(); flutterRenderer.setSemanticsEnabled(false); - renderSurface.detachFromRenderer(); // Revert the image view to previous surface if (previousRenderSurface != null && renderSurface == flutterImageView) { renderSurface = previousRenderSurface; } + renderSurface.detachFromRenderer(); flutterImageView = null; previousRenderSurface = null; diff --git a/shell/platform/android/test/io/flutter/embedding/android/FlutterViewTest.java b/shell/platform/android/test/io/flutter/embedding/android/FlutterViewTest.java index 9aa0ec9c0156b..624c6d436c3f6 100644 --- a/shell/platform/android/test/io/flutter/embedding/android/FlutterViewTest.java +++ b/shell/platform/android/test/io/flutter/embedding/android/FlutterViewTest.java @@ -108,6 +108,22 @@ public void detachFromFlutterEngine_turnsOffA11y() { verify(flutterRenderer, times(1)).setSemanticsEnabled(false); } + @Test + public void detachFromFlutterEngine_revertImageView() { + FlutterView flutterView = new FlutterView(RuntimeEnvironment.application); + FlutterEngine flutterEngine = + spy(new FlutterEngine(RuntimeEnvironment.application, mockFlutterLoader, mockFlutterJni)); + + flutterView.attachToFlutterEngine(flutterEngine); + assertFalse(flutterView.renderSurface instanceof FlutterImageView); + + flutterView.convertToImageView(); + assertTrue(flutterView.renderSurface instanceof FlutterImageView); + + flutterView.detachFromFlutterEngine(); + assertFalse(flutterView.renderSurface instanceof FlutterImageView); + } + @Test public void onConfigurationChanged_fizzlesWhenNullEngine() { FlutterView flutterView = new FlutterView(RuntimeEnvironment.application); From dc3c6f860c0508dd0f668cf75e931b8a82e2dd93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rulong=20Chen=EF=BC=88=E9=99=88=E6=B1=9D=E9=BE=99=EF=BC=89?= Date: Tue, 7 Sep 2021 10:19:20 +0800 Subject: [PATCH 3/3] Add @VisibleForTesting --- .../android/io/flutter/embedding/android/FlutterView.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/shell/platform/android/io/flutter/embedding/android/FlutterView.java b/shell/platform/android/io/flutter/embedding/android/FlutterView.java index fcb43be2fb77f..47eedb6860894 100644 --- a/shell/platform/android/io/flutter/embedding/android/FlutterView.java +++ b/shell/platform/android/io/flutter/embedding/android/FlutterView.java @@ -86,8 +86,7 @@ public class FlutterView extends FrameLayout implements MouseCursorPlugin.MouseC @Nullable private FlutterSurfaceView flutterSurfaceView; @Nullable private FlutterTextureView flutterTextureView; @Nullable private FlutterImageView flutterImageView; - // This member is not intended for public use and is only visible for testing. - @Nullable RenderSurface renderSurface; + @Nullable @VisibleForTesting /* package */ RenderSurface renderSurface; @Nullable private RenderSurface previousRenderSurface; private final Set flutterUiDisplayListeners = new HashSet<>(); private boolean isFlutterUiDisplayed;