11package dev .flutter .scenarios ;
22
33import android .Manifest ;
4+ import android .content .Context ;
45import android .content .Intent ;
56import android .net .Uri ;
67import android .os .Build ;
78import android .os .Bundle ;
89import android .os .Handler ;
10+ import android .os .Looper ;
911import android .support .annotation .NonNull ;
1012import io .flutter .Log ;
1113import io .flutter .embedding .android .FlutterActivity ;
1214import io .flutter .embedding .engine .FlutterEngine ;
1315import io .flutter .embedding .engine .FlutterShellArgs ;
16+ import io .flutter .embedding .engine .loader .FlutterLoader ;
1417import io .flutter .plugin .common .BasicMessageChannel ;
1518import io .flutter .plugin .common .BinaryCodec ;
1619import java .io .FileDescriptor ;
1720import java .io .FileOutputStream ;
1821import java .io .IOException ;
1922import java .nio .ByteBuffer ;
23+ import java .util .concurrent .atomic .AtomicBoolean ;
2024
2125public class TextPlatformViewActivity extends FlutterActivity {
2226 static final String TAG = "Scenarios" ;
@@ -31,7 +35,19 @@ protected void onCreate(Bundle savedInstanceState) {
3135 }
3236 // Run for one minute, get the timeline data, write it, and finish.
3337 final Uri logFileUri = launchIntent .getData ();
34- new Handler ().postDelayed (() -> writeTimelineData (logFileUri ), 20000 );
38+ new Handler ()
39+ .postDelayed (
40+ new Runnable () {
41+ @ Override
42+ public void run () {
43+ writeTimelineData (logFileUri );
44+
45+ testFlutterLoaderCallbackWhenInitializedTwice ();
46+ }
47+ },
48+ 20000 );
49+ } else {
50+ testFlutterLoaderCallbackWhenInitializedTwice ();
3551 }
3652 }
3753
@@ -80,4 +96,46 @@ private void writeTimelineData(Uri logFile) {
8096 finish ();
8197 });
8298 }
99+
100+ /**
101+ * This method verifies that {@link FlutterLoader#ensureInitializationCompleteAsync(Context,
102+ * String[], Handler, Runnable)} invokes its callback when called after initialization.
103+ */
104+ private void testFlutterLoaderCallbackWhenInitializedTwice () {
105+ FlutterLoader flutterLoader = new FlutterLoader ();
106+
107+ // Flutter is probably already loaded in this app based on
108+ // code that ran before this method. Nonetheless, invoke the
109+ // blocking initialization here to ensure it's initialized.
110+ flutterLoader .startInitialization (getApplicationContext ());
111+ flutterLoader .ensureInitializationComplete (getApplication (), new String [] {});
112+
113+ // Now that Flutter is loaded, invoke ensureInitializationCompleteAsync with
114+ // a callback and verify that the callback is invoked.
115+ Handler mainHandler = new Handler (Looper .getMainLooper ());
116+
117+ final AtomicBoolean didInvokeCallback = new AtomicBoolean (false );
118+
119+ flutterLoader .ensureInitializationCompleteAsync (
120+ getApplication (),
121+ new String [] {},
122+ mainHandler ,
123+ new Runnable () {
124+ @ Override
125+ public void run () {
126+ didInvokeCallback .set (true );
127+ }
128+ });
129+
130+ mainHandler .post (
131+ new Runnable () {
132+ @ Override
133+ public void run () {
134+ if (!didInvokeCallback .get ()) {
135+ throw new RuntimeException (
136+ "Failed test: FlutterLoader#ensureInitializationCompleteAsync() did not invoke its callback." );
137+ }
138+ }
139+ });
140+ }
83141}
0 commit comments