From 9622ebd0807735a8c5aff944d186ebc091b3b71b Mon Sep 17 00:00:00 2001 From: Jason Simmons Date: Mon, 22 Jun 2020 17:45:25 -0700 Subject: [PATCH] Implement PlatformViewsController.createOverlaySurface --- .../platform/PlatformViewsController.java | 33 +++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/shell/platform/android/io/flutter/plugin/platform/PlatformViewsController.java b/shell/platform/android/io/flutter/plugin/platform/PlatformViewsController.java index 706b31228a090..d576efc54bff3 100644 --- a/shell/platform/android/io/flutter/plugin/platform/PlatformViewsController.java +++ b/shell/platform/android/io/flutter/plugin/platform/PlatformViewsController.java @@ -9,6 +9,9 @@ import android.annotation.TargetApi; import android.content.Context; +import android.graphics.PixelFormat; +import android.hardware.HardwareBuffer; +import android.media.ImageReader; import android.os.Build; import android.util.DisplayMetrics; import android.util.Log; @@ -17,6 +20,7 @@ import androidx.annotation.NonNull; import androidx.annotation.UiThread; import androidx.annotation.VisibleForTesting; +import io.flutter.embedding.android.FlutterImageView; import io.flutter.embedding.engine.FlutterOverlaySurface; import io.flutter.embedding.engine.dart.DartExecutor; import io.flutter.embedding.engine.systemchannels.PlatformViewsChannel; @@ -71,6 +75,12 @@ public class PlatformViewsController implements PlatformViewsAccessibilityDelega // it is associated with(e.g if a platform view creates other views in the same virtual display. private final HashMap contextToPlatformView; + // Map of unique IDs to views that render overlay layers. + private HashMap overlayLayerViews; + + // Next available unique ID for use in overlayLayerViews; + private long nextOverlayLayerId = 0; + private final PlatformViewsChannel.PlatformViewsHandler channelHandler = new PlatformViewsChannel.PlatformViewsHandler() { @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) @@ -283,6 +293,7 @@ public PlatformViewsController() { vdControllers = new HashMap<>(); accessibilityEventsDelegate = new AccessibilityEventsDelegate(); contextToPlatformView = new HashMap<>(); + overlayLayerViews = new HashMap<>(); } /** @@ -552,7 +563,25 @@ public void onEndFrame() { } public FlutterOverlaySurface createOverlaySurface() { - // TODO: Implement this method. https://github.com/flutter/flutter/issues/58288 - return null; + ImageReader imageReader; + if (android.os.Build.VERSION.SDK_INT >= 29) { + imageReader = + ImageReader.newInstance( + flutterView.getWidth(), + flutterView.getHeight(), + PixelFormat.RGBA_8888, + 2, + HardwareBuffer.USAGE_GPU_SAMPLED_IMAGE | HardwareBuffer.USAGE_GPU_COLOR_OUTPUT); + } else { + imageReader = + ImageReader.newInstance( + flutterView.getWidth(), flutterView.getHeight(), PixelFormat.RGBA_8888, 2); + } + + FlutterImageView imageView = new FlutterImageView(flutterView.getContext(), imageReader); + long id = nextOverlayLayerId++; + overlayLayerViews.put(id, imageView); + + return new FlutterOverlaySurface(id, imageReader.getSurface()); } }