Skip to content

Commit 195ff7f

Browse files
committed
settings: Add browser preference setting ui
Signed-off-by: Zixuan James Li <[email protected]>
1 parent eaf6a88 commit 195ff7f

12 files changed

+98
-0
lines changed

assets/l10n/app_en.arb

+4
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@
2323
"@settingsPageTitle": {
2424
"description": "Title for the settings page."
2525
},
26+
"settingsUseExternalBrowser": "Use external browser",
27+
"@settingsUseExternalBrowser": {
28+
"description": "Whether to open links with external browser or not"
29+
},
2630
"switchAccountButton": "Switch account",
2731
"@switchAccountButton": {
2832
"description": "Label for main-menu button leading to the choose-account page."

lib/generated/l10n/zulip_localizations.dart

+6
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,12 @@ abstract class ZulipLocalizations {
141141
/// **'Settings'**
142142
String get settingsPageTitle;
143143

144+
/// Whether to open links with external browser or not
145+
///
146+
/// In en, this message translates to:
147+
/// **'Use external browser'**
148+
String get settingsUseExternalBrowser;
149+
144150
/// Label for main-menu button leading to the choose-account page.
145151
///
146152
/// In en, this message translates to:

lib/generated/l10n/zulip_localizations_ar.dart

+3
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ class ZulipLocalizationsAr extends ZulipLocalizations {
2626
@override
2727
String get settingsPageTitle => 'Settings';
2828

29+
@override
30+
String get settingsUseExternalBrowser => 'Use external browser';
31+
2932
@override
3033
String get switchAccountButton => 'Switch account';
3134

lib/generated/l10n/zulip_localizations_en.dart

+3
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ class ZulipLocalizationsEn extends ZulipLocalizations {
2626
@override
2727
String get settingsPageTitle => 'Settings';
2828

29+
@override
30+
String get settingsUseExternalBrowser => 'Use external browser';
31+
2932
@override
3033
String get switchAccountButton => 'Switch account';
3134

lib/generated/l10n/zulip_localizations_ja.dart

+3
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ class ZulipLocalizationsJa extends ZulipLocalizations {
2626
@override
2727
String get settingsPageTitle => 'Settings';
2828

29+
@override
30+
String get settingsUseExternalBrowser => 'Use external browser';
31+
2932
@override
3033
String get switchAccountButton => 'Switch account';
3134

lib/generated/l10n/zulip_localizations_nb.dart

+3
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ class ZulipLocalizationsNb extends ZulipLocalizations {
2626
@override
2727
String get settingsPageTitle => 'Settings';
2828

29+
@override
30+
String get settingsUseExternalBrowser => 'Use external browser';
31+
2932
@override
3033
String get switchAccountButton => 'Switch account';
3134

lib/generated/l10n/zulip_localizations_pl.dart

+3
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ class ZulipLocalizationsPl extends ZulipLocalizations {
2626
@override
2727
String get settingsPageTitle => 'Settings';
2828

29+
@override
30+
String get settingsUseExternalBrowser => 'Use external browser';
31+
2932
@override
3033
String get switchAccountButton => 'Przełącz konto';
3134

lib/generated/l10n/zulip_localizations_ru.dart

+3
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ class ZulipLocalizationsRu extends ZulipLocalizations {
2626
@override
2727
String get settingsPageTitle => 'Settings';
2828

29+
@override
30+
String get settingsUseExternalBrowser => 'Use external browser';
31+
2932
@override
3033
String get switchAccountButton => 'Сменить учетную запись';
3134

lib/generated/l10n/zulip_localizations_sk.dart

+3
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ class ZulipLocalizationsSk extends ZulipLocalizations {
2626
@override
2727
String get settingsPageTitle => 'Settings';
2828

29+
@override
30+
String get settingsUseExternalBrowser => 'Use external browser';
31+
2932
@override
3033
String get switchAccountButton => 'Zmeniť účet';
3134

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 useExternalBrowser;
42+
43+
@override
44+
void didChangeDependencies() {
45+
super.didChangeDependencies();
46+
useExternalBrowser =
47+
GlobalStoreWidget.of(context).globalSettings.effectiveBrowserPreference
48+
== BrowserPreference.external;
49+
}
50+
51+
void _handleChange(bool useExternalBrowser) {
52+
GlobalStoreWidget.of(context).updateGlobalSettings(
53+
GlobalSettingsCompanion(browserPreference: Value(
54+
useExternalBrowser ? BrowserPreference.external
55+
: BrowserPreference.embedded)));
56+
setState(() {
57+
this.useExternalBrowser = useExternalBrowser;
58+
});
59+
}
60+
61+
@override
62+
Widget build(BuildContext context) {
63+
final zulipLocalizations = ZulipLocalizations.of(context);
64+
return SwitchListTile.adaptive(
65+
title: Text(zulipLocalizations.settingsUseExternalBrowser),
66+
value: useExternalBrowser,
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

+24
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,30 @@ void main() {
2424
await tester.pump();
2525
}
2626

27+
group('BrowserPreference', () {
28+
Finder useExternalBrowserSwitchFinder = find.ancestor(
29+
of: find.text('Use external browser'),
30+
matching: find.byType(SwitchListTile));
31+
32+
testWidgets('smoke', (tester) async {
33+
await testBinding.globalStore.updateGlobalSettings(
34+
eg.globalSettings(
35+
browserPreference: BrowserPreference.external).toCompanion(false));
36+
await prepare(tester);
37+
check(tester.widget<SwitchListTile>(useExternalBrowserSwitchFinder))
38+
.value.isTrue();
39+
check(testBinding.globalStore).globalSettings.effectiveBrowserPreference.equals(
40+
BrowserPreference.external);
41+
42+
await tester.tap(useExternalBrowserSwitchFinder);
43+
await tester.pump();
44+
check(tester.widget<SwitchListTile>(useExternalBrowserSwitchFinder))
45+
.value.isFalse();
46+
check(testBinding.globalStore).globalSettings.effectiveBrowserPreference.equals(
47+
BrowserPreference.embedded);
48+
});
49+
});
50+
2751
group('ThemeSetting', () {
2852
Finder findRadioListTileWithTitle(String title) => find.ancestor(
2953
of: find.text(title),

0 commit comments

Comments
 (0)