From e0400f6bb3a1e115f6674534225eef31cdb6d436 Mon Sep 17 00:00:00 2001 From: ColdPaleLight Date: Tue, 11 Jan 2022 22:10:37 +0800 Subject: [PATCH] Implemented library uri support for FlutterFragmentActivities --- .../android/FlutterFragmentActivity.java | 31 +++++++++++++++++++ .../android/FlutterFragmentActivityTest.java | 18 +++++++++++ 2 files changed, 49 insertions(+) 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 } called {@link + * FlutterActivityLaunchConfigs#DART_ENTRYPOINT_URI_META_DATA_KEY} within the Android manifest + * definition for this {@code FlutterFragmentActivity}. + * + *

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 scenario = @@ -348,6 +361,11 @@ public String getDartEntrypointFunctionName() { return ""; } + @Nullable + public String getDartEntrypointLibraryUri() { + return null; + } + @Override protected String getInitialRoute() { return "";