From e99e19809d7e7db8316e45a52b1047d99e3f933c Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Wed, 29 Jun 2022 16:27:33 -0700 Subject: [PATCH 1/4] clamp --- .../plugin/platform/VirtualDisplayController.java | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/shell/platform/android/io/flutter/plugin/platform/VirtualDisplayController.java b/shell/platform/android/io/flutter/plugin/platform/VirtualDisplayController.java index e049d5cccbd44..bd1f7c47849ac 100644 --- a/shell/platform/android/io/flutter/plugin/platform/VirtualDisplayController.java +++ b/shell/platform/android/io/flutter/plugin/platform/VirtualDisplayController.java @@ -45,19 +45,8 @@ public static VirtualDisplayController create( } // Prevent https://github.com/flutter/flutter/issues/2897. if (selectedWidth > metrics.widthPixels || selectedHeight > metrics.heightPixels) { - float aspectRatio = (float) selectedWidth / (float) selectedHeight; - int maybeWidth = (int) (metrics.heightPixels * aspectRatio); - int maybeHeight = (int) (metrics.widthPixels / aspectRatio); - - if (maybeHeight <= metrics.heightPixels) { - selectedWidth = metrics.widthPixels; - selectedHeight = maybeHeight; - } else if (maybeWidth <= metrics.widthPixels) { - selectedHeight = metrics.heightPixels; - selectedWidth = maybeWidth; - } else { - return null; - } + selectedWidth = Math.min(selectedWidth, metrics.widthPixels); + selectedHeight = Math.min(selectedHeight, metrics.heightPixels); String message = String.format( From 90f864072f4c057e12f323390ad591e7a97e187a Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Thu, 30 Jun 2022 14:30:31 -0700 Subject: [PATCH 2/4] revert code that changing the virtual display's size --- .../platform/VirtualDisplayController.java | 31 +++---------------- 1 file changed, 5 insertions(+), 26 deletions(-) diff --git a/shell/platform/android/io/flutter/plugin/platform/VirtualDisplayController.java b/shell/platform/android/io/flutter/plugin/platform/VirtualDisplayController.java index bd1f7c47849ac..e6aa0d7e62223 100644 --- a/shell/platform/android/io/flutter/plugin/platform/VirtualDisplayController.java +++ b/shell/platform/android/io/flutter/plugin/platform/VirtualDisplayController.java @@ -36,33 +36,12 @@ public static VirtualDisplayController create( Object createParams, OnFocusChangeListener focusChangeListener) { - int selectedWidth = width; - int selectedHeight = height; - DisplayMetrics metrics = context.getResources().getDisplayMetrics(); - if (selectedWidth == 0 || selectedHeight == 0) { + if (width == 0 || height == 0) { return null; } - // Prevent https://github.com/flutter/flutter/issues/2897. - if (selectedWidth > metrics.widthPixels || selectedHeight > metrics.heightPixels) { - selectedWidth = Math.min(selectedWidth, metrics.widthPixels); - selectedHeight = Math.min(selectedHeight, metrics.heightPixels); - - String message = - String.format( - Locale.US, - "Resizing virtual display of size: [%d, %d] to size [%d, %d] " - + "since it's larger than the device display size [%d, %d].", - width, - height, - selectedWidth, - selectedHeight, - metrics.widthPixels, - metrics.heightPixels); - Log.w(TAG, message); - } - textureEntry.surfaceTexture().setDefaultBufferSize(selectedWidth, selectedHeight); + textureEntry.surfaceTexture().setDefaultBufferSize(width, height); Surface surface = new Surface(textureEntry.surfaceTexture()); DisplayManager displayManager = (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE); @@ -70,7 +49,7 @@ public static VirtualDisplayController create( int densityDpi = context.getResources().getDisplayMetrics().densityDpi; VirtualDisplay virtualDisplay = displayManager.createVirtualDisplay( - "flutter-vd", selectedWidth, selectedHeight, densityDpi, surface, 0); + "flutter-vd", width, height, densityDpi, surface, 0); if (virtualDisplay == null) { return null; @@ -86,8 +65,8 @@ public static VirtualDisplayController create( focusChangeListener, viewId, createParams); - controller.bufferWidth = selectedWidth; - controller.bufferHeight = selectedHeight; + controller.bufferWidth = width; + controller.bufferHeight = height; return controller; } From 667576220c649a330395353fbf4ec28e1a8e60fe Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Thu, 30 Jun 2022 14:31:01 -0700 Subject: [PATCH 3/4] format --- .../io/flutter/plugin/platform/VirtualDisplayController.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/shell/platform/android/io/flutter/plugin/platform/VirtualDisplayController.java b/shell/platform/android/io/flutter/plugin/platform/VirtualDisplayController.java index e6aa0d7e62223..7f1d7ddb7558a 100644 --- a/shell/platform/android/io/flutter/plugin/platform/VirtualDisplayController.java +++ b/shell/platform/android/io/flutter/plugin/platform/VirtualDisplayController.java @@ -17,9 +17,7 @@ import android.view.ViewTreeObserver; import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; -import io.flutter.Log; import io.flutter.view.TextureRegistry; -import java.util.Locale; @TargetApi(20) class VirtualDisplayController { @@ -48,8 +46,7 @@ public static VirtualDisplayController create( int densityDpi = context.getResources().getDisplayMetrics().densityDpi; VirtualDisplay virtualDisplay = - displayManager.createVirtualDisplay( - "flutter-vd", width, height, densityDpi, surface, 0); + displayManager.createVirtualDisplay("flutter-vd", width, height, densityDpi, surface, 0); if (virtualDisplay == null) { return null; From 3cb09aa9a9c3f50a95b16bfab4dc623cff838be7 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Wed, 6 Jul 2022 09:18:41 -0700 Subject: [PATCH 4/4] add comment and TODO --- .../plugin/platform/VirtualDisplayController.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/shell/platform/android/io/flutter/plugin/platform/VirtualDisplayController.java b/shell/platform/android/io/flutter/plugin/platform/VirtualDisplayController.java index 7f1d7ddb7558a..5a1eb7c08a8c4 100644 --- a/shell/platform/android/io/flutter/plugin/platform/VirtualDisplayController.java +++ b/shell/platform/android/io/flutter/plugin/platform/VirtualDisplayController.java @@ -39,6 +39,16 @@ public static VirtualDisplayController create( return null; } + // Virtual Display crashes for some PlatformViews if the width or height is bigger + // than the physical screen size. We have tried to clamp or scale down the size to prevent + // the crash, but both solutions lead to unwanted behavior because the + // AndroidPlatformView(https://github.com/flutter/flutter/blob/master/packages/flutter/lib/src/widgets/platform_view.dart#L677) widget doesn't + // scale or clamp, which leads to a mismatch between the size of the widget and the size of + // virtual display. + // This mismatch leads to some test failures: https://github.com/flutter/flutter/issues/106750 + // TODO(cyanglaz): find a way to prevent the crash without introducing size mistach betewen + // virtual display and AndroidPlatformView widget. + // https://github.com/flutter/flutter/issues/93115 textureEntry.surfaceTexture().setDefaultBufferSize(width, height); Surface surface = new Surface(textureEntry.surfaceTexture()); DisplayManager displayManager =