manager: Updated the susfs binary file
- made the umount manager publicly available - and removed the “try umount” functionality
This commit is contained in:
Binary file not shown.
@@ -149,31 +149,28 @@ fun Tools(
|
|||||||
|
|
||||||
DynamicManagerCard()
|
DynamicManagerCard()
|
||||||
|
|
||||||
val lkmMode = Natives.isLkmMode
|
Card(
|
||||||
if (lkmMode) {
|
modifier = Modifier
|
||||||
Card(
|
.padding(top = 12.dp)
|
||||||
modifier = Modifier
|
.fillMaxWidth(),
|
||||||
.padding(top = 12.dp)
|
) {
|
||||||
.fillMaxWidth(),
|
val umontManager = stringResource(id = R.string.umount_path_manager)
|
||||||
) {
|
SuperArrow(
|
||||||
val umontManager = stringResource(id = R.string.umount_path_manager)
|
title = umontManager,
|
||||||
SuperArrow(
|
leftAction = {
|
||||||
title = umontManager,
|
Icon(
|
||||||
leftAction = {
|
Icons.Rounded.FolderDelete,
|
||||||
Icon(
|
modifier = Modifier.padding(end = 16.dp),
|
||||||
Icons.Rounded.FolderDelete,
|
contentDescription = umontManager,
|
||||||
modifier = Modifier.padding(end = 16.dp),
|
tint = colorScheme.onBackground
|
||||||
contentDescription = umontManager,
|
)
|
||||||
tint = colorScheme.onBackground
|
},
|
||||||
)
|
onClick = {
|
||||||
},
|
navigator.navigate(UmountManagerDestination)
|
||||||
onClick = {
|
}
|
||||||
navigator.navigate(UmountManagerDestination)
|
)
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
AllowlistBackupSection(scope = scope, context = context)
|
AllowlistBackupSection(scope = scope, context = context)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,7 +42,6 @@ import com.sukisu.ultra.ui.susfs.content.PathSettingsContent
|
|||||||
import com.sukisu.ultra.ui.susfs.content.SusLoopPathsContent
|
import com.sukisu.ultra.ui.susfs.content.SusLoopPathsContent
|
||||||
import com.sukisu.ultra.ui.susfs.content.SusMapsContent
|
import com.sukisu.ultra.ui.susfs.content.SusMapsContent
|
||||||
import com.sukisu.ultra.ui.susfs.content.SusPathsContent
|
import com.sukisu.ultra.ui.susfs.content.SusPathsContent
|
||||||
import com.sukisu.ultra.ui.susfs.content.TryUmountContent
|
|
||||||
import com.sukisu.ultra.ui.susfs.util.SuSFSManager
|
import com.sukisu.ultra.ui.susfs.util.SuSFSManager
|
||||||
import com.sukisu.ultra.ui.util.isAbDevice
|
import com.sukisu.ultra.ui.util.isAbDevice
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
@@ -61,7 +60,6 @@ enum class SuSFSTab(val displayNameRes: Int) {
|
|||||||
SUS_PATHS(R.string.susfs_tab_sus_paths),
|
SUS_PATHS(R.string.susfs_tab_sus_paths),
|
||||||
SUS_LOOP_PATHS(R.string.susfs_tab_sus_loop_paths),
|
SUS_LOOP_PATHS(R.string.susfs_tab_sus_loop_paths),
|
||||||
SUS_MAPS(R.string.susfs_tab_sus_maps),
|
SUS_MAPS(R.string.susfs_tab_sus_maps),
|
||||||
TRY_UMOUNT(R.string.susfs_tab_try_umount),
|
|
||||||
KSTAT_CONFIG(R.string.susfs_tab_kstat_config),
|
KSTAT_CONFIG(R.string.susfs_tab_kstat_config),
|
||||||
PATH_SETTINGS(R.string.susfs_tab_path_settings),
|
PATH_SETTINGS(R.string.susfs_tab_path_settings),
|
||||||
ENABLED_FEATURES(R.string.susfs_tab_enabled_features);
|
ENABLED_FEATURES(R.string.susfs_tab_enabled_features);
|
||||||
@@ -109,7 +107,6 @@ fun SuSFSConfigScreen(
|
|||||||
var susPaths by remember { mutableStateOf(emptySet<String>()) }
|
var susPaths by remember { mutableStateOf(emptySet<String>()) }
|
||||||
var susLoopPaths by remember { mutableStateOf(emptySet<String>()) }
|
var susLoopPaths by remember { mutableStateOf(emptySet<String>()) }
|
||||||
var susMaps by remember { mutableStateOf(emptySet<String>()) }
|
var susMaps by remember { mutableStateOf(emptySet<String>()) }
|
||||||
var tryUmounts by remember { mutableStateOf(emptySet<String>()) }
|
|
||||||
var androidDataPath by remember { mutableStateOf("") }
|
var androidDataPath by remember { mutableStateOf("") }
|
||||||
var sdcardPath by remember { mutableStateOf("") }
|
var sdcardPath by remember { mutableStateOf("") }
|
||||||
|
|
||||||
@@ -134,7 +131,6 @@ fun SuSFSConfigScreen(
|
|||||||
var showAddLoopPathDialog by remember { mutableStateOf(false) }
|
var showAddLoopPathDialog by remember { mutableStateOf(false) }
|
||||||
var showAddSusMapDialog by remember { mutableStateOf(false) }
|
var showAddSusMapDialog by remember { mutableStateOf(false) }
|
||||||
var showAddAppPathDialog by remember { mutableStateOf(false) }
|
var showAddAppPathDialog by remember { mutableStateOf(false) }
|
||||||
var showAddUmountDialog by remember { mutableStateOf(false) }
|
|
||||||
var showAddKstatStaticallyDialog by remember { mutableStateOf(false) }
|
var showAddKstatStaticallyDialog by remember { mutableStateOf(false) }
|
||||||
var showAddKstatDialog by remember { mutableStateOf(false) }
|
var showAddKstatDialog by remember { mutableStateOf(false) }
|
||||||
|
|
||||||
@@ -142,7 +138,6 @@ fun SuSFSConfigScreen(
|
|||||||
var editingPath by remember { mutableStateOf<String?>(null) }
|
var editingPath by remember { mutableStateOf<String?>(null) }
|
||||||
var editingLoopPath by remember { mutableStateOf<String?>(null) }
|
var editingLoopPath by remember { mutableStateOf<String?>(null) }
|
||||||
var editingSusMap by remember { mutableStateOf<String?>(null) }
|
var editingSusMap by remember { mutableStateOf<String?>(null) }
|
||||||
var editingUmount by remember { mutableStateOf<String?>(null) }
|
|
||||||
var editingKstatConfig by remember { mutableStateOf<String?>(null) }
|
var editingKstatConfig by remember { mutableStateOf<String?>(null) }
|
||||||
var editingKstatPath by remember { mutableStateOf<String?>(null) }
|
var editingKstatPath by remember { mutableStateOf<String?>(null) }
|
||||||
|
|
||||||
@@ -150,7 +145,6 @@ fun SuSFSConfigScreen(
|
|||||||
var showResetPathsDialog by remember { mutableStateOf(false) }
|
var showResetPathsDialog by remember { mutableStateOf(false) }
|
||||||
var showResetLoopPathsDialog by remember { mutableStateOf(false) }
|
var showResetLoopPathsDialog by remember { mutableStateOf(false) }
|
||||||
var showResetSusMapsDialog by remember { mutableStateOf(false) }
|
var showResetSusMapsDialog by remember { mutableStateOf(false) }
|
||||||
var showResetUmountsDialog by remember { mutableStateOf(false) }
|
|
||||||
var showResetKstatDialog by remember { mutableStateOf(false) }
|
var showResetKstatDialog by remember { mutableStateOf(false) }
|
||||||
|
|
||||||
|
|
||||||
@@ -204,7 +198,6 @@ fun SuSFSConfigScreen(
|
|||||||
susPaths = SuSFSManager.getSusPaths(context)
|
susPaths = SuSFSManager.getSusPaths(context)
|
||||||
susLoopPaths = SuSFSManager.getSusLoopPaths(context)
|
susLoopPaths = SuSFSManager.getSusLoopPaths(context)
|
||||||
susMaps = SuSFSManager.getSusMaps(context)
|
susMaps = SuSFSManager.getSusMaps(context)
|
||||||
tryUmounts = SuSFSManager.getTryUmounts(context)
|
|
||||||
androidDataPath = SuSFSManager.getAndroidDataPath(context)
|
androidDataPath = SuSFSManager.getAndroidDataPath(context)
|
||||||
sdcardPath = SuSFSManager.getSdcardPath(context)
|
sdcardPath = SuSFSManager.getSdcardPath(context)
|
||||||
kstatConfigs = SuSFSManager.getKstatConfigs(context)
|
kstatConfigs = SuSFSManager.getKstatConfigs(context)
|
||||||
@@ -366,33 +359,6 @@ fun SuSFSConfigScreen(
|
|||||||
existingSusPaths = susPaths
|
existingSusPaths = susPaths
|
||||||
)
|
)
|
||||||
|
|
||||||
AddTryUmountDialog(
|
|
||||||
showDialog = showAddUmountDialog,
|
|
||||||
onDismiss = {
|
|
||||||
showAddUmountDialog = false
|
|
||||||
editingUmount = null
|
|
||||||
},
|
|
||||||
onConfirm = { path, mode ->
|
|
||||||
val oldUmount = editingUmount
|
|
||||||
coroutineScope.launch {
|
|
||||||
isLoading = true
|
|
||||||
val success = if (oldUmount != null) {
|
|
||||||
SuSFSManager.editTryUmount(context, oldUmount, path, mode)
|
|
||||||
} else {
|
|
||||||
SuSFSManager.addTryUmount(context, path, mode)
|
|
||||||
}
|
|
||||||
if (success) {
|
|
||||||
tryUmounts = SuSFSManager.getTryUmounts(context)
|
|
||||||
}
|
|
||||||
isLoading = false
|
|
||||||
showAddUmountDialog = false
|
|
||||||
editingUmount = null
|
|
||||||
}
|
|
||||||
},
|
|
||||||
isLoading = isLoading,
|
|
||||||
initialPath = editingUmount?.split("|")?.get(0) ?: "",
|
|
||||||
initialMode = editingUmount?.split("|")?.get(1)?.toIntOrNull() ?: 0
|
|
||||||
)
|
|
||||||
|
|
||||||
AddKstatStaticallyDialog(
|
AddKstatStaticallyDialog(
|
||||||
showDialog = showAddKstatStaticallyDialog,
|
showDialog = showAddKstatStaticallyDialog,
|
||||||
@@ -551,25 +517,6 @@ fun SuSFSConfigScreen(
|
|||||||
isLoading = isLoading
|
isLoading = isLoading
|
||||||
)
|
)
|
||||||
|
|
||||||
ConfirmDialog(
|
|
||||||
showDialog = showResetUmountsDialog,
|
|
||||||
onDismiss = { showResetUmountsDialog = false },
|
|
||||||
onConfirm = {
|
|
||||||
coroutineScope.launch {
|
|
||||||
isLoading = true
|
|
||||||
SuSFSManager.saveTryUmounts(context, emptySet())
|
|
||||||
tryUmounts = emptySet()
|
|
||||||
if (SuSFSManager.isAutoStartEnabled(context)) {
|
|
||||||
SuSFSManager.configureAutoStart(context, true)
|
|
||||||
}
|
|
||||||
isLoading = false
|
|
||||||
showResetUmountsDialog = false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
titleRes = R.string.susfs_reset_umounts_title,
|
|
||||||
messageRes = R.string.susfs_reset_umounts_message,
|
|
||||||
isLoading = isLoading
|
|
||||||
)
|
|
||||||
|
|
||||||
ConfirmDialog(
|
ConfirmDialog(
|
||||||
showDialog = showResetKstatDialog,
|
showDialog = showResetKstatDialog,
|
||||||
@@ -749,6 +696,18 @@ fun SuSFSConfigScreen(
|
|||||||
isLoading = false
|
isLoading = false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
umountForZygoteIsoService = umountForZygoteIsoService,
|
||||||
|
onUmountForZygoteIsoServiceChange = { enabled ->
|
||||||
|
coroutineScope.launch {
|
||||||
|
isLoading = true
|
||||||
|
val success =
|
||||||
|
SuSFSManager.setUmountForZygoteIsoService(context, enabled)
|
||||||
|
if (success) {
|
||||||
|
umountForZygoteIsoService = enabled
|
||||||
|
}
|
||||||
|
isLoading = false
|
||||||
|
}
|
||||||
|
},
|
||||||
onReset = { showConfirmReset = true },
|
onReset = { showConfirmReset = true },
|
||||||
onApply = {
|
onApply = {
|
||||||
coroutineScope.launch {
|
coroutineScope.launch {
|
||||||
@@ -780,7 +739,6 @@ fun SuSFSConfigScreen(
|
|||||||
susPaths = SuSFSManager.getSusPaths(context)
|
susPaths = SuSFSManager.getSusPaths(context)
|
||||||
susLoopPaths = SuSFSManager.getSusLoopPaths(context)
|
susLoopPaths = SuSFSManager.getSusLoopPaths(context)
|
||||||
susMaps = SuSFSManager.getSusMaps(context)
|
susMaps = SuSFSManager.getSusMaps(context)
|
||||||
tryUmounts = SuSFSManager.getTryUmounts(context)
|
|
||||||
androidDataPath = SuSFSManager.getAndroidDataPath(context)
|
androidDataPath = SuSFSManager.getAndroidDataPath(context)
|
||||||
sdcardPath = SuSFSManager.getSdcardPath(context)
|
sdcardPath = SuSFSManager.getSdcardPath(context)
|
||||||
kstatConfigs = SuSFSManager.getKstatConfigs(context)
|
kstatConfigs = SuSFSManager.getKstatConfigs(context)
|
||||||
@@ -863,40 +821,6 @@ fun SuSFSConfigScreen(
|
|||||||
onReset = { showResetSusMapsDialog = true }
|
onReset = { showResetSusMapsDialog = true }
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
SuSFSTab.TRY_UMOUNT -> {
|
|
||||||
TryUmountContent(
|
|
||||||
tryUmounts = tryUmounts,
|
|
||||||
umountForZygoteIsoService = umountForZygoteIsoService,
|
|
||||||
isLoading = isLoading,
|
|
||||||
onAddUmount = { showAddUmountDialog = true },
|
|
||||||
onRemoveUmount = { umountEntry ->
|
|
||||||
coroutineScope.launch {
|
|
||||||
isLoading = true
|
|
||||||
if (SuSFSManager.removeTryUmount(context, umountEntry)) {
|
|
||||||
tryUmounts = SuSFSManager.getTryUmounts(context)
|
|
||||||
}
|
|
||||||
isLoading = false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
onEditUmount = { umountEntry ->
|
|
||||||
editingUmount = umountEntry
|
|
||||||
showAddUmountDialog = true
|
|
||||||
},
|
|
||||||
onToggleUmountForZygoteIsoService = { enabled ->
|
|
||||||
coroutineScope.launch {
|
|
||||||
isLoading = true
|
|
||||||
val success =
|
|
||||||
SuSFSManager.setUmountForZygoteIsoService(context, enabled)
|
|
||||||
if (success) {
|
|
||||||
umountForZygoteIsoService = enabled
|
|
||||||
}
|
|
||||||
isLoading = false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
onReset = { showResetUmountsDialog = true }
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
SuSFSTab.KSTAT_CONFIG -> {
|
SuSFSTab.KSTAT_CONFIG -> {
|
||||||
KstatConfigContent(
|
KstatConfigContent(
|
||||||
kstatConfigs = kstatConfigs,
|
kstatConfigs = kstatConfigs,
|
||||||
|
|||||||
@@ -659,69 +659,6 @@ fun AddAppPathDialog(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Composable
|
|
||||||
fun AddTryUmountDialog(
|
|
||||||
showDialog: Boolean,
|
|
||||||
onDismiss: () -> Unit,
|
|
||||||
onConfirm: (String, Int) -> Unit,
|
|
||||||
isLoading: Boolean,
|
|
||||||
initialPath: String = "",
|
|
||||||
initialMode: Int = 0
|
|
||||||
) {
|
|
||||||
var newUmountPath by remember { mutableStateOf("") }
|
|
||||||
var newUmountMode by remember { mutableIntStateOf(0) }
|
|
||||||
|
|
||||||
// 当对话框显示时,设置初始值
|
|
||||||
LaunchedEffect(showDialog, initialPath, initialMode) {
|
|
||||||
if (showDialog) {
|
|
||||||
newUmountPath = initialPath
|
|
||||||
newUmountMode = initialMode
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val umountModeItems = listOf(
|
|
||||||
stringResource(R.string.susfs_umount_mode_normal),
|
|
||||||
stringResource(R.string.susfs_umount_mode_detach)
|
|
||||||
)
|
|
||||||
|
|
||||||
UniversalDialog(
|
|
||||||
showDialog = showDialog,
|
|
||||||
onDismiss = onDismiss,
|
|
||||||
onConfirm = {
|
|
||||||
if (newUmountPath.isNotBlank()) {
|
|
||||||
onConfirm(newUmountPath.trim(), newUmountMode)
|
|
||||||
true
|
|
||||||
} else {
|
|
||||||
false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
titleRes = if (initialPath.isNotEmpty()) R.string.susfs_edit_try_umount else R.string.susfs_add_try_umount,
|
|
||||||
isLoading = isLoading,
|
|
||||||
fields = listOf(
|
|
||||||
DialogField.TextField(
|
|
||||||
value = newUmountPath,
|
|
||||||
onValueChange = { newUmountPath = it },
|
|
||||||
labelRes = R.string.susfs_path_label,
|
|
||||||
enabled = !isLoading
|
|
||||||
),
|
|
||||||
DialogField.Dropdown(
|
|
||||||
titleRes = R.string.susfs_umount_mode_label,
|
|
||||||
summary = umountModeItems[newUmountMode],
|
|
||||||
items = umountModeItems,
|
|
||||||
selectedIndex = newUmountMode,
|
|
||||||
onSelectedIndexChange = { newUmountMode = it },
|
|
||||||
enabled = !isLoading
|
|
||||||
)
|
|
||||||
),
|
|
||||||
confirmTextRes = if (initialPath.isNotEmpty()) R.string.susfs_save else R.string.add,
|
|
||||||
isConfirmEnabled = newUmountPath.isNotBlank() && !isLoading,
|
|
||||||
onReset = {
|
|
||||||
newUmountPath = ""
|
|
||||||
newUmountMode = 0
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 添加Kstat静态配置对话框
|
* 添加Kstat静态配置对话框
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -46,6 +46,8 @@ fun BasicSettingsContent(
|
|||||||
onEnableAvcLogSpoofingChange: (Boolean) -> Unit,
|
onEnableAvcLogSpoofingChange: (Boolean) -> Unit,
|
||||||
hideSusMountsForAllProcs: Boolean,
|
hideSusMountsForAllProcs: Boolean,
|
||||||
onHideSusMountsForAllProcsChange: (Boolean) -> Unit,
|
onHideSusMountsForAllProcsChange: (Boolean) -> Unit,
|
||||||
|
umountForZygoteIsoService: Boolean,
|
||||||
|
onUmountForZygoteIsoServiceChange: (Boolean) -> Unit,
|
||||||
onReset: (() -> Unit)? = null,
|
onReset: (() -> Unit)? = null,
|
||||||
onApply: (() -> Unit)? = null,
|
onApply: (() -> Unit)? = null,
|
||||||
onConfigReload: () -> Unit
|
onConfigReload: () -> Unit
|
||||||
@@ -266,6 +268,23 @@ fun BasicSettingsContent(
|
|||||||
onCheckedChange = onHideSusMountsForAllProcsChange,
|
onCheckedChange = onHideSusMountsForAllProcsChange,
|
||||||
enabled = !isLoading
|
enabled = !isLoading
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// 卸载 Zygote 隔离服务开关
|
||||||
|
SuperSwitch(
|
||||||
|
title = stringResource(R.string.umount_zygote_iso_service),
|
||||||
|
summary = stringResource(R.string.umount_zygote_iso_service_description),
|
||||||
|
leftAction = {
|
||||||
|
Icon(
|
||||||
|
Icons.Default.Security,
|
||||||
|
modifier = Modifier.padding(end = 16.dp),
|
||||||
|
contentDescription = stringResource(R.string.umount_zygote_iso_service),
|
||||||
|
tint = colorScheme.onBackground
|
||||||
|
)
|
||||||
|
},
|
||||||
|
checked = umountForZygoteIsoService,
|
||||||
|
onCheckedChange = onUmountForZygoteIsoServiceChange,
|
||||||
|
enabled = !isLoading
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 槽位信息按钮
|
// 槽位信息按钮
|
||||||
|
|||||||
@@ -1,99 +0,0 @@
|
|||||||
package com.sukisu.ultra.ui.susfs.content
|
|
||||||
|
|
||||||
import androidx.compose.foundation.layout.*
|
|
||||||
import androidx.compose.material.icons.Icons
|
|
||||||
import androidx.compose.material.icons.filled.*
|
|
||||||
import androidx.compose.runtime.Composable
|
|
||||||
import androidx.compose.ui.Modifier
|
|
||||||
import androidx.compose.ui.res.stringResource
|
|
||||||
import androidx.compose.ui.unit.dp
|
|
||||||
import com.sukisu.ultra.R
|
|
||||||
import com.sukisu.ultra.ui.susfs.component.BottomActionButtons
|
|
||||||
import com.sukisu.ultra.ui.susfs.component.EmptyStateCard
|
|
||||||
import com.sukisu.ultra.ui.susfs.component.PathItemCard
|
|
||||||
import com.sukisu.ultra.ui.susfs.component.ResetButton
|
|
||||||
import top.yukonga.miuix.kmp.basic.*
|
|
||||||
import top.yukonga.miuix.kmp.extra.SuperSwitch
|
|
||||||
import top.yukonga.miuix.kmp.theme.MiuixTheme.colorScheme
|
|
||||||
|
|
||||||
@Composable
|
|
||||||
fun TryUmountContent(
|
|
||||||
tryUmounts: Set<String>,
|
|
||||||
umountForZygoteIsoService: Boolean,
|
|
||||||
isLoading: Boolean,
|
|
||||||
onAddUmount: () -> Unit,
|
|
||||||
onRemoveUmount: (String) -> Unit,
|
|
||||||
onEditUmount: ((String) -> Unit)? = null,
|
|
||||||
onToggleUmountForZygoteIsoService: (Boolean) -> Unit,
|
|
||||||
onReset: (() -> Unit)? = null
|
|
||||||
) {
|
|
||||||
Column(
|
|
||||||
modifier = Modifier.fillMaxWidth(),
|
|
||||||
verticalArrangement = Arrangement.spacedBy(12.dp)
|
|
||||||
) {
|
|
||||||
Card(
|
|
||||||
modifier = Modifier.fillMaxWidth(),
|
|
||||||
) {
|
|
||||||
SuperSwitch(
|
|
||||||
title = stringResource(R.string.umount_zygote_iso_service),
|
|
||||||
summary = stringResource(R.string.umount_zygote_iso_service_description),
|
|
||||||
leftAction = {
|
|
||||||
Icon(
|
|
||||||
Icons.Default.Security,
|
|
||||||
modifier = Modifier.padding(end = 16.dp),
|
|
||||||
contentDescription = stringResource(R.string.umount_zygote_iso_service),
|
|
||||||
tint = colorScheme.onBackground
|
|
||||||
)
|
|
||||||
},
|
|
||||||
checked = umountForZygoteIsoService,
|
|
||||||
onCheckedChange = onToggleUmountForZygoteIsoService,
|
|
||||||
enabled = !isLoading
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tryUmounts.isEmpty()) {
|
|
||||||
EmptyStateCard(
|
|
||||||
message = stringResource(R.string.susfs_no_umounts_configured)
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
tryUmounts.toList().forEach { umountEntry ->
|
|
||||||
val parts = umountEntry.split("|")
|
|
||||||
val path = if (parts.isNotEmpty()) parts[0] else umountEntry
|
|
||||||
val mode = if (parts.size > 1) parts[1] else "0"
|
|
||||||
val modeText = if (mode == "0")
|
|
||||||
stringResource(R.string.susfs_umount_mode_normal_short)
|
|
||||||
else
|
|
||||||
stringResource(R.string.susfs_umount_mode_detach_short)
|
|
||||||
|
|
||||||
PathItemCard(
|
|
||||||
path = path,
|
|
||||||
icon = Icons.Default.Storage,
|
|
||||||
additionalInfo = stringResource(
|
|
||||||
R.string.susfs_umount_mode_display,
|
|
||||||
modeText,
|
|
||||||
mode
|
|
||||||
),
|
|
||||||
onDelete = { onRemoveUmount(umountEntry) },
|
|
||||||
onEdit = if (onEditUmount != null) {
|
|
||||||
{ onEditUmount(umountEntry) }
|
|
||||||
} else null,
|
|
||||||
isLoading = isLoading
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
BottomActionButtons(
|
|
||||||
primaryButtonText = stringResource(R.string.add),
|
|
||||||
onPrimaryClick = onAddUmount,
|
|
||||||
isLoading = isLoading
|
|
||||||
)
|
|
||||||
|
|
||||||
if (onReset != null && tryUmounts.isNotEmpty()) {
|
|
||||||
ResetButton(
|
|
||||||
title = stringResource(R.string.susfs_reset_umounts_title),
|
|
||||||
onClick = onReset
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -40,7 +40,6 @@ object SuSFSManager {
|
|||||||
private const val KEY_SUS_LOOP_PATHS = "sus_loop_paths"
|
private const val KEY_SUS_LOOP_PATHS = "sus_loop_paths"
|
||||||
|
|
||||||
private const val KEY_SUS_MAPS = "sus_maps"
|
private const val KEY_SUS_MAPS = "sus_maps"
|
||||||
private const val KEY_TRY_UMOUNTS = "try_umounts"
|
|
||||||
private const val KEY_ANDROID_DATA_PATH = "android_data_path"
|
private const val KEY_ANDROID_DATA_PATH = "android_data_path"
|
||||||
private const val KEY_SDCARD_PATH = "sdcard_path"
|
private const val KEY_SDCARD_PATH = "sdcard_path"
|
||||||
private const val KEY_ENABLE_LOG = "enable_log"
|
private const val KEY_ENABLE_LOG = "enable_log"
|
||||||
@@ -147,7 +146,6 @@ object SuSFSManager {
|
|||||||
val susPaths: Set<String>,
|
val susPaths: Set<String>,
|
||||||
val susLoopPaths: Set<String>,
|
val susLoopPaths: Set<String>,
|
||||||
val susMaps: Set<String>,
|
val susMaps: Set<String>,
|
||||||
val tryUmounts: Set<String>,
|
|
||||||
val androidDataPath: String,
|
val androidDataPath: String,
|
||||||
val sdcardPath: String,
|
val sdcardPath: String,
|
||||||
val enableLog: Boolean,
|
val enableLog: Boolean,
|
||||||
@@ -168,7 +166,6 @@ object SuSFSManager {
|
|||||||
susPaths.isNotEmpty() ||
|
susPaths.isNotEmpty() ||
|
||||||
susLoopPaths.isNotEmpty() ||
|
susLoopPaths.isNotEmpty() ||
|
||||||
susMaps.isNotEmpty() ||
|
susMaps.isNotEmpty() ||
|
||||||
tryUmounts.isNotEmpty() ||
|
|
||||||
kstatConfigs.isNotEmpty() ||
|
kstatConfigs.isNotEmpty() ||
|
||||||
addKstatPaths.isNotEmpty()
|
addKstatPaths.isNotEmpty()
|
||||||
}
|
}
|
||||||
@@ -267,7 +264,6 @@ object SuSFSManager {
|
|||||||
susPaths = getSusPaths(context),
|
susPaths = getSusPaths(context),
|
||||||
susLoopPaths = getSusLoopPaths(context),
|
susLoopPaths = getSusLoopPaths(context),
|
||||||
susMaps = getSusMaps(context),
|
susMaps = getSusMaps(context),
|
||||||
tryUmounts = getTryUmounts(context),
|
|
||||||
androidDataPath = getAndroidDataPath(context),
|
androidDataPath = getAndroidDataPath(context),
|
||||||
sdcardPath = getSdcardPath(context),
|
sdcardPath = getSdcardPath(context),
|
||||||
enableLog = getEnableLogState(context),
|
enableLog = getEnableLogState(context),
|
||||||
@@ -369,12 +365,6 @@ object SuSFSManager {
|
|||||||
fun getSusMaps(context: Context): Set<String> =
|
fun getSusMaps(context: Context): Set<String> =
|
||||||
getPrefs(context).getStringSet(KEY_SUS_MAPS, emptySet()) ?: emptySet()
|
getPrefs(context).getStringSet(KEY_SUS_MAPS, emptySet()) ?: emptySet()
|
||||||
|
|
||||||
fun saveTryUmounts(context: Context, umounts: Set<String>) =
|
|
||||||
getPrefs(context).edit { putStringSet(KEY_TRY_UMOUNTS, umounts) }
|
|
||||||
|
|
||||||
fun getTryUmounts(context: Context): Set<String> =
|
|
||||||
getPrefs(context).getStringSet(KEY_TRY_UMOUNTS, emptySet()) ?: emptySet()
|
|
||||||
|
|
||||||
fun saveKstatConfigs(context: Context, configs: Set<String>) =
|
fun saveKstatConfigs(context: Context, configs: Set<String>) =
|
||||||
getPrefs(context).edit { putStringSet(KEY_KSTAT_CONFIGS, configs) }
|
getPrefs(context).edit { putStringSet(KEY_KSTAT_CONFIGS, configs) }
|
||||||
|
|
||||||
@@ -552,7 +542,6 @@ object SuSFSManager {
|
|||||||
KEY_SUS_PATHS to getSusPaths(context),
|
KEY_SUS_PATHS to getSusPaths(context),
|
||||||
KEY_SUS_LOOP_PATHS to getSusLoopPaths(context),
|
KEY_SUS_LOOP_PATHS to getSusLoopPaths(context),
|
||||||
KEY_SUS_MAPS to getSusMaps(context),
|
KEY_SUS_MAPS to getSusMaps(context),
|
||||||
KEY_TRY_UMOUNTS to getTryUmounts(context),
|
|
||||||
KEY_ANDROID_DATA_PATH to getAndroidDataPath(context),
|
KEY_ANDROID_DATA_PATH to getAndroidDataPath(context),
|
||||||
KEY_SDCARD_PATH to getSdcardPath(context),
|
KEY_SDCARD_PATH to getSdcardPath(context),
|
||||||
KEY_ENABLE_LOG to getEnableLogState(context),
|
KEY_ENABLE_LOG to getEnableLogState(context),
|
||||||
@@ -1066,48 +1055,6 @@ object SuSFSManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 添加尝试卸载
|
|
||||||
private suspend fun addTryUmountInternal(context: Context, path: String, mode: Int): Boolean {
|
|
||||||
executeSusfsCommand(context, "add_try_umount '$path' $mode")
|
|
||||||
saveTryUmounts(context, getTryUmounts(context) + "$path|$mode")
|
|
||||||
if (isAutoStartEnabled(context)) updateMagiskModule(context)
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
suspend fun addTryUmount(context: Context, path: String, mode: Int): Boolean {
|
|
||||||
return addTryUmountInternal(context, path, mode)
|
|
||||||
}
|
|
||||||
|
|
||||||
suspend fun removeTryUmount(context: Context, umountEntry: String): Boolean {
|
|
||||||
saveTryUmounts(context, getTryUmounts(context) - umountEntry)
|
|
||||||
if (isAutoStartEnabled(context)) updateMagiskModule(context)
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// 编辑尝试卸载
|
|
||||||
suspend fun editTryUmount(context: Context, oldEntry: String, newPath: String, newMode: Int): Boolean {
|
|
||||||
return try {
|
|
||||||
val currentUmounts = getTryUmounts(context).toMutableSet()
|
|
||||||
if (!currentUmounts.remove(oldEntry)) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
saveTryUmounts(context, currentUmounts)
|
|
||||||
|
|
||||||
val success = addTryUmountInternal(context, newPath, newMode)
|
|
||||||
|
|
||||||
if (!success) {
|
|
||||||
// 如果添加新条目失败,恢复旧条目
|
|
||||||
currentUmounts.add(oldEntry)
|
|
||||||
saveTryUmounts(context, currentUmounts)
|
|
||||||
if (isAutoStartEnabled(context)) updateMagiskModule(context)
|
|
||||||
}
|
|
||||||
return success
|
|
||||||
} catch (_: Exception) {
|
|
||||||
false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Zygote隔离服务卸载控制
|
// Zygote隔离服务卸载控制
|
||||||
suspend fun setUmountForZygoteIsoService(context: Context, enabled: Boolean): Boolean {
|
suspend fun setUmountForZygoteIsoService(context: Context, enabled: Boolean): Boolean {
|
||||||
val result = executeSusfsCommandWithOutput(context, "umount_for_zygote_iso_service ${if (enabled) 1 else 0}")
|
val result = executeSusfsCommandWithOutput(context, "umount_for_zygote_iso_service ${if (enabled) 1 else 0}")
|
||||||
|
|||||||
@@ -427,21 +427,6 @@ object ScriptGenerator {
|
|||||||
appendLine(generateBinaryCheck(config.targetPath))
|
appendLine(generateBinaryCheck(config.targetPath))
|
||||||
appendLine()
|
appendLine()
|
||||||
|
|
||||||
// 添加尝试卸载
|
|
||||||
if (config.tryUmounts.isNotEmpty()) {
|
|
||||||
appendLine("# 添加尝试卸载")
|
|
||||||
config.tryUmounts.forEach { umount ->
|
|
||||||
val parts = umount.split("|")
|
|
||||||
if (parts.size == 2) {
|
|
||||||
val path = parts[0]
|
|
||||||
val mode = parts[1]
|
|
||||||
appendLine($$"\"$SUSFS_BIN\" add_try_umount '$$path' $$mode")
|
|
||||||
appendLine($$"echo \"$(get_current_time): 添加尝试卸载: $$path (模式: $$mode)\" >> \"$LOG_FILE\"")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
appendLine()
|
|
||||||
}
|
|
||||||
|
|
||||||
appendLine($$"echo \"$(get_current_time): Post-Mount脚本执行完成\" >> \"$LOG_FILE\"")
|
appendLine($$"echo \"$(get_current_time): Post-Mount脚本执行完成\" >> \"$LOG_FILE\"")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
@@ -361,7 +361,6 @@
|
|||||||
<!-- SuSFS Toast Messages -->
|
<!-- SuSFS Toast Messages -->
|
||||||
<string name="susfs_binary_not_found">无法找到 ksu_susfs 文件</string>
|
<string name="susfs_binary_not_found">无法找到 ksu_susfs 文件</string>
|
||||||
<string name="susfs_command_failed">SuSFS 命令执行失败</string>
|
<string name="susfs_command_failed">SuSFS 命令执行失败</string>
|
||||||
<!-- SuSFS Settings Item -->
|
|
||||||
<!-- 开机自启动相关 -->
|
<!-- 开机自启动相关 -->
|
||||||
<string name="susfs_autostart_title">开机自启动</string>
|
<string name="susfs_autostart_title">开机自启动</string>
|
||||||
<string name="susfs_autostart_description">重启时自动应用所有非默认配置</string>
|
<string name="susfs_autostart_description">重启时自动应用所有非默认配置</string>
|
||||||
@@ -369,28 +368,15 @@
|
|||||||
<!-- SuSFS Tab Titles -->
|
<!-- SuSFS Tab Titles -->
|
||||||
<string name="susfs_tab_basic_settings">基本设置</string>
|
<string name="susfs_tab_basic_settings">基本设置</string>
|
||||||
<string name="susfs_tab_sus_paths">SuS 路径</string>
|
<string name="susfs_tab_sus_paths">SuS 路径</string>
|
||||||
<string name="susfs_tab_try_umount">尝试卸载</string>
|
|
||||||
<string name="susfs_tab_path_settings">路径设置</string>
|
<string name="susfs_tab_path_settings">路径设置</string>
|
||||||
<string name="susfs_tab_enabled_features">启用功能状态</string>
|
<string name="susfs_tab_enabled_features">启用功能状态</string>
|
||||||
<!-- SuSFS Path Management -->
|
<!-- SuSFS Path Management -->
|
||||||
<string name="susfs_add_sus_path">添加 SuS 路径</string>
|
<string name="susfs_add_sus_path">添加 SuS 路径</string>
|
||||||
<string name="susfs_add_try_umount">添加尝试卸载</string>
|
|
||||||
<string name="susfs_path_label">路径</string>
|
<string name="susfs_path_label">路径</string>
|
||||||
<string name="susfs_no_paths_configured">暂无 SuS 路径配置</string>
|
<string name="susfs_no_paths_configured">暂无 SuS 路径配置</string>
|
||||||
<string name="susfs_no_umounts_configured">暂无尝试卸载配置</string>
|
|
||||||
<!-- SuSFS Umount Mode -->
|
|
||||||
<string name="susfs_umount_mode_label">卸载模式</string>
|
|
||||||
<string name="susfs_umount_mode_normal">普通卸载(0)</string>
|
|
||||||
<string name="susfs_umount_mode_detach">分离卸载(1)</string>
|
|
||||||
<string name="susfs_umount_mode_normal_short">普通</string>
|
|
||||||
<string name="susfs_umount_mode_detach_short">分离</string>
|
|
||||||
<string name="susfs_umount_mode_display">模式: %1$s (%2$s)</string>
|
|
||||||
<!-- SuSFS Run Umount -->
|
|
||||||
<!-- SuSFS Reset Categories -->
|
<!-- SuSFS Reset Categories -->
|
||||||
<string name="susfs_reset_paths_title">重置 SuS 路径</string>
|
<string name="susfs_reset_paths_title">重置 SuS 路径</string>
|
||||||
<string name="susfs_reset_paths_message">这将清除所有 SuS 路径配置,确定要继续吗?</string>
|
<string name="susfs_reset_paths_message">这将清除所有 SuS 路径配置,确定要继续吗?</string>
|
||||||
<string name="susfs_reset_umounts_title">重置尝试卸载</string>
|
|
||||||
<string name="susfs_reset_umounts_message">这将清除所有尝试卸载配置,确定要继续吗?</string>
|
|
||||||
<string name="susfs_reset_path_title">重置路径设置</string>
|
<string name="susfs_reset_path_title">重置路径设置</string>
|
||||||
<!-- SuSFS Path Settings -->
|
<!-- SuSFS Path Settings -->
|
||||||
<string name="susfs_android_data_path_label">Android Data 路径</string>
|
<string name="susfs_android_data_path_label">Android Data 路径</string>
|
||||||
@@ -475,7 +461,6 @@
|
|||||||
<string name="cleanup_residue">清理工具残留</string>
|
<string name="cleanup_residue">清理工具残留</string>
|
||||||
<string name="cleanup_residue_description">清理各种模块以及工具的残留文件和目录(可能会误删导致丢失以及无法启动,谨慎使用)</string>
|
<string name="cleanup_residue_description">清理各种模块以及工具的残留文件和目录(可能会误删导致丢失以及无法启动,谨慎使用)</string>
|
||||||
<string name="susfs_edit_sus_path">编辑 SuS 路径</string>
|
<string name="susfs_edit_sus_path">编辑 SuS 路径</string>
|
||||||
<string name="susfs_edit_try_umount">编辑尝试卸载</string>
|
|
||||||
<string name="edit_kstat_statically_title">编辑 Kstat 静态配置</string>
|
<string name="edit_kstat_statically_title">编辑 Kstat 静态配置</string>
|
||||||
<string name="edit_kstat_path_title">编辑 Kstat 路径</string>
|
<string name="edit_kstat_path_title">编辑 Kstat 路径</string>
|
||||||
<string name="susfs_save">保存</string>
|
<string name="susfs_save">保存</string>
|
||||||
|
|||||||
@@ -369,7 +369,6 @@
|
|||||||
<!-- SuSFS Toast Messages -->
|
<!-- SuSFS Toast Messages -->
|
||||||
<string name="susfs_binary_not_found">Cannot find ksu_susfs file</string>
|
<string name="susfs_binary_not_found">Cannot find ksu_susfs file</string>
|
||||||
<string name="susfs_command_failed">SuSFS command execution failed</string>
|
<string name="susfs_command_failed">SuSFS command execution failed</string>
|
||||||
<!-- SuSFS Settings Item -->
|
|
||||||
<!-- 开机自启动相关 -->
|
<!-- 开机自启动相关 -->
|
||||||
<string name="susfs_autostart_title">Auto Start</string>
|
<string name="susfs_autostart_title">Auto Start</string>
|
||||||
<string name="susfs_autostart_description">Automatically apply all non-default configurations on reboot</string>
|
<string name="susfs_autostart_description">Automatically apply all non-default configurations on reboot</string>
|
||||||
@@ -377,27 +376,15 @@
|
|||||||
<!-- SuSFS Tab Titles -->
|
<!-- SuSFS Tab Titles -->
|
||||||
<string name="susfs_tab_basic_settings">Basic Settings</string>
|
<string name="susfs_tab_basic_settings">Basic Settings</string>
|
||||||
<string name="susfs_tab_sus_paths">SUS Paths</string>
|
<string name="susfs_tab_sus_paths">SUS Paths</string>
|
||||||
<string name="susfs_tab_try_umount">Try Umount</string>
|
|
||||||
<string name="susfs_tab_path_settings">Path Settings</string>
|
<string name="susfs_tab_path_settings">Path Settings</string>
|
||||||
<string name="susfs_tab_enabled_features">Enabled Features Status</string>
|
<string name="susfs_tab_enabled_features">Enabled Features Status</string>
|
||||||
<!-- SuSFS Path Management -->
|
<!-- SuSFS Path Management -->
|
||||||
<string name="susfs_add_sus_path">Add SUS Path</string>
|
<string name="susfs_add_sus_path">Add SUS Path</string>
|
||||||
<string name="susfs_add_try_umount">Add Try Umount</string>
|
|
||||||
<string name="susfs_path_label">Path</string>
|
<string name="susfs_path_label">Path</string>
|
||||||
<string name="susfs_no_paths_configured">No SUS paths configured</string>
|
<string name="susfs_no_paths_configured">No SUS paths configured</string>
|
||||||
<string name="susfs_no_umounts_configured">No try umount configured</string>
|
|
||||||
<!-- SuSFS Umount Mode -->
|
|
||||||
<string name="susfs_umount_mode_label">Umount Mode</string>
|
|
||||||
<string name="susfs_umount_mode_normal">Normal Umount (0)</string>
|
|
||||||
<string name="susfs_umount_mode_detach">Detach Umount (1)</string>
|
|
||||||
<string name="susfs_umount_mode_normal_short">Normal</string>
|
|
||||||
<string name="susfs_umount_mode_detach_short">Detach</string>
|
|
||||||
<string name="susfs_umount_mode_display">Mode: %1$s (%2$s)</string>
|
|
||||||
<!-- SuSFS Reset Categories -->
|
<!-- SuSFS Reset Categories -->
|
||||||
<string name="susfs_reset_paths_title">Reset SUS Paths</string>
|
<string name="susfs_reset_paths_title">Reset SUS Paths</string>
|
||||||
<string name="susfs_reset_paths_message">This will clear all SUS path configurations. Are you sure you want to continue?</string>
|
<string name="susfs_reset_paths_message">This will clear all SUS path configurations. Are you sure you want to continue?</string>
|
||||||
<string name="susfs_reset_umounts_title">Reset Try Umount</string>
|
|
||||||
<string name="susfs_reset_umounts_message">This will clear all try umount configurations. Are you sure you want to continue?</string>
|
|
||||||
<string name="susfs_reset_path_title">Reset Path Settings</string>
|
<string name="susfs_reset_path_title">Reset Path Settings</string>
|
||||||
<!-- SuSFS Path Settings -->
|
<!-- SuSFS Path Settings -->
|
||||||
<string name="susfs_android_data_path_label">Android Data Path</string>
|
<string name="susfs_android_data_path_label">Android Data Path</string>
|
||||||
@@ -435,7 +422,6 @@
|
|||||||
<string name="susfs_slot_use_uname">Use Uname</string>
|
<string name="susfs_slot_use_uname">Use Uname</string>
|
||||||
<string name="susfs_slot_use_build_time">Use Build Time</string>
|
<string name="susfs_slot_use_build_time">Use Build Time</string>
|
||||||
<string name="susfs_slot_info_unavailable">Unable to retrieve slot information</string>
|
<string name="susfs_slot_info_unavailable">Unable to retrieve slot information</string>
|
||||||
<!-- SuSFS 自启动相关字符串 -->
|
|
||||||
<!-- SuSFS Kstat相关字符串 -->
|
<!-- SuSFS Kstat相关字符串 -->
|
||||||
<string name="susfs_tab_kstat_config">Kstat Configuration</string>
|
<string name="susfs_tab_kstat_config">Kstat Configuration</string>
|
||||||
<string name="add_kstat_statically_title">Add Kstat Static Configuration</string>
|
<string name="add_kstat_statically_title">Add Kstat Static Configuration</string>
|
||||||
@@ -482,7 +468,6 @@
|
|||||||
<string name="cleanup_residue">Cleanup Residue</string>
|
<string name="cleanup_residue">Cleanup Residue</string>
|
||||||
<string name="cleanup_residue_description">Clean up the residual files and directories of various modules and tools (May be deleted by mistake, resulting in loss and failure to start, use with caution)</string>
|
<string name="cleanup_residue_description">Clean up the residual files and directories of various modules and tools (May be deleted by mistake, resulting in loss and failure to start, use with caution)</string>
|
||||||
<string name="susfs_edit_sus_path">Edit SUS Path</string>
|
<string name="susfs_edit_sus_path">Edit SUS Path</string>
|
||||||
<string name="susfs_edit_try_umount">Edit Try Umount</string>
|
|
||||||
<string name="edit_kstat_statically_title">Edit Kstat Static Configuration</string>
|
<string name="edit_kstat_statically_title">Edit Kstat Static Configuration</string>
|
||||||
<string name="edit_kstat_path_title">Edit Kstat Path</string>
|
<string name="edit_kstat_path_title">Edit Kstat Path</string>
|
||||||
<string name="susfs_save">Save</string>
|
<string name="susfs_save">Save</string>
|
||||||
|
|||||||
Reference in New Issue
Block a user