@@ -114,11 +114,12 @@ fun SettingsScreen(
114114 var showThemeSettings by rememberSaveable { mutableStateOf(false ) }
115115 var showAppProfileTemplates by rememberSaveable { mutableStateOf(false ) }
116116 var showManagerTools by rememberSaveable { mutableStateOf(false ) }
117+ var showSusfsControl by rememberSaveable { mutableStateOf(false ) }
117118 var showAboutPage by rememberSaveable { mutableStateOf(false ) }
118119 var showOpenSourceLicenses by rememberSaveable { mutableStateOf(false ) }
119120 var showExtensionManagerPage by rememberSaveable { mutableStateOf(false ) }
120121 val scrollBehavior = TopAppBarDefaults .exitUntilCollapsedScrollBehavior(rememberTopAppBarState())
121- val showChildPage = showThemeSettings || showAppProfileTemplates || showManagerTools ||
122+ val showChildPage = showThemeSettings || showAppProfileTemplates || showManagerTools || showSusfsControl ||
122123 showAboutPage || showOpenSourceLicenses || showExtensionManagerPage
123124 val childPageTransition = rememberChildPageOverlayTransition(
124125 visible = showChildPage,
@@ -128,6 +129,7 @@ fun SettingsScreen(
128129
129130 LaunchedEffect (Unit ) {
130131 vm.refreshManagerSettings(force = true )
132+ vm.refreshSusfsState(force = true )
131133 }
132134
133135 LaunchedEffect (state.hasNativeManagerPermission) {
@@ -147,6 +149,7 @@ fun SettingsScreen(
147149 showThemeSettings = false
148150 showAppProfileTemplates = false
149151 showManagerTools = false
152+ showSusfsControl = false
150153 showAboutPage = false
151154 showOpenSourceLicenses = false
152155 showExtensionManagerPage = false
@@ -193,13 +196,26 @@ fun SettingsScreen(
193196 childPageBack.resetProgress()
194197 showThemeSettings = false
195198 showAppProfileTemplates = false
199+ showSusfsControl = false
196200 showAboutPage = false
197201 showOpenSourceLicenses = false
198202 showExtensionManagerPage = false
199203 showManagerTools = true
200204 vm.refreshManagerTools(force = true )
201205 }
202206
207+ fun openSusfsControl () {
208+ childPageBack.resetProgress()
209+ showThemeSettings = false
210+ showAppProfileTemplates = false
211+ showManagerTools = false
212+ showAboutPage = false
213+ showOpenSourceLicenses = false
214+ showExtensionManagerPage = false
215+ showSusfsControl = true
216+ vm.refreshSusfsState(force = true )
217+ }
218+
203219 fun openAboutPage () {
204220 childPageBack.resetProgress()
205221 showThemeSettings = false
@@ -304,6 +320,7 @@ fun SettingsScreen(
304320 onOpenThemeSettings = ::openThemeSettings,
305321 onOpenAppProfileTemplates = ::openAppProfileTemplates,
306322 onOpenManagerTools = ::openManagerTools,
323+ onOpenSusfsControl = ::openSusfsControl,
307324 onOpenInstalledModules = onOpenInstalledModules,
308325 onAbout = ::openAboutPage,
309326 onOpenSourceLicenses = ::openOpenSourceLicenses,
@@ -505,6 +522,58 @@ fun SettingsScreen(
505522 }
506523 }
507524
525+ childPageTransition.AnimatedVisibility (
526+ visible = { it && showSusfsControl },
527+ enter = childPageOverlayEnterTransition(state.predictiveBackEnabled, motionScheme),
528+ exit = childPageOverlayExitTransition(state.predictiveBackEnabled, motionScheme),
529+ modifier = childPageModifier
530+ ) {
531+ val refreshPresentation = rememberAbkInteractiveRefreshPresentation(loading = state.susfsLoading)
532+ Box (
533+ modifier = Modifier
534+ .fillMaxSize()
535+ .then(childPageBack.backTransformModifier())
536+ ) {
537+ SettingsPageBackground (
538+ backgroundUri = state.customBackgroundUri,
539+ backgroundImageEnabled = state.backgroundImageEnabled
540+ )
541+ Scaffold (
542+ containerColor = Color .Transparent ,
543+ topBar = {
544+ ExpressiveTopBar (
545+ title = stringResource(R .string.susfs_title),
546+ navigationIcon = {
547+ IconButton (onClick = childPageBack::requestDismiss) {
548+ Icon (Icons .Default .ArrowBack , contentDescription = stringResource(R .string.settings_back))
549+ }
550+ },
551+ actions = {
552+ IconButton (onClick = {
553+ refreshPresentation.beginRefresh()
554+ vm.refreshSusfsState(force = true )
555+ }) {
556+ Icon (Icons .Default .Refresh , contentDescription = stringResource(R .string.refresh))
557+ }
558+ }
559+ )
560+ }
561+ ) {
562+ SusfsControlScreen (
563+ padding = it,
564+ state = state,
565+ showRefreshLoading = refreshPresentation.showLoading,
566+ onApply = vm::applySusfsConfig,
567+ onReset = vm::resetSusfsConfig,
568+ onRefresh = {
569+ refreshPresentation.beginRefresh()
570+ vm.refreshSusfsState(force = true )
571+ }
572+ )
573+ }
574+ }
575+ }
576+
508577 childPageTransition.AnimatedVisibility (
509578 visible = { it && showAboutPage },
510579 enter = childPageOverlayEnterTransition(state.predictiveBackEnabled, motionScheme),
@@ -602,6 +671,7 @@ private fun SettingsMainContent(
602671 onOpenThemeSettings : () -> Unit ,
603672 onOpenAppProfileTemplates : () -> Unit ,
604673 onOpenManagerTools : () -> Unit ,
674+ onOpenSusfsControl : () -> Unit ,
605675 onOpenInstalledModules : () -> Unit ,
606676 onAbout : () -> Unit ,
607677 onOpenSourceLicenses : () -> Unit ,
@@ -818,6 +888,7 @@ private fun SettingsMainContent(
818888 vm = vm,
819889 onOpenAppProfileTemplates = onOpenAppProfileTemplates,
820890 onOpenManagerTools = onOpenManagerTools,
891+ onOpenSusfsControl = onOpenSusfsControl,
821892 onOpenInstalledModules = onOpenInstalledModules
822893 )
823894
@@ -938,9 +1009,9 @@ private fun ManagerInjectedSettingsGroup(
9381009 vm : MainViewModel ,
9391010 onOpenAppProfileTemplates : () -> Unit ,
9401011 onOpenManagerTools : () -> Unit ,
1012+ onOpenSusfsControl : () -> Unit ,
9411013 onOpenInstalledModules : () -> Unit
9421014) {
943- if (! state.hasNativeManagerPermission) return
9441015 val hasInjectedSettings = state.managerSettingsItems.isNotEmpty()
9451016 val refreshPresentation = rememberAbkInteractiveRefreshPresentation(loading = state.managerSettingsLoading)
9461017 val showRefreshLoading = refreshPresentation.showLoading
@@ -992,6 +1063,7 @@ private fun ManagerInjectedSettingsGroup(
9921063 when (item.id) {
9931064 " app_profile_templates" -> onOpenAppProfileTemplates()
9941065 " manager_tools" -> onOpenManagerTools()
1066+ " susfs_control" -> onOpenSusfsControl()
9951067 " kpm" -> onOpenInstalledModules()
9961068 }
9971069 }
@@ -1674,6 +1746,7 @@ private fun managerSettingIcon(id: String) = when (id) {
16741746 " selinux_hide" -> Icons .Default .Shield
16751747 " default_umount_modules" -> Icons .Default .FolderDelete
16761748 " webview_debug" -> Icons .Default .Code
1749+ " susfs_control" -> Icons .Default .Extension
16771750 else -> Icons .Default .Settings
16781751}
16791752
@@ -2532,6 +2605,7 @@ private fun SettingsGroup(title: String, content: @Composable ColumnScope.() ->
25322605 " SukiSU" -> stringResource(R .string.settings_group_backend_desc, " SukiSU" )
25332606 " KernelSU" -> stringResource(R .string.settings_group_backend_desc, " KernelSU" )
25342607 stringResource(R .string.settings_manager_settings) -> stringResource(R .string.settings_group_manager_settings_desc)
2608+ stringResource(R .string.settings_kernel_capabilities) -> stringResource(R .string.settings_group_kernel_capabilities_desc)
25352609 stringResource(R .string.settings_system_tools) -> stringResource(R .string.settings_group_system_tools_desc)
25362610 stringResource(R .string.settings_allowlist) -> stringResource(R .string.settings_group_allowlist_desc)
25372611 stringResource(R .string.settings_tool_status) -> stringResource(R .string.settings_group_tool_status_desc)
@@ -2555,6 +2629,7 @@ private fun SettingsGroup(title: String, content: @Composable ColumnScope.() ->
25552629 stringResource(R .string.settings_theme) -> Icons .Default .Palette
25562630 " ReSukiSU" , " SukiSU" , " KernelSU" -> Icons .Default .AdminPanelSettings
25572631 stringResource(R .string.settings_manager_settings) -> Icons .Default .AdminPanelSettings
2632+ stringResource(R .string.settings_kernel_capabilities) -> Icons .Default .Extension
25582633 stringResource(R .string.settings_system_tools) -> Icons .Default .Build
25592634 stringResource(R .string.settings_allowlist) -> Icons .Default .VerifiedUser
25602635 stringResource(R .string.settings_tool_status) -> Icons .Default .Info
0 commit comments