Skip to content

Commit 2b6c71c

Browse files
Reland "Implement PlatformViewsController.createOverlaySurface" (flutter#19245)
1 parent 10dfcc0 commit 2b6c71c

File tree

1 file changed

+33
-2
lines changed

1 file changed

+33
-2
lines changed

shell/platform/android/io/flutter/plugin/platform/PlatformViewsController.java

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,19 @@
99

1010
import android.annotation.TargetApi;
1111
import android.content.Context;
12+
import android.graphics.PixelFormat;
13+
import android.hardware.HardwareBuffer;
14+
import android.media.ImageReader;
1215
import android.os.Build;
1316
import android.util.DisplayMetrics;
1417
import android.util.Log;
18+
import android.util.LongSparseArray;
1519
import android.view.MotionEvent;
1620
import android.view.View;
1721
import androidx.annotation.NonNull;
1822
import androidx.annotation.UiThread;
1923
import androidx.annotation.VisibleForTesting;
24+
import io.flutter.embedding.android.FlutterImageView;
2025
import io.flutter.embedding.engine.FlutterOverlaySurface;
2126
import io.flutter.embedding.engine.dart.DartExecutor;
2227
import io.flutter.embedding.engine.systemchannels.PlatformViewsChannel;
@@ -71,6 +76,12 @@ public class PlatformViewsController implements PlatformViewsAccessibilityDelega
7176
// it is associated with(e.g if a platform view creates other views in the same virtual display.
7277
private final HashMap<Context, View> contextToPlatformView;
7378

79+
// Map of unique IDs to views that render overlay layers.
80+
private final LongSparseArray<FlutterImageView> overlayLayerViews;
81+
82+
// Next available unique ID for use in overlayLayerViews;
83+
private long nextOverlayLayerId = 0;
84+
7485
private final PlatformViewsChannel.PlatformViewsHandler channelHandler =
7586
new PlatformViewsChannel.PlatformViewsHandler() {
7687
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
@@ -283,6 +294,7 @@ public PlatformViewsController() {
283294
vdControllers = new HashMap<>();
284295
accessibilityEventsDelegate = new AccessibilityEventsDelegate();
285296
contextToPlatformView = new HashMap<>();
297+
overlayLayerViews = new LongSparseArray<>();
286298
}
287299

288300
/**
@@ -551,8 +563,27 @@ public void onEndFrame() {
551563
// TODO: Implement this method. https://github.com/flutter/flutter/issues/58288
552564
}
553565

566+
@TargetApi(19)
554567
public FlutterOverlaySurface createOverlaySurface() {
555-
// TODO: Implement this method. https://github.com/flutter/flutter/issues/58288
556-
return null;
568+
ImageReader imageReader;
569+
if (android.os.Build.VERSION.SDK_INT >= 29) {
570+
imageReader =
571+
ImageReader.newInstance(
572+
flutterView.getWidth(),
573+
flutterView.getHeight(),
574+
PixelFormat.RGBA_8888,
575+
2,
576+
HardwareBuffer.USAGE_GPU_SAMPLED_IMAGE | HardwareBuffer.USAGE_GPU_COLOR_OUTPUT);
577+
} else {
578+
imageReader =
579+
ImageReader.newInstance(
580+
flutterView.getWidth(), flutterView.getHeight(), PixelFormat.RGBA_8888, 2);
581+
}
582+
583+
FlutterImageView imageView = new FlutterImageView(flutterView.getContext(), imageReader);
584+
long id = nextOverlayLayerId++;
585+
overlayLayerViews.put(id, imageView);
586+
587+
return new FlutterOverlaySurface(id, imageReader.getSurface());
557588
}
558589
}

0 commit comments

Comments
 (0)