diff --git a/shell/platform/android/io/flutter/embedding/android/FlutterView.java b/shell/platform/android/io/flutter/embedding/android/FlutterView.java index a224d34b26b10..47eedb6860894 100644 --- a/shell/platform/android/io/flutter/embedding/android/FlutterView.java +++ b/shell/platform/android/io/flutter/embedding/android/FlutterView.java @@ -86,7 +86,7 @@ public class FlutterView extends FrameLayout implements MouseCursorPlugin.MouseC @Nullable private FlutterSurfaceView flutterSurfaceView; @Nullable private FlutterTextureView flutterTextureView; @Nullable private FlutterImageView flutterImageView; - @Nullable private RenderSurface renderSurface; + @Nullable @VisibleForTesting /* package */ RenderSurface renderSurface; @Nullable private RenderSurface previousRenderSurface; private final Set flutterUiDisplayListeners = new HashSet<>(); private boolean isFlutterUiDisplayed; @@ -1083,6 +1083,11 @@ public void detachFromFlutterEngine() { flutterRenderer.removeIsDisplayingFlutterUiListener(flutterUiDisplayListener); flutterRenderer.stopRenderingToSurface(); flutterRenderer.setSemanticsEnabled(false); + + // Revert the image view to previous surface + if (previousRenderSurface != null && renderSurface == flutterImageView) { + renderSurface = previousRenderSurface; + } renderSurface.detachFromRenderer(); flutterImageView = 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. 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);