From 835995a1c9619c417a0c422d3c5ab8117a9ecc62 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, 8 Feb 2022 11:35:34 +0800 Subject: [PATCH] Minor refactor: move `flutterViewConvertedToImageView` to FlutterView from PlatformViewsController. --- .../embedding/android/FlutterView.java | 21 +++++++++++++++++++ .../platform/PlatformViewsController.java | 14 ++++--------- .../embedding/android/FlutterViewTest.java | 2 ++ 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/shell/platform/android/io/flutter/embedding/android/FlutterView.java b/shell/platform/android/io/flutter/embedding/android/FlutterView.java index 39b4ebd23c704..b0b46ba58c32b 100644 --- a/shell/platform/android/io/flutter/embedding/android/FlutterView.java +++ b/shell/platform/android/io/flutter/embedding/android/FlutterView.java @@ -135,6 +135,8 @@ public class FlutterView extends FrameLayout implements MouseCursorPlugin.MouseC private final FlutterRenderer.ViewportMetrics viewportMetrics = new FlutterRenderer.ViewportMetrics(); + // Tracks whether the flutterView has been converted to use a FlutterImageView. + private boolean hasConvertedToImageView = false; private final AccessibilityBridge.OnAccessibilityChangeListener onAccessibilityChangeListener = new AccessibilityBridge.OnAccessibilityChangeListener() { @Override @@ -406,6 +408,15 @@ public boolean hasRenderedFirstFrame() { return isFlutterUiDisplayed; } + /** + * Whether this {@code FlutterView} has been converted to use a {@link FlutterImageView}. + * + *

Returns ture if the surface is rendered by a {@link FlutterImageView}. + */ + public boolean hasConvertedToImageView() { + return hasConvertedToImageView; + } + /** * Adds the given {@code listener} to this {@code FlutterView}, to be notified upon Flutter's * first rendered frame. @@ -1264,6 +1275,8 @@ public void detachFromFlutterEngine() { removeView(flutterImageView); flutterImageView = null; } + + hasConvertedToImageView = false; previousRenderSurface = null; flutterEngine = null; } @@ -1280,6 +1293,10 @@ public FlutterImageView createImageView() { * Otherwise, it resizes the {@link FlutterImageView} based on the current view size. */ public void convertToImageView() { + if (hasConvertedToImageView) { + return; + } + renderSurface.pause(); if (flutterImageView == null) { @@ -1294,6 +1311,8 @@ public void convertToImageView() { if (flutterEngine != null) { renderSurface.attachToRenderer(flutterEngine.getRenderer()); } + + hasConvertedToImageView = true; } /** @@ -1314,6 +1333,8 @@ public void revertImageView(@NonNull Runnable onDone) { } renderSurface = previousRenderSurface; previousRenderSurface = null; + hasConvertedToImageView = false; + if (flutterEngine == null) { flutterImageView.detachFromRenderer(); onDone.run(); diff --git a/shell/platform/android/io/flutter/plugin/platform/PlatformViewsController.java b/shell/platform/android/io/flutter/plugin/platform/PlatformViewsController.java index 29ace9e502c2d..3ebed745ee6db 100644 --- a/shell/platform/android/io/flutter/plugin/platform/PlatformViewsController.java +++ b/shell/platform/android/io/flutter/plugin/platform/PlatformViewsController.java @@ -102,9 +102,6 @@ public class PlatformViewsController implements PlatformViewsAccessibilityDelega // Next available unique ID for use in overlayLayerViews. private int nextOverlayLayerId = 0; - // Tracks whether the flutterView has been converted to use a FlutterImageView. - private boolean flutterViewConvertedToImageView = false; - // When adding platform views using Hybrid Composition, the engine converts the render surface // to a FlutterImageView to help improve animation synchronization on Android. This flag allows // disabling this conversion through the PlatformView platform channel. @@ -510,7 +507,6 @@ public void detachFromView() { destroyOverlaySurfaces(); removeOverlaySurfaces(); this.flutterView = null; - flutterViewConvertedToImageView = false; // Inform all existing platform views that they are no longer associated with // a Flutter View. @@ -726,9 +722,8 @@ private void flushAllViews() { } private void initializeRootImageViewIfNeeded() { - if (synchronizeToNativeViewHierarchy && !flutterViewConvertedToImageView) { + if (synchronizeToNativeViewHierarchy) { flutterView.convertToImageView(); - flutterViewConvertedToImageView = true; } } @@ -863,8 +858,7 @@ public void onEndFrame() { // then revert the image view surface and use the previous surface. // // Otherwise, acquire the latest image. - if (flutterViewConvertedToImageView && currentFrameUsedPlatformViewIds.isEmpty()) { - flutterViewConvertedToImageView = false; + if (flutterView.hasConvertedToImageView() && currentFrameUsedPlatformViewIds.isEmpty()) { flutterView.revertImageView( () -> { // Destroy overlay surfaces once the surface reversion is completed. @@ -882,7 +876,7 @@ public void onEndFrame() { // dropped. // For example, a toolbar widget painted by Flutter may not be rendered. final boolean isFrameRenderedUsingImageReaders = - flutterViewConvertedToImageView && flutterView.acquireLatestImageViewFrame(); + flutterView.hasConvertedToImageView() && flutterView.acquireLatestImageViewFrame(); finishFrame(isFrameRenderedUsingImageReaders); } @@ -899,7 +893,7 @@ private void finishFrame(boolean isFrameRenderedUsingImageReaders) { // If the background surface isn't rendered by the image view, then the // overlay surfaces can be detached from the rendered. // This releases resources used by the ImageReader. - if (!flutterViewConvertedToImageView) { + if (!flutterView.hasConvertedToImageView()) { overlayView.detachFromRenderer(); } // Hide overlay surfaces that aren't rendered in the current frame. 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 b4cace07d9268..26080cf351236 100644 --- a/shell/platform/android/test/io/flutter/embedding/android/FlutterViewTest.java +++ b/shell/platform/android/test/io/flutter/embedding/android/FlutterViewTest.java @@ -131,9 +131,11 @@ public void detachFromFlutterEngine_revertImageView() { flutterView.convertToImageView(); assertTrue(flutterView.renderSurface instanceof FlutterImageView); + assertTrue(flutterView.hasConvertedToImageView()); flutterView.detachFromFlutterEngine(); assertFalse(flutterView.renderSurface instanceof FlutterImageView); + assertFalse(flutterView.hasConvertedToImageView()); } @Test