move experimental settings

This commit is contained in:
Fabian Freund
2026-03-12 03:41:03 +01:00
parent 57a8b2f013
commit 2d4fbc633e
2 changed files with 90 additions and 68 deletions
@@ -35,6 +35,7 @@ import 'package:weblibre/features/settings/presentation/dialogs/user_agent_resta
import 'package:weblibre/features/settings/presentation/widgets/custom_list_tile.dart'; import 'package:weblibre/features/settings/presentation/widgets/custom_list_tile.dart';
import 'package:weblibre/features/settings/presentation/widgets/sections.dart'; import 'package:weblibre/features/settings/presentation/widgets/sections.dart';
import 'package:weblibre/features/user/data/models/engine_settings.dart'; import 'package:weblibre/features/user/data/models/engine_settings.dart';
import 'package:weblibre/features/user/domain/presentation/dialogs/quit_browser_dialog.dart';
import 'package:weblibre/features/user/domain/providers.dart'; import 'package:weblibre/features/user/domain/providers.dart';
import 'package:weblibre/features/user/domain/repositories/cache.dart'; import 'package:weblibre/features/user/domain/repositories/cache.dart';
import 'package:weblibre/features/user/domain/repositories/engine_settings.dart'; import 'package:weblibre/features/user/domain/repositories/engine_settings.dart';
@@ -57,6 +58,7 @@ class AdvancedSettingsScreen extends StatelessWidget {
padding: const EdgeInsets.symmetric(horizontal: 12.0), padding: const EdgeInsets.symmetric(horizontal: 12.0),
children: const [ children: const [
_ContentBehaviorSection(), _ContentBehaviorSection(),
_ExperimentalSection(),
_ExtensionsSection(), _ExtensionsSection(),
_StorageDebuggingSection(), _StorageDebuggingSection(),
_ResetSection(), _ResetSection(),
@@ -100,6 +102,21 @@ class _ExtensionsSection extends StatelessWidget {
} }
} }
class _ExperimentalSection extends StatelessWidget {
const _ExperimentalSection();
@override
Widget build(BuildContext context) {
return const Column(
children: [
SettingSection(name: 'Experimental'),
_IsolatedProcessEnabledTile(),
_AppZygoteProcessEnabledTile(),
],
);
}
}
class _InstallLocalAddonTile extends StatelessWidget { class _InstallLocalAddonTile extends StatelessWidget {
const _InstallLocalAddonTile(); const _InstallLocalAddonTile();
@@ -286,6 +303,72 @@ class _EnterpriseRootsTile extends HookConsumerWidget {
} }
} }
class _IsolatedProcessEnabledTile extends HookConsumerWidget {
const _IsolatedProcessEnabledTile();
@override
Widget build(BuildContext context, WidgetRef ref) {
final isolatedProcessEnabled = ref.watch(
engineSettingsWithDefaultsProvider.select(
(s) => s.isolatedProcessEnabled,
),
);
return SwitchListTile.adaptive(
title: const Text('Isolated Content Process'),
subtitle: const Text(
'Run web content in an isolated process. Requires app restart.',
),
secondary: const Icon(MdiIcons.shieldCheck),
value: isolatedProcessEnabled,
onChanged: (value) async {
await ref
.read(saveEngineSettingsControllerProvider.notifier)
.save(
(currentSettings) =>
currentSettings.copyWith.isolatedProcessEnabled(value),
);
if (context.mounted) {
await _showRestartDialog(context, ref);
}
},
);
}
}
class _AppZygoteProcessEnabledTile extends HookConsumerWidget {
const _AppZygoteProcessEnabledTile();
@override
Widget build(BuildContext context, WidgetRef ref) {
final appZygoteProcessEnabled = ref.watch(
engineSettingsWithDefaultsProvider.select(
(s) => s.appZygoteProcessEnabled,
),
);
return SwitchListTile.adaptive(
title: const Text('App Zygote Process'),
subtitle: const Text(
'Preload content service via App Zygote for faster isolated process startup. Requires Android 10+ and app restart.',
),
secondary: const Icon(MdiIcons.rocketLaunch),
value: appZygoteProcessEnabled,
onChanged: (value) async {
await ref
.read(saveEngineSettingsControllerProvider.notifier)
.save(
(currentSettings) =>
currentSettings.copyWith.appZygoteProcessEnabled(value),
);
if (context.mounted) {
await _showRestartDialog(context, ref);
}
},
);
}
}
class _IconCacheTile extends HookConsumerWidget { class _IconCacheTile extends HookConsumerWidget {
const _IconCacheTile(); const _IconCacheTile();
@@ -428,3 +511,10 @@ class _ResetUITile extends ConsumerWidget {
); );
} }
} }
Future<void> _showRestartDialog(BuildContext context, WidgetRef ref) async {
final result = await showQuitBrowserDialog(context);
if (result == true && context.mounted) {
await exitApp(ProviderScope.containerOf(context));
}
}
@@ -204,8 +204,6 @@ class _AdvancedSection extends StatelessWidget {
SettingSection(name: 'Advanced'), SettingSection(name: 'Advanced'),
_WebEngineHardeningTile(), _WebEngineHardeningTile(),
_FissionEnabledTile(), _FissionEnabledTile(),
_IsolatedProcessEnabledTile(),
_AppZygoteProcessEnabledTile(),
_ExtensionsWebAPIEnabledTile(), _ExtensionsWebAPIEnabledTile(),
], ],
); );
@@ -774,72 +772,6 @@ class _FissionEnabledTile extends HookConsumerWidget {
} }
} }
class _IsolatedProcessEnabledTile extends HookConsumerWidget {
const _IsolatedProcessEnabledTile();
@override
Widget build(BuildContext context, WidgetRef ref) {
final isolatedProcessEnabled = ref.watch(
engineSettingsWithDefaultsProvider.select(
(s) => s.isolatedProcessEnabled,
),
);
return SwitchListTile.adaptive(
title: const Text('Isolated Content Process'),
subtitle: const Text(
'Run web content in an isolated process. Requires app restart.',
),
secondary: const Icon(MdiIcons.shieldCheck),
value: isolatedProcessEnabled,
onChanged: (value) async {
await ref
.read(saveEngineSettingsControllerProvider.notifier)
.save(
(currentSettings) =>
currentSettings.copyWith.isolatedProcessEnabled(value),
);
if (context.mounted) {
await _showRestartDialog(context, ref);
}
},
);
}
}
class _AppZygoteProcessEnabledTile extends HookConsumerWidget {
const _AppZygoteProcessEnabledTile();
@override
Widget build(BuildContext context, WidgetRef ref) {
final appZygoteProcessEnabled = ref.watch(
engineSettingsWithDefaultsProvider.select(
(s) => s.appZygoteProcessEnabled,
),
);
return SwitchListTile.adaptive(
title: const Text('App Zygote Process'),
subtitle: const Text(
'Preload content service via App Zygote for faster isolated process startup. Requires Android 10+ and app restart.',
),
secondary: const Icon(MdiIcons.rocketLaunch),
value: appZygoteProcessEnabled,
onChanged: (value) async {
await ref
.read(saveEngineSettingsControllerProvider.notifier)
.save(
(currentSettings) =>
currentSettings.copyWith.appZygoteProcessEnabled(value),
);
if (context.mounted) {
await _showRestartDialog(context, ref);
}
},
);
}
}
class _ExtensionsWebAPIEnabledTile extends HookConsumerWidget { class _ExtensionsWebAPIEnabledTile extends HookConsumerWidget {
const _ExtensionsWebAPIEnabledTile(); const _ExtensionsWebAPIEnabledTile();