Skip to content

Commit c4c1a61

Browse files
rajveermalviyagnprice
authored andcommitted
content: Open links externally on iOS
On iOS we prefer LaunchMode.externalApplication because (for HTTP URLs) LaunchMode.platformDefault uses SFSafariViewController, which gives an awkward UX as described here: https://chat.zulip.org/#narrow/stream/48-mobile/topic/in-app.20browser/near/1169118 Fixes: zulip#280
1 parent 4932db1 commit c4c1a61

File tree

2 files changed

+15
-2
lines changed

2 files changed

+15
-2
lines changed

lib/widgets/content.dart

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import 'package:flutter/foundation.dart';
12
import 'package:flutter/gestures.dart';
23
import 'package:flutter/material.dart';
34
import 'package:flutter/services.dart';
@@ -895,7 +896,15 @@ void _launchUrl(BuildContext context, String urlString) async {
895896
bool launched = false;
896897
String? errorMessage;
897898
try {
898-
launched = await ZulipBinding.instance.launchUrl(url);
899+
launched = await ZulipBinding.instance.launchUrl(url,
900+
mode: switch (defaultTargetPlatform) {
901+
// On iOS we prefer LaunchMode.externalApplication because (for
902+
// HTTP URLs) LaunchMode.platformDefault uses SFSafariViewController,
903+
// which gives an awkward UX as described here:
904+
// https://chat.zulip.org/#narrow/stream/48-mobile/topic/in-app.20browser/near/1169118
905+
TargetPlatform.iOS => UrlLaunchMode.externalApplication,
906+
_ => UrlLaunchMode.platformDefault,
907+
});
899908
} on PlatformException catch (e) {
900909
errorMessage = e.message;
901910
}

test/widgets/content_test.dart

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'dart:io';
22

33
import 'package:checks/checks.dart';
4+
import 'package:flutter/foundation.dart';
45
import 'package:flutter/material.dart';
56
import 'package:flutter_gen/gen_l10n/zulip_localizations.dart';
67
import 'package:flutter_test/flutter_test.dart';
@@ -318,8 +319,11 @@ void main() {
318319
'<p><a href="https://example/">hello</a></p>');
319320

320321
await tapText(tester, find.text('hello'));
322+
323+
final expectedLaunchMode = defaultTargetPlatform == TargetPlatform.iOS ?
324+
LaunchMode.externalApplication : LaunchMode.platformDefault;
321325
check(testBinding.takeLaunchUrlCalls())
322-
.single.equals((url: Uri.parse('https://example/'), mode: LaunchMode.platformDefault));
326+
.single.equals((url: Uri.parse('https://example/'), mode: expectedLaunchMode));
323327
}, variant: const TargetPlatformVariant({TargetPlatform.android, TargetPlatform.iOS}));
324328

325329
testWidgets('multiple links in paragraph', (tester) async {

0 commit comments

Comments
 (0)