[url_launcher] Switch to new launchUrl interface (#5985)
diff --git a/packages/url_launcher/url_launcher/CHANGELOG.md b/packages/url_launcher/url_launcher/CHANGELOG.md
index 1821193..e5e98f6 100644
--- a/packages/url_launcher/url_launcher/CHANGELOG.md
+++ b/packages/url_launcher/url_launcher/CHANGELOG.md
@@ -1,5 +1,6 @@
-## NEXT
+## 6.1.4
+* Adopts new platform interface method for launching URLs.
* Ignores unnecessary import warnings in preparation for [upcoming Flutter changes](https://github.com/flutter/flutter/pull/105648).
## 6.1.3
diff --git a/packages/url_launcher/url_launcher/lib/src/type_conversion.dart b/packages/url_launcher/url_launcher/lib/src/type_conversion.dart
new file mode 100644
index 0000000..970f04d
--- /dev/null
+++ b/packages/url_launcher/url_launcher/lib/src/type_conversion.dart
@@ -0,0 +1,32 @@
+// Copyright 2013 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'package:url_launcher_platform_interface/url_launcher_platform_interface.dart';
+
+import 'types.dart';
+
+/// Converts an (app-facing) [WebViewConfiguration] to a (platform interface)
+/// [InAppWebViewConfiguration].
+InAppWebViewConfiguration convertConfiguration(WebViewConfiguration config) {
+ return InAppWebViewConfiguration(
+ enableJavaScript: config.enableJavaScript,
+ enableDomStorage: config.enableDomStorage,
+ headers: config.headers,
+ );
+}
+
+/// Converts an (app-facing) [LaunchMode] to a (platform interface)
+/// [PreferredLaunchMode].
+PreferredLaunchMode convertLaunchMode(LaunchMode mode) {
+ switch (mode) {
+ case LaunchMode.platformDefault:
+ return PreferredLaunchMode.platformDefault;
+ case LaunchMode.inAppWebView:
+ return PreferredLaunchMode.inAppWebView;
+ case LaunchMode.externalApplication:
+ return PreferredLaunchMode.externalApplication;
+ case LaunchMode.externalNonBrowserApplication:
+ return PreferredLaunchMode.externalNonBrowserApplication;
+ }
+}
diff --git a/packages/url_launcher/url_launcher/lib/src/url_launcher_string.dart b/packages/url_launcher/url_launcher/lib/src/url_launcher_string.dart
index bee2a80..cf96ebc 100644
--- a/packages/url_launcher/url_launcher/lib/src/url_launcher_string.dart
+++ b/packages/url_launcher/url_launcher/lib/src/url_launcher_string.dart
@@ -4,6 +4,7 @@
import 'package:url_launcher_platform_interface/url_launcher_platform_interface.dart';
+import 'type_conversion.dart';
import 'types.dart';
/// String version of [launchUrl].
@@ -24,27 +25,18 @@
WebViewConfiguration webViewConfiguration = const WebViewConfiguration(),
String? webOnlyWindowName,
}) async {
- final bool isWebURL =
- urlString.startsWith('http:') || urlString.startsWith('https:');
- if (mode == LaunchMode.inAppWebView && !isWebURL) {
+ if (mode == LaunchMode.inAppWebView &&
+ !(urlString.startsWith('https:') || urlString.startsWith('http:'))) {
throw ArgumentError.value(urlString, 'urlString',
'To use an in-app web view, you must provide an http(s) URL.');
}
- final bool useWebView = mode == LaunchMode.inAppWebView ||
- (isWebURL && mode == LaunchMode.platformDefault);
-
- // TODO(stuartmorgan): Create a replacement platform interface method that
- // uses something more like the new argument structure, and switch to using
- // that, to support launch mode on more platforms.
- return await UrlLauncherPlatform.instance.launch(
+ return await UrlLauncherPlatform.instance.launchUrl(
urlString,
- useSafariVC: useWebView,
- useWebView: useWebView,
- enableJavaScript: webViewConfiguration.enableJavaScript,
- enableDomStorage: webViewConfiguration.enableDomStorage,
- universalLinksOnly: mode == LaunchMode.externalNonBrowserApplication,
- headers: webViewConfiguration.headers,
- webOnlyWindowName: webOnlyWindowName,
+ LaunchOptions(
+ mode: convertLaunchMode(mode),
+ webViewConfiguration: convertConfiguration(webViewConfiguration),
+ webOnlyWindowName: webOnlyWindowName,
+ ),
);
}
diff --git a/packages/url_launcher/url_launcher/lib/src/url_launcher_uri.dart b/packages/url_launcher/url_launcher/lib/src/url_launcher_uri.dart
index fc33f05..9061b51 100644
--- a/packages/url_launcher/url_launcher/lib/src/url_launcher_uri.dart
+++ b/packages/url_launcher/url_launcher/lib/src/url_launcher_uri.dart
@@ -7,6 +7,8 @@
import 'package:url_launcher/url_launcher_string.dart';
import 'package:url_launcher_platform_interface/url_launcher_platform_interface.dart';
+import 'type_conversion.dart';
+
/// Passes [url] to the underlying platform for handling.
///
/// [mode] support varies significantly by platform:
@@ -43,20 +45,18 @@
WebViewConfiguration webViewConfiguration = const WebViewConfiguration(),
String? webOnlyWindowName,
}) async {
- final bool isWebURL = url.scheme == 'http' || url.scheme == 'https';
- if (mode == LaunchMode.inAppWebView && !isWebURL) {
+ if (mode == LaunchMode.inAppWebView &&
+ !(url.scheme == 'https' || url.scheme == 'http')) {
throw ArgumentError.value(url, 'url',
'To use an in-app web view, you must provide an http(s) URL.');
}
- // TODO(stuartmorgan): Use UrlLauncherPlatform directly once a new API
- // that better matches these parameters has been added. For now, delegate to
- // launchUrlString so that there's only one copy of the parameter translation
- // logic.
- return await launchUrlString(
+ return await UrlLauncherPlatform.instance.launchUrl(
url.toString(),
- mode: mode,
- webViewConfiguration: webViewConfiguration,
- webOnlyWindowName: webOnlyWindowName,
+ LaunchOptions(
+ mode: convertLaunchMode(mode),
+ webViewConfiguration: convertConfiguration(webViewConfiguration),
+ webOnlyWindowName: webOnlyWindowName,
+ ),
);
}
diff --git a/packages/url_launcher/url_launcher/pubspec.yaml b/packages/url_launcher/url_launcher/pubspec.yaml
index 2a7ddcd..e01cd9b 100644
--- a/packages/url_launcher/url_launcher/pubspec.yaml
+++ b/packages/url_launcher/url_launcher/pubspec.yaml
@@ -3,7 +3,7 @@
web, phone, SMS, and email schemes.
repository: https://github.com/flutter/plugins/tree/main/packages/url_launcher/url_launcher
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+url_launcher%22
-version: 6.1.3
+version: 6.1.4
environment:
sdk: ">=2.14.0 <3.0.0"
@@ -34,7 +34,7 @@
# implementations, as both are compatible.
url_launcher_linux: ">=2.0.0 <4.0.0"
url_launcher_macos: ">=2.0.0 <4.0.0"
- url_launcher_platform_interface: ^2.0.3
+ url_launcher_platform_interface: ^2.1.0
url_launcher_web: ^2.0.0
url_launcher_windows: ">=2.0.0 <4.0.0"
diff --git a/packages/url_launcher/url_launcher/test/link_test.dart b/packages/url_launcher/url_launcher/test/link_test.dart
index 6242397..1c3d3e1 100644
--- a/packages/url_launcher/url_launcher/test/link_test.dart
+++ b/packages/url_launcher/url_launcher/test/link_test.dart
@@ -19,7 +19,7 @@
UrlLauncherPlatform.instance = mock;
});
- group('$Link', () {
+ group('Link', () {
testWidgets('handles null uri correctly', (WidgetTester tester) async {
bool isBuilt = false;
FollowLink? followLink;
@@ -55,8 +55,7 @@
mock
..setLaunchExpectations(
url: 'http://example.com/foobar',
- useSafariVC: false,
- useWebView: false,
+ launchMode: PreferredLaunchMode.externalApplication,
universalLinksOnly: false,
enableJavaScript: true,
enableDomStorage: true,
@@ -85,8 +84,7 @@
mock
..setLaunchExpectations(
url: 'http://example.com/foobar',
- useSafariVC: true,
- useWebView: true,
+ launchMode: PreferredLaunchMode.inAppWebView,
universalLinksOnly: false,
enableJavaScript: true,
enableDomStorage: true,
diff --git a/packages/url_launcher/url_launcher/test/mocks/mock_url_launcher_platform.dart b/packages/url_launcher/url_launcher/test/mocks/mock_url_launcher_platform.dart
index 5c53257..05c8b5e 100644
--- a/packages/url_launcher/url_launcher/test/mocks/mock_url_launcher_platform.dart
+++ b/packages/url_launcher/url_launcher/test/mocks/mock_url_launcher_platform.dart
@@ -11,6 +11,7 @@
with MockPlatformInterfaceMixin
implements UrlLauncherPlatform {
String? url;
+ PreferredLaunchMode? launchMode;
bool? useSafariVC;
bool? useWebView;
bool? enableJavaScript;
@@ -32,8 +33,9 @@
void setLaunchExpectations({
required String url,
- required bool? useSafariVC,
- required bool useWebView,
+ PreferredLaunchMode? launchMode,
+ bool? useSafariVC,
+ bool? useWebView,
required bool enableJavaScript,
required bool enableDomStorage,
required bool universalLinksOnly,
@@ -41,6 +43,7 @@
required String? webOnlyWindowName,
}) {
this.url = url;
+ this.launchMode = launchMode;
this.useSafariVC = useSafariVC;
this.useWebView = useWebView;
this.enableJavaScript = enableJavaScript;
@@ -89,6 +92,18 @@
}
@override
+ Future<bool> launchUrl(String url, LaunchOptions options) async {
+ expect(url, this.url);
+ expect(options.mode, launchMode);
+ expect(options.webViewConfiguration.enableJavaScript, enableJavaScript);
+ expect(options.webViewConfiguration.enableDomStorage, enableDomStorage);
+ expect(options.webViewConfiguration.headers, headers);
+ expect(options.webOnlyWindowName, webOnlyWindowName);
+ launchCalled = true;
+ return response!;
+ }
+
+ @override
Future<void> closeWebView() async {
closeWebViewCalled = true;
}
diff --git a/packages/url_launcher/url_launcher/test/src/url_launcher_string_test.dart b/packages/url_launcher/url_launcher/test/src/url_launcher_string_test.dart
index 95b2f5c..02c0b22 100644
--- a/packages/url_launcher/url_launcher/test/src/url_launcher_string_test.dart
+++ b/packages/url_launcher/url_launcher/test/src/url_launcher_string_test.dart
@@ -43,8 +43,7 @@
mock
..setLaunchExpectations(
url: urlString,
- useSafariVC: true,
- useWebView: true,
+ launchMode: PreferredLaunchMode.platformDefault,
enableJavaScript: true,
enableDomStorage: true,
universalLinksOnly: false,
@@ -60,8 +59,7 @@
mock
..setLaunchExpectations(
url: urlString,
- useSafariVC: false,
- useWebView: false,
+ launchMode: PreferredLaunchMode.platformDefault,
enableJavaScript: true,
enableDomStorage: true,
universalLinksOnly: false,
@@ -77,8 +75,7 @@
mock
..setLaunchExpectations(
url: urlString,
- useSafariVC: true,
- useWebView: true,
+ launchMode: PreferredLaunchMode.platformDefault,
enableJavaScript: true,
enableDomStorage: true,
universalLinksOnly: false,
@@ -95,8 +92,7 @@
mock
..setLaunchExpectations(
url: urlString,
- useSafariVC: false,
- useWebView: false,
+ launchMode: PreferredLaunchMode.platformDefault,
enableJavaScript: true,
enableDomStorage: true,
universalLinksOnly: false,
@@ -113,8 +109,7 @@
mock
..setLaunchExpectations(
url: urlString,
- useSafariVC: true,
- useWebView: true,
+ launchMode: PreferredLaunchMode.inAppWebView,
enableJavaScript: true,
enableDomStorage: true,
universalLinksOnly: false,
@@ -131,8 +126,7 @@
mock
..setLaunchExpectations(
url: urlString,
- useSafariVC: false,
- useWebView: false,
+ launchMode: PreferredLaunchMode.externalApplication,
enableJavaScript: true,
enableDomStorage: true,
universalLinksOnly: false,
@@ -151,8 +145,7 @@
mock
..setLaunchExpectations(
url: urlString,
- useSafariVC: false,
- useWebView: false,
+ launchMode: PreferredLaunchMode.externalNonBrowserApplication,
enableJavaScript: true,
enableDomStorage: true,
universalLinksOnly: true,
@@ -171,8 +164,7 @@
mock
..setLaunchExpectations(
url: urlString,
- useSafariVC: true,
- useWebView: true,
+ launchMode: PreferredLaunchMode.inAppWebView,
enableJavaScript: false,
enableDomStorage: true,
universalLinksOnly: false,
@@ -193,8 +185,7 @@
mock
..setLaunchExpectations(
url: urlString,
- useSafariVC: true,
- useWebView: true,
+ launchMode: PreferredLaunchMode.inAppWebView,
enableJavaScript: true,
enableDomStorage: false,
universalLinksOnly: false,
@@ -215,8 +206,7 @@
mock
..setLaunchExpectations(
url: urlString,
- useSafariVC: true,
- useWebView: true,
+ launchMode: PreferredLaunchMode.inAppWebView,
enableJavaScript: true,
enableDomStorage: true,
universalLinksOnly: false,
@@ -245,8 +235,7 @@
mock
..setLaunchExpectations(
url: emailLaunchUrlString,
- useSafariVC: false,
- useWebView: false,
+ launchMode: PreferredLaunchMode.platformDefault,
enableJavaScript: true,
enableDomStorage: true,
universalLinksOnly: false,
@@ -264,8 +253,7 @@
mock
..setLaunchExpectations(
url: urlString,
- useSafariVC: false,
- useWebView: false,
+ launchMode: PreferredLaunchMode.platformDefault,
enableJavaScript: true,
enableDomStorage: true,
universalLinksOnly: false,
diff --git a/packages/url_launcher/url_launcher/test/src/url_launcher_uri_test.dart b/packages/url_launcher/url_launcher/test/src/url_launcher_uri_test.dart
index 8286e0c..e226e59 100644
--- a/packages/url_launcher/url_launcher/test/src/url_launcher_uri_test.dart
+++ b/packages/url_launcher/url_launcher/test/src/url_launcher_uri_test.dart
@@ -48,8 +48,7 @@
mock
..setLaunchExpectations(
url: url.toString(),
- useSafariVC: true,
- useWebView: true,
+ launchMode: PreferredLaunchMode.platformDefault,
enableJavaScript: true,
enableDomStorage: true,
universalLinksOnly: false,
@@ -65,8 +64,7 @@
mock
..setLaunchExpectations(
url: url.toString(),
- useSafariVC: false,
- useWebView: false,
+ launchMode: PreferredLaunchMode.platformDefault,
enableJavaScript: true,
enableDomStorage: true,
universalLinksOnly: false,
@@ -82,8 +80,7 @@
mock
..setLaunchExpectations(
url: url.toString(),
- useSafariVC: true,
- useWebView: true,
+ launchMode: PreferredLaunchMode.platformDefault,
enableJavaScript: true,
enableDomStorage: true,
universalLinksOnly: false,
@@ -99,8 +96,7 @@
mock
..setLaunchExpectations(
url: url.toString(),
- useSafariVC: false,
- useWebView: false,
+ launchMode: PreferredLaunchMode.platformDefault,
enableJavaScript: true,
enableDomStorage: true,
universalLinksOnly: false,
@@ -116,8 +112,7 @@
mock
..setLaunchExpectations(
url: url.toString(),
- useSafariVC: true,
- useWebView: true,
+ launchMode: PreferredLaunchMode.inAppWebView,
enableJavaScript: true,
enableDomStorage: true,
universalLinksOnly: false,
@@ -133,8 +128,7 @@
mock
..setLaunchExpectations(
url: url.toString(),
- useSafariVC: false,
- useWebView: false,
+ launchMode: PreferredLaunchMode.externalApplication,
enableJavaScript: true,
enableDomStorage: true,
universalLinksOnly: false,
@@ -151,8 +145,7 @@
mock
..setLaunchExpectations(
url: url.toString(),
- useSafariVC: false,
- useWebView: false,
+ launchMode: PreferredLaunchMode.externalNonBrowserApplication,
enableJavaScript: true,
enableDomStorage: true,
universalLinksOnly: true,
@@ -170,8 +163,7 @@
mock
..setLaunchExpectations(
url: url.toString(),
- useSafariVC: true,
- useWebView: true,
+ launchMode: PreferredLaunchMode.inAppWebView,
enableJavaScript: false,
enableDomStorage: true,
universalLinksOnly: false,
@@ -192,8 +184,7 @@
mock
..setLaunchExpectations(
url: url.toString(),
- useSafariVC: true,
- useWebView: true,
+ launchMode: PreferredLaunchMode.inAppWebView,
enableJavaScript: true,
enableDomStorage: false,
universalLinksOnly: false,
@@ -214,8 +205,7 @@
mock
..setLaunchExpectations(
url: url.toString(),
- useSafariVC: true,
- useWebView: true,
+ launchMode: PreferredLaunchMode.inAppWebView,
enableJavaScript: true,
enableDomStorage: true,
universalLinksOnly: false,
@@ -247,8 +237,7 @@
mock
..setLaunchExpectations(
url: emailLaunchUrl.toString(),
- useSafariVC: false,
- useWebView: false,
+ launchMode: PreferredLaunchMode.platformDefault,
enableJavaScript: true,
enableDomStorage: true,
universalLinksOnly: false,