Skip to content

Commit 59b1650

Browse files
matthew-carrollNoamDev
authored andcommitted
Fix ensureInitializationCompleteAsync callback when already initialized. (flutter#39675) (flutter#16503)
1 parent e93b3bd commit 59b1650

File tree

2 files changed

+60
-1
lines changed

2 files changed

+60
-1
lines changed

shell/platform/android/io/flutter/embedding/engine/loader/FlutterLoader.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,7 @@ public void ensureInitializationCompleteAsync(
234234
"ensureInitializationComplete must be called after startInitialization");
235235
}
236236
if (initialized) {
237+
callbackHandler.post(callback);
237238
return;
238239
}
239240
new Thread(

testing/scenario_app/android/app/src/main/java/dev/flutter/scenarios/TextPlatformViewActivity.java

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,26 @@
11
package dev.flutter.scenarios;
22

33
import android.Manifest;
4+
import android.content.Context;
45
import android.content.Intent;
56
import android.net.Uri;
67
import android.os.Build;
78
import android.os.Bundle;
89
import android.os.Handler;
10+
import android.os.Looper;
911
import android.support.annotation.NonNull;
1012
import io.flutter.Log;
1113
import io.flutter.embedding.android.FlutterActivity;
1214
import io.flutter.embedding.engine.FlutterEngine;
1315
import io.flutter.embedding.engine.FlutterShellArgs;
16+
import io.flutter.embedding.engine.loader.FlutterLoader;
1417
import io.flutter.plugin.common.BasicMessageChannel;
1518
import io.flutter.plugin.common.BinaryCodec;
1619
import java.io.FileDescriptor;
1720
import java.io.FileOutputStream;
1821
import java.io.IOException;
1922
import java.nio.ByteBuffer;
23+
import java.util.concurrent.atomic.AtomicBoolean;
2024

2125
public 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

Comments
 (0)