1313import static io .flutter .embedding .android .FlutterActivityLaunchConfigs .EXTRA_DESTROY_ENGINE_WITH_ACTIVITY ;
1414import static io .flutter .embedding .android .FlutterActivityLaunchConfigs .EXTRA_ENABLE_STATE_RESTORATION ;
1515import static io .flutter .embedding .android .FlutterActivityLaunchConfigs .EXTRA_INITIAL_ROUTE ;
16+ import static io .flutter .embedding .android .FlutterActivityLaunchConfigs .HANDLE_DEEPLINKING_META_DATA_KEY ;
1617import static io .flutter .embedding .android .FlutterActivityLaunchConfigs .INITIAL_ROUTE_META_DATA_KEY ;
1718import static io .flutter .embedding .android .FlutterActivityLaunchConfigs .NORMAL_THEME_META_DATA_KEY ;
1819import static io .flutter .embedding .android .FlutterActivityLaunchConfigs .SPLASH_SCREEN_META_DATA_KEY ;
@@ -446,10 +447,9 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
446447 */
447448 private void switchLaunchThemeForNormalTheme () {
448449 try {
449- ActivityInfo activityInfo =
450- getPackageManager ().getActivityInfo (getComponentName (), PackageManager .GET_META_DATA );
451- if (activityInfo .metaData != null ) {
452- int normalThemeRID = activityInfo .metaData .getInt (NORMAL_THEME_META_DATA_KEY , -1 );
450+ Bundle metaData = getMetaData ();
451+ if (metaData != null ) {
452+ int normalThemeRID = metaData .getInt (NORMAL_THEME_META_DATA_KEY , -1 );
453453 if (normalThemeRID != -1 ) {
454454 setTheme (normalThemeRID );
455455 }
@@ -485,10 +485,8 @@ public SplashScreen provideSplashScreen() {
485485 @ SuppressWarnings ("deprecation" )
486486 private Drawable getSplashScreenFromManifest () {
487487 try {
488- ActivityInfo activityInfo =
489- getPackageManager ().getActivityInfo (getComponentName (), PackageManager .GET_META_DATA );
490- Bundle metadata = activityInfo .metaData ;
491- int splashScreenId = metadata != null ? metadata .getInt (SPLASH_SCREEN_META_DATA_KEY ) : 0 ;
488+ Bundle metaData = getMetaData ();
489+ int splashScreenId = metaData != null ? metaData .getInt (SPLASH_SCREEN_META_DATA_KEY ) : 0 ;
492490 return splashScreenId != 0
493491 ? Build .VERSION .SDK_INT > Build .VERSION_CODES .LOLLIPOP
494492 ? getResources ().getDrawable (splashScreenId , getTheme ())
@@ -748,11 +746,9 @@ public boolean shouldDestroyEngineWithHost() {
748746 @ NonNull
749747 public String getDartEntrypointFunctionName () {
750748 try {
751- ActivityInfo activityInfo =
752- getPackageManager ().getActivityInfo (getComponentName (), PackageManager .GET_META_DATA );
753- Bundle metadata = activityInfo .metaData ;
749+ Bundle metaData = getMetaData ();
754750 String desiredDartEntrypoint =
755- metadata != null ? metadata .getString (DART_ENTRYPOINT_META_DATA_KEY ) : null ;
751+ metaData != null ? metaData .getString (DART_ENTRYPOINT_META_DATA_KEY ) : null ;
756752 return desiredDartEntrypoint != null ? desiredDartEntrypoint : DEFAULT_DART_ENTRYPOINT ;
757753 } catch (PackageManager .NameNotFoundException e ) {
758754 return DEFAULT_DART_ENTRYPOINT ;
@@ -779,22 +775,22 @@ public String getDartEntrypointFunctionName() {
779775 * have control over the incoming {@code Intent}.
780776 *
781777 * <p>Subclasses may override this method to directly control the initial route.
778+ *
779+ * <p>If this method returns null and the {@code shouldHandleDeeplinking} returns true, the
780+ * initial route is derived from the {@code Intent} through the Intent.getData() instead.
782781 */
783- @ NonNull
784782 public String getInitialRoute () {
785783 if (getIntent ().hasExtra (EXTRA_INITIAL_ROUTE )) {
786784 return getIntent ().getStringExtra (EXTRA_INITIAL_ROUTE );
787785 }
788786
789787 try {
790- ActivityInfo activityInfo =
791- getPackageManager ().getActivityInfo (getComponentName (), PackageManager .GET_META_DATA );
792- Bundle metadata = activityInfo .metaData ;
788+ Bundle metaData = getMetaData ();
793789 String desiredInitialRoute =
794- metadata != null ? metadata .getString (INITIAL_ROUTE_META_DATA_KEY ) : null ;
795- return desiredInitialRoute != null ? desiredInitialRoute : DEFAULT_INITIAL_ROUTE ;
790+ metaData != null ? metaData .getString (INITIAL_ROUTE_META_DATA_KEY ) : null ;
791+ return desiredInitialRoute ;
796792 } catch (PackageManager .NameNotFoundException e ) {
797- return DEFAULT_INITIAL_ROUTE ;
793+ return null ;
798794 }
799795 }
800796
@@ -894,6 +890,14 @@ protected FlutterEngine getFlutterEngine() {
894890 return delegate .getFlutterEngine ();
895891 }
896892
893+ /** Retrieves the meta data specified in the AndroidManifest.xml. */
894+ @ Nullable
895+ protected Bundle getMetaData () throws PackageManager .NameNotFoundException {
896+ ActivityInfo activityInfo =
897+ getPackageManager ().getActivityInfo (getComponentName (), PackageManager .GET_META_DATA );
898+ return activityInfo .metaData ;
899+ }
900+
897901 @ Nullable
898902 @ Override
899903 public PlatformPlugin providePlatformPlugin (
@@ -970,6 +974,26 @@ public boolean shouldAttachEngineToActivity() {
970974 return true ;
971975 }
972976
977+ /**
978+ * Whether to handle the deeplinking from the {@code Intent} automatically if the {@code
979+ * getInitialRoute} returns null.
980+ *
981+ * <p>The default implementation looks {@code <meta-data>} called {@link
982+ * FlutterActivityLaunchConfigs#HANDLE_DEEPLINKING_META_DATA_KEY} within the Android manifest
983+ * definition for this {@code FlutterActivity}.
984+ */
985+ @ Override
986+ public boolean shouldHandleDeeplinking () {
987+ try {
988+ Bundle metaData = getMetaData ();
989+ boolean shouldHandleDeeplinking =
990+ metaData != null ? metaData .getBoolean (HANDLE_DEEPLINKING_META_DATA_KEY ) : false ;
991+ return shouldHandleDeeplinking ;
992+ } catch (PackageManager .NameNotFoundException e ) {
993+ return false ;
994+ }
995+ }
996+
973997 @ Override
974998 public void onFlutterSurfaceViewCreated (@ NonNull FlutterSurfaceView flutterSurfaceView ) {
975999 // Hook for subclasses.
0 commit comments