Skip to content
This repository was archived by the owner on Feb 22, 2023. It is now read-only.

Commit 99feee9

Browse files
authored
[url_launcher] Move away from shared method channel implementation in native packages. (#4719)
* Move away from shared method channel implementation in native packages. * Implement PR Feedback Implement PR Feedback Implement PR Feedback * Fix missed test * Implement PR feedback
1 parent 039068e commit 99feee9

File tree

26 files changed

+1213
-17
lines changed

26 files changed

+1213
-17
lines changed

packages/url_launcher/url_launcher_android/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 6.0.15
2+
3+
* Switches to an in-package method channel implementation.
4+
15
## 6.0.14
26

37
* Updates code for new analysis options.

packages/url_launcher/url_launcher_android/android/src/main/java/io/flutter/plugins/urllauncher/MethodCallHandlerImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ void startListening(BinaryMessenger messenger) {
6161
stopListening();
6262
}
6363

64-
channel = new MethodChannel(messenger, "plugins.flutter.io/url_launcher");
64+
channel = new MethodChannel(messenger, "plugins.flutter.io/url_launcher_android");
6565
channel.setMethodCallHandler(this);
6666
}
6767

packages/url_launcher/url_launcher_android/android/src/test/java/io/flutter/plugins/urllauncher/MethodCallHandlerImplTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727

