Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 2a03da4

Browse files
Notify PlatformViewsController within FlutterEngine when a hot restart occurs. (#48518)
1 parent fc1936f commit 2a03da4

File tree

2 files changed

+62
-1
lines changed

2 files changed

+62
-1
lines changed

shell/platform/android/io/flutter/embedding/engine/FlutterEngine.java

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,8 @@ public void onPreEngineRestart() {
112112
for (EngineLifecycleListener lifecycleListener : engineLifecycleListeners) {
113113
lifecycleListener.onPreEngineRestart();
114114
}
115+
116+
platformViewsController.onPreEngineRestart();
115117
}
116118
};
117119

@@ -190,6 +192,27 @@ public FlutterEngine(
190192
@NonNull FlutterJNI flutterJNI,
191193
@Nullable String[] dartVmArgs,
192194
boolean automaticallyRegisterPlugins
195+
) {
196+
this(
197+
context,
198+
flutterLoader,
199+
flutterJNI,
200+
new PlatformViewsController(),
201+
dartVmArgs,
202+
automaticallyRegisterPlugins
203+
);
204+
}
205+
206+
/**
207+
* Fully configurable {@code FlutterEngine} constructor.
208+
*/
209+
public FlutterEngine(
210+
@NonNull Context context,
211+
@NonNull FlutterLoader flutterLoader,
212+
@NonNull FlutterJNI flutterJNI,
213+
@NonNull PlatformViewsController platformViewsController,
214+
@Nullable String[] dartVmArgs,
215+
boolean automaticallyRegisterPlugins
193216
) {
194217
this.flutterJNI = flutterJNI;
195218
flutterLoader.startInitialization(context);
@@ -214,7 +237,7 @@ public FlutterEngine(
214237
systemChannel = new SystemChannel(dartExecutor);
215238
textInputChannel = new TextInputChannel(dartExecutor);
216239

217-
platformViewsController = new PlatformViewsController();
240+
this.platformViewsController = platformViewsController;
218241

219242
this.pluginRegistry = new FlutterEnginePluginRegistry(
220243
context.getApplicationContext(),

shell/platform/android/test/io/flutter/embedding/engine/FlutterEngineTest.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package test.io.flutter.embedding.engine;
22

3+
import io.flutter.plugin.platform.PlatformViewsController;
34
import io.flutter.plugins.GeneratedPluginRegistrant;
45
import java.util.List;
56
import org.junit.After;
67
import org.junit.Before;
78
import org.junit.Test;
89
import org.junit.runner.RunWith;
10+
import org.mockito.ArgumentCaptor;
911
import org.mockito.Mock;
1012
import org.mockito.MockitoAnnotations;
1113
import org.robolectric.RobolectricTestRunner;
@@ -17,8 +19,11 @@
1719
import io.flutter.embedding.engine.loader.FlutterLoader;
1820

1921
import static org.junit.Assert.assertEquals;
22+
import static org.junit.Assert.assertNotNull;
2023
import static org.junit.Assert.assertTrue;
2124
import static org.mockito.Mockito.mock;
25+
import static org.mockito.Mockito.times;
26+
import static org.mockito.Mockito.verify;
2227
import static org.mockito.Mockito.when;
2328

2429
@Config(manifest=Config.NONE)
@@ -64,4 +69,37 @@ public void itCanBeConfiguredToNotAutomaticallyRegisterPlugins() {
6469

6570
assertTrue(GeneratedPluginRegistrant.getRegisteredEngines().isEmpty());
6671
}
72+
73+
@Test
74+
public void itNotifiesPlatformViewsControllerWhenDevHotRestart() {
75+
// Setup test.
76+
FlutterJNI mockFlutterJNI = mock(FlutterJNI.class);
77+
when(mockFlutterJNI.isAttached()).thenReturn(true);
78+
79+
PlatformViewsController platformViewsController = mock(PlatformViewsController.class);
80+
81+
ArgumentCaptor<FlutterEngine.EngineLifecycleListener> engineLifecycleListenerArgumentCaptor = ArgumentCaptor.forClass(FlutterEngine.EngineLifecycleListener.class);
82+
83+
// Execute behavior under test.
84+
new FlutterEngine(
85+
RuntimeEnvironment.application,
86+
mock(FlutterLoader.class),
87+
mockFlutterJNI,
88+
platformViewsController,
89+
/*dartVmArgs=*/new String[] {},
90+
/*automaticallyRegisterPlugins=*/false
91+
);
92+
93+
// Obtain the EngineLifecycleListener within FlutterEngine that was given to FlutterJNI.
94+
verify(mockFlutterJNI).addEngineLifecycleListener(engineLifecycleListenerArgumentCaptor.capture());
95+
FlutterEngine.EngineLifecycleListener engineLifecycleListener = engineLifecycleListenerArgumentCaptor.getValue();
96+
assertNotNull(engineLifecycleListener);
97+
98+
// Simulate a pre-engine restart, AKA hot restart.
99+
engineLifecycleListener.onPreEngineRestart();
100+
101+
// Verify that FlutterEngine notified PlatformViewsController of the pre-engine restart,
102+
// AKA hot restart.
103+
verify(platformViewsController, times(1)).onPreEngineRestart();
104+
}
67105
}

0 commit comments

Comments
 (0)