Skip to content

Commit

Permalink
settings: Add browser preference setting ui
Browse files Browse the repository at this point in the history
Signed-off-by: Zixuan James Li <zixuan@zulip.com>
  • Loading branch information
PIG208 committed Feb 21, 2025
1 parent eaf6a88 commit 195ff7f
Show file tree
Hide file tree
Showing 12 changed files with 98 additions and 0 deletions.
4 changes: 4 additions & 0 deletions assets/l10n/app_en.arb
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,10 @@
"@settingsPageTitle": {
"description": "Title for the settings page."
},
"settingsUseExternalBrowser": "Use external browser",
"@settingsUseExternalBrowser": {
"description": "Whether to open links with external browser or not"
},
"switchAccountButton": "Switch account",
"@switchAccountButton": {
"description": "Label for main-menu button leading to the choose-account page."
Expand Down
6 changes: 6 additions & 0 deletions lib/generated/l10n/zulip_localizations.dart
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,12 @@ abstract class ZulipLocalizations {
/// **'Settings'**
String get settingsPageTitle;

/// Whether to open links with external browser or not
///
/// In en, this message translates to:
/// **'Use external browser'**
String get settingsUseExternalBrowser;

/// Label for main-menu button leading to the choose-account page.
///
/// In en, this message translates to:
Expand Down
3 changes: 3 additions & 0 deletions lib/generated/l10n/zulip_localizations_ar.dart
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ class ZulipLocalizationsAr extends ZulipLocalizations {
@override
String get settingsPageTitle => 'Settings';

@override
String get settingsUseExternalBrowser => 'Use external browser';

@override
String get switchAccountButton => 'Switch account';

Expand Down
3 changes: 3 additions & 0 deletions lib/generated/l10n/zulip_localizations_en.dart
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ class ZulipLocalizationsEn extends ZulipLocalizations {
@override
String get settingsPageTitle => 'Settings';

@override
String get settingsUseExternalBrowser => 'Use external browser';

@override
String get switchAccountButton => 'Switch account';

Expand Down
3 changes: 3 additions & 0 deletions lib/generated/l10n/zulip_localizations_ja.dart
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ class ZulipLocalizationsJa extends ZulipLocalizations {
@override
String get settingsPageTitle => 'Settings';

@override
String get settingsUseExternalBrowser => 'Use external browser';

@override
String get switchAccountButton => 'Switch account';

Expand Down
3 changes: 3 additions & 0 deletions lib/generated/l10n/zulip_localizations_nb.dart
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ class ZulipLocalizationsNb extends ZulipLocalizations {
@override
String get settingsPageTitle => 'Settings';

@override
String get settingsUseExternalBrowser => 'Use external browser';

@override
String get switchAccountButton => 'Switch account';

Expand Down
3 changes: 3 additions & 0 deletions lib/generated/l10n/zulip_localizations_pl.dart
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ class ZulipLocalizationsPl extends ZulipLocalizations {
@override
String get settingsPageTitle => 'Settings';

@override
String get settingsUseExternalBrowser => 'Use external browser';

@override
String get switchAccountButton => 'Przełącz konto';

Expand Down
3 changes: 3 additions & 0 deletions lib/generated/l10n/zulip_localizations_ru.dart
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ class ZulipLocalizationsRu extends ZulipLocalizations {
@override
String get settingsPageTitle => 'Settings';

@override
String get settingsUseExternalBrowser => 'Use external browser';

@override
String get switchAccountButton => 'Сменить учетную запись';

Expand Down
3 changes: 3 additions & 0 deletions lib/generated/l10n/zulip_localizations_sk.dart
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ class ZulipLocalizationsSk extends ZulipLocalizations {
@override
String get settingsPageTitle => 'Settings';

@override
String get settingsUseExternalBrowser => 'Use external browser';

@override
String get switchAccountButton => 'Zmeniť účet';

Expand Down
39 changes: 39 additions & 0 deletions lib/widgets/settings.dart
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,50 @@ class SettingsPage extends StatelessWidget {
appBar: ZulipAppBar(
title: Text(zulipLocalizations.settingsPageTitle)),
body: Column(children: [
_BrowserPreferenceSetting(),
_ThemeSetting(),
]));
}
}

class _BrowserPreferenceSetting extends StatefulWidget {
const _BrowserPreferenceSetting();

@override
State<_BrowserPreferenceSetting> createState() => _BrowserPreferenceSettingState();
}

class _BrowserPreferenceSettingState extends State<_BrowserPreferenceSetting> {
late bool useExternalBrowser;

@override
void didChangeDependencies() {
super.didChangeDependencies();
useExternalBrowser =
GlobalStoreWidget.of(context).globalSettings.effectiveBrowserPreference
== BrowserPreference.external;
}

void _handleChange(bool useExternalBrowser) {
GlobalStoreWidget.of(context).updateGlobalSettings(
GlobalSettingsCompanion(browserPreference: Value(
useExternalBrowser ? BrowserPreference.external
: BrowserPreference.embedded)));
setState(() {
this.useExternalBrowser = useExternalBrowser;
});
}

@override
Widget build(BuildContext context) {
final zulipLocalizations = ZulipLocalizations.of(context);
return SwitchListTile.adaptive(
title: Text(zulipLocalizations.settingsUseExternalBrowser),
value: useExternalBrowser,
onChanged: _handleChange);
}
}

class _ThemeSetting extends StatefulWidget {
const _ThemeSetting();

Expand Down
4 changes: 4 additions & 0 deletions test/flutter_checks.dart
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,10 @@ extension RadioListTileChecks<T> on Subject<RadioListTile<T>> {
Subject<bool> get checked => has((x) => x.checked, 'checked');
}

extension SwitchListTileChecks<T> on Subject<SwitchListTile> {
Subject<bool> get value => has((x) => x.value, 'value');
}

extension TextChecks on Subject<Text> {
Subject<String?> get data => has((t) => t.data, 'data');
Subject<TextStyle?> get style => has((t) => t.style, 'style');
Expand Down
24 changes: 24 additions & 0 deletions test/widgets/settings_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,30 @@ void main() {
await tester.pump();
}

group('BrowserPreference', () {
Finder useExternalBrowserSwitchFinder = find.ancestor(
of: find.text('Use external browser'),
matching: find.byType(SwitchListTile));

testWidgets('smoke', (tester) async {
await testBinding.globalStore.updateGlobalSettings(
eg.globalSettings(
browserPreference: BrowserPreference.external).toCompanion(false));
await prepare(tester);
check(tester.widget<SwitchListTile>(useExternalBrowserSwitchFinder))
.value.isTrue();
check(testBinding.globalStore).globalSettings.effectiveBrowserPreference.equals(
BrowserPreference.external);

await tester.tap(useExternalBrowserSwitchFinder);
await tester.pump();
check(tester.widget<SwitchListTile>(useExternalBrowserSwitchFinder))
.value.isFalse();
check(testBinding.globalStore).globalSettings.effectiveBrowserPreference.equals(
BrowserPreference.embedded);
});
});

group('ThemeSetting', () {
Finder findRadioListTileWithTitle(String title) => find.ancestor(
of: find.text(title),
Expand Down

0 comments on commit 195ff7f

Please sign in to comment.