diff --git a/shell/platform/android/io/flutter/embedding/engine/FlutterEngine.java b/shell/platform/android/io/flutter/embedding/engine/FlutterEngine.java index 1d142a0bf9b2c..21c95edc6c50e 100644 --- a/shell/platform/android/io/flutter/embedding/engine/FlutterEngine.java +++ b/shell/platform/android/io/flutter/embedding/engine/FlutterEngine.java @@ -112,6 +112,8 @@ public void onPreEngineRestart() { for (EngineLifecycleListener lifecycleListener : engineLifecycleListeners) { lifecycleListener.onPreEngineRestart(); } + + platformViewsController.onPreEngineRestart(); } }; @@ -190,6 +192,27 @@ public FlutterEngine( @NonNull FlutterJNI flutterJNI, @Nullable String[] dartVmArgs, boolean automaticallyRegisterPlugins + ) { + this( + context, + flutterLoader, + flutterJNI, + new PlatformViewsController(), + dartVmArgs, + automaticallyRegisterPlugins + ); + } + + /** + * Fully configurable {@code FlutterEngine} constructor. + */ + public FlutterEngine( + @NonNull Context context, + @NonNull FlutterLoader flutterLoader, + @NonNull FlutterJNI flutterJNI, + @NonNull PlatformViewsController platformViewsController, + @Nullable String[] dartVmArgs, + boolean automaticallyRegisterPlugins ) { this.flutterJNI = flutterJNI; flutterLoader.startInitialization(context); @@ -214,7 +237,7 @@ public FlutterEngine( systemChannel = new SystemChannel(dartExecutor); textInputChannel = new TextInputChannel(dartExecutor); - platformViewsController = new PlatformViewsController(); + this.platformViewsController = platformViewsController; this.pluginRegistry = new FlutterEnginePluginRegistry( context.getApplicationContext(), diff --git a/shell/platform/android/test/io/flutter/embedding/engine/FlutterEngineTest.java b/shell/platform/android/test/io/flutter/embedding/engine/FlutterEngineTest.java index 133beb6dd75fc..353fe648cea41 100644 --- a/shell/platform/android/test/io/flutter/embedding/engine/FlutterEngineTest.java +++ b/shell/platform/android/test/io/flutter/embedding/engine/FlutterEngineTest.java @@ -1,11 +1,13 @@ package test.io.flutter.embedding.engine; +import io.flutter.plugin.platform.PlatformViewsController; import io.flutter.plugins.GeneratedPluginRegistrant; import java.util.List; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; @@ -17,8 +19,11 @@ import io.flutter.embedding.engine.loader.FlutterLoader; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @Config(manifest=Config.NONE) @@ -64,4 +69,37 @@ public void itCanBeConfiguredToNotAutomaticallyRegisterPlugins() { assertTrue(GeneratedPluginRegistrant.getRegisteredEngines().isEmpty()); } + + @Test + public void itNotifiesPlatformViewsControllerWhenDevHotRestart() { + // Setup test. + FlutterJNI mockFlutterJNI = mock(FlutterJNI.class); + when(mockFlutterJNI.isAttached()).thenReturn(true); + + PlatformViewsController platformViewsController = mock(PlatformViewsController.class); + + ArgumentCaptor engineLifecycleListenerArgumentCaptor = ArgumentCaptor.forClass(FlutterEngine.EngineLifecycleListener.class); + + // Execute behavior under test. + new FlutterEngine( + RuntimeEnvironment.application, + mock(FlutterLoader.class), + mockFlutterJNI, + platformViewsController, + /*dartVmArgs=*/new String[] {}, + /*automaticallyRegisterPlugins=*/false + ); + + // Obtain the EngineLifecycleListener within FlutterEngine that was given to FlutterJNI. + verify(mockFlutterJNI).addEngineLifecycleListener(engineLifecycleListenerArgumentCaptor.capture()); + FlutterEngine.EngineLifecycleListener engineLifecycleListener = engineLifecycleListenerArgumentCaptor.getValue(); + assertNotNull(engineLifecycleListener); + + // Simulate a pre-engine restart, AKA hot restart. + engineLifecycleListener.onPreEngineRestart(); + + // Verify that FlutterEngine notified PlatformViewsController of the pre-engine restart, + // AKA hot restart. + verify(platformViewsController, times(1)).onPreEngineRestart(); + } }