Skip to content

Commit

Permalink
[url_launcher] Use url_launcher_platform_interface to handle calls (f…
Browse files Browse the repository at this point in the history
…lutter#2228)

* [url_launcher] Use `url_launcher_platform_interface` to handle calls

* Exclude platform interface from all-plugins-app

* Update now that flutter#2230 has landed
  • Loading branch information
Harry Terkelsen authored and Park Sung Min committed Dec 17, 2019
1 parent 13dac5e commit c96c329
Show file tree
Hide file tree
Showing 5 changed files with 121 additions and 141 deletions.
4 changes: 4 additions & 0 deletions packages/url_launcher/url_launcher/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -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.
Expand Down
29 changes: 11 additions & 18 deletions packages/url_launcher/url_launcher/lib/url_launcher.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -84,17 +83,14 @@ Future<bool> launch(
? SystemUiOverlayStyle.dark
: SystemUiOverlayStyle.light);
}
final bool result = await _channel.invokeMethod<bool>(
'launch',
<String, Object>{
'url': urlString,
'useSafariVC': forceSafariVC ?? isWebURL,
'useWebView': forceWebView ?? false,
'enableJavaScript': enableJavaScript ?? false,
'enableDomStorage': enableDomStorage ?? false,
'universalLinksOnly': universalLinksOnly ?? false,
'headers': headers ?? <String, String>{},
},
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 ?? <String, String>{},
);
if (statusBarBrightness != null) {
WidgetsBinding.instance.renderView.automaticSystemUiAdjustment =
Expand All @@ -109,10 +105,7 @@ Future<bool> canLaunch(String urlString) async {
if (urlString == null) {
return false;
}
return await _channel.invokeMethod<bool>(
'canLaunch',
<String, Object>{'url': urlString},
);
return await UrlLauncherPlatform.instance.canLaunch(urlString);
}

/// Closes the current WebView, if one was previously opened via a call to [launch].
Expand All @@ -127,5 +120,5 @@ Future<bool> 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<void> closeWebView() async {
return await _channel.invokeMethod<void>('closeWebView');
return await UrlLauncherPlatform.instance.closeWebView();
}
5 changes: 4 additions & 1 deletion packages/url_launcher/url_launcher/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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 <flutter-dev@googlegroups.com>
homepage: https://github.com/flutter/plugins/tree/master/packages/url_launcher/url_launcher
version: 5.2.3
version: 5.2.4

flutter:
plugin:
Expand All @@ -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"
Expand Down
222 changes: 101 additions & 121 deletions packages/url_launcher/url_launcher/test/url_launcher_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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<MethodCall> log = <MethodCall>[];
channel.setMockMethodCallHandler((MethodCall methodCall) async {
log.add(methodCall);
});

tearDown(() {
log.clear();
});
UrlLauncherPlatform.instance = mock;

test('canLaunch', () async {
await canLaunch('http://example.com/');
expect(
log,
<Matcher>[
isMethodCall('canLaunch', arguments: <String, Object>{
'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,
<Matcher>[
isMethodCall('launch', arguments: <String, Object>{
'url': 'http://example.com/',
'useSafariVC': true,
'useWebView': false,
'enableJavaScript': false,
'enableDomStorage': false,
'universalLinksOnly': false,
'headers': <String, String>{},
})
verify(mock.launch(
captureAny,
useSafariVC: captureAnyNamed('useSafariVC'),
useWebView: captureAnyNamed('useWebView'),
enableJavaScript: captureAnyNamed('enableJavaScript'),
enableDomStorage: captureAnyNamed('enableDomStorage'),
universalLinksOnly: captureAnyNamed('universalLinksOnly'),
headers: captureAnyNamed('headers'),
)).captured,
<dynamic>[
'http://example.com/',
true,
false,
false,
false,
false,
<String, String>{},
],
);
});
Expand All @@ -56,142 +50,128 @@ void main() {
headers: <String, String>{'key': 'value'},
);
expect(
log,
<Matcher>[
isMethodCall('launch', arguments: <String, Object>{
'url': 'http://example.com/',
'useSafariVC': true,
'useWebView': false,
'enableJavaScript': false,
'enableDomStorage': false,
'universalLinksOnly': false,
'headers': <String, String>{'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,
<String, String>{'key': 'value'},
);
});

test('launch force SafariVC', () async {
await launch('http://example.com/', forceSafariVC: true);
expect(
log,
<Matcher>[
isMethodCall('launch', arguments: <String, Object>{
'url': 'http://example.com/',
'useSafariVC': true,
'useWebView': false,
'enableJavaScript': false,
'enableDomStorage': false,
'universalLinksOnly': false,
'headers': <String, String>{},
})
],
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,
);
});

test('launch universal links only', () async {
await launch('http://example.com/',
forceSafariVC: false, universalLinksOnly: true);
expect(
log,
<Matcher>[
isMethodCall('launch', arguments: <String, Object>{
'url': 'http://example.com/',
'useSafariVC': false,
'useWebView': false,
'enableJavaScript': false,
'enableDomStorage': false,
'universalLinksOnly': true,
'headers': <String, String>{},
})
],
verify(mock.launch(
any,
useSafariVC: captureAnyNamed('useSafariVC'),
useWebView: anyNamed('useWebView'),
enableJavaScript: anyNamed('enableJavaScript'),
enableDomStorage: anyNamed('enableDomStorage'),
universalLinksOnly: captureAnyNamed('universalLinksOnly'),
headers: anyNamed('headers'),
)).captured,
<bool>[false, true],
);
});

test('launch force WebView', () async {
await launch('http://example.com/', forceWebView: true);
expect(
log,
<Matcher>[
isMethodCall('launch', arguments: <String, Object>{
'url': 'http://example.com/',
'useSafariVC': true,
'useWebView': true,
'enableJavaScript': false,
'enableDomStorage': false,
'universalLinksOnly': false,
'headers': <String, String>{},
})
],
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,
);
});

test('launch force WebView enable javascript', () async {
await launch('http://example.com/',
forceWebView: true, enableJavaScript: true);
expect(
log,
<Matcher>[
isMethodCall('launch', arguments: <String, Object>{
'url': 'http://example.com/',
'useSafariVC': true,
'useWebView': true,
'enableJavaScript': true,
'enableDomStorage': false,
'universalLinksOnly': false,
'headers': <String, String>{},
})
],
verify(mock.launch(
any,
useSafariVC: anyNamed('useSafariVC'),
useWebView: captureAnyNamed('useWebView'),
enableJavaScript: captureAnyNamed('enableJavaScript'),
enableDomStorage: anyNamed('enableDomStorage'),
universalLinksOnly: anyNamed('universalLinksOnly'),
headers: anyNamed('headers'),
)).captured,
<bool>[true, true],
);
});

test('launch force WebView enable DOM storage', () async {
await launch('http://example.com/',
forceWebView: true, enableDomStorage: true);
expect(
log,
<Matcher>[
isMethodCall('launch', arguments: <String, Object>{
'url': 'http://example.com/',
'useSafariVC': true,
'useWebView': true,
'enableJavaScript': false,
'enableDomStorage': true,
'universalLinksOnly': false,
'headers': <String, String>{},
})
],
verify(mock.launch(
any,
useSafariVC: anyNamed('useSafariVC'),
useWebView: captureAnyNamed('useWebView'),
enableJavaScript: anyNamed('enableJavaScript'),
enableDomStorage: captureAnyNamed('enableDomStorage'),
universalLinksOnly: anyNamed('universalLinksOnly'),
headers: anyNamed('headers'),
)).captured,
<bool>[true, true],
);
});

test('launch force SafariVC to false', () async {
await launch('http://example.com/', forceSafariVC: false);
expect(
log,
<Matcher>[
isMethodCall('launch', arguments: <String, Object>{
'url': 'http://example.com/',
'useSafariVC': false,
'useWebView': false,
'enableJavaScript': false,
'enableDomStorage': false,
'universalLinksOnly': false,
'headers': <String, String>{},
})
],
// 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<PlatformException>()));
throwsA(isA<PlatformException>()));
});

test('closeWebView default behavior', () async {
await closeWebView();
expect(
log,
<Matcher>[isMethodCall('closeWebView', arguments: null)],
);
verify(mock.closeWebView());
});
}

class MockUrlLauncher extends Mock implements UrlLauncherPlatform {}
2 changes: 1 addition & 1 deletion script/build_all_plugins_app.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit c96c329

Please sign in to comment.