diff --git a/shell/platform/android/io/flutter/embedding/android/FlutterFragmentActivity.java b/shell/platform/android/io/flutter/embedding/android/FlutterFragmentActivity.java index 52c65ca855d45..e699c2abeef93 100644 --- a/shell/platform/android/io/flutter/embedding/android/FlutterFragmentActivity.java +++ b/shell/platform/android/io/flutter/embedding/android/FlutterFragmentActivity.java @@ -5,6 +5,7 @@ package io.flutter.embedding.android; import static io.flutter.embedding.android.FlutterActivityLaunchConfigs.DART_ENTRYPOINT_META_DATA_KEY; +import static io.flutter.embedding.android.FlutterActivityLaunchConfigs.DART_ENTRYPOINT_URI_META_DATA_KEY; import static io.flutter.embedding.android.FlutterActivityLaunchConfigs.DEFAULT_BACKGROUND_MODE; import static io.flutter.embedding.android.FlutterActivityLaunchConfigs.DEFAULT_DART_ENTRYPOINT; import static io.flutter.embedding.android.FlutterActivityLaunchConfigs.DEFAULT_INITIAL_ROUTE; @@ -460,6 +461,9 @@ protected FlutterFragment createFlutterFragment() { + "Dart entrypoint: " + getDartEntrypointFunctionName() + "\n" + + "Dart entrypoint library uri: " + + (getDartEntrypointLibraryUri() != null ? getDartEntrypointLibraryUri() : "\"\"") + + "\n" + "Initial route: " + getInitialRoute() + "\n" @@ -471,6 +475,7 @@ protected FlutterFragment createFlutterFragment() { return FlutterFragment.withNewEngine() .dartEntrypoint(getDartEntrypointFunctionName()) + .dartLibraryUri(getDartEntrypointLibraryUri()) .initialRoute(getInitialRoute()) .appBundlePath(getAppBundlePath()) .flutterShellArgs(FlutterShellArgs.fromIntent(getIntent())) @@ -693,6 +698,32 @@ public String getDartEntrypointFunctionName() { } } + /** + * The Dart library URI for the entrypoint that will be executed as soon as the Dart snapshot is + * loaded. + * + *
Example value: "package:foo/bar.dart" + * + *
This preference can be controlled by setting a {@code A value of null means use the default root library.
+ *
+ * Subclasses may override this method to directly control the Dart entrypoint uri.
+ */
+ @Nullable
+ public String getDartEntrypointLibraryUri() {
+ try {
+ Bundle metaData = getMetaData();
+ String desiredDartLibraryUri =
+ metaData != null ? metaData.getString(DART_ENTRYPOINT_URI_META_DATA_KEY) : null;
+ return desiredDartLibraryUri;
+ } catch (PackageManager.NameNotFoundException e) {
+ return null;
+ }
+ }
+
/**
* The initial route that a Flutter app will render upon loading and executing its Dart code.
*
diff --git a/shell/platform/android/test/io/flutter/embedding/android/FlutterFragmentActivityTest.java b/shell/platform/android/test/io/flutter/embedding/android/FlutterFragmentActivityTest.java
index d47992afa6106..70e32c4c3277b 100644
--- a/shell/platform/android/test/io/flutter/embedding/android/FlutterFragmentActivityTest.java
+++ b/shell/platform/android/test/io/flutter/embedding/android/FlutterFragmentActivityTest.java
@@ -91,6 +91,19 @@ protected RenderMode getRenderMode() {
assertEquals(activity.createFlutterFragment().getRenderMode(), RenderMode.texture);
}
+ @Test
+ public void createFlutterFragment__customDartEntrypointLibraryUri() {
+ final FlutterFragmentActivity activity =
+ new FakeFlutterFragmentActivity() {
+ @Override
+ public String getDartEntrypointLibraryUri() {
+ return "package:foo/bar.dart";
+ }
+ };
+ assertEquals(
+ activity.createFlutterFragment().getDartEntrypointLibraryUri(), "package:foo/bar.dart");
+ }
+
@Test
public void itRegistersPluginsAtConfigurationTime() {
try (ActivityScenario