138 auto jni_mock = std::make_shared<JNIMock>();
140 auto embedder = std::make_unique<AndroidExternalViewEmbedder>(
144 auto raster_thread_merger =
146 ASSERT_FALSE(raster_thread_merger->IsMerged());
148 EXPECT_CALL(*jni_mock, FlutterViewBeginFrame());
149 embedder->BeginFrame(
nullptr, raster_thread_merger);
153 embedder->PrerollCompositeEmbeddedView(
154 0, std::make_unique<EmbeddedViewParams>());
156 auto postpreroll_result = embedder->PostPrerollAction(raster_thread_merger);
159 EXPECT_CALL(*jni_mock, FlutterViewEndFrame());
160 embedder->EndFrame(
true, raster_thread_merger);
162 ASSERT_TRUE(raster_thread_merger->IsMerged());
164 int pending_frames = 0;
165 while (raster_thread_merger->IsMerged()) {
166 raster_thread_merger->DecrementLease();
169 ASSERT_EQ(10, pending_frames);
261 auto jni_mock = std::make_shared<JNIMock>();
262 auto android_context =
265 auto window = fml::MakeRefCounted<AndroidNativeWindow>(
nullptr);
269 auto surface_factory = std::make_shared<TestAndroidSurfaceFactory>(
270 [gr_context,
window, frame_size, framebuffer_info]() {
271 auto surface_frame_1 = std::make_unique<SurfaceFrame>(
277 auto surface_frame_2 = std::make_unique<SurfaceFrame>(
284 auto surface_mock = std::make_unique<SurfaceMock>();
285 EXPECT_CALL(*surface_mock, AcquireFrame(frame_size))
287 .WillOnce(Return(ByMove(std::move(surface_frame_1))))
288 .WillOnce(Return(ByMove(std::move(surface_frame_2))));
290 auto android_surface_mock = std::make_unique<AndroidSurfaceMock>();
291 EXPECT_CALL(*android_surface_mock, IsValid()).WillOnce(Return(
true));
293 EXPECT_CALL(*android_surface_mock, CreateGPUSurface(gr_context.get()))
294 .WillOnce(Return(ByMove(std::move(surface_mock))));
296 EXPECT_CALL(*android_surface_mock, SetNativeWindow(
window));
298 return android_surface_mock;
300 auto embedder = std::make_unique<AndroidExternalViewEmbedder>(
307 auto did_submit_frame =
false;
308 auto surface_frame = std::make_unique<SurfaceFrame>(
312 if (canvas !=
nullptr) {
313 did_submit_frame =
true;
319 embedder->SubmitFlutterView(
kImplicitViewId, gr_context.get(),
nullptr,
320 std::move(surface_frame));
324 auto postpreroll_result = embedder->PostPrerollAction(raster_thread_merger);
327 EXPECT_CALL(*jni_mock, FlutterViewEndFrame());
328 embedder->EndFrame(
false, raster_thread_merger);
333 EXPECT_CALL(*jni_mock, FlutterViewBeginFrame());
334 embedder->BeginFrame(
nullptr, raster_thread_merger);
335 embedder->PrepareFlutterView(frame_size, 1.5);
348 auto view_params_1 = std::make_unique<EmbeddedViewParams>(
351 embedder->PrerollCompositeEmbeddedView(0, std::move(view_params_1));
353 auto canvas_1 = embedder->CompositeEmbeddedView(0);
366 EXPECT_CALL(*jni_mock, FlutterViewCreateOverlaySurface())
368 ByMove(std::make_unique<PlatformViewAndroidJNI::OverlayMetadata>(
371 EXPECT_CALL(*jni_mock, FlutterViewOnDisplayPlatformView(
372 0, 150, 150, 300, 300, 300, 300, stack1));
374 EXPECT_CALL(*jni_mock,
375 FlutterViewDisplayOverlaySurface(0, 150, 150, 100, 100));
377 auto did_submit_frame =
false;
378 auto surface_frame = std::make_unique<SurfaceFrame>(
382 if (canvas !=
nullptr) {
383 did_submit_frame =
true;
389 embedder->SubmitFlutterView(
kImplicitViewId, gr_context.get(),
nullptr,
390 std::move(surface_frame));
392 EXPECT_FALSE(did_submit_frame);
394 auto postpreroll_result = embedder->PostPrerollAction(raster_thread_merger);
397 EXPECT_CALL(*jni_mock, FlutterViewEndFrame());
398 embedder->EndFrame(
false, raster_thread_merger);
403 EXPECT_CALL(*jni_mock, FlutterViewBeginFrame());
404 embedder->BeginFrame(
nullptr, raster_thread_merger);
405 embedder->PrepareFlutterView(frame_size, 1.5);
418 auto view_params_1 = std::make_unique<EmbeddedViewParams>(
421 embedder->PrerollCompositeEmbeddedView(0, std::move(view_params_1));
423 auto canvas_1 = embedder->CompositeEmbeddedView(0);
437 EXPECT_CALL(*jni_mock, FlutterViewCreateOverlaySurface()).Times(0);
439 EXPECT_CALL(*jni_mock, FlutterViewOnDisplayPlatformView(
440 0, 150, 150, 300, 300, 300, 300, stack1));
442 EXPECT_CALL(*jni_mock,
443 FlutterViewDisplayOverlaySurface(0, 150, 150, 100, 100));
445 auto did_submit_frame =
false;
446 auto surface_frame = std::make_unique<SurfaceFrame>(
450 if (canvas !=
nullptr) {
451 did_submit_frame =
true;
456 embedder->SubmitFlutterView(
kImplicitViewId, gr_context.get(),
nullptr,
457 std::move(surface_frame));
461 auto postpreroll_result = embedder->PostPrerollAction(raster_thread_merger);
464 EXPECT_CALL(*jni_mock, FlutterViewEndFrame());
465 embedder->EndFrame(
false, raster_thread_merger);
473 auto jni_mock = std::make_shared<JNIMock>();
474 auto android_context =
477 auto window = fml::MakeRefCounted<AndroidNativeWindow>(
nullptr);
481 auto surface_factory = std::make_shared<TestAndroidSurfaceFactory>(
482 [gr_context,
window, frame_size, framebuffer_info]() {
483 auto surface_frame_1 = std::make_unique<SurfaceFrame>(
490 auto surface_mock = std::make_unique<SurfaceMock>();
491 EXPECT_CALL(*surface_mock, AcquireFrame(frame_size))
493 .WillOnce(Return(ByMove(std::move(surface_frame_1))));
495 auto android_surface_mock = std::make_unique<AndroidSurfaceMock>();
496 EXPECT_CALL(*android_surface_mock, IsValid()).WillOnce(Return(
true));
498 EXPECT_CALL(*android_surface_mock, CreateGPUSurface(gr_context.get()))
499 .WillOnce(Return(ByMove(std::move(surface_mock))));
501 EXPECT_CALL(*android_surface_mock, SetNativeWindow(
window));
502 return android_surface_mock;
504 auto embedder = std::make_unique<AndroidExternalViewEmbedder>(
509 EXPECT_CALL(*jni_mock, FlutterViewBeginFrame());
510 embedder->BeginFrame(
nullptr, raster_thread_merger);
511 embedder->PrepareFlutterView(frame_size, 1.5);
517 embedder->PrerollCompositeEmbeddedView(
518 0, std::make_unique<EmbeddedViewParams>(matrix,
SkSize::Make(100, 100),
521 EXPECT_CALL(*jni_mock, FlutterViewOnDisplayPlatformView(
522 0, 100, 100, 100, 100, 150, 150, stack));
529 embedder->PrerollCompositeEmbeddedView(
530 1, std::make_unique<EmbeddedViewParams>(matrix,
SkSize::Make(100, 100),
533 EXPECT_CALL(*jni_mock, FlutterViewOnDisplayPlatformView(
534 1, 300, 100, 100, 100, 150, 150, stack));
544 embedder->CompositeEmbeddedView(1)->DrawRect(
547 EXPECT_CALL(*jni_mock, FlutterViewCreateOverlaySurface())
548 .WillRepeatedly([&]() {
549 return std::make_unique<PlatformViewAndroidJNI::OverlayMetadata>(
554 EXPECT_CALL(*jni_mock,
555 FlutterViewDisplayOverlaySurface(1, 150, 100, 200, 100))
558 auto surface_frame = std::make_unique<SurfaceFrame>(
565 embedder->SubmitFlutterView(
kImplicitViewId, gr_context.get(),
nullptr,
566 std::move(surface_frame));
568 EXPECT_CALL(*jni_mock, FlutterViewEndFrame());
569 embedder->EndFrame(
false, raster_thread_merger);
573 auto jni_mock = std::make_shared<JNIMock>();
574 auto android_context =
577 auto window = fml::MakeRefCounted<AndroidNativeWindow>(
nullptr);
581 auto surface_factory = std::make_shared<TestAndroidSurfaceFactory>(
582 [gr_context,
window, frame_size, framebuffer_info]() {
583 auto surface_frame_1 = std::make_unique<SurfaceFrame>(
590 auto surface_mock = std::make_unique<SurfaceMock>();
591 EXPECT_CALL(*surface_mock, AcquireFrame(frame_size))
593 .WillOnce(Return(ByMove(std::move(surface_frame_1))));
595 auto android_surface_mock = std::make_unique<AndroidSurfaceMock>();
596 EXPECT_CALL(*android_surface_mock, IsValid()).WillOnce(Return(
true));
598 EXPECT_CALL(*android_surface_mock, CreateGPUSurface(gr_context.get()))
599 .WillOnce(Return(ByMove(std::move(surface_mock))));
601 EXPECT_CALL(*android_surface_mock, SetNativeWindow(
window));
602 return android_surface_mock;
604 auto embedder = std::make_unique<AndroidExternalViewEmbedder>(
609 EXPECT_CALL(*jni_mock, FlutterViewBeginFrame());
610 embedder->BeginFrame(
nullptr, raster_thread_merger);
611 embedder->PrepareFlutterView(frame_size, 1.5);
619 embedder->PrerollCompositeEmbeddedView(
620 0, std::make_unique<EmbeddedViewParams>(matrix,
SkSize::Make(200, 200),
622 EXPECT_CALL(*jni_mock, FlutterViewOnDisplayPlatformView(0, 0, 0, 200, 200,
631 embedder->CompositeEmbeddedView(0)->DrawRect(
640 embedder->PrerollCompositeEmbeddedView(
641 1, std::make_unique<EmbeddedViewParams>(matrix,
SkSize::Make(100, 100),
643 EXPECT_CALL(*jni_mock, FlutterViewOnDisplayPlatformView(1, 0, 0, 100, 100,
648 embedder->CompositeEmbeddedView(1)->DrawRect(
SkRect::MakeXYWH(25, 25, 80, 50),
651 embedder->CompositeEmbeddedView(1)->DrawRect(
654 EXPECT_CALL(*jni_mock, FlutterViewCreateOverlaySurface())
655 .WillRepeatedly([&]() {
656 return std::make_unique<PlatformViewAndroidJNI::OverlayMetadata>(
660 EXPECT_CALL(*jni_mock, FlutterViewDisplayOverlaySurface(1, 25, 25, 80, 150))
663 auto surface_frame = std::make_unique<SurfaceFrame>(
670 embedder->SubmitFlutterView(
kImplicitViewId, gr_context.get(),
nullptr,
671 std::move(surface_frame));
673 EXPECT_CALL(*jni_mock, FlutterViewEndFrame());
674 embedder->EndFrame(
false, raster_thread_merger);
678 auto jni_mock = std::make_shared<JNIMock>();
679 auto android_context =
682 auto window = fml::MakeRefCounted<AndroidNativeWindow>(
nullptr);
686 auto surface_factory = std::make_shared<TestAndroidSurfaceFactory>(
687 [gr_context,
window, frame_size, framebuffer_info]() {
688 auto surface_frame_1 = std::make_unique<SurfaceFrame>(
695 auto surface_mock = std::make_unique<SurfaceMock>();
696 EXPECT_CALL(*surface_mock, AcquireFrame(frame_size))
698 .WillOnce(Return(ByMove(std::move(surface_frame_1))));
700 auto android_surface_mock = std::make_unique<AndroidSurfaceMock>();
701 EXPECT_CALL(*android_surface_mock, IsValid()).WillOnce(Return(
true));
703 EXPECT_CALL(*android_surface_mock, CreateGPUSurface(gr_context.get()))
704 .WillOnce(Return(ByMove(std::move(surface_mock))));
706 EXPECT_CALL(*android_surface_mock, SetNativeWindow(
window));
707 return android_surface_mock;
709 auto embedder = std::make_unique<AndroidExternalViewEmbedder>(
714 EXPECT_CALL(*jni_mock, FlutterViewBeginFrame());
715 embedder->BeginFrame(
nullptr, raster_thread_merger);
716 embedder->PrepareFlutterView(frame_size, 1.5);
724 embedder->PrerollCompositeEmbeddedView(
725 0, std::make_unique<EmbeddedViewParams>(matrix,
SkSize::Make(200, 200),
727 EXPECT_CALL(*jni_mock, FlutterViewOnDisplayPlatformView(0, 0, 0, 200, 200,
731 EXPECT_CALL(*jni_mock, FlutterViewCreateOverlaySurface()).Times(0);
733 auto surface_frame = std::make_unique<SurfaceFrame>(
740 embedder->SubmitFlutterView(
kImplicitViewId, gr_context.get(),
nullptr,
741 std::move(surface_frame));
743 EXPECT_CALL(*jni_mock, FlutterViewEndFrame());
744 embedder->EndFrame(
false, raster_thread_merger);
768 auto jni_mock = std::make_shared<JNIMock>();
770 auto android_context =
772 auto window = fml::MakeRefCounted<AndroidNativeWindow>(
nullptr);
776 auto surface_factory = std::make_shared<TestAndroidSurfaceFactory>(
777 [gr_context,
window, frame_size, framebuffer_info]() {
778 auto surface_frame_1 = std::make_unique<SurfaceFrame>(
785 auto surface_mock = std::make_unique<SurfaceMock>();
786 EXPECT_CALL(*surface_mock, AcquireFrame(frame_size))
787 .WillOnce(Return(ByMove(std::move(surface_frame_1))));
789 auto android_surface_mock = std::make_unique<AndroidSurfaceMock>();
790 EXPECT_CALL(*android_surface_mock, IsValid()).WillOnce(Return(
true));
792 EXPECT_CALL(*android_surface_mock, CreateGPUSurface(gr_context.get()))
793 .WillOnce(Return(ByMove(std::move(surface_mock))));
795 EXPECT_CALL(*android_surface_mock, SetNativeWindow(
window));
797 return android_surface_mock;
800 auto embedder = std::make_unique<AndroidExternalViewEmbedder>(
803 auto raster_thread_merger =
808 EXPECT_CALL(*jni_mock, FlutterViewBeginFrame());
809 embedder->BeginFrame(
nullptr, raster_thread_merger);
810 embedder->PrepareFlutterView(frame_size, 1.5);
816 auto view_params_1 = std::make_unique<EmbeddedViewParams>(
819 embedder->PrerollCompositeEmbeddedView(0, std::move(view_params_1));
822 embedder->CompositeEmbeddedView(0)->DrawRect(
826 EXPECT_CALL(*jni_mock, FlutterViewCreateOverlaySurface())
828 ByMove(std::make_unique<PlatformViewAndroidJNI::OverlayMetadata>(
831 EXPECT_CALL(*jni_mock, FlutterViewOnDisplayPlatformView(0, 0, 0, 200, 200,
833 EXPECT_CALL(*jni_mock,
834 FlutterViewDisplayOverlaySurface(0, 50, 50, 150, 150));
837 auto surface_frame = std::make_unique<SurfaceFrame>(
843 embedder->SubmitFlutterView(
kImplicitViewId, gr_context.get(),
nullptr,
844 std::move(surface_frame));
846 EXPECT_CALL(*jni_mock, FlutterViewEndFrame());
847 embedder->EndFrame(
false, raster_thread_merger);
850 EXPECT_CALL(*jni_mock, FlutterViewDestroyOverlaySurfaces());
851 EXPECT_CALL(*jni_mock, FlutterViewBeginFrame());
853 embedder->BeginFrame(
nullptr, raster_thread_merger);
858 auto jni_mock = std::make_shared<JNIMock>();
859 auto android_context =
862 auto window = fml::MakeRefCounted<AndroidNativeWindow>(
nullptr);
866 auto surface_factory = std::make_shared<TestAndroidSurfaceFactory>(
867 [gr_context,
window, frame_size, framebuffer_info]() {
868 auto surface_frame_1 = std::make_unique<SurfaceFrame>(
875 auto surface_mock = std::make_unique<SurfaceMock>();
876 EXPECT_CALL(*surface_mock, AcquireFrame(frame_size))
877 .WillOnce(Return(ByMove(std::move(surface_frame_1))));
879 auto android_surface_mock = std::make_unique<AndroidSurfaceMock>();
880 EXPECT_CALL(*android_surface_mock, IsValid()).WillOnce(Return(
true));
882 EXPECT_CALL(*android_surface_mock, CreateGPUSurface(gr_context.get()))
883 .WillOnce(Return(ByMove(std::move(surface_mock))));
885 EXPECT_CALL(*android_surface_mock, SetNativeWindow(
window));
887 return android_surface_mock;
890 auto embedder = std::make_unique<AndroidExternalViewEmbedder>(
896 auto raster_thread_merger =
898 EXPECT_CALL(*jni_mock, FlutterViewBeginFrame());
899 embedder->BeginFrame(
nullptr, raster_thread_merger);
900 embedder->PrepareFlutterView(frame_size, 1.5);
906 auto view_params_1 = std::make_unique<EmbeddedViewParams>(
909 embedder->PrerollCompositeEmbeddedView(0, std::move(view_params_1));
912 embedder->CompositeEmbeddedView(0)->DrawRect(
916 EXPECT_CALL(*jni_mock, FlutterViewCreateOverlaySurface())
918 ByMove(std::make_unique<PlatformViewAndroidJNI::OverlayMetadata>(
921 EXPECT_CALL(*jni_mock, FlutterViewOnDisplayPlatformView(0, 0, 0, 200, 200,
923 EXPECT_CALL(*jni_mock,
924 FlutterViewDisplayOverlaySurface(0, 50, 50, 150, 150));
926 auto surface_frame = std::make_unique<SurfaceFrame>(
932 embedder->SubmitFlutterView(
kImplicitViewId, gr_context.get(),
nullptr,
933 std::move(surface_frame));
935 EXPECT_CALL(*jni_mock, FlutterViewEndFrame());
936 embedder->EndFrame(
false, raster_thread_merger);
939 EXPECT_CALL(*jni_mock, FlutterViewDestroyOverlaySurfaces()).Times(1);
940 EXPECT_CALL(*jni_mock, FlutterViewBeginFrame()).Times(0);
943 embedder->BeginFrame(
nullptr,
987 auto jni_mock = std::make_shared<JNIMock>();
988 auto android_context =
990 auto window = fml::MakeRefCounted<AndroidNativeWindow>(
nullptr);
993 auto surface_factory = std::make_shared<TestAndroidSurfaceFactory>(
994 [gr_context,
window, frame_size]() {
996 auto surface_frame_1 = std::make_unique<SurfaceFrame>(
1003 auto surface_mock = std::make_unique<SurfaceMock>();
1004 EXPECT_CALL(*surface_mock, AcquireFrame(frame_size))
1005 .WillOnce(Return(ByMove(std::move(surface_frame_1))));
1007 auto android_surface_mock = std::make_unique<AndroidSurfaceMock>();
1008 EXPECT_CALL(*android_surface_mock, IsValid()).WillOnce(Return(
true));
1009 EXPECT_CALL(*android_surface_mock, CreateGPUSurface(gr_context.get()))
1010 .WillOnce(Return(ByMove(std::move(surface_mock))));
1012 return android_surface_mock;
1015 auto embedder = std::make_unique<AndroidExternalViewEmbedder>(
1018 auto raster_thread_merger =
1021 embedder->BeginFrame(
nullptr, raster_thread_merger);
1022 embedder->PrepareFlutterView(frame_size, 1.5);
1026 auto view_params = std::make_unique<EmbeddedViewParams>(
1029 embedder->PrerollCompositeEmbeddedView(0, std::move(view_params));
1032 embedder->CompositeEmbeddedView(0)->DrawRect(
1036 EXPECT_CALL(*jni_mock, FlutterViewCreateOverlaySurface())
1038 ByMove(std::make_unique<PlatformViewAndroidJNI::OverlayMetadata>(
1042 auto surface_frame = std::make_unique<SurfaceFrame>(
1046 embedder->SubmitFlutterView(
kImplicitViewId, gr_context.get(),
nullptr,
1047 std::move(surface_frame));
1049 embedder->EndFrame(
false, raster_thread_merger);
1051 EXPECT_CALL(*jni_mock, FlutterViewDestroyOverlaySurfaces());
1053 embedder->Teardown();
static sk_sp< GrDirectContext > MakeMock(const GrMockOptions *, const GrContextOptions &)