From 4c6b4e9d716bdd3b4d543386bd0290c15ac3e213 Mon Sep 17 00:00:00 2001 From: Matt Carroll Date: Fri, 7 Feb 2020 15:36:57 -0800 Subject: [PATCH 1/3] Fix ensureInitializationCompleteAsync callback when already initialized. (#39675) --- .../io/flutter/embedding/engine/loader/FlutterLoader.java | 1 + 1 file changed, 1 insertion(+) diff --git a/shell/platform/android/io/flutter/embedding/engine/loader/FlutterLoader.java b/shell/platform/android/io/flutter/embedding/engine/loader/FlutterLoader.java index ff0f621b6ae5a..b0f4b165416de 100644 --- a/shell/platform/android/io/flutter/embedding/engine/loader/FlutterLoader.java +++ b/shell/platform/android/io/flutter/embedding/engine/loader/FlutterLoader.java @@ -234,6 +234,7 @@ public void ensureInitializationCompleteAsync( "ensureInitializationComplete must be called after startInitialization"); } if (initialized) { + callbackHandler.post(callback); return; } new Thread( From 4f33a635dba89d3f93648c69169dc94a51cc72db Mon Sep 17 00:00:00 2001 From: Matt Carroll Date: Mon, 10 Feb 2020 15:41:10 -0800 Subject: [PATCH 2/3] Added a test in the scenario app. --- .../scenarios/TextPlatformViewActivity.java | 70 +++++++++++++++++-- 1 file changed, 65 insertions(+), 5 deletions(-) diff --git a/testing/scenario_app/android/app/src/main/java/dev/flutter/scenarios/TextPlatformViewActivity.java b/testing/scenario_app/android/app/src/main/java/dev/flutter/scenarios/TextPlatformViewActivity.java index 4772203345d95..53af194695f90 100644 --- a/testing/scenario_app/android/app/src/main/java/dev/flutter/scenarios/TextPlatformViewActivity.java +++ b/testing/scenario_app/android/app/src/main/java/dev/flutter/scenarios/TextPlatformViewActivity.java @@ -1,22 +1,28 @@ package dev.flutter.scenarios; import android.Manifest; +import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Handler; +import android.os.Looper; import android.support.annotation.NonNull; + +import java.io.FileDescriptor; +import java.io.FileOutputStream; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.concurrent.atomic.AtomicBoolean; + import io.flutter.Log; import io.flutter.embedding.android.FlutterActivity; import io.flutter.embedding.engine.FlutterEngine; import io.flutter.embedding.engine.FlutterShellArgs; +import io.flutter.embedding.engine.loader.FlutterLoader; import io.flutter.plugin.common.BasicMessageChannel; import io.flutter.plugin.common.BinaryCodec; -import java.io.FileDescriptor; -import java.io.FileOutputStream; -import java.io.IOException; -import java.nio.ByteBuffer; public class TextPlatformViewActivity extends FlutterActivity { static final String TAG = "Scenarios"; @@ -31,7 +37,19 @@ protected void onCreate(Bundle savedInstanceState) { } // Run for one minute, get the timeline data, write it, and finish. final Uri logFileUri = launchIntent.getData(); - new Handler().postDelayed(() -> writeTimelineData(logFileUri), 20000); + new Handler() + .postDelayed( + new Runnable() { + @Override + public void run() { + writeTimelineData(logFileUri); + + testFlutterLoaderCallbackWhenInitializedTwice(); + } + }, + 20000); + } else { + testFlutterLoaderCallbackWhenInitializedTwice(); } } @@ -80,4 +98,46 @@ private void writeTimelineData(Uri logFile) { finish(); }); } + + /** + * This method verifies that {@link FlutterLoader#ensureInitializationCompleteAsync(Context, + * String[], Handler, Runnable)} invokes its callback when called after initialization. + */ + private void testFlutterLoaderCallbackWhenInitializedTwice() { + FlutterLoader flutterLoader = new FlutterLoader(); + + // Flutter is probably already loaded in this app based on + // code that ran before this method. Nonetheless, invoke the + // blocking initialization here to ensure it's initialized. + flutterLoader.startInitialization(getApplicationContext()); + flutterLoader.ensureInitializationComplete(getApplication(), new String[] {}); + + // Now that Flutter is loaded, invoke ensureInitializationCompleteAsync with + // a callback and verify that the callback is invoked. + Handler mainHandler = new Handler(Looper.getMainLooper()); + + final AtomicBoolean didInvokeCallback = new AtomicBoolean(false); + + flutterLoader.ensureInitializationCompleteAsync( + getApplication(), + new String[] {}, + mainHandler, + new Runnable() { + @Override + public void run() { + didInvokeCallback.set(true); + } + }); + + mainHandler.post( + new Runnable() { + @Override + public void run() { + if (!didInvokeCallback.get()) { + throw new RuntimeException( + "Failed test: FlutterLoader#ensureInitializationCompleteAsync() did not invoke its callback."); + } + } + }); + } } From 6129c8bab4710ef46964e9d2cb8d5b20a60cb1e7 Mon Sep 17 00:00:00 2001 From: Matt Carroll Date: Tue, 11 Feb 2020 14:03:32 -0800 Subject: [PATCH 3/3] Formatting fix. --- .../flutter/scenarios/TextPlatformViewActivity.java | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/testing/scenario_app/android/app/src/main/java/dev/flutter/scenarios/TextPlatformViewActivity.java b/testing/scenario_app/android/app/src/main/java/dev/flutter/scenarios/TextPlatformViewActivity.java index 53af194695f90..366ffe75178b0 100644 --- a/testing/scenario_app/android/app/src/main/java/dev/flutter/scenarios/TextPlatformViewActivity.java +++ b/testing/scenario_app/android/app/src/main/java/dev/flutter/scenarios/TextPlatformViewActivity.java @@ -9,13 +9,6 @@ import android.os.Handler; import android.os.Looper; import android.support.annotation.NonNull; - -import java.io.FileDescriptor; -import java.io.FileOutputStream; -import java.io.IOException; -import java.nio.ByteBuffer; -import java.util.concurrent.atomic.AtomicBoolean; - import io.flutter.Log; import io.flutter.embedding.android.FlutterActivity; import io.flutter.embedding.engine.FlutterEngine; @@ -23,6 +16,11 @@ import io.flutter.embedding.engine.loader.FlutterLoader; import io.flutter.plugin.common.BasicMessageChannel; import io.flutter.plugin.common.BinaryCodec; +import java.io.FileDescriptor; +import java.io.FileOutputStream; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.concurrent.atomic.AtomicBoolean; public class TextPlatformViewActivity extends FlutterActivity { static final String TAG = "Scenarios";