Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 63b4e6b

Browse files
author
Harry Terkelsen
authored
[url_launcher] Use url_launcher_platform_interface to handle calls (flutter#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
1 parent a68932e commit 63b4e6b

File tree

5 files changed

+121
-141
lines changed

5 files changed

+121
-141
lines changed

packages/url_launcher/url_launcher/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 5.2.4
2+
3+
* Use `package:url_launcher_platform_interface` to get the platform-specific implementation.
4+
15
## 5.2.3
26

37
Android: Use android.arch.lifecycle instead of androidx.lifecycle:lifecycle in `build.gradle` to support apps that has not been migrated to AndroidX.

packages/url_launcher/url_launcher/lib/url_launcher.dart

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@ import 'dart:async';
77
import 'package:flutter/foundation.dart';
88
import 'package:flutter/services.dart';
99
import 'package:flutter/widgets.dart';
10-
11-
const MethodChannel _channel = MethodChannel('plugins.flutter.io/url_launcher');
10+
import 'package:url_launcher_platform_interface/url_launcher_platform_interface.dart';
1211

1312
/// Parses the specified URL string and delegates handling of it to the
1413
/// underlying platform.
@@ -84,17 +83,14 @@ Future<bool> launch(
8483
? SystemUiOverlayStyle.dark
8584
: SystemUiOverlayStyle.light);
8685
}
87-
final bool result = await _channel.invokeMethod<bool>(
88-
'launch',
89-
<String, Object>{
90-
'url': urlString,
91-
'useSafariVC': forceSafariVC ?? isWebURL,
92-
'useWebView': forceWebView ?? false,
93-
'enableJavaScript': enableJavaScript ?? false,
94-
'enableDomStorage': enableDomStorage ?? false,
95-
'universalLinksOnly': universalLinksOnly ?? false,
96-
'headers': headers ?? <String, String>{},
97-
},
86+
final bool result = await UrlLauncherPlatform.instance.launch(
87+
urlString,
88+
useSafariVC: forceSafariVC ?? isWebURL,
89+
useWebView: forceWebView ?? false,
90+
enableJavaScript: enableJavaScript ?? false,
91+
enableDomStorage: enableDomStorage ?? false,
92+
universalLinksOnly: universalLinksOnly ?? false,
93+
headers: headers ?? <String, String>{},
9894
);
9995
if (statusBarBrightness != null) {
10096
WidgetsBinding.instance.renderView.automaticSystemUiAdjustment =
@@ -109,10 +105,7 @@ Future<bool> canLaunch(String urlString) async {
109105
if (urlString == null) {
110106
return false;
111107
}
112-
return await _channel.invokeMethod<bool>(
113-
'canLaunch',
114-
<String, Object>{'url': urlString},
115-
);
108+
return await UrlLauncherPlatform.instance.canLaunch(urlString);
116109
}
117110

118111
/// Closes the current WebView, if one was previously opened via a call to [launch].
@@ -127,5 +120,5 @@ Future<bool> canLaunch(String urlString) async {
127120
/// SafariViewController is only available on IOS version >= 9.0, this method does not do anything
128121
/// on IOS version below 9.0
129122
Future<void> closeWebView() async {
130-
return await _channel.invokeMethod<void>('closeWebView');
123+
return await UrlLauncherPlatform.instance.closeWebView();
131124
}

packages/url_launcher/url_launcher/pubspec.yaml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ description: Flutter plugin for launching a URL on Android and iOS. Supports
33
web, phone, SMS, and email schemes.
44
author: Flutter Team <[email protected]>
55
homepage: https://github.com/flutter/plugins/tree/master/packages/url_launcher/url_launcher
6-
version: 5.2.3
6+
version: 5.2.4
77

88
flutter:
99
plugin:
@@ -14,10 +14,13 @@ flutter:
1414
dependencies:
1515
flutter:
1616
sdk: flutter
17+
url_launcher_platform_interface: ^1.0.1
1718

1819
dev_dependencies:
1920
flutter_test:
2021
sdk: flutter
22+
test: ^1.3.0
23+
mockito: ^4.1.1
2124

2225
environment:
2326
sdk: ">=2.0.0-dev.28.0 <3.0.0"

packages/url_launcher/url_launcher/test/url_launcher_test.dart

Lines changed: 101 additions & 121 deletions
Original file line numberDiff line numberDiff line change
@@ -2,50 +2,44 @@
22
// Use of this source code is governed by a BSD-style license that can be
33
// found in the LICENSE file.
44

5-
import 'package:flutter/services.dart';
6-
import 'package:flutter_test/flutter_test.dart';
5+
import 'package:mockito/mockito.dart';
6+
import 'package:test/test.dart';
77
import 'package:url_launcher/url_launcher.dart';
8+
import 'package:url_launcher_platform_interface/url_launcher_platform_interface.dart';
9+
import 'package:flutter/services.dart' show PlatformException;
810

911
void main() {
10-
TestWidgetsFlutterBinding.ensureInitialized();
12+
final MockUrlLauncher mock = MockUrlLauncher();
13+
when(mock.isMock).thenReturn(true);
1114

12-
const MethodChannel channel =
13-
MethodChannel('plugins.flutter.io/url_launcher');
14-
final List<MethodCall> log = <MethodCall>[];
15-
channel.setMockMethodCallHandler((MethodCall methodCall) async {
16-
log.add(methodCall);
17-
});
18-
19-
tearDown(() {
20-
log.clear();
21-
});
15+
UrlLauncherPlatform.instance = mock;
2216

2317
test('canLaunch', () async {
2418
await canLaunch('http://example.com/');
25-
expect(
26-
log,
27-
<Matcher>[
28-
isMethodCall('canLaunch', arguments: <String, Object>{
29-
'url': 'http://example.com/',
30-
})
31-
],
32-
);
19+
expect(verify(mock.canLaunch(captureAny)).captured.single,
20+
'http://example.com/');
3321
});
3422

3523
test('launch default behavior', () async {
3624
await launch('http://example.com/');
3725
expect(
38-
log,
39-
<Matcher>[
40-
isMethodCall('launch', arguments: <String, Object>{
41-
'url': 'http://example.com/',
42-
'useSafariVC': true,
43-
'useWebView': false,
44-
'enableJavaScript': false,
45-
'enableDomStorage': false,
46-
'universalLinksOnly': false,
47-
'headers': <String, String>{},
48-
})
26+
verify(mock.launch(
27+
captureAny,
28+
useSafariVC: captureAnyNamed('useSafariVC'),
29+
useWebView: captureAnyNamed('useWebView'),
30+
enableJavaScript: captureAnyNamed('enableJavaScript'),
31+
enableDomStorage: captureAnyNamed('enableDomStorage'),
32+
universalLinksOnly: captureAnyNamed('universalLinksOnly'),
33+
headers: captureAnyNamed('headers'),
34+
)).captured,
35+
<dynamic>[
36+
'http://example.com/',
37+
true,
38+
false,
39+
false,
40+
false,
41+
false,
42+
<String, String>{},
4943
],
5044
);
5145
});
@@ -56,142 +50,128 @@ void main() {
5650
headers: <String, String>{'key': 'value'},
5751
);
5852
expect(
59-
log,
60-
<Matcher>[
61-
isMethodCall('launch', arguments: <String, Object>{
62-
'url': 'http://example.com/',
63-
'useSafariVC': true,
64-
'useWebView': false,
65-
'enableJavaScript': false,
66-
'enableDomStorage': false,
67-
'universalLinksOnly': false,
68-
'headers': <String, String>{'key': 'value'},
69-
})
70-
],
53+
verify(mock.launch(
54+
any,
55+
useSafariVC: anyNamed('useSafariVC'),
56+
useWebView: anyNamed('useWebView'),
57+
enableJavaScript: anyNamed('enableJavaScript'),
58+
enableDomStorage: anyNamed('enableDomStorage'),
59+
universalLinksOnly: anyNamed('universalLinksOnly'),
60+
headers: captureAnyNamed('headers'),
61+
)).captured.single,
62+
<String, String>{'key': 'value'},
7163
);
7264
});
7365

7466
test('launch force SafariVC', () async {
7567
await launch('http://example.com/', forceSafariVC: true);
7668
expect(
77-
log,
78-
<Matcher>[
79-
isMethodCall('launch', arguments: <String, Object>{
80-
'url': 'http://example.com/',
81-
'useSafariVC': true,
82-
'useWebView': false,
83-
'enableJavaScript': false,
84-
'enableDomStorage': false,
85-
'universalLinksOnly': false,
86-
'headers': <String, String>{},
87-
})
88-
],
69+
verify(mock.launch(
70+
any,
71+
useSafariVC: captureAnyNamed('useSafariVC'),
72+
useWebView: anyNamed('useWebView'),
73+
enableJavaScript: anyNamed('enableJavaScript'),
74+
enableDomStorage: anyNamed('enableDomStorage'),
75+
universalLinksOnly: anyNamed('universalLinksOnly'),
76+
headers: anyNamed('headers'),
77+
)).captured.single,
78+
true,
8979
);
9080
});
9181

9282
test('launch universal links only', () async {
9383
await launch('http://example.com/',
9484
forceSafariVC: false, universalLinksOnly: true);
9585
expect(
96-
log,
97-
<Matcher>[
98-
isMethodCall('launch', arguments: <String, Object>{
99-
'url': 'http://example.com/',
100-
'useSafariVC': false,
101-
'useWebView': false,
102-
'enableJavaScript': false,
103-
'enableDomStorage': false,
104-
'universalLinksOnly': true,
105-
'headers': <String, String>{},
106-
})
107-
],
86+
verify(mock.launch(
87+
any,
88+
useSafariVC: captureAnyNamed('useSafariVC'),
89+
useWebView: anyNamed('useWebView'),
90+
enableJavaScript: anyNamed('enableJavaScript'),
91+
enableDomStorage: anyNamed('enableDomStorage'),
92+
universalLinksOnly: captureAnyNamed('universalLinksOnly'),
93+
headers: anyNamed('headers'),
94+
)).captured,
95+
<bool>[false, true],
10896
);
10997
});
11098

11199
test('launch force WebView', () async {
112100
await launch('http://example.com/', forceWebView: true);
113101
expect(
114-
log,
115-
<Matcher>[
116-
isMethodCall('launch', arguments: <String, Object>{
117-
'url': 'http://example.com/',
118-
'useSafariVC': true,
119-
'useWebView': true,
120-
'enableJavaScript': false,
121-
'enableDomStorage': false,
122-
'universalLinksOnly': false,
123-
'headers': <String, String>{},
124-
})
125-
],
102+
verify(mock.launch(
103+
any,
104+
useSafariVC: anyNamed('useSafariVC'),
105+
useWebView: captureAnyNamed('useWebView'),
106+
enableJavaScript: anyNamed('enableJavaScript'),
107+
enableDomStorage: anyNamed('enableDomStorage'),
108+
universalLinksOnly: anyNamed('universalLinksOnly'),
109+
headers: anyNamed('headers'),
110+
)).captured.single,
111+
true,
126112
);
127113
});
128114

129115
test('launch force WebView enable javascript', () async {
130116
await launch('http://example.com/',
131117
forceWebView: true, enableJavaScript: true);
132118
expect(
133-
log,
134-
<Matcher>[
135-
isMethodCall('launch', arguments: <String, Object>{
136-
'url': 'http://example.com/',
137-
'useSafariVC': true,
138-
'useWebView': true,
139-
'enableJavaScript': true,
140-
'enableDomStorage': false,
141-
'universalLinksOnly': false,
142-
'headers': <String, String>{},
143-
})
144-
],
119+
verify(mock.launch(
120+
any,
121+
useSafariVC: anyNamed('useSafariVC'),
122+
useWebView: captureAnyNamed('useWebView'),
123+
enableJavaScript: captureAnyNamed('enableJavaScript'),
124+
enableDomStorage: anyNamed('enableDomStorage'),
125+
universalLinksOnly: anyNamed('universalLinksOnly'),
126+
headers: anyNamed('headers'),
127+
)).captured,
128+
<bool>[true, true],
145129
);
146130
});
147131

148132
test('launch force WebView enable DOM storage', () async {
149133
await launch('http://example.com/',
150134
forceWebView: true, enableDomStorage: true);
151135
expect(
152-
log,
153-
<Matcher>[
154-
isMethodCall('launch', arguments: <String, Object>{
155-
'url': 'http://example.com/',
156-
'useSafariVC': true,
157-
'useWebView': true,
158-
'enableJavaScript': false,
159-
'enableDomStorage': true,
160-
'universalLinksOnly': false,
161-
'headers': <String, String>{},
162-
})
163-
],
136+
verify(mock.launch(
137+
any,
138+
useSafariVC: anyNamed('useSafariVC'),
139+
useWebView: captureAnyNamed('useWebView'),
140+
enableJavaScript: anyNamed('enableJavaScript'),
141+
enableDomStorage: captureAnyNamed('enableDomStorage'),
142+
universalLinksOnly: anyNamed('universalLinksOnly'),
143+
headers: anyNamed('headers'),
144+
)).captured,
145+
<bool>[true, true],
164146
);
165147
});
166148

167149
test('launch force SafariVC to false', () async {
168150
await launch('http://example.com/', forceSafariVC: false);
169151
expect(
170-
log,
171-
<Matcher>[
172-
isMethodCall('launch', arguments: <String, Object>{
173-
'url': 'http://example.com/',
174-
'useSafariVC': false,
175-
'useWebView': false,
176-
'enableJavaScript': false,
177-
'enableDomStorage': false,
178-
'universalLinksOnly': false,
179-
'headers': <String, String>{},
180-
})
181-
],
152+
// ignore: missing_required_param
153+
verify(mock.launch(
154+
any,
155+
useSafariVC: captureAnyNamed('useSafariVC'),
156+
useWebView: anyNamed('useWebView'),
157+
enableJavaScript: anyNamed('enableJavaScript'),
158+
enableDomStorage: anyNamed('enableDomStorage'),
159+
universalLinksOnly: anyNamed('universalLinksOnly'),
160+
headers: anyNamed('headers'),
161+
)).captured.single,
162+
false,
182163
);
183164
});
184165

185166
test('cannot launch a non-web in webview', () async {
186167
expect(() async => await launch('tel:555-555-5555', forceWebView: true),
187-
throwsA(isInstanceOf<PlatformException>()));
168+
throwsA(isA<PlatformException>()));
188169
});
189170

190171
test('closeWebView default behavior', () async {
191172
await closeWebView();
192-
expect(
193-
log,
194-
<Matcher>[isMethodCall('closeWebView', arguments: null)],
195-
);
173+
verify(mock.closeWebView());
196174
});
197175
}
176+
177+
class MockUrlLauncher extends Mock implements UrlLauncherPlatform {}

script/build_all_plugins_app.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ readonly REPO_DIR="$(dirname "$SCRIPT_DIR")"
1010
source "$SCRIPT_DIR/common.sh"
1111
check_changed_packages > /dev/null
1212

13-
(cd "$REPO_DIR" && pub global run flutter_plugin_tools all-plugins-app --exclude instrumentation_adapter)
13+
(cd "$REPO_DIR" && pub global run flutter_plugin_tools all-plugins-app --exclude instrumentation_adapter,url_launcher_platform_interface)
1414

1515
function error() {
1616
echo "$@" 1>&2

0 commit comments

Comments
 (0)