Skip to content

Commit 9d27190

Browse files
committed
settings: Add browser preference setting ui
The translation for the label is taken from zulip-mobile. The UI currently does not have a design, and is made to be as simple as possible to implement for now. Signed-off-by: Zixuan James Li <[email protected]>
1 parent 42803b4 commit 9d27190

12 files changed

+112
-0
lines changed

assets/l10n/app_en.arb

+4
Original file line numberDiff line numberDiff line change
@@ -803,6 +803,10 @@
803803
"@themeSettingSystem": {
804804
"description": "Label for system theme setting."
805805
},
806+
"openLinksWithInAppBrowser": "Open links with in-app browser",
807+
"@openLinksWithInAppBrowser": {
808+
"description": "Label for toggling setting to open links with in-app browser"
809+
},
806810
"pollWidgetQuestionMissing": "No question.",
807811
"@pollWidgetQuestionMissing": {
808812
"description": "Text to display for a poll when the question is missing"

lib/generated/l10n/zulip_localizations.dart

+6
Original file line numberDiff line numberDiff line change
@@ -1173,6 +1173,12 @@ abstract class ZulipLocalizations {
11731173
/// **'System'**
11741174
String get themeSettingSystem;
11751175

1176+
/// Label for toggling setting to open links with in-app browser
1177+
///
1178+
/// In en, this message translates to:
1179+
/// **'Open links with in-app browser'**
1180+
String get openLinksWithInAppBrowser;
1181+
11761182
/// Text to display for a poll when the question is missing
11771183
///
11781184
/// In en, this message translates to:

lib/generated/l10n/zulip_localizations_ar.dart

+3
Original file line numberDiff line numberDiff line change
@@ -628,6 +628,9 @@ class ZulipLocalizationsAr extends ZulipLocalizations {
628628
@override
629629
String get themeSettingSystem => 'System';
630630

631+
@override
632+
String get openLinksWithInAppBrowser => 'Open links with in-app browser';
633+
631634
@override
632635
String get pollWidgetQuestionMissing => 'No question.';
633636

lib/generated/l10n/zulip_localizations_en.dart

+3
Original file line numberDiff line numberDiff line change
@@ -628,6 +628,9 @@ class ZulipLocalizationsEn extends ZulipLocalizations {
628628
@override
629629
String get themeSettingSystem => 'System';
630630

631+
@override
632+
String get openLinksWithInAppBrowser => 'Open links with in-app browser';
633+
631634
@override
632635
String get pollWidgetQuestionMissing => 'No question.';
633636

lib/generated/l10n/zulip_localizations_ja.dart

+3
Original file line numberDiff line numberDiff line change
@@ -628,6 +628,9 @@ class ZulipLocalizationsJa extends ZulipLocalizations {
628628
@override
629629
String get themeSettingSystem => 'System';
630630

631+
@override
632+
String get openLinksWithInAppBrowser => 'Open links with in-app browser';
633+
631634
@override
632635
String get pollWidgetQuestionMissing => 'No question.';
633636

lib/generated/l10n/zulip_localizations_nb.dart

+3
Original file line numberDiff line numberDiff line change
@@ -628,6 +628,9 @@ class ZulipLocalizationsNb extends ZulipLocalizations {
628628
@override
629629
String get themeSettingSystem => 'System';
630630

631+
@override
632+
String get openLinksWithInAppBrowser => 'Open links with in-app browser';
633+
631634
@override
632635
String get pollWidgetQuestionMissing => 'No question.';
633636

lib/generated/l10n/zulip_localizations_pl.dart

+3
Original file line numberDiff line numberDiff line change
@@ -628,6 +628,9 @@ class ZulipLocalizationsPl extends ZulipLocalizations {
628628
@override
629629
String get themeSettingSystem => 'System';
630630

631+
@override
632+
String get openLinksWithInAppBrowser => 'Open links with in-app browser';
633+
631634
@override
632635
String get pollWidgetQuestionMissing => 'Brak pytania.';
633636

lib/generated/l10n/zulip_localizations_ru.dart

+3
Original file line numberDiff line numberDiff line change
@@ -628,6 +628,9 @@ class ZulipLocalizationsRu extends ZulipLocalizations {
628628
@override
629629
String get themeSettingSystem => 'System';
630630

631+
@override
632+
String get openLinksWithInAppBrowser => 'Open links with in-app browser';
633+
631634
@override
632635
String get pollWidgetQuestionMissing => 'Нет вопроса.';
633636

lib/generated/l10n/zulip_localizations_sk.dart

+3
Original file line numberDiff line numberDiff line change
@@ -628,6 +628,9 @@ class ZulipLocalizationsSk extends ZulipLocalizations {
628628
@override
629629
String get themeSettingSystem => 'System';
630630

631+
@override
632+
String get openLinksWithInAppBrowser => 'Open links with in-app browser';
633+
631634
@override
632635
String get pollWidgetQuestionMissing => 'Bez otázky.';
633636

lib/widgets/settings.dart

+39
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,50 @@ class SettingsPage extends StatelessWidget {
2424
appBar: ZulipAppBar(
2525
title: Text(zulipLocalizations.settingsPageTitle)),
2626
body: Column(children: [
27+
_BrowserPreferenceSetting(),
2728
_ThemeSetting(),
2829
]));
2930
}
3031
}
3132

33+
class _BrowserPreferenceSetting extends StatefulWidget {
34+
const _BrowserPreferenceSetting();
35+
36+
@override
37+
State<_BrowserPreferenceSetting> createState() => _BrowserPreferenceSettingState();
38+
}
39+
40+
class _BrowserPreferenceSettingState extends State<_BrowserPreferenceSetting> {
41+
late bool openLinksWithInAppBrowser;
42+
43+
@override
44+
void didChangeDependencies() {
45+
super.didChangeDependencies();
46+
openLinksWithInAppBrowser =
47+
GlobalStoreWidget.of(context).globalSettings.effectiveBrowserPreference
48+
== BrowserPreference.embedded;
49+
}
50+
51+
void _handleChange(bool openLinksWithInAppBrowser) {
52+
GlobalStoreWidget.of(context).updateGlobalSettings(
53+
GlobalSettingsCompanion(browserPreference: Value(
54+
openLinksWithInAppBrowser ? BrowserPreference.embedded
55+
: BrowserPreference.external)));
56+
setState(() {
57+
this.openLinksWithInAppBrowser = openLinksWithInAppBrowser;
58+
});
59+
}
60+
61+
@override
62+
Widget build(BuildContext context) {
63+
final zulipLocalizations = ZulipLocalizations.of(context);
64+
return SwitchListTile.adaptive(
65+
title: Text(zulipLocalizations.openLinksWithInAppBrowser),
66+
value: openLinksWithInAppBrowser,
67+
onChanged: _handleChange);
68+
}
69+
}
70+
3271
class _ThemeSetting extends StatefulWidget {
3372
const _ThemeSetting();
3473

test/flutter_checks.dart

+4
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,10 @@ extension RadioListTileChecks<T> on Subject<RadioListTile<T>> {
6969
Subject<bool> get checked => has((x) => x.checked, 'checked');
7070
}
7171

72+
extension SwitchListTileChecks<T> on Subject<SwitchListTile> {
73+
Subject<bool> get value => has((x) => x.value, 'value');
74+
}
75+
7276
extension TextChecks on Subject<Text> {
7377
Subject<String?> get data => has((t) => t.data, 'data');
7478
Subject<TextStyle?> get style => has((t) => t.style, 'style');

test/widgets/settings_test.dart

+38
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import 'package:checks/checks.dart';
2+
import 'package:flutter/foundation.dart';
23
import 'package:flutter/material.dart';
34
import 'package:flutter_test/flutter_test.dart';
45
import 'package:zulip/model/settings.dart';
@@ -24,6 +25,43 @@ void main() {
2425
await tester.pump();
2526
}
2627

28+
group('BrowserPreference', () {
29+
Finder useInAppBrowserSwitchFinder = find.ancestor(
30+
of: find.text('Open links with in-app browser'),
31+
matching: find.byType(SwitchListTile));
32+
33+
void checkSwitchAndGlobalSettings(WidgetTester tester, {
34+
required bool useInAppBrowser,
35+
}) {
36+
check(tester.widget<SwitchListTile>(useInAppBrowserSwitchFinder))
37+
.value.equals(useInAppBrowser);
38+
check(testBinding.globalStore).globalSettings.effectiveBrowserPreference.equals(
39+
useInAppBrowser ? BrowserPreference.embedded : BrowserPreference.external);
40+
}
41+
42+
testWidgets('smoke', (tester) async {
43+
await testBinding.globalStore.updateGlobalSettings(
44+
eg.globalSettings(
45+
browserPreference: BrowserPreference.external).toCompanion(false));
46+
await prepare(tester);
47+
checkSwitchAndGlobalSettings(tester, useInAppBrowser: false);
48+
49+
await tester.tap(useInAppBrowserSwitchFinder);
50+
await tester.pump();
51+
checkSwitchAndGlobalSettings(tester, useInAppBrowser: true);
52+
});
53+
54+
testWidgets('use platform-specific default browser preference', (tester) async {
55+
await prepare(tester);
56+
final defaultUseInAppBrowser = defaultTargetPlatform == TargetPlatform.android;
57+
checkSwitchAndGlobalSettings(tester, useInAppBrowser: defaultUseInAppBrowser);
58+
59+
await tester.tap(useInAppBrowserSwitchFinder);
60+
await tester.pump();
61+
checkSwitchAndGlobalSettings(tester, useInAppBrowser: !defaultUseInAppBrowser);
62+
}, variant: TargetPlatformVariant({TargetPlatform.android, TargetPlatform.iOS}));
63+
});
64+
2765
group('ThemeSetting', () {
2866
Finder findRadioListTileWithTitle(String title) => find.ancestor(
2967
of: find.text(title),

0 commit comments

Comments
 (0)