diff --git a/packages/url_launcher/url_launcher/CHANGELOG.md b/packages/url_launcher/url_launcher/CHANGELOG.md index 3b8323126c7f..020f6cb32672 100644 --- a/packages/url_launcher/url_launcher/CHANGELOG.md +++ b/packages/url_launcher/url_launcher/CHANGELOG.md @@ -1,3 +1,7 @@ +## 5.2.4 + +* Use `package:url_launcher_platform_interface` to get the platform-specific implementation. + ## 5.2.3 Android: Use android.arch.lifecycle instead of androidx.lifecycle:lifecycle in `build.gradle` to support apps that has not been migrated to AndroidX. diff --git a/packages/url_launcher/url_launcher/lib/url_launcher.dart b/packages/url_launcher/url_launcher/lib/url_launcher.dart index 045448fbde97..97af77143936 100644 --- a/packages/url_launcher/url_launcher/lib/url_launcher.dart +++ b/packages/url_launcher/url_launcher/lib/url_launcher.dart @@ -7,8 +7,7 @@ import 'dart:async'; import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; - -const MethodChannel _channel = MethodChannel('plugins.flutter.io/url_launcher'); +import 'package:url_launcher_platform_interface/url_launcher_platform_interface.dart'; /// Parses the specified URL string and delegates handling of it to the /// underlying platform. @@ -84,17 +83,14 @@ Future launch( ? SystemUiOverlayStyle.dark : SystemUiOverlayStyle.light); } - final bool result = await _channel.invokeMethod( - 'launch', - { - 'url': urlString, - 'useSafariVC': forceSafariVC ?? isWebURL, - 'useWebView': forceWebView ?? false, - 'enableJavaScript': enableJavaScript ?? false, - 'enableDomStorage': enableDomStorage ?? false, - 'universalLinksOnly': universalLinksOnly ?? false, - 'headers': headers ?? {}, - }, + final bool result = await UrlLauncherPlatform.instance.launch( + urlString, + useSafariVC: forceSafariVC ?? isWebURL, + useWebView: forceWebView ?? false, + enableJavaScript: enableJavaScript ?? false, + enableDomStorage: enableDomStorage ?? false, + universalLinksOnly: universalLinksOnly ?? false, + headers: headers ?? {}, ); if (statusBarBrightness != null) { WidgetsBinding.instance.renderView.automaticSystemUiAdjustment = @@ -109,10 +105,7 @@ Future canLaunch(String urlString) async { if (urlString == null) { return false; } - return await _channel.invokeMethod( - 'canLaunch', - {'url': urlString}, - ); + return await UrlLauncherPlatform.instance.canLaunch(urlString); } /// Closes the current WebView, if one was previously opened via a call to [launch]. @@ -127,5 +120,5 @@ Future canLaunch(String urlString) async { /// SafariViewController is only available on IOS version >= 9.0, this method does not do anything /// on IOS version below 9.0 Future closeWebView() async { - return await _channel.invokeMethod('closeWebView'); + return await UrlLauncherPlatform.instance.closeWebView(); } diff --git a/packages/url_launcher/url_launcher/pubspec.yaml b/packages/url_launcher/url_launcher/pubspec.yaml index 4763469d558d..f52ffa322e87 100644 --- a/packages/url_launcher/url_launcher/pubspec.yaml +++ b/packages/url_launcher/url_launcher/pubspec.yaml @@ -3,7 +3,7 @@ description: Flutter plugin for launching a URL on Android and iOS. Supports web, phone, SMS, and email schemes. author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/url_launcher/url_launcher -version: 5.2.3 +version: 5.2.4 flutter: plugin: @@ -14,10 +14,13 @@ flutter: dependencies: flutter: sdk: flutter + url_launcher_platform_interface: ^1.0.1 dev_dependencies: flutter_test: sdk: flutter + test: ^1.3.0 + mockito: ^4.1.1 environment: sdk: ">=2.0.0-dev.28.0 <3.0.0" diff --git a/packages/url_launcher/url_launcher/test/url_launcher_test.dart b/packages/url_launcher/url_launcher/test/url_launcher_test.dart index a70392810f86..e7150bebde05 100644 --- a/packages/url_launcher/url_launcher/test/url_launcher_test.dart +++ b/packages/url_launcher/url_launcher/test/url_launcher_test.dart @@ -2,50 +2,44 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:flutter/services.dart'; -import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:test/test.dart'; import 'package:url_launcher/url_launcher.dart'; +import 'package:url_launcher_platform_interface/url_launcher_platform_interface.dart'; +import 'package:flutter/services.dart' show PlatformException; void main() { - TestWidgetsFlutterBinding.ensureInitialized(); + final MockUrlLauncher mock = MockUrlLauncher(); + when(mock.isMock).thenReturn(true); - const MethodChannel channel = - MethodChannel('plugins.flutter.io/url_launcher'); - final List log = []; - channel.setMockMethodCallHandler((MethodCall methodCall) async { - log.add(methodCall); - }); - - tearDown(() { - log.clear(); - }); + UrlLauncherPlatform.instance = mock; test('canLaunch', () async { await canLaunch('http://example.com/'); - expect( - log, - [ - isMethodCall('canLaunch', arguments: { - 'url': 'http://example.com/', - }) - ], - ); + expect(verify(mock.canLaunch(captureAny)).captured.single, + 'http://example.com/'); }); test('launch default behavior', () async { await launch('http://example.com/'); expect( - log, - [ - isMethodCall('launch', arguments: { - 'url': 'http://example.com/', - 'useSafariVC': true, - 'useWebView': false, - 'enableJavaScript': false, - 'enableDomStorage': false, - 'universalLinksOnly': false, - 'headers': {}, - }) + verify(mock.launch( + captureAny, + useSafariVC: captureAnyNamed('useSafariVC'), + useWebView: captureAnyNamed('useWebView'), + enableJavaScript: captureAnyNamed('enableJavaScript'), + enableDomStorage: captureAnyNamed('enableDomStorage'), + universalLinksOnly: captureAnyNamed('universalLinksOnly'), + headers: captureAnyNamed('headers'), + )).captured, + [ + 'http://example.com/', + true, + false, + false, + false, + false, + {}, ], ); }); @@ -56,36 +50,32 @@ void main() { headers: {'key': 'value'}, ); expect( - log, - [ - isMethodCall('launch', arguments: { - 'url': 'http://example.com/', - 'useSafariVC': true, - 'useWebView': false, - 'enableJavaScript': false, - 'enableDomStorage': false, - 'universalLinksOnly': false, - 'headers': {'key': 'value'}, - }) - ], + verify(mock.launch( + any, + useSafariVC: anyNamed('useSafariVC'), + useWebView: anyNamed('useWebView'), + enableJavaScript: anyNamed('enableJavaScript'), + enableDomStorage: anyNamed('enableDomStorage'), + universalLinksOnly: anyNamed('universalLinksOnly'), + headers: captureAnyNamed('headers'), + )).captured.single, + {'key': 'value'}, ); }); test('launch force SafariVC', () async { await launch('http://example.com/', forceSafariVC: true); expect( - log, - [ - isMethodCall('launch', arguments: { - 'url': 'http://example.com/', - 'useSafariVC': true, - 'useWebView': false, - 'enableJavaScript': false, - 'enableDomStorage': false, - 'universalLinksOnly': false, - 'headers': {}, - }) - ], + verify(mock.launch( + any, + useSafariVC: captureAnyNamed('useSafariVC'), + useWebView: anyNamed('useWebView'), + enableJavaScript: anyNamed('enableJavaScript'), + enableDomStorage: anyNamed('enableDomStorage'), + universalLinksOnly: anyNamed('universalLinksOnly'), + headers: anyNamed('headers'), + )).captured.single, + true, ); }); @@ -93,36 +83,32 @@ void main() { await launch('http://example.com/', forceSafariVC: false, universalLinksOnly: true); expect( - log, - [ - isMethodCall('launch', arguments: { - 'url': 'http://example.com/', - 'useSafariVC': false, - 'useWebView': false, - 'enableJavaScript': false, - 'enableDomStorage': false, - 'universalLinksOnly': true, - 'headers': {}, - }) - ], + verify(mock.launch( + any, + useSafariVC: captureAnyNamed('useSafariVC'), + useWebView: anyNamed('useWebView'), + enableJavaScript: anyNamed('enableJavaScript'), + enableDomStorage: anyNamed('enableDomStorage'), + universalLinksOnly: captureAnyNamed('universalLinksOnly'), + headers: anyNamed('headers'), + )).captured, + [false, true], ); }); test('launch force WebView', () async { await launch('http://example.com/', forceWebView: true); expect( - log, - [ - isMethodCall('launch', arguments: { - 'url': 'http://example.com/', - 'useSafariVC': true, - 'useWebView': true, - 'enableJavaScript': false, - 'enableDomStorage': false, - 'universalLinksOnly': false, - 'headers': {}, - }) - ], + verify(mock.launch( + any, + useSafariVC: anyNamed('useSafariVC'), + useWebView: captureAnyNamed('useWebView'), + enableJavaScript: anyNamed('enableJavaScript'), + enableDomStorage: anyNamed('enableDomStorage'), + universalLinksOnly: anyNamed('universalLinksOnly'), + headers: anyNamed('headers'), + )).captured.single, + true, ); }); @@ -130,18 +116,16 @@ void main() { await launch('http://example.com/', forceWebView: true, enableJavaScript: true); expect( - log, - [ - isMethodCall('launch', arguments: { - 'url': 'http://example.com/', - 'useSafariVC': true, - 'useWebView': true, - 'enableJavaScript': true, - 'enableDomStorage': false, - 'universalLinksOnly': false, - 'headers': {}, - }) - ], + verify(mock.launch( + any, + useSafariVC: anyNamed('useSafariVC'), + useWebView: captureAnyNamed('useWebView'), + enableJavaScript: captureAnyNamed('enableJavaScript'), + enableDomStorage: anyNamed('enableDomStorage'), + universalLinksOnly: anyNamed('universalLinksOnly'), + headers: anyNamed('headers'), + )).captured, + [true, true], ); }); @@ -149,49 +133,45 @@ void main() { await launch('http://example.com/', forceWebView: true, enableDomStorage: true); expect( - log, - [ - isMethodCall('launch', arguments: { - 'url': 'http://example.com/', - 'useSafariVC': true, - 'useWebView': true, - 'enableJavaScript': false, - 'enableDomStorage': true, - 'universalLinksOnly': false, - 'headers': {}, - }) - ], + verify(mock.launch( + any, + useSafariVC: anyNamed('useSafariVC'), + useWebView: captureAnyNamed('useWebView'), + enableJavaScript: anyNamed('enableJavaScript'), + enableDomStorage: captureAnyNamed('enableDomStorage'), + universalLinksOnly: anyNamed('universalLinksOnly'), + headers: anyNamed('headers'), + )).captured, + [true, true], ); }); test('launch force SafariVC to false', () async { await launch('http://example.com/', forceSafariVC: false); expect( - log, - [ - isMethodCall('launch', arguments: { - 'url': 'http://example.com/', - 'useSafariVC': false, - 'useWebView': false, - 'enableJavaScript': false, - 'enableDomStorage': false, - 'universalLinksOnly': false, - 'headers': {}, - }) - ], + // ignore: missing_required_param + verify(mock.launch( + any, + useSafariVC: captureAnyNamed('useSafariVC'), + useWebView: anyNamed('useWebView'), + enableJavaScript: anyNamed('enableJavaScript'), + enableDomStorage: anyNamed('enableDomStorage'), + universalLinksOnly: anyNamed('universalLinksOnly'), + headers: anyNamed('headers'), + )).captured.single, + false, ); }); test('cannot launch a non-web in webview', () async { expect(() async => await launch('tel:555-555-5555', forceWebView: true), - throwsA(isInstanceOf())); + throwsA(isA())); }); test('closeWebView default behavior', () async { await closeWebView(); - expect( - log, - [isMethodCall('closeWebView', arguments: null)], - ); + verify(mock.closeWebView()); }); } + +class MockUrlLauncher extends Mock implements UrlLauncherPlatform {} diff --git a/script/build_all_plugins_app.sh b/script/build_all_plugins_app.sh index 6b70ee00e9b1..5ba4b6e5ce02 100755 --- a/script/build_all_plugins_app.sh +++ b/script/build_all_plugins_app.sh @@ -10,7 +10,7 @@ readonly REPO_DIR="$(dirname "$SCRIPT_DIR")" source "$SCRIPT_DIR/common.sh" check_changed_packages > /dev/null -(cd "$REPO_DIR" && pub global run flutter_plugin_tools all-plugins-app --exclude instrumentation_adapter) +(cd "$REPO_DIR" && pub global run flutter_plugin_tools all-plugins-app --exclude instrumentation_adapter,url_launcher_platform_interface) function error() { echo "$@" 1>&2