2828
@RunWith(RobolectricTestRunner.class)
2929
public class MethodCallHandlerImplTest {
30-
private static final String CHANNEL_NAME = "plugins.flutter.io/url_launcher";
30+
private static final String CHANNEL_NAME = "plugins.flutter.io/url_launcher_android";
3131
private UrlLauncher urlLauncher;
3232
private MethodCallHandlerImpl methodCallHandler;
3333

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
// Copyright 2013 The Flutter Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
import 'dart:async';
6+
7+
import 'package:flutter/services.dart';
8+
import 'package:url_launcher_platform_interface/link.dart';
9+
import 'package:url_launcher_platform_interface/url_launcher_platform_interface.dart';
10+
11+
const MethodChannel _channel =
12+
MethodChannel('plugins.flutter.io/url_launcher_android');
13+
14+
/// An implementation of [UrlLauncherPlatform] for Android.
15+
class UrlLauncherAndroid extends UrlLauncherPlatform {
16+
/// Registers this class as the default instance of [UrlLauncherPlatform].
17+
static void registerWith() {
18+
UrlLauncherPlatform.instance = UrlLauncherAndroid();
19+
}
20+
21+
@override
22+
final LinkDelegate? linkDelegate = null;
23+
24+
@override
25+
Future<bool> canLaunch(String url) {
26+
return _channel.invokeMethod<bool>(
27+
'canLaunch',
28+
<String, Object>{'url': url},
29+
).then((bool? value) => value ?? false);
30+
}
31+
32+
@override
33+
Future<void> closeWebView() {
34+
return _channel.invokeMethod<void>('closeWebView');
35+
}
36+
37+
@override
38+
Future<bool> launch(
39+
String url, {
40+
required bool useSafariVC,
41+
required bool useWebView,
42+
required bool enableJavaScript,
43+
required bool enableDomStorage,
44+
required bool universalLinksOnly,
45+
required Map<String, String> headers,
46+
String? webOnlyWindowName,
47+
}) {
48+
return _channel.invokeMethod<bool>(
49+
'launch',
50+
<String, Object>{
51+
'url': url,
52+
'useWebView': useWebView,
53+
'enableJavaScript': enableJavaScript,
54+
'enableDomStorage': enableDomStorage,
55+
'universalLinksOnly': universalLinksOnly,
56+
'headers': headers,
57+
},
58+
).then((bool? value) => value ?? false);
59+
}
60+
}

packages/url_launcher/url_launcher_android/pubspec.yaml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ name: url_launcher_android
22
description: Android implementation of the url_launcher plugin.
33
repository: https://github.com/flutter/plugins/tree/main/packages/url_launcher/url_launcher_android
44
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+url_launcher%22
5-
version: 6.0.14
5+
version: 6.0.15
66

77
environment:
88
sdk: ">=2.14.0 <3.0.0"
9-
flutter: ">=2.5.0"
9+
flutter: ">=2.8.0"
1010

1111
flutter:
1212
plugin:
@@ -15,6 +15,7 @@ flutter:
1515
android:
1616
package: io.flutter.plugins.urllauncher
1717
pluginClass: UrlLauncherPlugin
18+
dartPluginClass: UrlLauncherAndroid
1819

1920
dependencies:
2021
flutter:
Lines changed: 234 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,234 @@
1+
// Copyright 2013 The Flutter Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
import 'package:flutter/services.dart';
6+
import 'package:flutter_test/flutter_test.dart';
7+
import 'package:url_launcher_android/url_launcher_android.dart';
8+
import 'package:url_launcher_platform_interface/url_launcher_platform_interface.dart';
9+
10+
void main() {
11+
TestWidgetsFlutterBinding.ensureInitialized();
12+
13+
group('$UrlLauncherAndroid', () {
14+
const MethodChannel channel =
15+
MethodChannel('plugins.flutter.io/url_launcher_android');
16+
final List<MethodCall> log = <MethodCall>[];
17+
channel.setMockMethodCallHandler((MethodCall methodCall) async {
18+
log.add(methodCall);
19+
20+
// Return null explicitly instead of relying on the implicit null
21+
// returned by the method channel if no return statement is specified.
22+
return null;
23+
});
24+
25+
tearDown(() {
26+
log.clear();
27+
});
28+
29+
test('registers instance', () {
30+
UrlLauncherAndroid.registerWith();
31+
expect(UrlLauncherPlatform.instance, isA<UrlLauncherAndroid>());
32+
});
33+
34+
test('canLaunch', () async {
35+
final UrlLauncherAndroid launcher = UrlLauncherAndroid();
36+
await launcher.canLaunch('http://example.com/');
37+
expect(
38+
log,
39+
<Matcher>[
40+
isMethodCall('canLaunch', arguments: <String, Object>{
41+
'url': 'http://example.com/',
42+
})
43+
],
44+
);
45+
});
46+
47+
test('canLaunch should return false if platform returns null', () async {
48+
final UrlLauncherAndroid launcher = UrlLauncherAndroid();
49+
final bool canLaunch = await launcher.canLaunch('http://example.com/');
50+
51+
expect(canLaunch, false);
52+
});
53+
54+
test('launch', () async {
55+
final UrlLauncherAndroid launcher = UrlLauncherAndroid();
56+
await launcher.launch(
57+
'http://example.com/',
58+
useSafariVC: true,
59+
useWebView: false,
60+
enableJavaScript: false,
61+
enableDomStorage: false,
62+
universalLinksOnly: false,
63+
headers: const <String, String>{},
64+
);
65+
expect(
66+
log,
67+
<Matcher>[
68+
isMethodCall('launch', arguments: <String, Object>{
69+
'url': 'http://example.com/',
70+
'useWebView': false,
71+
'enableJavaScript': false,
72+
'enableDomStorage': false,
73+
'universalLinksOnly': false,
74+
'headers': <String, String>{},
75+
})
76+
],
77+
);
78+
});
79+
80+
test('launch with headers', () async {
81+
final UrlLauncherAndroid launcher = UrlLauncherAndroid();
82+
await launcher.launch(
83+
'http://example.com/',
84+
useSafariVC: true,
85+
useWebView: false,
86+
enableJavaScript: false,
87+
enableDomStorage: false,
88+
universalLinksOnly: false,
89+
headers: const <String, String>{'key': 'value'},
90+
);
91+
expect(
92+
log,
93+
<Matcher>[
94+
isMethodCall('launch', arguments: <String, Object>{
95+
'url': 'http://example.com/',
96+
'useWebView': false,
97+
'enableJavaScript': false,
98+
'enableDomStorage': false,
99+
'universalLinksOnly': false,
100+
'headers': <String, String>{'key': 'value'},
101+
})
102+
],
103+
);
104+
});
105+
106+
test('launch universal links only', () async {
107+
final UrlLauncherAndroid launcher = UrlLauncherAndroid();
108+
await launcher.launch(
109+
'http://example.com/',
110+
useSafariVC: false,
111+
useWebView: false,
112+
enableJavaScript: false,
113+
enableDomStorage: false,
114+
universalLinksOnly: true,
115+
headers: const <String, String>{},
116+
);
117+
expect(
118+
log,
119+
<Matcher>[
120+
isMethodCall('launch', arguments: <String, Object>{
121+
'url': 'http://example.com/',
122+
'useWebView': false,
123+
'enableJavaScript': false,
124+
'enableDomStorage': false,
125+
'universalLinksOnly': true,
126+
'headers': <String, String>{},
127+
})
128+
],
129+
);
130+
});
131+
132+
test('launch force WebView', () async {
133+
final UrlLauncherAndroid launcher = UrlLauncherAndroid();
134+
await launcher.launch(
135+
'http://example.com/',
136+
useSafariVC: true,
137+
useWebView: true,
138+
enableJavaScript: false,
139+
enableDomStorage: false,
140+
universalLinksOnly: false,
141+
headers: const <String, String>{},
142+
);
143+
expect(
144+
log,
145+
<Matcher>[
146+
isMethodCall('launch', arguments: <String, Object>{
147+
'url': 'http://example.com/',
148+
'useWebView': true,
149+
'enableJavaScript': false,
150+
'enableDomStorage': false,
151+
'universalLinksOnly': false,
152+
'headers': <String, String>{},
153+
})
154+
],
155+
);
156+
});
157+
158+
test('launch force WebView enable javascript', () async {
159+
final UrlLauncherAndroid launcher = UrlLauncherAndroid();
160+
await launcher.launch(
161+
'http://example.com/',
162+
useSafariVC: true,
163+
useWebView: true,
164+
enableJavaScript: true,
165+
enableDomStorage: false,
166+
universalLinksOnly: false,
167+
headers: const <String, String>{},
168+
);
169+
expect(
170+
log,
171+
<Matcher>[
172+
isMethodCall('launch', arguments: <String, Object>{
173+
'url': 'http://example.com/',
174+
'useWebView': true,
175+
'enableJavaScript': true,
176+
'enableDomStorage': false,
177+
'universalLinksOnly': false,
178+
'headers': <String, String>{},
179+
})
180+
],
181+
);
182+
});
183+
184+
test('launch force WebView enable DOM storage', () async {
185+
final UrlLauncherAndroid launcher = UrlLauncherAndroid();
186+
await launcher.launch(
187+
'http://example.com/',
188+
useSafariVC: true,
189+
useWebView: true,
190+
enableJavaScript: false,
191+
enableDomStorage: true,
192+
universalLinksOnly: false,
193+
headers: const <String, String>{},
194+
);
195+
expect(
196+
log,
197+
<Matcher>[
198+
isMethodCall('launch', arguments: <String, Object>{
199+
'url': 'http://example.com/',
200+
'useWebView': true,
201+
'enableJavaScript': false,
202+
'enableDomStorage': true,
203+
'universalLinksOnly': false,
204+
'headers': <String, String>{},
205+
})
206+
],
207+
);
208+
});
209+
210+
test('launch should return false if platform returns null', () async {
211+
final UrlLauncherAndroid launcher = UrlLauncherAndroid();
212+
final bool launched = await launcher.launch(
213+
'http://example.com/',
214+
useSafariVC: true,
215+
useWebView: false,
216+
enableJavaScript: false,
217+
enableDomStorage: false,
218+
universalLinksOnly: false,
219+
headers: const <String, String>{},
220+
);
221+
222+
expect(launched, false);
223+
});
224+
225+
test('closeWebView default behavior', () async {
226+
final UrlLauncherAndroid launcher = UrlLauncherAndroid();
227+
await launcher.closeWebView();
228+
expect(
229+
log,
230+
<Matcher>[isMethodCall('closeWebView', arguments: null)],
231+
);
232+
});
233+
});
234+
}

packages/url_launcher/url_launcher_ios/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 6.0.15
2+
3+
* Switches to an in-package method channel implementation.
4+
15
## 6.0.14
26

37
* Updates code for new analysis options.

packages/url_launcher/url_launcher_ios/ios/Classes/FLTURLLauncherPlugin.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ @implementation FLTURLLauncherPlugin
6363

6464
+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar> *)registrar {
6565
FlutterMethodChannel *channel =
66-
[FlutterMethodChannel methodChannelWithName:@"plugins.flutter.io/url_launcher"
66+
[FlutterMethodChannel methodChannelWithName:@"plugins.flutter.io/url_launcher_ios"
6767
binaryMessenger:registrar.messenger];
6868
FLTURLLauncherPlugin *plugin = [[FLTURLLauncherPlugin alloc] init];
6969
[registrar addMethodCallDelegate:plugin channel:channel];

0 commit comments

Comments
 (0)