@@ -250,7 +250,7 @@ TEST(AndroidExternalViewEmbedder, PlatformViewRect__ChangedParams) {
250
250
ASSERT_EQ (SkRect::MakeXYWH (75 , 90 , 105 , 120 ), embedder->GetViewRect (view_id));
251
251
}
252
252
253
- TEST (AndroidExternalViewEmbedder, SubmitFrame__RecycleSurfaces ) {
253
+ TEST (AndroidExternalViewEmbedder, SubmitFrame ) {
254
254
auto jni_mock = std::make_shared<JNIMock>();
255
255
auto android_context =
256
256
std::make_shared<AndroidContext>(AndroidRenderingAPI::kSoftware );
@@ -294,6 +294,27 @@ TEST(AndroidExternalViewEmbedder, SubmitFrame__RecycleSurfaces) {
294
294
auto raster_thread_merger = GetThreadMergerFromPlatformThread ();
295
295
296
296
// ------------------ First frame ------------------ //
297
+ {
298
+ auto did_submit_frame = false ;
299
+ auto surface_frame = std::make_unique<SurfaceFrame>(
300
+ SkSurface::MakeNull (1000 , 1000 ), false ,
301
+ [&did_submit_frame](const SurfaceFrame& surface_frame,
302
+ SkCanvas* canvas) mutable {
303
+ if (canvas != nullptr ) {
304
+ did_submit_frame = true ;
305
+ }
306
+ return true ;
307
+ });
308
+
309
+ embedder->SubmitFrame (gr_context.get (), std::move (surface_frame));
310
+ // Submits frame if no Android view in the current frame.
311
+ EXPECT_TRUE (did_submit_frame);
312
+
313
+ EXPECT_CALL (*jni_mock, FlutterViewEndFrame ());
314
+ embedder->EndFrame (/* should_resubmit_frame=*/ false , raster_thread_merger);
315
+ }
316
+
317
+ // ------------------ Second frame ------------------ //
297
318
{
298
319
EXPECT_CALL (*jni_mock, FlutterViewBeginFrame ());
299
320
embedder->BeginFrame (frame_size, nullptr , 1.5 , raster_thread_merger);
@@ -338,18 +359,26 @@ TEST(AndroidExternalViewEmbedder, SubmitFrame__RecycleSurfaces) {
338
359
EXPECT_CALL (*jni_mock,
339
360
FlutterViewDisplayOverlaySurface (0 , 50 , 50 , 200 , 200 ));
340
361
341
- auto surface_frame =
342
- std::make_unique<SurfaceFrame>(SkSurface::MakeNull (1000 , 1000 ), false ,
343
- [](const SurfaceFrame& surface_frame,
344
- SkCanvas* canvas) { return true ; });
362
+ auto did_submit_frame = false ;
363
+ auto surface_frame = std::make_unique<SurfaceFrame>(
364
+ SkSurface::MakeNull (1000 , 1000 ), false ,
365
+ [&did_submit_frame](const SurfaceFrame& surface_frame,
366
+ SkCanvas* canvas) mutable {
367
+ if (canvas != nullptr ) {
368
+ did_submit_frame = true ;
369
+ }
370
+ return true ;
371
+ });
345
372
346
373
embedder->SubmitFrame (gr_context.get (), std::move (surface_frame));
374
+ // Doesn't submit frame if there aren't Android views in the previous frame.
375
+ EXPECT_FALSE (did_submit_frame);
347
376
348
377
EXPECT_CALL (*jni_mock, FlutterViewEndFrame ());
349
378
embedder->EndFrame (/* should_resubmit_frame=*/ false , raster_thread_merger);
350
379
}
351
380
352
- // ------------------ Second frame ------------------ //
381
+ // ------------------ Third frame ------------------ //
353
382
{
354
383
EXPECT_CALL (*jni_mock, FlutterViewBeginFrame ());
355
384
embedder->BeginFrame (frame_size, nullptr , 1.5 , raster_thread_merger);
@@ -392,11 +421,19 @@ TEST(AndroidExternalViewEmbedder, SubmitFrame__RecycleSurfaces) {
392
421
EXPECT_CALL (*jni_mock,
393
422
FlutterViewDisplayOverlaySurface (0 , 50 , 50 , 200 , 200 ));
394
423
395
- auto surface_frame =
396
- std::make_unique<SurfaceFrame>(SkSurface::MakeNull (1000 , 1000 ), false ,
397
- [](const SurfaceFrame& surface_frame,
398
- SkCanvas* canvas) { return true ; });
424
+ auto did_submit_frame = false ;
425
+ auto surface_frame = std::make_unique<SurfaceFrame>(
426
+ SkSurface::MakeNull (1000 , 1000 ), false ,
427
+ [&did_submit_frame](const SurfaceFrame& surface_frame,
428
+ SkCanvas* canvas) mutable {
429
+ if (canvas != nullptr ) {
430
+ did_submit_frame = true ;
431
+ }
432
+ return true ;
433
+ });
399
434
embedder->SubmitFrame (gr_context.get (), std::move (surface_frame));
435
+ // Submits frame if there are Android views in the previous frame.
436
+ EXPECT_TRUE (did_submit_frame);
400
437
401
438
EXPECT_CALL (*jni_mock, FlutterViewEndFrame ());
402
439
embedder->EndFrame (/* should_resubmit_frame=*/ false , raster_thread_merger);
@@ -423,15 +460,83 @@ TEST(AndroidExternalViewEmbedder, DoesNotCallJNIPlatformThreadOnlyMethods) {
423
460
424
461
TEST (AndroidExternalViewEmbedder, DestroyOverlayLayersOnSizeChange) {
425
462
auto jni_mock = std::make_shared<JNIMock>();
426
- auto embedder =
427
- std::make_unique<AndroidExternalViewEmbedder>( nullptr , jni_mock, nullptr );
463
+ auto android_context =
464
+ std::make_shared<AndroidContext>(AndroidRenderingAPI:: kSoftware );
428
465
466
+ auto window = fml::MakeRefCounted<AndroidNativeWindow>(nullptr );
467
+ auto gr_context = GrContext::MakeMock (nullptr );
468
+ auto frame_size = SkISize::Make (1000 , 1000 );
469
+ auto surface_factory =
470
+ [gr_context, window, frame_size](
471
+ std::shared_ptr<AndroidContext> android_context,
472
+ std::shared_ptr<PlatformViewAndroidJNI> jni_facade) {
473
+ auto surface_frame_1 = std::make_unique<SurfaceFrame>(
474
+ SkSurface::MakeNull (1000 , 1000 ), false ,
475
+ [](const SurfaceFrame& surface_frame, SkCanvas* canvas) {
476
+ return true ;
477
+ });
478
+
479
+ auto surface_mock = std::make_unique<SurfaceMock>();
480
+ EXPECT_CALL (*surface_mock, AcquireFrame (frame_size))
481
+ .WillOnce (Return (ByMove (std::move (surface_frame_1))));
482
+
483
+ auto android_surface_mock = std::make_unique<AndroidSurfaceMock>();
484
+ EXPECT_CALL (*android_surface_mock, IsValid ()).WillOnce (Return (true ));
485
+
486
+ EXPECT_CALL (*android_surface_mock, CreateGPUSurface (gr_context.get ()))
487
+ .WillOnce (Return (ByMove (std::move (surface_mock))));
488
+
489
+ EXPECT_CALL (*android_surface_mock, SetNativeWindow (window));
490
+
491
+ return android_surface_mock;
492
+ };
493
+
494
+ auto embedder = std::make_unique<AndroidExternalViewEmbedder>(
495
+ android_context, jni_mock, surface_factory);
429
496
auto raster_thread_merger = GetThreadMergerFromPlatformThread ();
430
- ASSERT_FALSE (raster_thread_merger->IsMerged ());
431
497
432
- embedder->BeginFrame (SkISize::Make (10 , 20 ), nullptr , 1.0 ,
433
- raster_thread_merger);
498
+ // ------------------ First frame ------------------ //
499
+ {
500
+ EXPECT_CALL (*jni_mock, FlutterViewBeginFrame ());
501
+ embedder->BeginFrame (frame_size, nullptr , 1.5 , raster_thread_merger);
502
+
503
+ // Add an Android view.
504
+ MutatorsStack stack1;
505
+ // TODO(egarciad): Investigate why Flow applies the device pixel ratio to
506
+ // the offsetPixels, but not the sizePoints.
507
+ auto view_params_1 = std::make_unique<EmbeddedViewParams>(
508
+ SkMatrix (), SkSize::Make (200 , 200 ), stack1);
509
+
510
+ embedder->PrerollCompositeEmbeddedView (0 , std::move (view_params_1));
511
+
512
+ // This simulates Flutter UI that intersects with the Android view.
513
+ embedder->CompositeEmbeddedView (0 )->drawRect (
514
+ SkRect::MakeXYWH (50 , 50 , 200 , 200 ), SkPaint ());
515
+
516
+ // Create a new overlay surface.
517
+ EXPECT_CALL (*jni_mock, FlutterViewCreateOverlaySurface ())
518
+ .WillOnce (Return (
519
+ ByMove (std::make_unique<PlatformViewAndroidJNI::OverlayMetadata>(
520
+ 0 , window))));
521
+ // The JNI call to display the Android view.
522
+ EXPECT_CALL (*jni_mock, FlutterViewOnDisplayPlatformView (0 , 0 , 0 , 200 , 200 ,
523
+ 300 , 300 , stack1));
524
+ EXPECT_CALL (*jni_mock,
525
+ FlutterViewDisplayOverlaySurface (0 , 50 , 50 , 200 , 200 ));
526
+
527
+ auto surface_frame =
528
+ std::make_unique<SurfaceFrame>(SkSurface::MakeNull (1000 , 1000 ), false ,
529
+ [](const SurfaceFrame& surface_frame,
530
+ SkCanvas* canvas) { return true ; });
531
+ embedder->SubmitFrame (gr_context.get (), std::move (surface_frame));
532
+
533
+ EXPECT_CALL (*jni_mock, FlutterViewEndFrame ());
534
+ embedder->EndFrame (/* should_resubmit_frame=*/ false , raster_thread_merger);
535
+ }
536
+
434
537
EXPECT_CALL (*jni_mock, FlutterViewDestroyOverlaySurfaces ());
538
+ EXPECT_CALL (*jni_mock, FlutterViewBeginFrame ());
539
+ // Change the frame size.
435
540
embedder->BeginFrame (SkISize::Make (30 , 40 ), nullptr , 1.0 ,
436
541
raster_thread_merger);
437
542
}
0 commit comments