diff --git a/engine/src/flutter/shell/platform/android/io/flutter/embedding/android/FlutterActivity.java b/engine/src/flutter/shell/platform/android/io/flutter/embedding/android/FlutterActivity.java index d536fed70d..f5794335b7 100644 --- a/engine/src/flutter/shell/platform/android/io/flutter/embedding/android/FlutterActivity.java +++ b/engine/src/flutter/shell/platform/android/io/flutter/embedding/android/FlutterActivity.java @@ -18,9 +18,9 @@ import static io.flutter.embedding.android.FlutterActivityLaunchConfigs.EXTRA_DA import static io.flutter.embedding.android.FlutterActivityLaunchConfigs.EXTRA_DESTROY_ENGINE_WITH_ACTIVITY; import static io.flutter.embedding.android.FlutterActivityLaunchConfigs.EXTRA_ENABLE_STATE_RESTORATION; import static io.flutter.embedding.android.FlutterActivityLaunchConfigs.EXTRA_INITIAL_ROUTE; -import static io.flutter.embedding.android.FlutterActivityLaunchConfigs.HANDLE_DEEPLINKING_META_DATA_KEY; import static io.flutter.embedding.android.FlutterActivityLaunchConfigs.INITIAL_ROUTE_META_DATA_KEY; import static io.flutter.embedding.android.FlutterActivityLaunchConfigs.NORMAL_THEME_META_DATA_KEY; +import static io.flutter.embedding.android.FlutterActivityLaunchConfigs.deepLinkEnabled; import android.annotation.TargetApi; import android.app.Activity; @@ -1404,9 +1404,7 @@ public class FlutterActivity extends Activity public boolean shouldHandleDeeplinking() { try { Bundle metaData = getMetaData(); - boolean shouldHandleDeeplinking = - metaData != null ? metaData.getBoolean(HANDLE_DEEPLINKING_META_DATA_KEY) : false; - return shouldHandleDeeplinking; + return deepLinkEnabled(metaData); } catch (PackageManager.NameNotFoundException e) { return false; } diff --git a/engine/src/flutter/shell/platform/android/io/flutter/embedding/android/FlutterActivityLaunchConfigs.java b/engine/src/flutter/shell/platform/android/io/flutter/embedding/android/FlutterActivityLaunchConfigs.java index 3f775af65d..4f3c5cbf0c 100644 --- a/engine/src/flutter/shell/platform/android/io/flutter/embedding/android/FlutterActivityLaunchConfigs.java +++ b/engine/src/flutter/shell/platform/android/io/flutter/embedding/android/FlutterActivityLaunchConfigs.java @@ -4,6 +4,8 @@ package io.flutter.embedding.android; +import android.os.Bundle; + /** Collection of Flutter launch configuration options. */ // This class is public so that Flutter app developers can reference // BackgroundMode @@ -41,5 +43,24 @@ public class FlutterActivityLaunchConfigs { transparent } + /** + * Whether to handle the deeplinking. + * + *
The default implementation looks {@code Defaults to {@code true}.
+ */
+ public static boolean deepLinkEnabled(Bundle metaData) {
+ // Check if metadata is not null and contains the HANDLE_DEEPLINKING_META_DATA_KEY.
+ if (metaData != null && metaData.containsKey(HANDLE_DEEPLINKING_META_DATA_KEY)) {
+ return metaData.getBoolean(HANDLE_DEEPLINKING_META_DATA_KEY);
+ } else {
+ // Return true if the deep linking flag is not found in metadata.
+ return true;
+ }
+ }
+
private FlutterActivityLaunchConfigs() {}
}
diff --git a/engine/src/flutter/shell/platform/android/io/flutter/embedding/android/FlutterFragmentActivity.java b/engine/src/flutter/shell/platform/android/io/flutter/embedding/android/FlutterFragmentActivity.java
index fda8a7c21d..d0562be102 100644
--- a/engine/src/flutter/shell/platform/android/io/flutter/embedding/android/FlutterFragmentActivity.java
+++ b/engine/src/flutter/shell/platform/android/io/flutter/embedding/android/FlutterFragmentActivity.java
@@ -16,9 +16,9 @@ import static io.flutter.embedding.android.FlutterActivityLaunchConfigs.EXTRA_DA
import static io.flutter.embedding.android.FlutterActivityLaunchConfigs.EXTRA_DART_ENTRYPOINT_ARGS;
import static io.flutter.embedding.android.FlutterActivityLaunchConfigs.EXTRA_DESTROY_ENGINE_WITH_ACTIVITY;
import static io.flutter.embedding.android.FlutterActivityLaunchConfigs.EXTRA_INITIAL_ROUTE;
-import static io.flutter.embedding.android.FlutterActivityLaunchConfigs.HANDLE_DEEPLINKING_META_DATA_KEY;
import static io.flutter.embedding.android.FlutterActivityLaunchConfigs.INITIAL_ROUTE_META_DATA_KEY;
import static io.flutter.embedding.android.FlutterActivityLaunchConfigs.NORMAL_THEME_META_DATA_KEY;
+import static io.flutter.embedding.android.FlutterActivityLaunchConfigs.deepLinkEnabled;
import android.content.Context;
import android.content.Intent;
@@ -695,9 +695,7 @@ public class FlutterFragmentActivity extends FragmentActivity
protected boolean shouldHandleDeeplinking() {
try {
Bundle metaData = getMetaData();
- boolean shouldHandleDeeplinking =
- metaData != null ? metaData.getBoolean(HANDLE_DEEPLINKING_META_DATA_KEY) : false;
- return shouldHandleDeeplinking;
+ return deepLinkEnabled(metaData);
} catch (PackageManager.NameNotFoundException e) {
return false;
}
diff --git a/engine/src/flutter/shell/platform/android/test/io/flutter/embedding/android/FlutterActivityTest.java b/engine/src/flutter/shell/platform/android/test/io/flutter/embedding/android/FlutterActivityTest.java
index f660e32eba..8dfbd4a0ce 100644
--- a/engine/src/flutter/shell/platform/android/test/io/flutter/embedding/android/FlutterActivityTest.java
+++ b/engine/src/flutter/shell/platform/android/test/io/flutter/embedding/android/FlutterActivityTest.java
@@ -332,8 +332,8 @@ public class FlutterActivityTest {
Bundle bundle = new Bundle();
FlutterActivity spyFlutterActivity = spy(flutterActivity);
when(spyFlutterActivity.getMetaData()).thenReturn(bundle);
- // Empty bundle should return false.
- assertFalse(spyFlutterActivity.shouldHandleDeeplinking());
+ // Empty bundle should return true.
+ assertTrue(spyFlutterActivity.shouldHandleDeeplinking());
}
@Test
diff --git a/engine/src/flutter/shell/platform/android/test/io/flutter/embedding/android/FlutterFragmentActivityTest.java b/engine/src/flutter/shell/platform/android/test/io/flutter/embedding/android/FlutterFragmentActivityTest.java
index 17960263e9..2ecb7aeea8 100644
--- a/engine/src/flutter/shell/platform/android/test/io/flutter/embedding/android/FlutterFragmentActivityTest.java
+++ b/engine/src/flutter/shell/platform/android/test/io/flutter/embedding/android/FlutterFragmentActivityTest.java
@@ -180,8 +180,8 @@ public class FlutterFragmentActivityTest {
Bundle bundle = new Bundle();
FlutterFragmentActivity spyFlutterActivity = spy(activity);
when(spyFlutterActivity.getMetaData()).thenReturn(bundle);
- // Empty bundle should return false.
- assertFalse(spyFlutterActivity.shouldHandleDeeplinking());
+ // Empty bundle should return true.
+ assertTrue(spyFlutterActivity.shouldHandleDeeplinking());
}
@Test
diff --git a/engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterAppDelegate.mm b/engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterAppDelegate.mm
index 4c2d0cecc2..6f784e7de3 100644
--- a/engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterAppDelegate.mm
+++ b/engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterAppDelegate.mm
@@ -137,8 +137,8 @@ static NSString* const kRestorationStateAppModificationKey = @"mod-date";
- (BOOL)isFlutterDeepLinkingEnabled {
NSNumber* isDeepLinkingEnabled =
[[NSBundle mainBundle] objectForInfoDictionaryKey:@"FlutterDeepLinkingEnabled"];
- // if not set, return NO
- return isDeepLinkingEnabled ? [isDeepLinkingEnabled boolValue] : NO;
+ // if not set, return YES
+ return isDeepLinkingEnabled ? [isDeepLinkingEnabled boolValue] : YES;
}
// This method is called when opening an URL with custom schemes.
diff --git a/engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterAppDelegateTest.mm b/engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterAppDelegateTest.mm
index 3caddbc532..79352d6589 100644
--- a/engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterAppDelegateTest.mm
+++ b/engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterAppDelegateTest.mm
@@ -80,12 +80,18 @@ FLUTTER_ASSERT_ARC
OCMStub([self.mockMainBundle objectForInfoDictionaryKey:@"FlutterDeepLinkingEnabled"])
.andReturn(nil);
+ OCMStub([self.mockNavigationChannel
+ invokeMethod:@"pushRouteInformation"
+ arguments:@{@"location" : @"http://myApp/custom/route?query=test"}])
+ .andReturn(@YES);
+
BOOL result =
[self.appDelegate application:[UIApplication sharedApplication]
openURL:[NSURL URLWithString:@"http://myApp/custom/route?query=test"]
options:@{}];
- XCTAssertFalse(result);
- OCMReject([self.mockNavigationChannel invokeMethod:OCMOCK_ANY arguments:OCMOCK_ANY]);
+
+ XCTAssertTrue(result);
+ OCMVerifyAll(self.mockNavigationChannel);
}
- (void)testLaunchUrlWithDeepLinkingDisabled {