Step 7-1: Optimize the susfs interface format and refactor the code
- Remove unused resources
This commit is contained in:
@@ -70,6 +70,7 @@ import com.sukisu.ultra.ui.component.UninstallDialog
|
|||||||
import com.sukisu.ultra.ui.component.rememberLoadingDialog
|
import com.sukisu.ultra.ui.component.rememberLoadingDialog
|
||||||
import com.sukisu.ultra.ui.util.execKsud
|
import com.sukisu.ultra.ui.util.execKsud
|
||||||
import com.sukisu.ultra.ui.util.getFeatureStatus
|
import com.sukisu.ultra.ui.util.getFeatureStatus
|
||||||
|
import com.sukisu.ultra.ui.util.getSuSFSFeatures
|
||||||
import com.sukisu.ultra.ui.util.rememberKpmAvailable
|
import com.sukisu.ultra.ui.util.rememberKpmAvailable
|
||||||
import top.yukonga.miuix.kmp.basic.Card
|
import top.yukonga.miuix.kmp.basic.Card
|
||||||
import top.yukonga.miuix.kmp.basic.Icon
|
import top.yukonga.miuix.kmp.basic.Icon
|
||||||
@@ -302,6 +303,9 @@ fun SettingPager(
|
|||||||
}
|
}
|
||||||
|
|
||||||
KsuIsValid {
|
KsuIsValid {
|
||||||
|
val rawFeature = getSuSFSFeatures()
|
||||||
|
val supported = rawFeature.isNotEmpty() && !rawFeature.startsWith("[-]")
|
||||||
|
if (supported) {
|
||||||
Card(
|
Card(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.padding(top = 12.dp)
|
.padding(top = 12.dp)
|
||||||
@@ -327,6 +331,7 @@ fun SettingPager(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
KsuIsValid {
|
KsuIsValid {
|
||||||
Card(
|
Card(
|
||||||
|
|||||||
@@ -149,13 +149,13 @@ fun Tools(
|
|||||||
|
|
||||||
DynamicManagerCard()
|
DynamicManagerCard()
|
||||||
|
|
||||||
|
val lkmMode = Natives.isLkmMode
|
||||||
|
if (lkmMode) {
|
||||||
Card(
|
Card(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.padding(top = 12.dp)
|
.padding(top = 12.dp)
|
||||||
.fillMaxWidth(),
|
.fillMaxWidth(),
|
||||||
) {
|
) {
|
||||||
val lkmMode = Natives.isLkmMode
|
|
||||||
if (lkmMode) {
|
|
||||||
val umontManager = stringResource(id = R.string.umount_path_manager)
|
val umontManager = stringResource(id = R.string.umount_path_manager)
|
||||||
SuperArrow(
|
SuperArrow(
|
||||||
title = umontManager,
|
title = umontManager,
|
||||||
@@ -168,8 +168,7 @@ fun Tools(
|
|||||||
)
|
)
|
||||||
},
|
},
|
||||||
onClick = {
|
onClick = {
|
||||||
navigator.navigate(UmountManagerDestination) {
|
navigator.navigate(UmountManagerDestination)
|
||||||
}
|
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,6 @@
|
|||||||
package com.sukisu.ultra.ui.susfs
|
package com.sukisu.ultra.ui.susfs
|
||||||
|
|
||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
import android.content.Context
|
|
||||||
import androidx.activity.compose.rememberLauncherForActivityResult
|
|
||||||
import androidx.activity.result.contract.ActivityResultContracts
|
|
||||||
import androidx.compose.foundation.background
|
import androidx.compose.foundation.background
|
||||||
import androidx.compose.foundation.clickable
|
import androidx.compose.foundation.clickable
|
||||||
import androidx.compose.foundation.layout.*
|
import androidx.compose.foundation.layout.*
|
||||||
@@ -15,6 +12,7 @@ import androidx.compose.material.icons.filled.*
|
|||||||
import androidx.compose.runtime.*
|
import androidx.compose.runtime.*
|
||||||
import androidx.compose.ui.Alignment
|
import androidx.compose.ui.Alignment
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.draw.clip
|
||||||
import androidx.compose.ui.graphics.Color
|
import androidx.compose.ui.graphics.Color
|
||||||
import androidx.compose.ui.input.nestedscroll.nestedScroll
|
import androidx.compose.ui.input.nestedscroll.nestedScroll
|
||||||
import androidx.compose.ui.platform.LocalContext
|
import androidx.compose.ui.platform.LocalContext
|
||||||
@@ -38,16 +36,20 @@ import com.ramcosta.composedestinations.annotation.RootGraph
|
|||||||
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
|
import com.ramcosta.composedestinations.navigation.DestinationsNavigator
|
||||||
import com.sukisu.ultra.R
|
import com.sukisu.ultra.R
|
||||||
import com.sukisu.ultra.ui.susfs.component.*
|
import com.sukisu.ultra.ui.susfs.component.*
|
||||||
|
import com.sukisu.ultra.ui.susfs.content.BasicSettingsContent
|
||||||
|
import com.sukisu.ultra.ui.susfs.content.EnabledFeaturesContent
|
||||||
|
import com.sukisu.ultra.ui.susfs.content.KstatConfigContent
|
||||||
|
import com.sukisu.ultra.ui.susfs.content.PathSettingsContent
|
||||||
|
import com.sukisu.ultra.ui.susfs.content.SusLoopPathsContent
|
||||||
|
import com.sukisu.ultra.ui.susfs.content.SusMapsContent
|
||||||
|
import com.sukisu.ultra.ui.susfs.content.SusMountsContent
|
||||||
|
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
|
||||||
import kotlinx.coroutines.Dispatchers
|
|
||||||
import kotlinx.coroutines.withContext
|
|
||||||
import kotlinx.coroutines.delay
|
|
||||||
import top.yukonga.miuix.kmp.basic.*
|
import top.yukonga.miuix.kmp.basic.*
|
||||||
import top.yukonga.miuix.kmp.extra.SuperDialog
|
import top.yukonga.miuix.kmp.extra.SuperDialog
|
||||||
import top.yukonga.miuix.kmp.extra.SuperDropdown
|
|
||||||
import top.yukonga.miuix.kmp.extra.SuperSwitch
|
|
||||||
import top.yukonga.miuix.kmp.icon.MiuixIcons
|
import top.yukonga.miuix.kmp.icon.MiuixIcons
|
||||||
import top.yukonga.miuix.kmp.icon.icons.useful.Back
|
import top.yukonga.miuix.kmp.icon.icons.useful.Back
|
||||||
import top.yukonga.miuix.kmp.theme.MiuixTheme
|
import top.yukonga.miuix.kmp.theme.MiuixTheme
|
||||||
@@ -55,13 +57,7 @@ import top.yukonga.miuix.kmp.theme.MiuixTheme.colorScheme
|
|||||||
import top.yukonga.miuix.kmp.utils.getWindowSize
|
import top.yukonga.miuix.kmp.utils.getWindowSize
|
||||||
import top.yukonga.miuix.kmp.utils.overScrollVertical
|
import top.yukonga.miuix.kmp.utils.overScrollVertical
|
||||||
import top.yukonga.miuix.kmp.utils.scrollEndHaptic
|
import top.yukonga.miuix.kmp.utils.scrollEndHaptic
|
||||||
import java.io.File
|
|
||||||
import java.text.SimpleDateFormat
|
|
||||||
import java.util.*
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 标签页枚举类
|
|
||||||
*/
|
|
||||||
enum class SuSFSTab(val displayNameRes: Int) {
|
enum class SuSFSTab(val displayNameRes: Int) {
|
||||||
BASIC_SETTINGS(R.string.susfs_tab_basic_settings),
|
BASIC_SETTINGS(R.string.susfs_tab_basic_settings),
|
||||||
SUS_PATHS(R.string.susfs_tab_sus_paths),
|
SUS_PATHS(R.string.susfs_tab_sus_paths),
|
||||||
@@ -80,9 +76,6 @@ enum class SuSFSTab(val displayNameRes: Int) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* SuSFS配置界面
|
|
||||||
*/
|
|
||||||
@SuppressLint("SdCardPath", "AutoboxingStateCreation")
|
@SuppressLint("SdCardPath", "AutoboxingStateCreation")
|
||||||
@Destination<RootGraph>
|
@Destination<RootGraph>
|
||||||
@Composable
|
@Composable
|
||||||
@@ -167,12 +160,6 @@ fun SuSFSConfigScreen(
|
|||||||
var showResetUmountsDialog by remember { mutableStateOf(false) }
|
var showResetUmountsDialog by remember { mutableStateOf(false) }
|
||||||
var showResetKstatDialog by remember { mutableStateOf(false) }
|
var showResetKstatDialog by remember { mutableStateOf(false) }
|
||||||
|
|
||||||
// 备份还原相关状态
|
|
||||||
var showBackupDialog by remember { mutableStateOf(false) }
|
|
||||||
var showRestoreDialog by remember { mutableStateOf(false) }
|
|
||||||
var showRestoreConfirmDialog by remember { mutableStateOf(false) }
|
|
||||||
var selectedBackupFile by remember { mutableStateOf<String?>(null) }
|
|
||||||
var backupInfo by remember { mutableStateOf<SuSFSManager.BackupData?>(null) }
|
|
||||||
|
|
||||||
var isNavigating by remember { mutableStateOf(false) }
|
var isNavigating by remember { mutableStateOf(false) }
|
||||||
|
|
||||||
@@ -186,62 +173,6 @@ fun SuSFSConfigScreen(
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// 文件选择器
|
|
||||||
val backupFileLauncher = rememberLauncherForActivityResult(
|
|
||||||
contract = ActivityResultContracts.CreateDocument("application/json")
|
|
||||||
) { uri ->
|
|
||||||
uri?.let { fileUri ->
|
|
||||||
val fileName = SuSFSManager.getDefaultBackupFileName()
|
|
||||||
val tempFile = File(context.cacheDir, fileName)
|
|
||||||
coroutineScope.launch {
|
|
||||||
isLoading = true
|
|
||||||
val success = SuSFSManager.createBackup(context, tempFile.absolutePath)
|
|
||||||
if (success) {
|
|
||||||
try {
|
|
||||||
context.contentResolver.openOutputStream(fileUri)?.use { outputStream ->
|
|
||||||
tempFile.inputStream().use { inputStream ->
|
|
||||||
inputStream.copyTo(outputStream)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (e: Exception) {
|
|
||||||
e.printStackTrace()
|
|
||||||
}
|
|
||||||
tempFile.delete()
|
|
||||||
}
|
|
||||||
isLoading = false
|
|
||||||
showBackupDialog = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val restoreFileLauncher = rememberLauncherForActivityResult(
|
|
||||||
contract = ActivityResultContracts.OpenDocument()
|
|
||||||
) { uri ->
|
|
||||||
uri?.let { fileUri ->
|
|
||||||
coroutineScope.launch {
|
|
||||||
try {
|
|
||||||
val tempFile = File(context.cacheDir, "temp_restore.susfs_backup")
|
|
||||||
context.contentResolver.openInputStream(fileUri)?.use { inputStream ->
|
|
||||||
tempFile.outputStream().use { outputStream ->
|
|
||||||
inputStream.copyTo(outputStream)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 验证备份文件
|
|
||||||
val backup = SuSFSManager.validateBackupFile(tempFile.absolutePath)
|
|
||||||
if (backup != null) {
|
|
||||||
selectedBackupFile = tempFile.absolutePath
|
|
||||||
backupInfo = backup
|
|
||||||
showRestoreConfirmDialog = true
|
|
||||||
}
|
|
||||||
tempFile.deleteOnExit()
|
|
||||||
} catch (e: Exception) {
|
|
||||||
e.printStackTrace()
|
|
||||||
}
|
|
||||||
showRestoreDialog = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 加载启用功能状态
|
// 加载启用功能状态
|
||||||
fun loadEnabledFeatures() {
|
fun loadEnabledFeatures() {
|
||||||
@@ -311,256 +242,6 @@ fun SuSFSConfigScreen(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 备份对话框
|
|
||||||
val showBackupDialogState = remember { mutableStateOf(showBackupDialog) }
|
|
||||||
LaunchedEffect(showBackupDialog) {
|
|
||||||
showBackupDialogState.value = showBackupDialog
|
|
||||||
}
|
|
||||||
if (showBackupDialog) {
|
|
||||||
SuperDialog(
|
|
||||||
show = showBackupDialogState,
|
|
||||||
title = stringResource(R.string.susfs_backup_title),
|
|
||||||
onDismissRequest = { showBackupDialog = false },
|
|
||||||
content = {
|
|
||||||
Text(stringResource(R.string.susfs_backup_description))
|
|
||||||
Spacer(modifier = Modifier.height(12.dp))
|
|
||||||
Row(
|
|
||||||
modifier = Modifier.fillMaxWidth(),
|
|
||||||
horizontalArrangement = Arrangement.spacedBy(12.dp)
|
|
||||||
) {
|
|
||||||
TextButton(
|
|
||||||
text = stringResource(R.string.cancel),
|
|
||||||
onClick = { showBackupDialog = false },
|
|
||||||
modifier = Modifier
|
|
||||||
.weight(1f)
|
|
||||||
.heightIn(min = 48.dp)
|
|
||||||
.padding(vertical = 8.dp)
|
|
||||||
)
|
|
||||||
TextButton(
|
|
||||||
text = stringResource(R.string.susfs_backup_create),
|
|
||||||
onClick = {
|
|
||||||
val dateFormat = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault())
|
|
||||||
val timestamp = dateFormat.format(Date())
|
|
||||||
backupFileLauncher.launch("SuSFS_Config_$timestamp.susfs_backup")
|
|
||||||
},
|
|
||||||
enabled = !isLoading,
|
|
||||||
modifier = Modifier
|
|
||||||
.weight(1f)
|
|
||||||
.heightIn(min = 48.dp)
|
|
||||||
.padding(vertical = 8.dp),
|
|
||||||
colors = ButtonDefaults.textButtonColorsPrimary()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 还原对话框
|
|
||||||
val showRestoreDialogState = remember { mutableStateOf(showRestoreDialog) }
|
|
||||||
LaunchedEffect(showRestoreDialog) {
|
|
||||||
showRestoreDialogState.value = showRestoreDialog
|
|
||||||
}
|
|
||||||
if (showRestoreDialog) {
|
|
||||||
SuperDialog(
|
|
||||||
show = showRestoreDialogState,
|
|
||||||
title = stringResource(R.string.susfs_restore_title),
|
|
||||||
onDismissRequest = { showRestoreDialog = false },
|
|
||||||
content = {
|
|
||||||
Text(stringResource(R.string.susfs_restore_description))
|
|
||||||
Spacer(modifier = Modifier.height(12.dp))
|
|
||||||
Row(
|
|
||||||
modifier = Modifier.fillMaxWidth(),
|
|
||||||
horizontalArrangement = Arrangement.spacedBy(12.dp)
|
|
||||||
) {
|
|
||||||
TextButton(
|
|
||||||
text = stringResource(R.string.cancel),
|
|
||||||
onClick = { showRestoreDialog = false },
|
|
||||||
modifier = Modifier
|
|
||||||
.weight(1f)
|
|
||||||
.heightIn(min = 48.dp)
|
|
||||||
.padding(vertical = 8.dp)
|
|
||||||
)
|
|
||||||
TextButton(
|
|
||||||
text = stringResource(R.string.susfs_restore_select_file),
|
|
||||||
onClick = {
|
|
||||||
restoreFileLauncher.launch(arrayOf("application/json", "*/*"))
|
|
||||||
},
|
|
||||||
enabled = !isLoading,
|
|
||||||
modifier = Modifier
|
|
||||||
.weight(1f)
|
|
||||||
.heightIn(min = 48.dp)
|
|
||||||
.padding(vertical = 8.dp),
|
|
||||||
colors = ButtonDefaults.textButtonColorsPrimary()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 还原确认对话框
|
|
||||||
val showRestoreConfirmDialogState = remember { mutableStateOf(showRestoreConfirmDialog && backupInfo != null) }
|
|
||||||
LaunchedEffect(showRestoreConfirmDialog, backupInfo) {
|
|
||||||
showRestoreConfirmDialogState.value = showRestoreConfirmDialog && backupInfo != null
|
|
||||||
}
|
|
||||||
if (showRestoreConfirmDialog && backupInfo != null) {
|
|
||||||
SuperDialog(
|
|
||||||
show = showRestoreConfirmDialogState,
|
|
||||||
title = stringResource(R.string.susfs_restore_confirm_title),
|
|
||||||
onDismissRequest = {
|
|
||||||
showRestoreConfirmDialog = false
|
|
||||||
selectedBackupFile = null
|
|
||||||
backupInfo = null
|
|
||||||
},
|
|
||||||
content = {
|
|
||||||
Column(
|
|
||||||
verticalArrangement = Arrangement.spacedBy(8.dp)
|
|
||||||
) {
|
|
||||||
Text(stringResource(R.string.susfs_restore_confirm_description))
|
|
||||||
|
|
||||||
Card(
|
|
||||||
modifier = Modifier.fillMaxWidth(),
|
|
||||||
) {
|
|
||||||
Column(
|
|
||||||
modifier = Modifier.padding(12.dp),
|
|
||||||
verticalArrangement = Arrangement.spacedBy(4.dp)
|
|
||||||
) {
|
|
||||||
val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault())
|
|
||||||
Text(
|
|
||||||
text = stringResource(R.string.susfs_backup_info_date,
|
|
||||||
dateFormat.format(Date(backupInfo!!.timestamp))),
|
|
||||||
fontSize = MiuixTheme.textStyles.body2.fontSize
|
|
||||||
)
|
|
||||||
Text(
|
|
||||||
text = stringResource(R.string.susfs_backup_info_device, backupInfo!!.deviceInfo),
|
|
||||||
fontSize = MiuixTheme.textStyles.body2.fontSize
|
|
||||||
)
|
|
||||||
Text(
|
|
||||||
text = stringResource(R.string.susfs_backup_info_version, backupInfo!!.version),
|
|
||||||
fontSize = MiuixTheme.textStyles.body2.fontSize
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Spacer(modifier = Modifier.height(12.dp))
|
|
||||||
Row(
|
|
||||||
modifier = Modifier.fillMaxWidth(),
|
|
||||||
horizontalArrangement = Arrangement.spacedBy(12.dp)
|
|
||||||
) {
|
|
||||||
TextButton(
|
|
||||||
text = stringResource(R.string.cancel),
|
|
||||||
onClick = {
|
|
||||||
showRestoreConfirmDialog = false
|
|
||||||
selectedBackupFile = null
|
|
||||||
backupInfo = null
|
|
||||||
},
|
|
||||||
modifier = Modifier
|
|
||||||
.weight(1f)
|
|
||||||
.heightIn(min = 48.dp)
|
|
||||||
.padding(vertical = 8.dp)
|
|
||||||
)
|
|
||||||
TextButton(
|
|
||||||
text = stringResource(R.string.susfs_restore_confirm),
|
|
||||||
onClick = {
|
|
||||||
selectedBackupFile?.let { filePath ->
|
|
||||||
coroutineScope.launch {
|
|
||||||
isLoading = true
|
|
||||||
try {
|
|
||||||
val success = SuSFSManager.restoreFromBackup(context, filePath)
|
|
||||||
if (success) {
|
|
||||||
// 在后台线程读取配置,然后在主线程更新状态
|
|
||||||
val configs = withContext(Dispatchers.IO) {
|
|
||||||
mapOf(
|
|
||||||
"unameValue" to SuSFSManager.getUnameValue(context),
|
|
||||||
"buildTimeValue" to SuSFSManager.getBuildTimeValue(context),
|
|
||||||
"autoStartEnabled" to SuSFSManager.isAutoStartEnabled(context),
|
|
||||||
"executeInPostFsData" to SuSFSManager.getExecuteInPostFsData(context),
|
|
||||||
"susPaths" to SuSFSManager.getSusPaths(context),
|
|
||||||
"susLoopPaths" to SuSFSManager.getSusLoopPaths(context),
|
|
||||||
"susMaps" to SuSFSManager.getSusMaps(context),
|
|
||||||
"susMounts" to SuSFSManager.getSusMounts(context),
|
|
||||||
"tryUmounts" to SuSFSManager.getTryUmounts(context),
|
|
||||||
"androidDataPath" to SuSFSManager.getAndroidDataPath(context),
|
|
||||||
"sdcardPath" to SuSFSManager.getSdcardPath(context),
|
|
||||||
"kstatConfigs" to SuSFSManager.getKstatConfigs(context),
|
|
||||||
"addKstatPaths" to SuSFSManager.getAddKstatPaths(context),
|
|
||||||
"hideSusMountsForAllProcs" to SuSFSManager.getHideSusMountsForAllProcs(context),
|
|
||||||
"enableHideBl" to SuSFSManager.getEnableHideBl(context),
|
|
||||||
"enableCleanupResidue" to SuSFSManager.getEnableCleanupResidue(context),
|
|
||||||
"umountForZygoteIsoService" to SuSFSManager.getUmountForZygoteIsoService(context),
|
|
||||||
"enableAvcLogSpoofing" to SuSFSManager.getEnableAvcLogSpoofing(context)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 在主线程更新状态
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
unameValue = configs["unameValue"] as String
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
buildTimeValue = configs["buildTimeValue"] as String
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
autoStartEnabled = configs["autoStartEnabled"] as Boolean
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
executeInPostFsData = configs["executeInPostFsData"] as Boolean
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
susPaths = configs["susPaths"] as Set<String>
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
susLoopPaths = configs["susLoopPaths"] as Set<String>
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
susMaps = configs["susMaps"] as Set<String>
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
susMounts = configs["susMounts"] as Set<String>
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
tryUmounts = configs["tryUmounts"] as Set<String>
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
androidDataPath = configs["androidDataPath"] as String
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
sdcardPath = configs["sdcardPath"] as String
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
kstatConfigs = configs["kstatConfigs"] as Set<String>
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
addKstatPaths = configs["addKstatPaths"] as Set<String>
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
hideSusMountsForAllProcs = configs["hideSusMountsForAllProcs"] as Boolean
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
enableHideBl = configs["enableHideBl"] as Boolean
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
enableCleanupResidue = configs["enableCleanupResidue"] as Boolean
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
umountForZygoteIsoService = configs["umountForZygoteIsoService"] as Boolean
|
|
||||||
@Suppress("UNCHECKED_CAST")
|
|
||||||
enableAvcLogSpoofing = configs["enableAvcLogSpoofing"] as Boolean
|
|
||||||
|
|
||||||
// 延迟关闭对话框,给 UI 时间更新
|
|
||||||
delay(300)
|
|
||||||
}
|
|
||||||
} catch (e: Exception) {
|
|
||||||
e.printStackTrace()
|
|
||||||
} finally {
|
|
||||||
// 先关闭对话框,确保在主线程上执行
|
|
||||||
withContext(Dispatchers.Main) {
|
|
||||||
isLoading = false
|
|
||||||
showRestoreConfirmDialog = false
|
|
||||||
}
|
|
||||||
// 延迟清空状态,确保对话框完全关闭后再清空
|
|
||||||
delay(100)
|
|
||||||
withContext(Dispatchers.Main) {
|
|
||||||
selectedBackupFile = null
|
|
||||||
backupInfo = null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
enabled = !isLoading,
|
|
||||||
modifier = Modifier
|
|
||||||
.weight(1f)
|
|
||||||
.heightIn(min = 48.dp)
|
|
||||||
.padding(vertical = 8.dp),
|
|
||||||
colors = ButtonDefaults.textButtonColorsPrimary()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 槽位信息对话框
|
// 槽位信息对话框
|
||||||
SlotInfoDialog(
|
SlotInfoDialog(
|
||||||
@@ -1072,8 +753,6 @@ fun SuSFSConfigScreen(
|
|||||||
},
|
},
|
||||||
onShowSlotInfo = { showSlotInfoDialog = true },
|
onShowSlotInfo = { showSlotInfoDialog = true },
|
||||||
context = context,
|
context = context,
|
||||||
onShowBackupDialog = { showBackupDialog = true },
|
|
||||||
onShowRestoreDialog = { showRestoreDialog = true },
|
|
||||||
enableHideBl = enableHideBl,
|
enableHideBl = enableHideBl,
|
||||||
onEnableHideBlChange = { enabled: Boolean ->
|
onEnableHideBlChange = { enabled: Boolean ->
|
||||||
enableHideBl = enabled
|
enableHideBl = enabled
|
||||||
@@ -1098,14 +777,62 @@ fun SuSFSConfigScreen(
|
|||||||
onEnableAvcLogSpoofingChange = { enabled: Boolean ->
|
onEnableAvcLogSpoofingChange = { enabled: Boolean ->
|
||||||
coroutineScope.launch {
|
coroutineScope.launch {
|
||||||
isLoading = true
|
isLoading = true
|
||||||
val success = SuSFSManager.setEnableAvcLogSpoofing(context, enabled)
|
val success =
|
||||||
|
SuSFSManager.setEnableAvcLogSpoofing(context, enabled)
|
||||||
if (success) {
|
if (success) {
|
||||||
enableAvcLogSpoofing = enabled
|
enableAvcLogSpoofing = enabled
|
||||||
}
|
}
|
||||||
isLoading = false
|
isLoading = false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onReset = { showConfirmReset = true }
|
onReset = { showConfirmReset = true },
|
||||||
|
onApply = {
|
||||||
|
coroutineScope.launch {
|
||||||
|
isLoading = true
|
||||||
|
val success = SuSFSManager.setUname(
|
||||||
|
context,
|
||||||
|
unameValue.trim(),
|
||||||
|
buildTimeValue.trim()
|
||||||
|
)
|
||||||
|
if (success) {
|
||||||
|
SuSFSManager.saveExecuteInPostFsData(
|
||||||
|
context,
|
||||||
|
executeInPostFsData
|
||||||
|
)
|
||||||
|
if (SuSFSManager.isAutoStartEnabled(context)) {
|
||||||
|
SuSFSManager.configureAutoStart(context, true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
isLoading = false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onConfigReload = {
|
||||||
|
coroutineScope.launch {
|
||||||
|
unameValue = SuSFSManager.getUnameValue(context)
|
||||||
|
buildTimeValue = SuSFSManager.getBuildTimeValue(context)
|
||||||
|
autoStartEnabled = SuSFSManager.isAutoStartEnabled(context)
|
||||||
|
executeInPostFsData =
|
||||||
|
SuSFSManager.getExecuteInPostFsData(context)
|
||||||
|
susPaths = SuSFSManager.getSusPaths(context)
|
||||||
|
susLoopPaths = SuSFSManager.getSusLoopPaths(context)
|
||||||
|
susMaps = SuSFSManager.getSusMaps(context)
|
||||||
|
susMounts = SuSFSManager.getSusMounts(context)
|
||||||
|
tryUmounts = SuSFSManager.getTryUmounts(context)
|
||||||
|
androidDataPath = SuSFSManager.getAndroidDataPath(context)
|
||||||
|
sdcardPath = SuSFSManager.getSdcardPath(context)
|
||||||
|
kstatConfigs = SuSFSManager.getKstatConfigs(context)
|
||||||
|
addKstatPaths = SuSFSManager.getAddKstatPaths(context)
|
||||||
|
hideSusMountsForAllProcs =
|
||||||
|
SuSFSManager.getHideSusMountsForAllProcs(context)
|
||||||
|
enableHideBl = SuSFSManager.getEnableHideBl(context)
|
||||||
|
enableCleanupResidue =
|
||||||
|
SuSFSManager.getEnableCleanupResidue(context)
|
||||||
|
umountForZygoteIsoService =
|
||||||
|
SuSFSManager.getUmountForZygoteIsoService(context)
|
||||||
|
enableAvcLogSpoofing =
|
||||||
|
SuSFSManager.getEnableAvcLogSpoofing(context)
|
||||||
|
}
|
||||||
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
SuSFSTab.SUS_PATHS -> {
|
SuSFSTab.SUS_PATHS -> {
|
||||||
@@ -1337,325 +1064,6 @@ fun SuSFSConfigScreen(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 基本设置内容组件
|
|
||||||
*/
|
|
||||||
@Composable
|
|
||||||
fun BasicSettingsContent(
|
|
||||||
unameValue: String,
|
|
||||||
onUnameValueChange: (String) -> Unit,
|
|
||||||
buildTimeValue: String,
|
|
||||||
onBuildTimeValueChange: (String) -> Unit,
|
|
||||||
executeInPostFsData: Boolean,
|
|
||||||
onExecuteInPostFsDataChange: (Boolean) -> Unit,
|
|
||||||
autoStartEnabled: Boolean,
|
|
||||||
canEnableAutoStart: Boolean,
|
|
||||||
isLoading: Boolean,
|
|
||||||
onAutoStartToggle: (Boolean) -> Unit,
|
|
||||||
onShowSlotInfo: () -> Unit,
|
|
||||||
context: Context,
|
|
||||||
onShowBackupDialog: () -> Unit,
|
|
||||||
onShowRestoreDialog: () -> Unit,
|
|
||||||
enableHideBl: Boolean,
|
|
||||||
onEnableHideBlChange: (Boolean) -> Unit,
|
|
||||||
enableCleanupResidue: Boolean,
|
|
||||||
onEnableCleanupResidueChange: (Boolean) -> Unit,
|
|
||||||
enableAvcLogSpoofing: Boolean,
|
|
||||||
onEnableAvcLogSpoofingChange: (Boolean) -> Unit,
|
|
||||||
onReset: (() -> Unit)? = null
|
|
||||||
) {
|
|
||||||
val isAbDevice = produceState(initialValue = false) {
|
|
||||||
value = isAbDevice()
|
|
||||||
}.value
|
|
||||||
|
|
||||||
Column(
|
|
||||||
modifier = Modifier.fillMaxWidth(),
|
|
||||||
verticalArrangement = Arrangement.spacedBy(16.dp)
|
|
||||||
) {
|
|
||||||
// 说明卡片
|
|
||||||
Card(
|
|
||||||
modifier = Modifier.fillMaxWidth(),
|
|
||||||
) {
|
|
||||||
Column(
|
|
||||||
modifier = Modifier.padding(14.dp),
|
|
||||||
verticalArrangement = Arrangement.spacedBy(6.dp)
|
|
||||||
) {
|
|
||||||
Text(
|
|
||||||
text = stringResource(R.string.susfs_config_description),
|
|
||||||
style = MiuixTheme.textStyles.title3,
|
|
||||||
fontWeight = FontWeight.Medium,
|
|
||||||
color = colorScheme.primary
|
|
||||||
)
|
|
||||||
Text(
|
|
||||||
text = stringResource(R.string.susfs_config_description_text),
|
|
||||||
style = MiuixTheme.textStyles.body2,
|
|
||||||
color = colorScheme.onSurfaceVariantSummary,
|
|
||||||
lineHeight = 18.sp
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Uname输入框
|
|
||||||
TextField(
|
|
||||||
value = unameValue,
|
|
||||||
onValueChange = onUnameValueChange,
|
|
||||||
label = stringResource(R.string.susfs_uname_label),
|
|
||||||
useLabelAsPlaceholder = true,
|
|
||||||
modifier = Modifier.fillMaxWidth(),
|
|
||||||
enabled = !isLoading
|
|
||||||
)
|
|
||||||
|
|
||||||
// 构建时间伪装输入框
|
|
||||||
TextField(
|
|
||||||
value = buildTimeValue,
|
|
||||||
onValueChange = onBuildTimeValueChange,
|
|
||||||
label = stringResource(R.string.susfs_build_time_label),
|
|
||||||
useLabelAsPlaceholder = true,
|
|
||||||
modifier = Modifier.fillMaxWidth(),
|
|
||||||
enabled = !isLoading
|
|
||||||
)
|
|
||||||
|
|
||||||
// 执行位置选择
|
|
||||||
val locationItems = listOf(
|
|
||||||
stringResource(R.string.susfs_execution_location_service),
|
|
||||||
stringResource(R.string.susfs_execution_location_post_fs_data)
|
|
||||||
)
|
|
||||||
SuperDropdown(
|
|
||||||
title = stringResource(R.string.susfs_execution_location_label),
|
|
||||||
summary = if (executeInPostFsData) {
|
|
||||||
stringResource(R.string.susfs_execution_location_post_fs_data)
|
|
||||||
} else {
|
|
||||||
stringResource(R.string.susfs_execution_location_service)
|
|
||||||
},
|
|
||||||
items = locationItems,
|
|
||||||
selectedIndex = if (executeInPostFsData) 1 else 0,
|
|
||||||
onSelectedIndexChange = { index ->
|
|
||||||
onExecuteInPostFsDataChange(index == 1)
|
|
||||||
},
|
|
||||||
enabled = !isLoading
|
|
||||||
)
|
|
||||||
|
|
||||||
// 当前值显示
|
|
||||||
Card(
|
|
||||||
modifier = Modifier.fillMaxWidth(),
|
|
||||||
) {
|
|
||||||
Column(
|
|
||||||
modifier = Modifier.padding(12.dp),
|
|
||||||
verticalArrangement = Arrangement.spacedBy(6.dp)
|
|
||||||
) {
|
|
||||||
Text(
|
|
||||||
text = stringResource(R.string.susfs_current_value, SuSFSManager.getUnameValue(context)),
|
|
||||||
style = MiuixTheme.textStyles.body2,
|
|
||||||
color = colorScheme.onSurfaceVariantSummary
|
|
||||||
)
|
|
||||||
Text(
|
|
||||||
text = stringResource(R.string.susfs_current_build_time, SuSFSManager.getBuildTimeValue(context)),
|
|
||||||
style = MiuixTheme.textStyles.body2,
|
|
||||||
color = colorScheme.onSurfaceVariantSummary
|
|
||||||
)
|
|
||||||
Text(
|
|
||||||
text = stringResource(R.string.susfs_current_execution_location, if (SuSFSManager.getExecuteInPostFsData(context)) "Post-FS-Data" else "Service"),
|
|
||||||
style = MiuixTheme.textStyles.body2,
|
|
||||||
color = colorScheme.onSurfaceVariantSummary
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 开机自启动开关
|
|
||||||
Card(
|
|
||||||
modifier = Modifier.fillMaxWidth(),
|
|
||||||
) {
|
|
||||||
SuperSwitch(
|
|
||||||
title = stringResource(R.string.susfs_autostart_title),
|
|
||||||
summary = if (canEnableAutoStart) {
|
|
||||||
stringResource(R.string.susfs_autostart_description)
|
|
||||||
} else {
|
|
||||||
stringResource(R.string.susfs_autostart_requirement)
|
|
||||||
},
|
|
||||||
leftAction = {
|
|
||||||
Icon(
|
|
||||||
Icons.Default.AutoMode,
|
|
||||||
modifier = Modifier.padding(end = 16.dp),
|
|
||||||
contentDescription = stringResource(R.string.susfs_autostart_title),
|
|
||||||
tint = if (canEnableAutoStart) colorScheme.onBackground else colorScheme.onSurfaceVariantSummary
|
|
||||||
)
|
|
||||||
},
|
|
||||||
checked = autoStartEnabled,
|
|
||||||
onCheckedChange = onAutoStartToggle,
|
|
||||||
enabled = !isLoading && canEnableAutoStart
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 隐藏BL脚本开关
|
|
||||||
Card(
|
|
||||||
modifier = Modifier.fillMaxWidth(),
|
|
||||||
) {
|
|
||||||
SuperSwitch(
|
|
||||||
title = stringResource(R.string.hide_bl_script),
|
|
||||||
summary = stringResource(R.string.hide_bl_script_description),
|
|
||||||
leftAction = {
|
|
||||||
Icon(
|
|
||||||
Icons.Default.Security,
|
|
||||||
modifier = Modifier.padding(end = 16.dp),
|
|
||||||
contentDescription = stringResource(R.string.hide_bl_script),
|
|
||||||
tint = colorScheme.onBackground
|
|
||||||
)
|
|
||||||
},
|
|
||||||
checked = enableHideBl,
|
|
||||||
onCheckedChange = onEnableHideBlChange,
|
|
||||||
enabled = !isLoading
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 清理残留脚本开关
|
|
||||||
Card(
|
|
||||||
modifier = Modifier.fillMaxWidth(),
|
|
||||||
) {
|
|
||||||
SuperSwitch(
|
|
||||||
title = stringResource(R.string.cleanup_residue),
|
|
||||||
summary = stringResource(R.string.cleanup_residue_description),
|
|
||||||
leftAction = {
|
|
||||||
Icon(
|
|
||||||
Icons.Default.CleaningServices,
|
|
||||||
modifier = Modifier.padding(end = 16.dp),
|
|
||||||
contentDescription = stringResource(R.string.cleanup_residue),
|
|
||||||
tint = colorScheme.onBackground
|
|
||||||
)
|
|
||||||
},
|
|
||||||
checked = enableCleanupResidue,
|
|
||||||
onCheckedChange = onEnableCleanupResidueChange,
|
|
||||||
enabled = !isLoading
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
// AVC日志欺骗开关
|
|
||||||
Card(
|
|
||||||
modifier = Modifier.fillMaxWidth(),
|
|
||||||
) {
|
|
||||||
SuperSwitch(
|
|
||||||
title = stringResource(R.string.avc_log_spoofing),
|
|
||||||
summary = stringResource(R.string.avc_log_spoofing_description),
|
|
||||||
leftAction = {
|
|
||||||
Icon(
|
|
||||||
Icons.Default.VisibilityOff,
|
|
||||||
modifier = Modifier.padding(end = 16.dp),
|
|
||||||
contentDescription = stringResource(R.string.avc_log_spoofing),
|
|
||||||
tint = colorScheme.onBackground
|
|
||||||
)
|
|
||||||
},
|
|
||||||
checked = enableAvcLogSpoofing,
|
|
||||||
onCheckedChange = onEnableAvcLogSpoofingChange,
|
|
||||||
enabled = !isLoading
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 槽位信息按钮
|
|
||||||
if (isAbDevice) {
|
|
||||||
Card(
|
|
||||||
modifier = Modifier.fillMaxWidth(),
|
|
||||||
) {
|
|
||||||
Column(
|
|
||||||
modifier = Modifier.padding(14.dp),
|
|
||||||
verticalArrangement = Arrangement.spacedBy(12.dp)
|
|
||||||
) {
|
|
||||||
Row(
|
|
||||||
verticalAlignment = Alignment.CenterVertically
|
|
||||||
) {
|
|
||||||
Icon(
|
|
||||||
Icons.Default.Info,
|
|
||||||
contentDescription = null,
|
|
||||||
tint = colorScheme.primary,
|
|
||||||
modifier = Modifier.size(20.dp)
|
|
||||||
)
|
|
||||||
Spacer(modifier = Modifier.width(10.dp))
|
|
||||||
Text(
|
|
||||||
text = stringResource(R.string.susfs_slot_info_title),
|
|
||||||
style = MiuixTheme.textStyles.title3,
|
|
||||||
fontWeight = FontWeight.Medium,
|
|
||||||
color = colorScheme.onBackground
|
|
||||||
)
|
|
||||||
}
|
|
||||||
Text(
|
|
||||||
text = stringResource(R.string.susfs_slot_info_description),
|
|
||||||
style = MiuixTheme.textStyles.body2,
|
|
||||||
color = colorScheme.onSurfaceVariantSummary,
|
|
||||||
lineHeight = 18.sp
|
|
||||||
)
|
|
||||||
TextButton(
|
|
||||||
text = stringResource(R.string.susfs_slot_info_title),
|
|
||||||
onClick = onShowSlotInfo,
|
|
||||||
enabled = !isLoading,
|
|
||||||
modifier = Modifier
|
|
||||||
.fillMaxWidth()
|
|
||||||
.heightIn(min = 48.dp)
|
|
||||||
.padding(vertical = 8.dp)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Row(
|
|
||||||
modifier = Modifier.fillMaxWidth(),
|
|
||||||
horizontalArrangement = Arrangement.spacedBy(12.dp)
|
|
||||||
) {
|
|
||||||
// 备份按钮
|
|
||||||
TextButton(
|
|
||||||
text = stringResource(R.string.susfs_backup_title),
|
|
||||||
onClick = onShowBackupDialog,
|
|
||||||
enabled = !isLoading,
|
|
||||||
modifier = Modifier
|
|
||||||
.weight(1f)
|
|
||||||
.heightIn(min = 48.dp)
|
|
||||||
.padding(vertical = 8.dp)
|
|
||||||
)
|
|
||||||
// 还原按钮
|
|
||||||
TextButton(
|
|
||||||
text = stringResource(R.string.susfs_restore_title),
|
|
||||||
onClick = onShowRestoreDialog,
|
|
||||||
enabled = !isLoading,
|
|
||||||
modifier = Modifier
|
|
||||||
.weight(1f)
|
|
||||||
.heightIn(min = 48.dp)
|
|
||||||
.padding(vertical = 8.dp)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 重置按钮
|
|
||||||
if (onReset != null) {
|
|
||||||
Spacer(modifier = Modifier.height(8.dp))
|
|
||||||
Card(
|
|
||||||
onClick = onReset,
|
|
||||||
modifier = Modifier.fillMaxWidth(),
|
|
||||||
cornerRadius = 8.dp
|
|
||||||
) {
|
|
||||||
Row(
|
|
||||||
modifier = Modifier
|
|
||||||
.fillMaxWidth()
|
|
||||||
.padding(12.dp),
|
|
||||||
horizontalArrangement = Arrangement.Center,
|
|
||||||
verticalAlignment = Alignment.CenterVertically
|
|
||||||
) {
|
|
||||||
Icon(
|
|
||||||
imageVector = Icons.Default.RestoreFromTrash,
|
|
||||||
contentDescription = null,
|
|
||||||
modifier = Modifier.size(18.dp),
|
|
||||||
tint = colorScheme.primary
|
|
||||||
)
|
|
||||||
Spacer(modifier = Modifier.width(8.dp))
|
|
||||||
Text(
|
|
||||||
text = stringResource(R.string.susfs_reset_confirm_title),
|
|
||||||
style = MiuixTheme.textStyles.body1,
|
|
||||||
fontWeight = FontWeight.Medium,
|
|
||||||
color = colorScheme.primary
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 槽位信息对话框
|
|
||||||
*/
|
|
||||||
@Composable
|
@Composable
|
||||||
fun SlotInfoDialog(
|
fun SlotInfoDialog(
|
||||||
showDialog: Boolean,
|
showDialog: Boolean,
|
||||||
@@ -1689,7 +1097,7 @@ fun SlotInfoDialog(
|
|||||||
) {
|
) {
|
||||||
Text(
|
Text(
|
||||||
text = stringResource(R.string.susfs_current_active_slot, currentActiveSlot),
|
text = stringResource(R.string.susfs_current_active_slot, currentActiveSlot),
|
||||||
style = MiuixTheme.textStyles.body1,
|
style = MiuixTheme.textStyles.body2,
|
||||||
fontWeight = FontWeight.Medium,
|
fontWeight = FontWeight.Medium,
|
||||||
color = colorScheme.primary
|
color = colorScheme.primary
|
||||||
)
|
)
|
||||||
@@ -1727,7 +1135,7 @@ fun SlotInfoDialog(
|
|||||||
Spacer(modifier = Modifier.width(6.dp))
|
Spacer(modifier = Modifier.width(6.dp))
|
||||||
Text(
|
Text(
|
||||||
text = slotInfo.slotName,
|
text = slotInfo.slotName,
|
||||||
style = MiuixTheme.textStyles.title2,
|
style = MiuixTheme.textStyles.body1,
|
||||||
fontWeight = FontWeight.Bold,
|
fontWeight = FontWeight.Bold,
|
||||||
color = if (slotInfo.slotName == currentActiveSlot) {
|
color = if (slotInfo.slotName == currentActiveSlot) {
|
||||||
colorScheme.primary
|
colorScheme.primary
|
||||||
@@ -1755,12 +1163,12 @@ fun SlotInfoDialog(
|
|||||||
}
|
}
|
||||||
Text(
|
Text(
|
||||||
text = stringResource(R.string.susfs_slot_uname, slotInfo.uname),
|
text = stringResource(R.string.susfs_slot_uname, slotInfo.uname),
|
||||||
style = MiuixTheme.textStyles.body2,
|
style = MiuixTheme.textStyles.body2.copy(fontSize = 13.sp),
|
||||||
color = colorScheme.onSurface
|
color = colorScheme.onSurface
|
||||||
)
|
)
|
||||||
Text(
|
Text(
|
||||||
text = stringResource(R.string.susfs_slot_build_time, slotInfo.buildTime),
|
text = stringResource(R.string.susfs_slot_build_time, slotInfo.buildTime),
|
||||||
style = MiuixTheme.textStyles.body2,
|
style = MiuixTheme.textStyles.body2.copy(fontSize = 13.sp),
|
||||||
color = colorScheme.onSurface
|
color = colorScheme.onSurface
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -1820,22 +1228,24 @@ fun SlotInfoDialog(
|
|||||||
cornerRadius = 8.dp
|
cornerRadius = 8.dp
|
||||||
) {
|
) {
|
||||||
Text(
|
Text(
|
||||||
text = stringResource(R.string.refresh),
|
text = stringResource(R.string.refresh)
|
||||||
style = MiuixTheme.textStyles.body2,
|
|
||||||
maxLines = 2
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
TextButton(
|
Button(
|
||||||
text = stringResource(android.R.string.cancel),
|
|
||||||
onClick = onDismiss,
|
onClick = onDismiss,
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
.heightIn(min = 48.dp)
|
.heightIn(min = 48.dp)
|
||||||
.padding(vertical = 8.dp)
|
.padding(vertical = 8.dp),
|
||||||
|
cornerRadius = 8.dp
|
||||||
|
) {
|
||||||
|
Text(
|
||||||
|
text = stringResource(android.R.string.cancel)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,112 @@
|
|||||||
|
package com.sukisu.ultra.ui.susfs.component
|
||||||
|
|
||||||
|
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.Alignment
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.unit.dp
|
||||||
|
import top.yukonga.miuix.kmp.basic.*
|
||||||
|
import top.yukonga.miuix.kmp.theme.MiuixTheme
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun BottomActionButtons(
|
||||||
|
modifier: Modifier = Modifier,
|
||||||
|
primaryButtonText: String,
|
||||||
|
onPrimaryClick: () -> Unit,
|
||||||
|
secondaryButtonText: String? = null,
|
||||||
|
onSecondaryClick: (() -> Unit)? = null,
|
||||||
|
isLoading: Boolean = false,
|
||||||
|
enabled: Boolean = true
|
||||||
|
) {
|
||||||
|
Card(
|
||||||
|
modifier = modifier
|
||||||
|
.padding(top = 12.dp)
|
||||||
|
.fillMaxWidth(),
|
||||||
|
) {
|
||||||
|
Row(
|
||||||
|
modifier = Modifier
|
||||||
|
.fillMaxWidth()
|
||||||
|
.padding(12.dp),
|
||||||
|
horizontalArrangement = Arrangement.spacedBy(12.dp),
|
||||||
|
verticalAlignment = Alignment.CenterVertically
|
||||||
|
) {
|
||||||
|
if (secondaryButtonText != null && onSecondaryClick != null) {
|
||||||
|
Button(
|
||||||
|
onClick = onSecondaryClick,
|
||||||
|
enabled = !isLoading && enabled,
|
||||||
|
modifier = Modifier
|
||||||
|
.weight(1f)
|
||||||
|
.heightIn(min = 48.dp),
|
||||||
|
cornerRadius = 8.dp
|
||||||
|
) {
|
||||||
|
Text(
|
||||||
|
text = secondaryButtonText,
|
||||||
|
style = MiuixTheme.textStyles.body2
|
||||||
|
)
|
||||||
|
}
|
||||||
|
Button(
|
||||||
|
onClick = onPrimaryClick,
|
||||||
|
enabled = !isLoading && enabled,
|
||||||
|
modifier = Modifier
|
||||||
|
.weight(1f)
|
||||||
|
.heightIn(min = 48.dp),
|
||||||
|
cornerRadius = 8.dp
|
||||||
|
) {
|
||||||
|
Text(
|
||||||
|
text = primaryButtonText,
|
||||||
|
style = MiuixTheme.textStyles.body2
|
||||||
|
)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Button(
|
||||||
|
onClick = onPrimaryClick,
|
||||||
|
enabled = !isLoading && enabled,
|
||||||
|
modifier = Modifier
|
||||||
|
.fillMaxWidth()
|
||||||
|
.heightIn(min = 48.dp),
|
||||||
|
cornerRadius = 8.dp
|
||||||
|
) {
|
||||||
|
Icon(
|
||||||
|
imageVector = Icons.Default.Add,
|
||||||
|
contentDescription = null,
|
||||||
|
modifier = Modifier.size(20.dp)
|
||||||
|
)
|
||||||
|
Spacer(modifier = Modifier.width(6.dp))
|
||||||
|
Text(
|
||||||
|
text = primaryButtonText,
|
||||||
|
style = MiuixTheme.textStyles.body2
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun ResetButton(
|
||||||
|
modifier: Modifier = Modifier,
|
||||||
|
title: String,
|
||||||
|
onClick: () -> Unit,
|
||||||
|
enabled: Boolean = true
|
||||||
|
) {
|
||||||
|
Card(
|
||||||
|
modifier = modifier
|
||||||
|
.padding(vertical = 12.dp)
|
||||||
|
.fillMaxWidth(),
|
||||||
|
) {
|
||||||
|
Button(
|
||||||
|
onClick = onClick,
|
||||||
|
enabled = enabled,
|
||||||
|
modifier = Modifier
|
||||||
|
.fillMaxWidth()
|
||||||
|
.heightIn(min = 48.dp),
|
||||||
|
cornerRadius = 8.dp
|
||||||
|
) {
|
||||||
|
Text(
|
||||||
|
text = title
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,404 @@
|
|||||||
|
package com.sukisu.ultra.ui.susfs.component
|
||||||
|
|
||||||
|
import androidx.activity.compose.rememberLauncherForActivityResult
|
||||||
|
import androidx.activity.result.contract.ActivityResultContracts
|
||||||
|
import androidx.compose.foundation.layout.*
|
||||||
|
import androidx.compose.runtime.*
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.platform.LocalContext
|
||||||
|
import androidx.compose.ui.res.stringResource
|
||||||
|
import androidx.compose.ui.unit.dp
|
||||||
|
import com.sukisu.ultra.R
|
||||||
|
import com.sukisu.ultra.ui.susfs.util.SuSFSManager
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
|
import top.yukonga.miuix.kmp.basic.*
|
||||||
|
import top.yukonga.miuix.kmp.extra.SuperDialog
|
||||||
|
import top.yukonga.miuix.kmp.theme.MiuixTheme
|
||||||
|
import java.io.File
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun BackupRestoreComponent(
|
||||||
|
isLoading: Boolean,
|
||||||
|
onLoadingChange: (Boolean) -> Unit,
|
||||||
|
onConfigReload: () -> Unit
|
||||||
|
) {
|
||||||
|
val context = LocalContext.current
|
||||||
|
val coroutineScope = rememberCoroutineScope()
|
||||||
|
|
||||||
|
var internalLoading by remember { mutableStateOf(false) }
|
||||||
|
val actualLoading = isLoading || internalLoading
|
||||||
|
|
||||||
|
var showBackupDialog by remember { mutableStateOf(false) }
|
||||||
|
var showRestoreDialog by remember { mutableStateOf(false) }
|
||||||
|
var showRestoreConfirmDialog by remember { mutableStateOf(false) }
|
||||||
|
var selectedBackupFile by remember { mutableStateOf<String?>(null) }
|
||||||
|
var backupInfo by remember { mutableStateOf<SuSFSManager.BackupData?>(null) }
|
||||||
|
|
||||||
|
// 备份文件选择器
|
||||||
|
val backupFileLauncher = rememberLauncherForActivityResult(
|
||||||
|
contract = ActivityResultContracts.CreateDocument("application/json")
|
||||||
|
) { uri ->
|
||||||
|
uri?.let { fileUri ->
|
||||||
|
coroutineScope.launch {
|
||||||
|
try {
|
||||||
|
internalLoading = true
|
||||||
|
onLoadingChange(true)
|
||||||
|
val fileName = SuSFSManager.getDefaultBackupFileName()
|
||||||
|
val tempFile = File(context.cacheDir, fileName)
|
||||||
|
|
||||||
|
val success = SuSFSManager.createBackup(context, tempFile.absolutePath)
|
||||||
|
if (success) {
|
||||||
|
try {
|
||||||
|
context.contentResolver.openOutputStream(fileUri)?.use { outputStream ->
|
||||||
|
tempFile.inputStream().use { inputStream ->
|
||||||
|
inputStream.copyTo(outputStream)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e: Exception) {
|
||||||
|
e.printStackTrace()
|
||||||
|
} finally {
|
||||||
|
tempFile.delete()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e: Exception) {
|
||||||
|
e.printStackTrace()
|
||||||
|
} finally {
|
||||||
|
internalLoading = false
|
||||||
|
onLoadingChange(false)
|
||||||
|
showBackupDialog = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 还原文件选择器
|
||||||
|
val restoreFileLauncher = rememberLauncherForActivityResult(
|
||||||
|
contract = ActivityResultContracts.OpenDocument()
|
||||||
|
) { uri ->
|
||||||
|
uri?.let { fileUri ->
|
||||||
|
coroutineScope.launch {
|
||||||
|
try {
|
||||||
|
val tempFile = File(context.cacheDir, "temp_restore.susfs_backup")
|
||||||
|
context.contentResolver.openInputStream(fileUri)?.use { inputStream ->
|
||||||
|
tempFile.outputStream().use { outputStream ->
|
||||||
|
inputStream.copyTo(outputStream)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 验证备份文件
|
||||||
|
val backup = SuSFSManager.validateBackupFile(tempFile.absolutePath)
|
||||||
|
if (backup != null) {
|
||||||
|
selectedBackupFile = tempFile.absolutePath
|
||||||
|
backupInfo = backup
|
||||||
|
showRestoreConfirmDialog = true
|
||||||
|
} else {
|
||||||
|
tempFile.delete()
|
||||||
|
}
|
||||||
|
} catch (e: Exception) {
|
||||||
|
e.printStackTrace()
|
||||||
|
} finally {
|
||||||
|
showRestoreDialog = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 备份对话框
|
||||||
|
BackupDialog(
|
||||||
|
showDialog = showBackupDialog,
|
||||||
|
onDismiss = { showBackupDialog = false },
|
||||||
|
isLoading = actualLoading,
|
||||||
|
onBackup = {
|
||||||
|
val dateFormat = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault())
|
||||||
|
val timestamp = dateFormat.format(Date())
|
||||||
|
backupFileLauncher.launch("SuSFS_Config_$timestamp.susfs_backup")
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
// 还原对话框
|
||||||
|
RestoreDialog(
|
||||||
|
showDialog = showRestoreDialog,
|
||||||
|
onDismiss = { showRestoreDialog = false },
|
||||||
|
isLoading = actualLoading,
|
||||||
|
onSelectFile = {
|
||||||
|
restoreFileLauncher.launch(arrayOf("application/json", "*/*"))
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
// 还原确认对话框
|
||||||
|
RestoreConfirmDialog(
|
||||||
|
showDialog = showRestoreConfirmDialog,
|
||||||
|
onDismiss = {
|
||||||
|
showRestoreConfirmDialog = false
|
||||||
|
selectedBackupFile = null
|
||||||
|
backupInfo = null
|
||||||
|
},
|
||||||
|
backupInfo = backupInfo,
|
||||||
|
isLoading = actualLoading,
|
||||||
|
onConfirm = {
|
||||||
|
selectedBackupFile?.let { filePath ->
|
||||||
|
coroutineScope.launch {
|
||||||
|
try {
|
||||||
|
internalLoading = true
|
||||||
|
onLoadingChange(true)
|
||||||
|
val success = SuSFSManager.restoreFromBackup(context, filePath)
|
||||||
|
if (success) {
|
||||||
|
onConfigReload()
|
||||||
|
}
|
||||||
|
} catch (e: Exception) {
|
||||||
|
e.printStackTrace()
|
||||||
|
} finally {
|
||||||
|
internalLoading = false
|
||||||
|
onLoadingChange(false)
|
||||||
|
showRestoreConfirmDialog = false
|
||||||
|
kotlinx.coroutines.delay(100)
|
||||||
|
selectedBackupFile = null
|
||||||
|
backupInfo = null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
// 按钮行
|
||||||
|
Card(
|
||||||
|
modifier = Modifier
|
||||||
|
.padding(top = 12.dp)
|
||||||
|
.fillMaxWidth(),
|
||||||
|
) {
|
||||||
|
Row(
|
||||||
|
modifier = Modifier
|
||||||
|
.fillMaxWidth()
|
||||||
|
.padding(12.dp),
|
||||||
|
horizontalArrangement = Arrangement.spacedBy(12.dp)
|
||||||
|
) {
|
||||||
|
Button(
|
||||||
|
onClick = { showBackupDialog = true },
|
||||||
|
enabled = !actualLoading,
|
||||||
|
modifier = Modifier
|
||||||
|
.weight(1f)
|
||||||
|
.heightIn(min = 48.dp),
|
||||||
|
cornerRadius = 8.dp
|
||||||
|
) {
|
||||||
|
Text(
|
||||||
|
text = stringResource(R.string.susfs_backup_title)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
Button(
|
||||||
|
onClick = { showRestoreDialog = true },
|
||||||
|
enabled = !actualLoading,
|
||||||
|
modifier = Modifier
|
||||||
|
.weight(1f)
|
||||||
|
.heightIn(min = 48.dp),
|
||||||
|
cornerRadius = 8.dp
|
||||||
|
) {
|
||||||
|
Text(
|
||||||
|
text = stringResource(R.string.susfs_restore_title)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
private fun BackupDialog(
|
||||||
|
showDialog: Boolean,
|
||||||
|
onDismiss: () -> Unit,
|
||||||
|
isLoading: Boolean,
|
||||||
|
onBackup: () -> Unit
|
||||||
|
) {
|
||||||
|
val showDialogState = remember { mutableStateOf(showDialog) }
|
||||||
|
|
||||||
|
LaunchedEffect(showDialog) {
|
||||||
|
showDialogState.value = showDialog
|
||||||
|
}
|
||||||
|
|
||||||
|
if (showDialogState.value) {
|
||||||
|
SuperDialog(
|
||||||
|
show = showDialogState,
|
||||||
|
title = stringResource(R.string.susfs_backup_title),
|
||||||
|
onDismissRequest = onDismiss,
|
||||||
|
content = {
|
||||||
|
Column(
|
||||||
|
modifier = Modifier.padding(horizontal = 24.dp),
|
||||||
|
verticalArrangement = Arrangement.spacedBy(12.dp)
|
||||||
|
) {
|
||||||
|
Text(stringResource(R.string.susfs_backup_description))
|
||||||
|
Spacer(modifier = Modifier.height(12.dp))
|
||||||
|
Row(
|
||||||
|
modifier = Modifier.fillMaxWidth(),
|
||||||
|
horizontalArrangement = Arrangement.spacedBy(12.dp)
|
||||||
|
) {
|
||||||
|
Button(
|
||||||
|
onClick = onDismiss,
|
||||||
|
modifier = Modifier
|
||||||
|
.weight(1f)
|
||||||
|
.heightIn(min = 48.dp)
|
||||||
|
.padding(vertical = 8.dp),
|
||||||
|
cornerRadius = 8.dp
|
||||||
|
) {
|
||||||
|
Text(stringResource(R.string.cancel))
|
||||||
|
}
|
||||||
|
Button(
|
||||||
|
onClick = onBackup,
|
||||||
|
enabled = !isLoading,
|
||||||
|
modifier = Modifier
|
||||||
|
.weight(1f)
|
||||||
|
.heightIn(min = 48.dp)
|
||||||
|
.padding(vertical = 8.dp),
|
||||||
|
cornerRadius = 8.dp
|
||||||
|
) {
|
||||||
|
Text(stringResource(R.string.susfs_backup_create))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
private fun RestoreDialog(
|
||||||
|
showDialog: Boolean,
|
||||||
|
onDismiss: () -> Unit,
|
||||||
|
isLoading: Boolean,
|
||||||
|
onSelectFile: () -> Unit
|
||||||
|
) {
|
||||||
|
val showDialogState = remember { mutableStateOf(showDialog) }
|
||||||
|
|
||||||
|
LaunchedEffect(showDialog) {
|
||||||
|
showDialogState.value = showDialog
|
||||||
|
}
|
||||||
|
|
||||||
|
if (showDialogState.value) {
|
||||||
|
SuperDialog(
|
||||||
|
show = showDialogState,
|
||||||
|
title = stringResource(R.string.susfs_restore_title),
|
||||||
|
onDismissRequest = onDismiss,
|
||||||
|
content = {
|
||||||
|
Column(
|
||||||
|
modifier = Modifier.padding(horizontal = 24.dp),
|
||||||
|
verticalArrangement = Arrangement.spacedBy(12.dp)
|
||||||
|
) {
|
||||||
|
Text(stringResource(R.string.susfs_restore_description))
|
||||||
|
Spacer(modifier = Modifier.height(12.dp))
|
||||||
|
Row(
|
||||||
|
modifier = Modifier.fillMaxWidth(),
|
||||||
|
horizontalArrangement = Arrangement.spacedBy(12.dp)
|
||||||
|
) {
|
||||||
|
Button(
|
||||||
|
onClick = onDismiss,
|
||||||
|
modifier = Modifier
|
||||||
|
.weight(1f)
|
||||||
|
.heightIn(min = 48.dp)
|
||||||
|
.padding(vertical = 8.dp),
|
||||||
|
cornerRadius = 8.dp
|
||||||
|
) {
|
||||||
|
Text(stringResource(R.string.cancel))
|
||||||
|
}
|
||||||
|
Button(
|
||||||
|
onClick = onSelectFile,
|
||||||
|
enabled = !isLoading,
|
||||||
|
modifier = Modifier
|
||||||
|
.weight(1f)
|
||||||
|
.heightIn(min = 48.dp)
|
||||||
|
.padding(vertical = 8.dp),
|
||||||
|
cornerRadius = 8.dp
|
||||||
|
) {
|
||||||
|
Text(stringResource(R.string.susfs_restore_select_file))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
private fun RestoreConfirmDialog(
|
||||||
|
showDialog: Boolean,
|
||||||
|
onDismiss: () -> Unit,
|
||||||
|
backupInfo: SuSFSManager.BackupData?,
|
||||||
|
isLoading: Boolean,
|
||||||
|
onConfirm: () -> Unit
|
||||||
|
) {
|
||||||
|
val showDialogState = remember { mutableStateOf(showDialog && backupInfo != null) }
|
||||||
|
|
||||||
|
LaunchedEffect(showDialog, backupInfo) {
|
||||||
|
showDialogState.value = showDialog && backupInfo != null
|
||||||
|
}
|
||||||
|
|
||||||
|
if (showDialogState.value && backupInfo != null) {
|
||||||
|
SuperDialog(
|
||||||
|
show = showDialogState,
|
||||||
|
title = stringResource(R.string.susfs_restore_confirm_title),
|
||||||
|
onDismissRequest = onDismiss,
|
||||||
|
content = {
|
||||||
|
Column(
|
||||||
|
modifier = Modifier.padding(horizontal = 24.dp),
|
||||||
|
verticalArrangement = Arrangement.spacedBy(8.dp)
|
||||||
|
) {
|
||||||
|
Text(stringResource(R.string.susfs_restore_confirm_description))
|
||||||
|
|
||||||
|
Card(
|
||||||
|
modifier = Modifier.fillMaxWidth(),
|
||||||
|
) {
|
||||||
|
Column(
|
||||||
|
modifier = Modifier.padding(12.dp),
|
||||||
|
verticalArrangement = Arrangement.spacedBy(4.dp)
|
||||||
|
) {
|
||||||
|
val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault())
|
||||||
|
Text(
|
||||||
|
text = stringResource(
|
||||||
|
R.string.susfs_backup_info_date,
|
||||||
|
dateFormat.format(Date(backupInfo.timestamp))
|
||||||
|
),
|
||||||
|
fontSize = MiuixTheme.textStyles.body2.fontSize
|
||||||
|
)
|
||||||
|
Text(
|
||||||
|
text = stringResource(R.string.susfs_backup_info_device, backupInfo.deviceInfo),
|
||||||
|
fontSize = MiuixTheme.textStyles.body2.fontSize
|
||||||
|
)
|
||||||
|
Text(
|
||||||
|
text = stringResource(R.string.susfs_backup_info_version, backupInfo.version),
|
||||||
|
fontSize = MiuixTheme.textStyles.body2.fontSize
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Spacer(modifier = Modifier.height(12.dp))
|
||||||
|
|
||||||
|
Row(
|
||||||
|
modifier = Modifier.fillMaxWidth(),
|
||||||
|
horizontalArrangement = Arrangement.spacedBy(12.dp)
|
||||||
|
) {
|
||||||
|
Button(
|
||||||
|
onClick = onDismiss,
|
||||||
|
modifier = Modifier
|
||||||
|
.weight(1f)
|
||||||
|
.heightIn(min = 48.dp)
|
||||||
|
.padding(vertical = 8.dp),
|
||||||
|
cornerRadius = 8.dp
|
||||||
|
) {
|
||||||
|
Text(stringResource(R.string.cancel))
|
||||||
|
}
|
||||||
|
Button(
|
||||||
|
onClick = onConfirm,
|
||||||
|
enabled = !isLoading,
|
||||||
|
modifier = Modifier
|
||||||
|
.weight(1f)
|
||||||
|
.heightIn(min = 48.dp)
|
||||||
|
.padding(vertical = 8.dp),
|
||||||
|
cornerRadius = 8.dp
|
||||||
|
) {
|
||||||
|
Text(stringResource(R.string.susfs_restore_confirm))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,351 @@
|
|||||||
|
package com.sukisu.ultra.ui.susfs.component
|
||||||
|
|
||||||
|
import androidx.compose.foundation.background
|
||||||
|
import androidx.compose.foundation.layout.*
|
||||||
|
import androidx.compose.foundation.rememberScrollState
|
||||||
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||||
|
import androidx.compose.foundation.verticalScroll
|
||||||
|
import androidx.compose.runtime.*
|
||||||
|
import androidx.compose.ui.Alignment
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.draw.clip
|
||||||
|
import androidx.compose.ui.graphics.vector.ImageVector
|
||||||
|
import androidx.compose.ui.res.stringResource
|
||||||
|
import androidx.compose.ui.text.font.FontWeight
|
||||||
|
import androidx.compose.ui.text.style.TextAlign
|
||||||
|
import androidx.compose.ui.unit.dp
|
||||||
|
import androidx.compose.ui.unit.sp
|
||||||
|
import com.sukisu.ultra.R
|
||||||
|
import top.yukonga.miuix.kmp.basic.Button
|
||||||
|
import top.yukonga.miuix.kmp.basic.Card
|
||||||
|
import top.yukonga.miuix.kmp.basic.CardDefaults
|
||||||
|
import top.yukonga.miuix.kmp.basic.Icon
|
||||||
|
import top.yukonga.miuix.kmp.basic.Text
|
||||||
|
import top.yukonga.miuix.kmp.basic.TextField
|
||||||
|
import top.yukonga.miuix.kmp.extra.SuperDialog
|
||||||
|
import top.yukonga.miuix.kmp.extra.SuperDropdown
|
||||||
|
import top.yukonga.miuix.kmp.theme.MiuixTheme
|
||||||
|
import top.yukonga.miuix.kmp.theme.MiuixTheme.colorScheme
|
||||||
|
|
||||||
|
sealed class DialogField {
|
||||||
|
data class TextField(
|
||||||
|
val value: String,
|
||||||
|
val onValueChange: (String) -> Unit,
|
||||||
|
val labelRes: Int,
|
||||||
|
val enabled: Boolean = true,
|
||||||
|
val modifier: Modifier = Modifier.fillMaxWidth()
|
||||||
|
) : DialogField()
|
||||||
|
|
||||||
|
data class Dropdown(
|
||||||
|
val titleRes: Int,
|
||||||
|
val summary: String,
|
||||||
|
val items: List<String>,
|
||||||
|
val selectedIndex: Int,
|
||||||
|
val onSelectedIndexChange: (Int) -> Unit,
|
||||||
|
val enabled: Boolean = true
|
||||||
|
) : DialogField()
|
||||||
|
|
||||||
|
data class CustomContent(
|
||||||
|
val content: @Composable ColumnScope.() -> Unit
|
||||||
|
) : DialogField()
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通用多功能对话框组件
|
||||||
|
*
|
||||||
|
* @param showDialog 是否显示对话框
|
||||||
|
* @param onDismiss 关闭对话框回调
|
||||||
|
* @param onConfirm 确认回调,返回是否应该关闭对话框
|
||||||
|
* @param titleRes 标题资源ID
|
||||||
|
* @param isLoading 是否正在加载
|
||||||
|
* @param fields 对话框字段列表
|
||||||
|
* @param confirmTextRes 确认按钮文本资源ID,默认为"添加"
|
||||||
|
* @param cancelTextRes 取消按钮文本资源ID,默认为"取消"
|
||||||
|
* @param isConfirmEnabled 确认按钮是否启用,默认为true
|
||||||
|
* @param scrollable 内容是否可滚动,默认为false
|
||||||
|
* @param onReset 重置回调,用于清空字段
|
||||||
|
*/
|
||||||
|
@Composable
|
||||||
|
fun UniversalDialog(
|
||||||
|
showDialog: Boolean,
|
||||||
|
onDismiss: () -> Unit,
|
||||||
|
onConfirm: () -> Boolean,
|
||||||
|
titleRes: Int,
|
||||||
|
isLoading: Boolean = false,
|
||||||
|
fields: List<DialogField>,
|
||||||
|
confirmTextRes: Int = R.string.add,
|
||||||
|
cancelTextRes: Int = R.string.cancel,
|
||||||
|
isConfirmEnabled: Boolean = true,
|
||||||
|
scrollable: Boolean = false,
|
||||||
|
onReset: (() -> Unit)? = null
|
||||||
|
) {
|
||||||
|
val showDialogState = remember { mutableStateOf(showDialog) }
|
||||||
|
|
||||||
|
LaunchedEffect(showDialog) {
|
||||||
|
showDialogState.value = showDialog
|
||||||
|
}
|
||||||
|
|
||||||
|
if (showDialogState.value) {
|
||||||
|
SuperDialog(
|
||||||
|
show = showDialogState,
|
||||||
|
title = stringResource(titleRes),
|
||||||
|
onDismissRequest = {
|
||||||
|
onDismiss()
|
||||||
|
onReset?.invoke()
|
||||||
|
},
|
||||||
|
content = {
|
||||||
|
val contentModifier = if (scrollable) {
|
||||||
|
Modifier
|
||||||
|
.verticalScroll(rememberScrollState())
|
||||||
|
.padding(horizontal = 24.dp)
|
||||||
|
} else {
|
||||||
|
Modifier.padding(horizontal = 24.dp)
|
||||||
|
}
|
||||||
|
|
||||||
|
Column(
|
||||||
|
modifier = contentModifier,
|
||||||
|
verticalArrangement = Arrangement.spacedBy(12.dp)
|
||||||
|
) {
|
||||||
|
fields.forEach { field ->
|
||||||
|
when (field) {
|
||||||
|
is DialogField.TextField -> {
|
||||||
|
TextField(
|
||||||
|
value = field.value,
|
||||||
|
onValueChange = field.onValueChange,
|
||||||
|
label = stringResource(field.labelRes),
|
||||||
|
useLabelAsPlaceholder = true,
|
||||||
|
modifier = field.modifier,
|
||||||
|
enabled = field.enabled && !isLoading
|
||||||
|
)
|
||||||
|
}
|
||||||
|
is DialogField.Dropdown -> {
|
||||||
|
SuperDropdown(
|
||||||
|
title = stringResource(field.titleRes),
|
||||||
|
summary = field.summary,
|
||||||
|
items = field.items,
|
||||||
|
selectedIndex = field.selectedIndex,
|
||||||
|
onSelectedIndexChange = field.onSelectedIndexChange,
|
||||||
|
enabled = field.enabled && !isLoading
|
||||||
|
)
|
||||||
|
}
|
||||||
|
is DialogField.CustomContent -> {
|
||||||
|
field.content.invoke(this)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Row(
|
||||||
|
modifier = Modifier.fillMaxWidth(),
|
||||||
|
horizontalArrangement = Arrangement.spacedBy(12.dp)
|
||||||
|
) {
|
||||||
|
Button(
|
||||||
|
onClick = {
|
||||||
|
onDismiss()
|
||||||
|
onReset?.invoke()
|
||||||
|
},
|
||||||
|
modifier = Modifier
|
||||||
|
.weight(1f)
|
||||||
|
.heightIn(min = 48.dp)
|
||||||
|
.padding(vertical = 8.dp),
|
||||||
|
cornerRadius = 8.dp
|
||||||
|
) {
|
||||||
|
Text(
|
||||||
|
text = stringResource(cancelTextRes)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
Button(
|
||||||
|
onClick = {
|
||||||
|
if (onConfirm()) {
|
||||||
|
onDismiss()
|
||||||
|
onReset?.invoke()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
enabled = isConfirmEnabled && !isLoading,
|
||||||
|
modifier = Modifier
|
||||||
|
.weight(1f)
|
||||||
|
.heightIn(min = 48.dp)
|
||||||
|
.padding(vertical = 8.dp),
|
||||||
|
cornerRadius = 8.dp
|
||||||
|
) {
|
||||||
|
Text(
|
||||||
|
text = stringResource(confirmTextRes)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun DescriptionCard(
|
||||||
|
title: String,
|
||||||
|
description: String,
|
||||||
|
modifier: Modifier = Modifier,
|
||||||
|
warning: String? = null,
|
||||||
|
additionalInfo: String? = null
|
||||||
|
) {
|
||||||
|
Card(
|
||||||
|
modifier = modifier.fillMaxWidth(),
|
||||||
|
colors = CardDefaults.defaultColors(
|
||||||
|
color = colorScheme.surfaceVariant.copy(alpha = 0.3f)
|
||||||
|
),
|
||||||
|
cornerRadius = 8.dp
|
||||||
|
) {
|
||||||
|
Column(
|
||||||
|
modifier = Modifier.padding(12.dp),
|
||||||
|
verticalArrangement = Arrangement.spacedBy(6.dp)
|
||||||
|
) {
|
||||||
|
Text(
|
||||||
|
text = title,
|
||||||
|
style = MiuixTheme.textStyles.body1,
|
||||||
|
fontWeight = FontWeight.Medium,
|
||||||
|
color = colorScheme.primary
|
||||||
|
)
|
||||||
|
Text(
|
||||||
|
text = description,
|
||||||
|
style = MiuixTheme.textStyles.body2,
|
||||||
|
color = colorScheme.onSurfaceVariantSummary,
|
||||||
|
lineHeight = 16.sp
|
||||||
|
)
|
||||||
|
warning?.let {
|
||||||
|
Text(
|
||||||
|
text = it,
|
||||||
|
style = MiuixTheme.textStyles.body2,
|
||||||
|
color = colorScheme.secondary,
|
||||||
|
fontWeight = FontWeight.Medium,
|
||||||
|
lineHeight = 16.sp
|
||||||
|
)
|
||||||
|
}
|
||||||
|
additionalInfo?.let {
|
||||||
|
Text(
|
||||||
|
text = it,
|
||||||
|
style = MiuixTheme.textStyles.body2,
|
||||||
|
color = colorScheme.onSurfaceVariantSummary.copy(alpha = 0.8f),
|
||||||
|
lineHeight = 14.sp
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun ConfirmDialog(
|
||||||
|
showDialog: Boolean,
|
||||||
|
onDismiss: () -> Unit,
|
||||||
|
onConfirm: () -> Unit,
|
||||||
|
titleRes: Int,
|
||||||
|
messageRes: Int,
|
||||||
|
isLoading: Boolean = false
|
||||||
|
) {
|
||||||
|
UniversalDialog(
|
||||||
|
showDialog = showDialog,
|
||||||
|
onDismiss = onDismiss,
|
||||||
|
onConfirm = {
|
||||||
|
onConfirm()
|
||||||
|
true
|
||||||
|
},
|
||||||
|
titleRes = titleRes,
|
||||||
|
isLoading = isLoading,
|
||||||
|
fields = listOf(
|
||||||
|
DialogField.CustomContent {
|
||||||
|
Text(
|
||||||
|
text = stringResource(messageRes),
|
||||||
|
style = MiuixTheme.textStyles.body2
|
||||||
|
)
|
||||||
|
}
|
||||||
|
),
|
||||||
|
confirmTextRes = R.string.confirm,
|
||||||
|
cancelTextRes = R.string.cancel,
|
||||||
|
isConfirmEnabled = !isLoading
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun EmptyStateCard(
|
||||||
|
message: String,
|
||||||
|
modifier: Modifier = Modifier
|
||||||
|
) {
|
||||||
|
Card(
|
||||||
|
modifier = modifier.fillMaxWidth(),
|
||||||
|
colors = CardDefaults.defaultColors(
|
||||||
|
color = colorScheme.surfaceVariant.copy(alpha = 0.15f)
|
||||||
|
),
|
||||||
|
cornerRadius = 8.dp
|
||||||
|
) {
|
||||||
|
Box(
|
||||||
|
modifier = Modifier
|
||||||
|
.fillMaxWidth()
|
||||||
|
.padding(20.dp),
|
||||||
|
contentAlignment = Alignment.Center
|
||||||
|
) {
|
||||||
|
Text(
|
||||||
|
text = message,
|
||||||
|
style = MiuixTheme.textStyles.body2,
|
||||||
|
color = colorScheme.onSurfaceVariantSummary,
|
||||||
|
textAlign = TextAlign.Center
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun SectionHeader(
|
||||||
|
title: String,
|
||||||
|
subtitle: String?,
|
||||||
|
icon: ImageVector,
|
||||||
|
count: Int
|
||||||
|
) {
|
||||||
|
Card(
|
||||||
|
modifier = Modifier.fillMaxWidth(),
|
||||||
|
colors = CardDefaults.defaultColors(
|
||||||
|
color = colorScheme.surfaceVariant.copy(alpha = 0.25f)
|
||||||
|
),
|
||||||
|
cornerRadius = 8.dp
|
||||||
|
) {
|
||||||
|
Row(
|
||||||
|
modifier = Modifier
|
||||||
|
.fillMaxWidth()
|
||||||
|
.padding(14.dp),
|
||||||
|
verticalAlignment = Alignment.CenterVertically
|
||||||
|
) {
|
||||||
|
Icon(
|
||||||
|
imageVector = icon,
|
||||||
|
contentDescription = null,
|
||||||
|
tint = colorScheme.primary,
|
||||||
|
modifier = Modifier.size(22.dp)
|
||||||
|
)
|
||||||
|
Spacer(modifier = Modifier.width(12.dp))
|
||||||
|
Column(modifier = Modifier.weight(1f)) {
|
||||||
|
Text(
|
||||||
|
text = title,
|
||||||
|
style = MiuixTheme.textStyles.body1,
|
||||||
|
fontWeight = FontWeight.Medium,
|
||||||
|
color = colorScheme.onSurface
|
||||||
|
)
|
||||||
|
subtitle?.let {
|
||||||
|
Spacer(modifier = Modifier.height(2.dp))
|
||||||
|
Text(
|
||||||
|
text = it,
|
||||||
|
style = MiuixTheme.textStyles.body2,
|
||||||
|
color = colorScheme.onSurfaceVariantSummary
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Box(
|
||||||
|
modifier = Modifier
|
||||||
|
.clip(RoundedCornerShape(12.dp))
|
||||||
|
.background(colorScheme.primaryContainer)
|
||||||
|
.padding(horizontal = 10.dp, vertical = 5.dp)
|
||||||
|
) {
|
||||||
|
Text(
|
||||||
|
text = count.toString(),
|
||||||
|
style = MiuixTheme.textStyles.body2.copy(fontSize = 12.sp),
|
||||||
|
color = colorScheme.onPrimaryContainer,
|
||||||
|
fontWeight = FontWeight.Medium
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,313 @@
|
|||||||
|
package com.sukisu.ultra.ui.susfs.content
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
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.runtime.produceState
|
||||||
|
import androidx.compose.ui.Alignment
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.res.stringResource
|
||||||
|
import androidx.compose.ui.text.font.FontWeight
|
||||||
|
import androidx.compose.ui.unit.dp
|
||||||
|
import androidx.compose.ui.unit.sp
|
||||||
|
import com.sukisu.ultra.R
|
||||||
|
import com.sukisu.ultra.ui.susfs.component.BackupRestoreComponent
|
||||||
|
import com.sukisu.ultra.ui.susfs.component.DescriptionCard
|
||||||
|
import com.sukisu.ultra.ui.susfs.component.ResetButton
|
||||||
|
import com.sukisu.ultra.ui.susfs.util.SuSFSManager
|
||||||
|
import com.sukisu.ultra.ui.util.isAbDevice
|
||||||
|
import top.yukonga.miuix.kmp.basic.*
|
||||||
|
import top.yukonga.miuix.kmp.extra.SuperDropdown
|
||||||
|
import top.yukonga.miuix.kmp.extra.SuperSwitch
|
||||||
|
import top.yukonga.miuix.kmp.theme.MiuixTheme
|
||||||
|
import top.yukonga.miuix.kmp.theme.MiuixTheme.colorScheme
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun BasicSettingsContent(
|
||||||
|
unameValue: String,
|
||||||
|
onUnameValueChange: (String) -> Unit,
|
||||||
|
buildTimeValue: String,
|
||||||
|
onBuildTimeValueChange: (String) -> Unit,
|
||||||
|
executeInPostFsData: Boolean,
|
||||||
|
onExecuteInPostFsDataChange: (Boolean) -> Unit,
|
||||||
|
autoStartEnabled: Boolean,
|
||||||
|
canEnableAutoStart: Boolean,
|
||||||
|
isLoading: Boolean,
|
||||||
|
onAutoStartToggle: (Boolean) -> Unit,
|
||||||
|
onShowSlotInfo: () -> Unit,
|
||||||
|
context: Context,
|
||||||
|
enableHideBl: Boolean,
|
||||||
|
onEnableHideBlChange: (Boolean) -> Unit,
|
||||||
|
enableCleanupResidue: Boolean,
|
||||||
|
onEnableCleanupResidueChange: (Boolean) -> Unit,
|
||||||
|
enableAvcLogSpoofing: Boolean,
|
||||||
|
onEnableAvcLogSpoofingChange: (Boolean) -> Unit,
|
||||||
|
onReset: (() -> Unit)? = null,
|
||||||
|
onApply: (() -> Unit)? = null,
|
||||||
|
onConfigReload: () -> Unit
|
||||||
|
) {
|
||||||
|
val isAbDevice = produceState(initialValue = false) {
|
||||||
|
value = isAbDevice()
|
||||||
|
}.value
|
||||||
|
|
||||||
|
// 执行位置选择
|
||||||
|
val locationItems = listOf(
|
||||||
|
stringResource(R.string.susfs_execution_location_service),
|
||||||
|
stringResource(R.string.susfs_execution_location_post_fs_data)
|
||||||
|
)
|
||||||
|
|
||||||
|
// 说明卡片
|
||||||
|
DescriptionCard(
|
||||||
|
title = stringResource(R.string.susfs_config_description),
|
||||||
|
description = stringResource(R.string.susfs_config_description_text)
|
||||||
|
)
|
||||||
|
|
||||||
|
// Uname输入框
|
||||||
|
TextField(
|
||||||
|
value = unameValue,
|
||||||
|
onValueChange = onUnameValueChange,
|
||||||
|
label = stringResource(R.string.susfs_uname_label),
|
||||||
|
useLabelAsPlaceholder = true,
|
||||||
|
modifier = Modifier
|
||||||
|
.padding(top = 12.dp)
|
||||||
|
.fillMaxWidth(),
|
||||||
|
enabled = !isLoading
|
||||||
|
)
|
||||||
|
|
||||||
|
// 构建时间伪装输入框
|
||||||
|
TextField(
|
||||||
|
value = buildTimeValue,
|
||||||
|
onValueChange = onBuildTimeValueChange,
|
||||||
|
label = stringResource(R.string.susfs_build_time_label),
|
||||||
|
useLabelAsPlaceholder = true,
|
||||||
|
modifier = Modifier
|
||||||
|
.padding(top = 12.dp)
|
||||||
|
.fillMaxWidth(),
|
||||||
|
enabled = !isLoading
|
||||||
|
)
|
||||||
|
|
||||||
|
Card(
|
||||||
|
modifier = Modifier
|
||||||
|
.padding(top = 12.dp)
|
||||||
|
.fillMaxWidth(),
|
||||||
|
) {
|
||||||
|
SuperDropdown(
|
||||||
|
title = stringResource(R.string.susfs_execution_location_label),
|
||||||
|
summary = if (executeInPostFsData) {
|
||||||
|
stringResource(R.string.susfs_execution_location_post_fs_data)
|
||||||
|
} else {
|
||||||
|
stringResource(R.string.susfs_execution_location_service)
|
||||||
|
},
|
||||||
|
items = locationItems,
|
||||||
|
selectedIndex = if (executeInPostFsData) 1 else 0,
|
||||||
|
onSelectedIndexChange = { index ->
|
||||||
|
onExecuteInPostFsDataChange(index == 1)
|
||||||
|
},
|
||||||
|
enabled = !isLoading,
|
||||||
|
leftAction = {
|
||||||
|
Icon(
|
||||||
|
Icons.Default.LocationOn,
|
||||||
|
contentDescription = null,
|
||||||
|
tint = colorScheme.primary,
|
||||||
|
modifier = Modifier.padding(end = 16.dp)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 当前值显示
|
||||||
|
Card(
|
||||||
|
modifier = Modifier
|
||||||
|
.padding(top = 12.dp)
|
||||||
|
.fillMaxWidth(),
|
||||||
|
) {
|
||||||
|
Column(
|
||||||
|
modifier = Modifier.padding(12.dp),
|
||||||
|
verticalArrangement = Arrangement.spacedBy(6.dp)
|
||||||
|
) {
|
||||||
|
Text(
|
||||||
|
text = stringResource(R.string.susfs_current_value, SuSFSManager.getUnameValue(context)),
|
||||||
|
style = MiuixTheme.textStyles.body2.copy(fontSize = 13.sp),
|
||||||
|
color = colorScheme.onSurfaceVariantSummary
|
||||||
|
)
|
||||||
|
Text(
|
||||||
|
text = stringResource(R.string.susfs_current_build_time, SuSFSManager.getBuildTimeValue(context)),
|
||||||
|
style = MiuixTheme.textStyles.body2.copy(fontSize = 13.sp),
|
||||||
|
color = colorScheme.onSurfaceVariantSummary
|
||||||
|
)
|
||||||
|
Text(
|
||||||
|
text = stringResource(R.string.susfs_current_execution_location, if (SuSFSManager.getExecuteInPostFsData(context)) "Post-FS-Data" else "Service"),
|
||||||
|
style = MiuixTheme.textStyles.body2.copy(fontSize = 13.sp),
|
||||||
|
color = colorScheme.onSurfaceVariantSummary
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 应用按钮
|
||||||
|
if (onApply != null) {
|
||||||
|
Card(
|
||||||
|
modifier = Modifier
|
||||||
|
.padding(top = 12.dp)
|
||||||
|
.fillMaxWidth(),
|
||||||
|
) {
|
||||||
|
Button(
|
||||||
|
onClick = { onApply() },
|
||||||
|
enabled = !isLoading && (unameValue.isNotBlank() || buildTimeValue.isNotBlank()),
|
||||||
|
modifier = Modifier
|
||||||
|
.fillMaxWidth()
|
||||||
|
.heightIn(min = 48.dp),
|
||||||
|
cornerRadius = 8.dp
|
||||||
|
) {
|
||||||
|
Text(
|
||||||
|
text = stringResource(R.string.susfs_apply)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Card(
|
||||||
|
modifier = Modifier
|
||||||
|
.padding(top = 12.dp)
|
||||||
|
.fillMaxWidth(),
|
||||||
|
) {
|
||||||
|
// 开机自启动开关
|
||||||
|
SuperSwitch(
|
||||||
|
title = stringResource(R.string.susfs_autostart_title),
|
||||||
|
summary = if (canEnableAutoStart) {
|
||||||
|
stringResource(R.string.susfs_autostart_description)
|
||||||
|
} else {
|
||||||
|
stringResource(R.string.susfs_autostart_requirement)
|
||||||
|
},
|
||||||
|
leftAction = {
|
||||||
|
Icon(
|
||||||
|
Icons.Default.AutoMode,
|
||||||
|
modifier = Modifier.padding(end = 16.dp),
|
||||||
|
contentDescription = stringResource(R.string.susfs_autostart_title),
|
||||||
|
tint = if (canEnableAutoStart) colorScheme.onBackground else colorScheme.onSurfaceVariantSummary
|
||||||
|
)
|
||||||
|
},
|
||||||
|
checked = autoStartEnabled,
|
||||||
|
onCheckedChange = onAutoStartToggle,
|
||||||
|
enabled = !isLoading && canEnableAutoStart
|
||||||
|
)
|
||||||
|
|
||||||
|
// 隐藏BL脚本开关
|
||||||
|
SuperSwitch(
|
||||||
|
title = stringResource(R.string.hide_bl_script),
|
||||||
|
summary = stringResource(R.string.hide_bl_script_description),
|
||||||
|
leftAction = {
|
||||||
|
Icon(
|
||||||
|
Icons.Default.Security,
|
||||||
|
modifier = Modifier.padding(end = 16.dp),
|
||||||
|
contentDescription = stringResource(R.string.hide_bl_script),
|
||||||
|
tint = colorScheme.onBackground
|
||||||
|
)
|
||||||
|
},
|
||||||
|
checked = enableHideBl,
|
||||||
|
onCheckedChange = onEnableHideBlChange,
|
||||||
|
enabled = !isLoading
|
||||||
|
)
|
||||||
|
|
||||||
|
// 清理残留脚本开关
|
||||||
|
SuperSwitch(
|
||||||
|
title = stringResource(R.string.cleanup_residue),
|
||||||
|
summary = stringResource(R.string.cleanup_residue_description),
|
||||||
|
leftAction = {
|
||||||
|
Icon(
|
||||||
|
Icons.Default.CleaningServices,
|
||||||
|
modifier = Modifier.padding(end = 16.dp),
|
||||||
|
contentDescription = stringResource(R.string.cleanup_residue),
|
||||||
|
tint = colorScheme.onBackground
|
||||||
|
)
|
||||||
|
},
|
||||||
|
checked = enableCleanupResidue,
|
||||||
|
onCheckedChange = onEnableCleanupResidueChange,
|
||||||
|
enabled = !isLoading
|
||||||
|
)
|
||||||
|
|
||||||
|
// AVC日志欺骗开关
|
||||||
|
SuperSwitch(
|
||||||
|
title = stringResource(R.string.avc_log_spoofing),
|
||||||
|
summary = stringResource(R.string.avc_log_spoofing_description),
|
||||||
|
leftAction = {
|
||||||
|
Icon(
|
||||||
|
Icons.Default.VisibilityOff,
|
||||||
|
modifier = Modifier.padding(end = 16.dp),
|
||||||
|
contentDescription = stringResource(R.string.avc_log_spoofing),
|
||||||
|
tint = colorScheme.onBackground
|
||||||
|
)
|
||||||
|
},
|
||||||
|
checked = enableAvcLogSpoofing,
|
||||||
|
onCheckedChange = onEnableAvcLogSpoofingChange,
|
||||||
|
enabled = !isLoading
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 槽位信息按钮
|
||||||
|
if (isAbDevice) {
|
||||||
|
Card(
|
||||||
|
modifier = Modifier
|
||||||
|
.padding(top = 12.dp)
|
||||||
|
.fillMaxWidth(),
|
||||||
|
) {
|
||||||
|
Column(
|
||||||
|
modifier = Modifier.padding(14.dp),
|
||||||
|
verticalArrangement = Arrangement.spacedBy(12.dp)
|
||||||
|
) {
|
||||||
|
Row(
|
||||||
|
verticalAlignment = Alignment.CenterVertically
|
||||||
|
) {
|
||||||
|
Icon(
|
||||||
|
Icons.Default.Info,
|
||||||
|
contentDescription = null,
|
||||||
|
tint = colorScheme.primary,
|
||||||
|
modifier = Modifier.size(20.dp)
|
||||||
|
)
|
||||||
|
Spacer(modifier = Modifier.width(10.dp))
|
||||||
|
Text(
|
||||||
|
text = stringResource(R.string.susfs_slot_info_title),
|
||||||
|
style = MiuixTheme.textStyles.title3,
|
||||||
|
fontWeight = FontWeight.Medium,
|
||||||
|
color = colorScheme.onBackground
|
||||||
|
)
|
||||||
|
}
|
||||||
|
Text(
|
||||||
|
text = stringResource(R.string.susfs_slot_info_description),
|
||||||
|
style = MiuixTheme.textStyles.body2.copy(fontSize = 13.sp),
|
||||||
|
color = colorScheme.onSurfaceVariantSummary,
|
||||||
|
lineHeight = 16.sp
|
||||||
|
)
|
||||||
|
Button(
|
||||||
|
onClick = onShowSlotInfo,
|
||||||
|
enabled = !isLoading,
|
||||||
|
modifier = Modifier
|
||||||
|
.fillMaxWidth()
|
||||||
|
.heightIn(min = 48.dp)
|
||||||
|
.padding(vertical = 8.dp),
|
||||||
|
cornerRadius = 8.dp
|
||||||
|
) {
|
||||||
|
Text(
|
||||||
|
text = stringResource(R.string.susfs_slot_info_title)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BackupRestoreComponent(
|
||||||
|
isLoading = isLoading,
|
||||||
|
onLoadingChange = { },
|
||||||
|
onConfigReload = onConfigReload
|
||||||
|
)
|
||||||
|
|
||||||
|
// 重置按钮
|
||||||
|
if (onReset != null) {
|
||||||
|
ResetButton(
|
||||||
|
title = stringResource(R.string.susfs_reset_confirm_title),
|
||||||
|
onClick = onReset
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,79 @@
|
|||||||
|
package com.sukisu.ultra.ui.susfs.content
|
||||||
|
|
||||||
|
import androidx.compose.foundation.layout.*
|
||||||
|
import androidx.compose.material.icons.Icons
|
||||||
|
import androidx.compose.material.icons.filled.Settings
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.ui.Alignment
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.res.stringResource
|
||||||
|
import androidx.compose.ui.unit.dp
|
||||||
|
import androidx.compose.ui.unit.sp
|
||||||
|
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.FeatureStatusCard
|
||||||
|
import com.sukisu.ultra.ui.susfs.util.SuSFSManager
|
||||||
|
import top.yukonga.miuix.kmp.basic.*
|
||||||
|
import top.yukonga.miuix.kmp.basic.CardDefaults
|
||||||
|
import top.yukonga.miuix.kmp.theme.MiuixTheme
|
||||||
|
import top.yukonga.miuix.kmp.theme.MiuixTheme.colorScheme
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun EnabledFeaturesContent(
|
||||||
|
enabledFeatures: List<SuSFSManager.EnabledFeature>,
|
||||||
|
onRefresh: () -> Unit
|
||||||
|
) {
|
||||||
|
Column(
|
||||||
|
modifier = Modifier.fillMaxWidth(),
|
||||||
|
verticalArrangement = Arrangement.spacedBy(12.dp)
|
||||||
|
) {
|
||||||
|
Card(
|
||||||
|
modifier = Modifier.fillMaxWidth(),
|
||||||
|
colors = CardDefaults.defaultColors(
|
||||||
|
color = colorScheme.surfaceVariant.copy(alpha = 0.3f)
|
||||||
|
),
|
||||||
|
cornerRadius = 8.dp
|
||||||
|
) {
|
||||||
|
Row(
|
||||||
|
modifier = Modifier
|
||||||
|
.fillMaxWidth()
|
||||||
|
.padding(12.dp),
|
||||||
|
verticalAlignment = Alignment.CenterVertically
|
||||||
|
) {
|
||||||
|
Icon(
|
||||||
|
imageVector = Icons.Default.Settings,
|
||||||
|
contentDescription = null,
|
||||||
|
tint = colorScheme.primary,
|
||||||
|
modifier = Modifier.size(18.dp)
|
||||||
|
)
|
||||||
|
Spacer(modifier = Modifier.width(10.dp))
|
||||||
|
Text(
|
||||||
|
text = stringResource(R.string.susfs_enabled_features_description),
|
||||||
|
style = MiuixTheme.textStyles.body2,
|
||||||
|
color = colorScheme.onSurfaceVariantSummary,
|
||||||
|
lineHeight = 16.sp
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (enabledFeatures.isEmpty()) {
|
||||||
|
EmptyStateCard(
|
||||||
|
message = stringResource(R.string.susfs_no_features_found)
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
enabledFeatures.forEach { feature ->
|
||||||
|
FeatureStatusCard(
|
||||||
|
feature = feature,
|
||||||
|
onRefresh = onRefresh
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BottomActionButtons(
|
||||||
|
primaryButtonText = stringResource(R.string.refresh),
|
||||||
|
onPrimaryClick = onRefresh
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,99 @@
|
|||||||
|
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.AddKstatPathItemCard
|
||||||
|
import com.sukisu.ultra.ui.susfs.component.BottomActionButtons
|
||||||
|
import com.sukisu.ultra.ui.susfs.component.DescriptionCard
|
||||||
|
import com.sukisu.ultra.ui.susfs.component.EmptyStateCard
|
||||||
|
import com.sukisu.ultra.ui.susfs.component.KstatConfigItemCard
|
||||||
|
import com.sukisu.ultra.ui.susfs.component.SectionHeader
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun KstatConfigContent(
|
||||||
|
kstatConfigs: Set<String>,
|
||||||
|
addKstatPaths: Set<String>,
|
||||||
|
isLoading: Boolean,
|
||||||
|
onAddKstatStatically: () -> Unit,
|
||||||
|
onAddKstat: () -> Unit,
|
||||||
|
onRemoveKstatConfig: (String) -> Unit,
|
||||||
|
onEditKstatConfig: ((String) -> Unit)? = null,
|
||||||
|
onRemoveAddKstat: (String) -> Unit,
|
||||||
|
onEditAddKstat: ((String) -> Unit)? = null,
|
||||||
|
onUpdateKstat: (String) -> Unit,
|
||||||
|
onUpdateKstatFullClone: (String) -> Unit
|
||||||
|
) {
|
||||||
|
Column(
|
||||||
|
modifier = Modifier.fillMaxWidth(),
|
||||||
|
verticalArrangement = Arrangement.spacedBy(12.dp)
|
||||||
|
) {
|
||||||
|
DescriptionCard(
|
||||||
|
title = stringResource(R.string.kstat_config_description_title),
|
||||||
|
description = stringResource(R.string.kstat_config_description_add_statically) + "\n" +
|
||||||
|
stringResource(R.string.kstat_config_description_add) + "\n" +
|
||||||
|
stringResource(R.string.kstat_config_description_update) + "\n" +
|
||||||
|
stringResource(R.string.kstat_config_description_update_full_clone)
|
||||||
|
)
|
||||||
|
|
||||||
|
if (kstatConfigs.isNotEmpty()) {
|
||||||
|
SectionHeader(
|
||||||
|
title = stringResource(R.string.static_kstat_config),
|
||||||
|
subtitle = null,
|
||||||
|
icon = Icons.Default.Settings,
|
||||||
|
count = kstatConfigs.size
|
||||||
|
)
|
||||||
|
kstatConfigs.toList().forEach { config ->
|
||||||
|
KstatConfigItemCard(
|
||||||
|
config = config,
|
||||||
|
onDelete = { onRemoveKstatConfig(config) },
|
||||||
|
onEdit = if (onEditKstatConfig != null) {
|
||||||
|
{ onEditKstatConfig(config) }
|
||||||
|
} else null,
|
||||||
|
isLoading = isLoading
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (addKstatPaths.isNotEmpty()) {
|
||||||
|
SectionHeader(
|
||||||
|
title = stringResource(R.string.kstat_path_management),
|
||||||
|
subtitle = null,
|
||||||
|
icon = Icons.Default.Folder,
|
||||||
|
count = addKstatPaths.size
|
||||||
|
)
|
||||||
|
addKstatPaths.toList().forEach { path ->
|
||||||
|
AddKstatPathItemCard(
|
||||||
|
path = path,
|
||||||
|
onDelete = { onRemoveAddKstat(path) },
|
||||||
|
onEdit = if (onEditAddKstat != null) {
|
||||||
|
{ onEditAddKstat(path) }
|
||||||
|
} else null,
|
||||||
|
onUpdate = { onUpdateKstat(path) },
|
||||||
|
onUpdateFullClone = { onUpdateKstatFullClone(path) },
|
||||||
|
isLoading = isLoading
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (kstatConfigs.isEmpty() && addKstatPaths.isEmpty()) {
|
||||||
|
EmptyStateCard(
|
||||||
|
message = stringResource(R.string.no_kstat_config_message)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BottomActionButtons(
|
||||||
|
primaryButtonText = stringResource(R.string.add),
|
||||||
|
onPrimaryClick = onAddKstat,
|
||||||
|
secondaryButtonText = stringResource(R.string.add),
|
||||||
|
onSecondaryClick = onAddKstatStatically,
|
||||||
|
isLoading = isLoading
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,80 @@
|
|||||||
|
package com.sukisu.ultra.ui.susfs.content
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
|
import androidx.compose.foundation.layout.*
|
||||||
|
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.ResetButton
|
||||||
|
import top.yukonga.miuix.kmp.basic.*
|
||||||
|
|
||||||
|
@SuppressLint("SdCardPath")
|
||||||
|
@Composable
|
||||||
|
fun PathSettingsContent(
|
||||||
|
androidDataPath: String,
|
||||||
|
onAndroidDataPathChange: (String) -> Unit,
|
||||||
|
sdcardPath: String,
|
||||||
|
onSdcardPathChange: (String) -> Unit,
|
||||||
|
isLoading: Boolean,
|
||||||
|
onSetAndroidDataPath: () -> Unit,
|
||||||
|
onSetSdcardPath: () -> Unit,
|
||||||
|
onReset: (() -> Unit)? = null
|
||||||
|
) {
|
||||||
|
Column(
|
||||||
|
modifier = Modifier.fillMaxWidth(),
|
||||||
|
verticalArrangement = Arrangement.spacedBy(16.dp)
|
||||||
|
) {
|
||||||
|
Card(
|
||||||
|
modifier = Modifier.fillMaxWidth(),
|
||||||
|
) {
|
||||||
|
Column(
|
||||||
|
modifier = Modifier.padding(12.dp),
|
||||||
|
verticalArrangement = Arrangement.spacedBy(12.dp)
|
||||||
|
) {
|
||||||
|
TextField(
|
||||||
|
value = androidDataPath,
|
||||||
|
onValueChange = onAndroidDataPathChange,
|
||||||
|
label = stringResource(R.string.susfs_android_data_path_label),
|
||||||
|
useLabelAsPlaceholder = true,
|
||||||
|
modifier = Modifier.fillMaxWidth(),
|
||||||
|
cornerRadius = 16.dp,
|
||||||
|
enabled = !isLoading
|
||||||
|
)
|
||||||
|
|
||||||
|
TextField(
|
||||||
|
value = sdcardPath,
|
||||||
|
onValueChange = onSdcardPathChange,
|
||||||
|
label = stringResource(R.string.susfs_sdcard_path_label),
|
||||||
|
useLabelAsPlaceholder = true,
|
||||||
|
modifier = Modifier.fillMaxWidth(),
|
||||||
|
cornerRadius = 16.dp,
|
||||||
|
enabled = !isLoading
|
||||||
|
)
|
||||||
|
|
||||||
|
Button(
|
||||||
|
onClick = {
|
||||||
|
onSetAndroidDataPath()
|
||||||
|
onSetSdcardPath()
|
||||||
|
},
|
||||||
|
enabled = !isLoading && androidDataPath.isNotBlank() && sdcardPath.isNotBlank(),
|
||||||
|
modifier = Modifier.fillMaxWidth(),
|
||||||
|
cornerRadius = 16.dp
|
||||||
|
) {
|
||||||
|
Text(
|
||||||
|
text = stringResource(R.string.susfs_apply)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (onReset != null) {
|
||||||
|
ResetButton(
|
||||||
|
title = stringResource(R.string.susfs_reset_path_title),
|
||||||
|
onClick = onReset
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,77 @@
|
|||||||
|
package com.sukisu.ultra.ui.susfs.content
|
||||||
|
|
||||||
|
import androidx.compose.foundation.layout.*
|
||||||
|
import androidx.compose.material.icons.Icons
|
||||||
|
import androidx.compose.material.icons.filled.Loop
|
||||||
|
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.DescriptionCard
|
||||||
|
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 com.sukisu.ultra.ui.susfs.component.SectionHeader
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun SusLoopPathsContent(
|
||||||
|
susLoopPaths: Set<String>,
|
||||||
|
isLoading: Boolean,
|
||||||
|
onAddLoopPath: () -> Unit,
|
||||||
|
onRemoveLoopPath: (String) -> Unit,
|
||||||
|
onEditLoopPath: ((String) -> Unit)? = null,
|
||||||
|
onReset: (() -> Unit)? = null
|
||||||
|
) {
|
||||||
|
Column(
|
||||||
|
modifier = Modifier.fillMaxWidth(),
|
||||||
|
verticalArrangement = Arrangement.spacedBy(12.dp)
|
||||||
|
) {
|
||||||
|
// 说明卡片
|
||||||
|
DescriptionCard(
|
||||||
|
title = stringResource(R.string.sus_loop_paths_description_title),
|
||||||
|
description = stringResource(R.string.sus_loop_paths_description_text),
|
||||||
|
warning = stringResource(R.string.susfs_loop_path_restriction_warning)
|
||||||
|
)
|
||||||
|
|
||||||
|
if (susLoopPaths.isEmpty()) {
|
||||||
|
EmptyStateCard(
|
||||||
|
message = stringResource(R.string.susfs_no_loop_paths_configured)
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
SectionHeader(
|
||||||
|
title = stringResource(R.string.loop_paths_section),
|
||||||
|
subtitle = null,
|
||||||
|
icon = Icons.Default.Loop,
|
||||||
|
count = susLoopPaths.size
|
||||||
|
)
|
||||||
|
|
||||||
|
susLoopPaths.toList().forEach { path ->
|
||||||
|
PathItemCard(
|
||||||
|
path = path,
|
||||||
|
icon = Icons.Default.Loop,
|
||||||
|
onDelete = { onRemoveLoopPath(path) },
|
||||||
|
onEdit = if (onEditLoopPath != null) {
|
||||||
|
{ onEditLoopPath(path) }
|
||||||
|
} else null,
|
||||||
|
isLoading = isLoading
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BottomActionButtons(
|
||||||
|
primaryButtonText = stringResource(R.string.add_loop_path),
|
||||||
|
onPrimaryClick = onAddLoopPath,
|
||||||
|
isLoading = isLoading
|
||||||
|
)
|
||||||
|
|
||||||
|
if (onReset != null && susLoopPaths.isNotEmpty()) {
|
||||||
|
ResetButton(
|
||||||
|
title = stringResource(R.string.susfs_reset_loop_paths_title),
|
||||||
|
onClick = onReset
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,78 @@
|
|||||||
|
package com.sukisu.ultra.ui.susfs.content
|
||||||
|
|
||||||
|
import androidx.compose.foundation.layout.*
|
||||||
|
import androidx.compose.material.icons.Icons
|
||||||
|
import androidx.compose.material.icons.filled.Security
|
||||||
|
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.DescriptionCard
|
||||||
|
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 com.sukisu.ultra.ui.susfs.component.SectionHeader
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun SusMapsContent(
|
||||||
|
susMaps: Set<String>,
|
||||||
|
isLoading: Boolean,
|
||||||
|
onAddSusMap: () -> Unit,
|
||||||
|
onRemoveSusMap: (String) -> Unit,
|
||||||
|
onEditSusMap: ((String) -> Unit)? = null,
|
||||||
|
onReset: (() -> Unit)? = null
|
||||||
|
) {
|
||||||
|
Column(
|
||||||
|
modifier = Modifier.fillMaxWidth(),
|
||||||
|
verticalArrangement = Arrangement.spacedBy(12.dp)
|
||||||
|
) {
|
||||||
|
// 说明卡片
|
||||||
|
DescriptionCard(
|
||||||
|
title = stringResource(R.string.sus_maps_description_title),
|
||||||
|
description = stringResource(R.string.sus_maps_description_text),
|
||||||
|
warning = stringResource(R.string.sus_maps_warning),
|
||||||
|
additionalInfo = stringResource(R.string.sus_maps_debug_info)
|
||||||
|
)
|
||||||
|
|
||||||
|
if (susMaps.isEmpty()) {
|
||||||
|
EmptyStateCard(
|
||||||
|
message = stringResource(R.string.susfs_no_sus_maps_configured)
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
SectionHeader(
|
||||||
|
title = stringResource(R.string.sus_maps_section),
|
||||||
|
subtitle = null,
|
||||||
|
icon = Icons.Default.Security,
|
||||||
|
count = susMaps.size
|
||||||
|
)
|
||||||
|
|
||||||
|
susMaps.toList().forEach { map ->
|
||||||
|
PathItemCard(
|
||||||
|
path = map,
|
||||||
|
icon = Icons.Default.Security,
|
||||||
|
onDelete = { onRemoveSusMap(map) },
|
||||||
|
onEdit = if (onEditSusMap != null) {
|
||||||
|
{ onEditSusMap(map) }
|
||||||
|
} else null,
|
||||||
|
isLoading = isLoading
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BottomActionButtons(
|
||||||
|
primaryButtonText = stringResource(R.string.add),
|
||||||
|
onPrimaryClick = onAddSusMap,
|
||||||
|
isLoading = isLoading
|
||||||
|
)
|
||||||
|
|
||||||
|
if (onReset != null && susMaps.isNotEmpty()) {
|
||||||
|
ResetButton(
|
||||||
|
title = stringResource(R.string.susfs_reset_sus_maps_title),
|
||||||
|
onClick = onReset
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
package com.sukisu.ultra.ui.susfs.content
|
||||||
|
|
||||||
|
import androidx.compose.foundation.layout.*
|
||||||
|
import androidx.compose.material.icons.Icons
|
||||||
|
import androidx.compose.material.icons.filled.Storage
|
||||||
|
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 com.sukisu.ultra.ui.susfs.component.SusMountHidingControlCard
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun SusMountsContent(
|
||||||
|
susMounts: Set<String>,
|
||||||
|
hideSusMountsForAllProcs: Boolean,
|
||||||
|
isLoading: Boolean,
|
||||||
|
onAddMount: () -> Unit,
|
||||||
|
onRemoveMount: (String) -> Unit,
|
||||||
|
onEditMount: ((String) -> Unit)? = null,
|
||||||
|
onToggleHideSusMountsForAllProcs: (Boolean) -> Unit,
|
||||||
|
onReset: (() -> Unit)? = null
|
||||||
|
) {
|
||||||
|
Column(
|
||||||
|
modifier = Modifier.fillMaxWidth(),
|
||||||
|
verticalArrangement = Arrangement.spacedBy(12.dp)
|
||||||
|
) {
|
||||||
|
SusMountHidingControlCard(
|
||||||
|
hideSusMountsForAllProcs = hideSusMountsForAllProcs,
|
||||||
|
isLoading = isLoading,
|
||||||
|
onToggleHiding = onToggleHideSusMountsForAllProcs
|
||||||
|
)
|
||||||
|
|
||||||
|
if (susMounts.isEmpty()) {
|
||||||
|
EmptyStateCard(
|
||||||
|
message = stringResource(R.string.susfs_no_mounts_configured)
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
susMounts.toList().forEach { mount ->
|
||||||
|
PathItemCard(
|
||||||
|
path = mount,
|
||||||
|
icon = Icons.Default.Storage,
|
||||||
|
onDelete = { onRemoveMount(mount) },
|
||||||
|
onEdit = if (onEditMount != null) {
|
||||||
|
{ onEditMount(mount) }
|
||||||
|
} else null,
|
||||||
|
isLoading = isLoading
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BottomActionButtons(
|
||||||
|
primaryButtonText = stringResource(R.string.add),
|
||||||
|
onPrimaryClick = onAddMount,
|
||||||
|
isLoading = isLoading
|
||||||
|
)
|
||||||
|
|
||||||
|
if (onReset != null && susMounts.isNotEmpty()) {
|
||||||
|
ResetButton(
|
||||||
|
title = stringResource(R.string.susfs_reset_mounts_title),
|
||||||
|
onClick = onReset
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,192 @@
|
|||||||
|
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.runtime.LaunchedEffect
|
||||||
|
import androidx.compose.runtime.getValue
|
||||||
|
import androidx.compose.runtime.mutableStateOf
|
||||||
|
import androidx.compose.runtime.remember
|
||||||
|
import androidx.compose.runtime.setValue
|
||||||
|
import androidx.compose.runtime.snapshotFlow
|
||||||
|
import kotlinx.coroutines.flow.distinctUntilChanged
|
||||||
|
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.AppInfoCache
|
||||||
|
import com.sukisu.ultra.ui.susfs.component.AppPathGroupCard
|
||||||
|
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 com.sukisu.ultra.ui.susfs.component.SectionHeader
|
||||||
|
import com.sukisu.ultra.ui.viewmodel.SuperUserViewModel
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun SusPathsContent(
|
||||||
|
susPaths: Set<String>,
|
||||||
|
isLoading: Boolean,
|
||||||
|
onAddPath: () -> Unit,
|
||||||
|
onAddAppPath: () -> Unit,
|
||||||
|
onRemovePath: (String) -> Unit,
|
||||||
|
onEditPath: ((String) -> Unit)? = null,
|
||||||
|
forceRefreshApps: Boolean = false,
|
||||||
|
onReset: (() -> Unit)? = null
|
||||||
|
) {
|
||||||
|
var superUserApps by remember { mutableStateOf(SuperUserViewModel.getAppsSafely()) }
|
||||||
|
|
||||||
|
LaunchedEffect(Unit) {
|
||||||
|
snapshotFlow { SuperUserViewModel.apps }
|
||||||
|
.distinctUntilChanged()
|
||||||
|
.collect { _ ->
|
||||||
|
superUserApps = SuperUserViewModel.getAppsSafely()
|
||||||
|
if (superUserApps.isNotEmpty()) {
|
||||||
|
try {
|
||||||
|
AppInfoCache.clearCache()
|
||||||
|
} catch (_: Exception) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
LaunchedEffect(forceRefreshApps) {
|
||||||
|
if (forceRefreshApps) {
|
||||||
|
try {
|
||||||
|
AppInfoCache.clearCache()
|
||||||
|
} catch (_: Exception) {
|
||||||
|
// Ignore cache clear errors
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val (appPathGroups, otherPaths) = remember(susPaths, superUserApps) {
|
||||||
|
val appPathRegex = Regex(".*/Android/data/([^/]+)/?.*")
|
||||||
|
val uidPathRegex = Regex("/sys/fs/cgroup/uid_([0-9]+)")
|
||||||
|
val appPathMap = mutableMapOf<String, MutableList<String>>()
|
||||||
|
val uidToPackageMap = mutableMapOf<String, String>()
|
||||||
|
val others = mutableListOf<String>()
|
||||||
|
|
||||||
|
// 构建UID到包名的映射
|
||||||
|
try {
|
||||||
|
superUserApps.forEach { app: SuperUserViewModel.AppInfo ->
|
||||||
|
try {
|
||||||
|
val uid = app.packageInfo.applicationInfo?.uid
|
||||||
|
if (uid != null) {
|
||||||
|
uidToPackageMap[uid.toString()] = app.packageName
|
||||||
|
}
|
||||||
|
} catch (_: Exception) {
|
||||||
|
// Ignore individual app errors
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (_: Exception) {
|
||||||
|
// Ignore mapping errors
|
||||||
|
}
|
||||||
|
|
||||||
|
susPaths.forEach { path ->
|
||||||
|
val appDataMatch = appPathRegex.find(path)
|
||||||
|
val uidMatch = uidPathRegex.find(path)
|
||||||
|
|
||||||
|
when {
|
||||||
|
appDataMatch != null -> {
|
||||||
|
val packageName = appDataMatch.groupValues[1]
|
||||||
|
appPathMap.getOrPut(packageName) { mutableListOf() }.add(path)
|
||||||
|
}
|
||||||
|
uidMatch != null -> {
|
||||||
|
val uid = uidMatch.groupValues[1]
|
||||||
|
val packageName = uidToPackageMap[uid]
|
||||||
|
if (packageName != null) {
|
||||||
|
appPathMap.getOrPut(packageName) { mutableListOf() }.add(path)
|
||||||
|
} else {
|
||||||
|
others.add(path)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else -> {
|
||||||
|
others.add(path)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val sortedAppGroups = appPathMap.toList()
|
||||||
|
.sortedBy { it.first }
|
||||||
|
.map { (packageName, paths) -> packageName to paths.sorted() }
|
||||||
|
|
||||||
|
Pair(sortedAppGroups, others.sorted())
|
||||||
|
}
|
||||||
|
|
||||||
|
Column(
|
||||||
|
modifier = Modifier.fillMaxWidth(),
|
||||||
|
verticalArrangement = Arrangement.spacedBy(12.dp)
|
||||||
|
) {
|
||||||
|
// 应用路径分组
|
||||||
|
if (appPathGroups.isNotEmpty()) {
|
||||||
|
SectionHeader(
|
||||||
|
title = stringResource(R.string.app_paths_section),
|
||||||
|
subtitle = null,
|
||||||
|
icon = Icons.Default.Apps,
|
||||||
|
count = appPathGroups.size
|
||||||
|
)
|
||||||
|
|
||||||
|
appPathGroups.forEach { (packageName, paths) ->
|
||||||
|
AppPathGroupCard(
|
||||||
|
packageName = packageName,
|
||||||
|
paths = paths,
|
||||||
|
onDeleteGroup = {
|
||||||
|
paths.forEach { path -> onRemovePath(path) }
|
||||||
|
},
|
||||||
|
onEditGroup = if (onEditPath != null) {
|
||||||
|
{
|
||||||
|
onEditPath(paths.first())
|
||||||
|
}
|
||||||
|
} else null,
|
||||||
|
isLoading = isLoading
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 其他路径
|
||||||
|
if (otherPaths.isNotEmpty()) {
|
||||||
|
SectionHeader(
|
||||||
|
title = stringResource(R.string.other_paths_section),
|
||||||
|
subtitle = null,
|
||||||
|
icon = Icons.Default.Folder,
|
||||||
|
count = otherPaths.size
|
||||||
|
)
|
||||||
|
|
||||||
|
otherPaths.forEach { path ->
|
||||||
|
PathItemCard(
|
||||||
|
path = path,
|
||||||
|
icon = Icons.Default.Folder,
|
||||||
|
onDelete = { onRemovePath(path) },
|
||||||
|
onEdit = if (onEditPath != null) {
|
||||||
|
{ onEditPath(path) }
|
||||||
|
} else null,
|
||||||
|
isLoading = isLoading
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (susPaths.isEmpty()) {
|
||||||
|
EmptyStateCard(
|
||||||
|
message = stringResource(R.string.susfs_no_paths_configured)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BottomActionButtons(
|
||||||
|
primaryButtonText = stringResource(R.string.add_custom_path),
|
||||||
|
onPrimaryClick = onAddPath,
|
||||||
|
secondaryButtonText = stringResource(R.string.susfs_apply),
|
||||||
|
onSecondaryClick = onAddAppPath,
|
||||||
|
isLoading = isLoading
|
||||||
|
)
|
||||||
|
|
||||||
|
if (onReset != null && susPaths.isNotEmpty()) {
|
||||||
|
ResetButton(
|
||||||
|
title = stringResource(R.string.susfs_reset_paths_title),
|
||||||
|
onClick = onReset
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,99 @@
|
|||||||
|
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
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -14,9 +14,6 @@ import kotlinx.coroutines.Dispatchers
|
|||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.runBlocking
|
import kotlinx.coroutines.runBlocking
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import java.io.File
|
|
||||||
import java.io.FileOutputStream
|
|
||||||
import java.io.IOException
|
|
||||||
import androidx.core.content.edit
|
import androidx.core.content.edit
|
||||||
import com.sukisu.ultra.ui.util.getRootShell
|
import com.sukisu.ultra.ui.util.getRootShell
|
||||||
import com.sukisu.ultra.ui.util.getSuSFSVersion
|
import com.sukisu.ultra.ui.util.getSuSFSVersion
|
||||||
@@ -27,13 +24,12 @@ import kotlinx.coroutines.async
|
|||||||
import kotlinx.coroutines.awaitAll
|
import kotlinx.coroutines.awaitAll
|
||||||
import org.json.JSONArray
|
import org.json.JSONArray
|
||||||
import org.json.JSONObject
|
import org.json.JSONObject
|
||||||
|
import java.io.File
|
||||||
|
import java.io.FileOutputStream
|
||||||
|
import java.io.IOException
|
||||||
import java.text.SimpleDateFormat
|
import java.text.SimpleDateFormat
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
/**
|
|
||||||
* SuSFS 配置管理器
|
|
||||||
* 用于管理SuSFS相关的配置和命令执行
|
|
||||||
*/
|
|
||||||
object SuSFSManager {
|
object SuSFSManager {
|
||||||
private const val PREFS_NAME = "susfs_config"
|
private const val PREFS_NAME = "susfs_config"
|
||||||
private const val KEY_UNAME_VALUE = "uname_value"
|
private const val KEY_UNAME_VALUE = "uname_value"
|
||||||
@@ -57,20 +53,16 @@ object SuSFSManager {
|
|||||||
private const val KEY_UMOUNT_FOR_ZYGOTE_ISO_SERVICE = "umount_for_zygote_iso_service"
|
private const val KEY_UMOUNT_FOR_ZYGOTE_ISO_SERVICE = "umount_for_zygote_iso_service"
|
||||||
private const val KEY_ENABLE_AVC_LOG_SPOOFING = "enable_avc_log_spoofing"
|
private const val KEY_ENABLE_AVC_LOG_SPOOFING = "enable_avc_log_spoofing"
|
||||||
|
|
||||||
|
|
||||||
// 常量
|
// 常量
|
||||||
private const val SUSFS_BINARY_TARGET_NAME = "ksu_susfs"
|
|
||||||
private const val DEFAULT_UNAME = "default"
|
private const val DEFAULT_UNAME = "default"
|
||||||
private const val DEFAULT_BUILD_TIME = "default"
|
private const val DEFAULT_BUILD_TIME = "default"
|
||||||
private const val MODULE_ID = "susfs_manager"
|
|
||||||
private const val MODULE_PATH = "/data/adb/modules/$MODULE_ID"
|
|
||||||
const val MAX_SUSFS_VERSION = "2.0.0"
|
const val MAX_SUSFS_VERSION = "2.0.0"
|
||||||
private const val BACKUP_FILE_EXTENSION = ".susfs_backup"
|
private const val BACKUP_FILE_EXTENSION = ".susfs_backup"
|
||||||
private const val MEDIA_DATA_PATH = "/data/media/0/Android/data"
|
private const val MEDIA_DATA_PATH = "/data/media/0/Android/data"
|
||||||
private const val CGROUP_UID_PATH_PREFIX = "/sys/fs/cgroup/uid_"
|
private const val CGROUP_UID_PATH_PREFIX = "/sys/fs/cgroup/uid_"
|
||||||
|
private const val SUSFS_BINARY_TARGET_NAME = "ksu_susfs"
|
||||||
|
|
||||||
data class SlotInfo(val slotName: String, val uname: String, val buildTime: String)
|
data class SlotInfo(val slotName: String, val uname: String, val buildTime: String)
|
||||||
data class CommandResult(val isSuccess: Boolean, val output: String, val errorOutput: String = "")
|
|
||||||
data class EnabledFeature(
|
data class EnabledFeature(
|
||||||
val name: String,
|
val name: String,
|
||||||
val isEnabled: Boolean,
|
val isEnabled: Boolean,
|
||||||
@@ -89,9 +81,6 @@ object SuSFSManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 应用信息数据类
|
|
||||||
*/
|
|
||||||
data class AppInfo(
|
data class AppInfo(
|
||||||
val packageName: String,
|
val packageName: String,
|
||||||
val appName: String,
|
val appName: String,
|
||||||
@@ -99,9 +88,6 @@ object SuSFSManager {
|
|||||||
val isSystemApp: Boolean
|
val isSystemApp: Boolean
|
||||||
)
|
)
|
||||||
|
|
||||||
/**
|
|
||||||
* 备份数据类
|
|
||||||
*/
|
|
||||||
data class BackupData(
|
data class BackupData(
|
||||||
val version: String,
|
val version: String,
|
||||||
val timestamp: Long,
|
val timestamp: Long,
|
||||||
@@ -153,9 +139,6 @@ object SuSFSManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 模块配置数据类
|
|
||||||
*/
|
|
||||||
data class ModuleConfig(
|
data class ModuleConfig(
|
||||||
val targetPath: String,
|
val targetPath: String,
|
||||||
val unameValue: String,
|
val unameValue: String,
|
||||||
@@ -197,25 +180,49 @@ object SuSFSManager {
|
|||||||
private fun getPrefs(context: Context): SharedPreferences =
|
private fun getPrefs(context: Context): SharedPreferences =
|
||||||
context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
|
context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
|
||||||
|
|
||||||
private fun getSuSFSVersionUse(context: Context): String = try {
|
private fun getSuSFSBinaryName(): String {
|
||||||
val version = getSuSFSVersion()
|
val version = try {
|
||||||
val binaryName = "${SUSFS_BINARY_TARGET_NAME}_${version.removePrefix("v")}"
|
getSuSFSVersion()
|
||||||
if (isBinaryAvailable(context, binaryName)) {
|
|
||||||
version
|
|
||||||
} else {
|
|
||||||
MAX_SUSFS_VERSION
|
|
||||||
}
|
|
||||||
} catch (_: Exception) {
|
} catch (_: Exception) {
|
||||||
MAX_SUSFS_VERSION
|
MAX_SUSFS_VERSION
|
||||||
}
|
}
|
||||||
|
val versionSuffix = version.removePrefix("v")
|
||||||
|
return "${SUSFS_BINARY_TARGET_NAME}_$versionSuffix"
|
||||||
|
}
|
||||||
|
|
||||||
fun isBinaryAvailable(context: Context, binaryName: String): Boolean = try {
|
fun getSuSFSTargetPath(): String = "/data/adb/ksu/bin/$SUSFS_BINARY_TARGET_NAME"
|
||||||
context.assets.open(binaryName).use { true }
|
|
||||||
} catch (_: IOException) { false }
|
|
||||||
|
|
||||||
private fun getSuSFSBinaryName(context: Context): String = "${SUSFS_BINARY_TARGET_NAME}_${getSuSFSVersionUse(context).removePrefix("v")}"
|
suspend fun copyBinaryFromAssets(context: Context): String? = withContext(Dispatchers.IO) {
|
||||||
|
try {
|
||||||
|
val binaryName = getSuSFSBinaryName()
|
||||||
|
val targetPath = getSuSFSTargetPath()
|
||||||
|
val tempFile = File(context.cacheDir, binaryName)
|
||||||
|
|
||||||
|
context.assets.open(binaryName).use { input ->
|
||||||
|
FileOutputStream(tempFile).use { output ->
|
||||||
|
input.copyTo(output)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val shell = Shell.getShell()
|
||||||
|
val success = shell.newJob()
|
||||||
|
.add("cp '${tempFile.absolutePath}' '$targetPath'")
|
||||||
|
.add("chmod 755 '$targetPath'")
|
||||||
|
.exec().isSuccess
|
||||||
|
|
||||||
|
tempFile.delete()
|
||||||
|
|
||||||
|
if (success && shell.newJob().add("test -f '$targetPath'").exec().isSuccess) {
|
||||||
|
targetPath
|
||||||
|
} else {
|
||||||
|
null
|
||||||
|
}
|
||||||
|
} catch (e: IOException) {
|
||||||
|
Log.e("SuSFSManager", "Failed to copy binary", e)
|
||||||
|
null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun getSuSFSTargetPath(): String = "/data/adb/ksu/bin/$SUSFS_BINARY_TARGET_NAME"
|
|
||||||
|
|
||||||
private fun runCmd(shell: Shell, cmd: String): String {
|
private fun runCmd(shell: Shell, cmd: String): String {
|
||||||
return shell.newJob()
|
return shell.newJob()
|
||||||
@@ -225,16 +232,31 @@ object SuSFSManager {
|
|||||||
.joinToString("\n")
|
.joinToString("\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun runCmdWithResult(cmd: String): CommandResult {
|
private fun runCmdWithResult(cmd: String): SuSFSModuleManager.CommandResult {
|
||||||
val result = Shell.getShell().newJob().add(cmd).exec()
|
val result = Shell.getShell().newJob().add(cmd).exec()
|
||||||
return CommandResult(result.isSuccess, result.out.joinToString("\n"), result.err.joinToString("\n"))
|
return SuSFSModuleManager.CommandResult(result.isSuccess, result.out.joinToString("\n"), result.err.joinToString("\n"))
|
||||||
|
}
|
||||||
|
|
||||||
|
private suspend fun executeSusfsCommandDirect(context: Context, command: String): SuSFSModuleManager.CommandResult = withContext(Dispatchers.IO) {
|
||||||
|
try {
|
||||||
|
val binaryPath = copyBinaryFromAssets(context) ?: return@withContext SuSFSModuleManager.CommandResult(
|
||||||
|
false, "", context.getString(R.string.susfs_binary_not_found)
|
||||||
|
)
|
||||||
|
val shell = Shell.getShell()
|
||||||
|
val result = shell.newJob().add("$binaryPath $command").exec()
|
||||||
|
SuSFSModuleManager.CommandResult(
|
||||||
|
isSuccess = result.isSuccess,
|
||||||
|
output = result.out.joinToString("\n"),
|
||||||
|
errorOutput = result.err.joinToString("\n")
|
||||||
|
)
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Log.e("SuSFSManager", "Command execution failed", e)
|
||||||
|
SuSFSModuleManager.CommandResult(false, "", e.message ?: "Unknown error")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
fun getCurrentModuleConfig(context: Context): ModuleConfig {
|
||||||
* 获取当前模块配置
|
|
||||||
*/
|
|
||||||
private fun getCurrentModuleConfig(context: Context): ModuleConfig {
|
|
||||||
return ModuleConfig(
|
return ModuleConfig(
|
||||||
targetPath = getSuSFSTargetPath(),
|
targetPath = getSuSFSTargetPath(),
|
||||||
unameValue = getUnameValue(context),
|
unameValue = getUnameValue(context),
|
||||||
@@ -286,6 +308,9 @@ object SuSFSManager {
|
|||||||
fun getExecuteInPostFsData(context: Context): Boolean =
|
fun getExecuteInPostFsData(context: Context): Boolean =
|
||||||
getPrefs(context).getBoolean(KEY_EXECUTE_IN_POST_FS_DATA, false)
|
getPrefs(context).getBoolean(KEY_EXECUTE_IN_POST_FS_DATA, false)
|
||||||
|
|
||||||
|
fun saveExecuteInPostFsData(context: Context, enabled: Boolean) =
|
||||||
|
getPrefs(context).edit { putBoolean(KEY_EXECUTE_IN_POST_FS_DATA, enabled) }
|
||||||
|
|
||||||
// SUS挂载隐藏控制
|
// SUS挂载隐藏控制
|
||||||
fun saveHideSusMountsForAllProcs(context: Context, hideForAll: Boolean) =
|
fun saveHideSusMountsForAllProcs(context: Context, hideForAll: Boolean) =
|
||||||
getPrefs(context).edit { putBoolean(KEY_HIDE_SUS_MOUNTS_FOR_ALL_PROCS, hideForAll) }
|
getPrefs(context).edit { putBoolean(KEY_HIDE_SUS_MOUNTS_FOR_ALL_PROCS, hideForAll) }
|
||||||
@@ -609,6 +634,7 @@ object SuSFSManager {
|
|||||||
|
|
||||||
// 还原配置到SharedPreferences
|
// 还原配置到SharedPreferences
|
||||||
private fun restoreConfigurations(context: Context, configurations: Map<String, Any>) {
|
private fun restoreConfigurations(context: Context, configurations: Map<String, Any>) {
|
||||||
|
try {
|
||||||
val prefs = getPrefs(context)
|
val prefs = getPrefs(context)
|
||||||
prefs.edit {
|
prefs.edit {
|
||||||
configurations.forEach { (key, value) ->
|
configurations.forEach { (key, value) ->
|
||||||
@@ -625,6 +651,10 @@ object SuSFSManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} catch (e: Exception) {
|
||||||
|
e.printStackTrace()
|
||||||
|
throw e
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 验证备份文件
|
// 验证备份文件
|
||||||
@@ -688,108 +718,25 @@ object SuSFSManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 二进制文件管理
|
|
||||||
private suspend fun copyBinaryFromAssets(context: Context): String? = withContext(Dispatchers.IO) {
|
|
||||||
try {
|
|
||||||
val binaryName = getSuSFSBinaryName(context)
|
|
||||||
val targetPath = getSuSFSTargetPath()
|
|
||||||
val tempFile = File(context.cacheDir, binaryName)
|
|
||||||
|
|
||||||
context.assets.open(binaryName).use { input ->
|
|
||||||
FileOutputStream(tempFile).use { output ->
|
|
||||||
input.copyTo(output)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val success = runCmdWithResult("cp '${tempFile.absolutePath}' '$targetPath' && chmod 755 '$targetPath'").isSuccess
|
|
||||||
tempFile.delete()
|
|
||||||
|
|
||||||
if (success && runCmdWithResult("test -f '$targetPath'").isSuccess) targetPath else null
|
|
||||||
} catch (e: IOException) {
|
|
||||||
e.printStackTrace()
|
|
||||||
null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 命令执行
|
// 命令执行
|
||||||
private suspend fun executeSusfsCommand(context: Context, command: String): Boolean = withContext(Dispatchers.IO) {
|
private suspend fun executeSusfsCommand(context: Context, command: String): Boolean {
|
||||||
try {
|
val result = executeSusfsCommandDirect(context, command)
|
||||||
val binaryPath = copyBinaryFromAssets(context) ?: run {
|
|
||||||
showToast(context, context.getString(R.string.susfs_binary_not_found))
|
|
||||||
return@withContext false
|
|
||||||
}
|
|
||||||
|
|
||||||
val result = runCmdWithResult("$binaryPath $command")
|
|
||||||
|
|
||||||
if (!result.isSuccess) {
|
if (!result.isSuccess) {
|
||||||
showToast(context, "${context.getString(R.string.susfs_command_failed)}\n${result.output}\n${result.errorOutput}")
|
showToast(context, "${context.getString(R.string.susfs_command_failed)}\n${result.output}\n${result.errorOutput}")
|
||||||
}
|
}
|
||||||
|
return result.isSuccess
|
||||||
result.isSuccess
|
|
||||||
} catch (e: Exception) {
|
|
||||||
e.printStackTrace()
|
|
||||||
showToast(context, context.getString(R.string.susfs_command_error, e.message ?: "Unknown error"))
|
|
||||||
false
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun executeSusfsCommandWithOutput(context: Context, command: String): CommandResult = withContext(Dispatchers.IO) {
|
private suspend fun executeSusfsCommandWithOutput(context: Context, command: String): SuSFSModuleManager.CommandResult {
|
||||||
try {
|
return executeSusfsCommandDirect(context, command)
|
||||||
val binaryPath = copyBinaryFromAssets(context) ?: return@withContext CommandResult(
|
|
||||||
false, "", context.getString(R.string.susfs_binary_not_found)
|
|
||||||
)
|
|
||||||
runCmdWithResult("$binaryPath $command")
|
|
||||||
} catch (e: Exception) {
|
|
||||||
e.printStackTrace()
|
|
||||||
CommandResult(false, "", e.message ?: "Unknown error")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun showToast(context: Context, message: String) = withContext(Dispatchers.Main) {
|
private suspend fun showToast(context: Context, message: String) = withContext(Dispatchers.Main) {
|
||||||
Toast.makeText(context, message, Toast.LENGTH_SHORT).show()
|
Toast.makeText(context, message, Toast.LENGTH_SHORT).show()
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 模块管理
|
|
||||||
*/
|
|
||||||
private suspend fun updateMagiskModule(context: Context): Boolean {
|
private suspend fun updateMagiskModule(context: Context): Boolean {
|
||||||
return removeMagiskModule() && createMagiskModule(context)
|
return SuSFSModuleManager.updateMagiskModule(context)
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 模块创建方法
|
|
||||||
*/
|
|
||||||
private suspend fun createMagiskModule(context: Context): Boolean = withContext(Dispatchers.IO) {
|
|
||||||
try {
|
|
||||||
val config = getCurrentModuleConfig(context)
|
|
||||||
|
|
||||||
// 创建模块目录
|
|
||||||
if (!runCmdWithResult("mkdir -p $MODULE_PATH").isSuccess) return@withContext false
|
|
||||||
|
|
||||||
// 创建module.prop
|
|
||||||
val moduleProp = ScriptGenerator.generateModuleProp(MODULE_ID)
|
|
||||||
if (!runCmdWithResult("cat > $MODULE_PATH/module.prop << 'EOF'\n$moduleProp\nEOF").isSuccess) return@withContext false
|
|
||||||
|
|
||||||
// 生成并创建所有脚本文件
|
|
||||||
val scripts = ScriptGenerator.generateAllScripts(config)
|
|
||||||
|
|
||||||
scripts.all { (filename, content) ->
|
|
||||||
runCmdWithResult("cat > $MODULE_PATH/$filename << 'EOF'\n$content\nEOF").isSuccess &&
|
|
||||||
runCmdWithResult("chmod 755 $MODULE_PATH/$filename").isSuccess
|
|
||||||
}
|
|
||||||
} catch (e: Exception) {
|
|
||||||
e.printStackTrace()
|
|
||||||
false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private suspend fun removeMagiskModule(): Boolean = withContext(Dispatchers.IO) {
|
|
||||||
try {
|
|
||||||
runCmdWithResult("rm -rf $MODULE_PATH").isSuccess
|
|
||||||
} catch (e: Exception) {
|
|
||||||
e.printStackTrace()
|
|
||||||
false
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 功能状态获取
|
// 功能状态获取
|
||||||
@@ -1398,9 +1345,6 @@ object SuSFSManager {
|
|||||||
return success
|
return success
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 自启动配置检查
|
|
||||||
*/
|
|
||||||
fun hasConfigurationForAutoStart(context: Context): Boolean {
|
fun hasConfigurationForAutoStart(context: Context): Boolean {
|
||||||
val config = getCurrentModuleConfig(context)
|
val config = getCurrentModuleConfig(context)
|
||||||
return config.hasAutoStartConfig() || runBlocking {
|
return config.hasAutoStartConfig() || runBlocking {
|
||||||
@@ -1408,9 +1352,6 @@ object SuSFSManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 自启动配置方法
|
|
||||||
*/
|
|
||||||
suspend fun configureAutoStart(context: Context, enabled: Boolean): Boolean = withContext(Dispatchers.IO) {
|
suspend fun configureAutoStart(context: Context, enabled: Boolean): Boolean = withContext(Dispatchers.IO) {
|
||||||
try {
|
try {
|
||||||
if (enabled) {
|
if (enabled) {
|
||||||
@@ -1427,16 +1368,16 @@ object SuSFSManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val success = createMagiskModule(context)
|
val success = SuSFSModuleManager.createMagiskModule(context)
|
||||||
if (success) {
|
if (success) {
|
||||||
setAutoStartEnabled(context, true)
|
setAutoStartEnabled(context, true)
|
||||||
showToast(context, context.getString(R.string.susfs_autostart_enabled_success, MODULE_PATH))
|
showToast(context, context.getString(R.string.susfs_autostart_enabled_success, SuSFSModuleManager.getModulePath()))
|
||||||
} else {
|
} else {
|
||||||
showToast(context, context.getString(R.string.susfs_autostart_enable_failed))
|
showToast(context, context.getString(R.string.susfs_autostart_enable_failed))
|
||||||
}
|
}
|
||||||
success
|
success
|
||||||
} else {
|
} else {
|
||||||
val success = removeMagiskModule()
|
val success = SuSFSModuleManager.removeMagiskModule()
|
||||||
if (success) {
|
if (success) {
|
||||||
setAutoStartEnabled(context, false)
|
setAutoStartEnabled(context, false)
|
||||||
showToast(context, context.getString(R.string.susfs_autostart_disabled_success))
|
showToast(context, context.getString(R.string.susfs_autostart_disabled_success))
|
||||||
|
|||||||
@@ -0,0 +1,74 @@
|
|||||||
|
package com.sukisu.ultra.ui.susfs.util
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.util.Log
|
||||||
|
import com.topjohnwu.superuser.Shell
|
||||||
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
import kotlinx.coroutines.withContext
|
||||||
|
|
||||||
|
object SuSFSModuleManager {
|
||||||
|
private const val TAG = "SuSFSModuleManager"
|
||||||
|
private const val MODULE_ID = "susfs_manager"
|
||||||
|
private const val MODULE_PATH = "/data/adb/modules/$MODULE_ID"
|
||||||
|
|
||||||
|
data class CommandResult(val isSuccess: Boolean, val output: String, val errorOutput: String = "")
|
||||||
|
|
||||||
|
private fun runCmdWithResult(cmd: String): CommandResult {
|
||||||
|
val result = Shell.getShell().newJob().add(cmd).exec()
|
||||||
|
return CommandResult(
|
||||||
|
isSuccess = result.isSuccess,
|
||||||
|
output = result.out.joinToString("\n"),
|
||||||
|
errorOutput = result.err.joinToString("\n")
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun getModulePath(): String = MODULE_PATH
|
||||||
|
|
||||||
|
private fun getCurrentModuleConfig(context: Context): SuSFSManager.ModuleConfig {
|
||||||
|
return SuSFSManager.getCurrentModuleConfig(context)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
suspend fun createMagiskModule(context: Context): Boolean = withContext(Dispatchers.IO) {
|
||||||
|
try {
|
||||||
|
val config = getCurrentModuleConfig(context)
|
||||||
|
|
||||||
|
// 创建模块目录
|
||||||
|
if (!runCmdWithResult("mkdir -p $MODULE_PATH").isSuccess) {
|
||||||
|
return@withContext false
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建 module.prop
|
||||||
|
val moduleProp = ScriptGenerator.generateModuleProp(MODULE_ID)
|
||||||
|
val modulePropCmd = "cat > $MODULE_PATH/module.prop << 'EOF'\n$moduleProp\nEOF"
|
||||||
|
if (!runCmdWithResult(modulePropCmd).isSuccess) {
|
||||||
|
return@withContext false
|
||||||
|
}
|
||||||
|
|
||||||
|
// 生成并创建所有脚本文件
|
||||||
|
val scripts = ScriptGenerator.generateAllScripts(config)
|
||||||
|
scripts.all { (filename, content) ->
|
||||||
|
val writeCmd = "cat > $MODULE_PATH/$filename << 'EOF'\n$content\nEOF"
|
||||||
|
runCmdWithResult(writeCmd).isSuccess &&
|
||||||
|
runCmdWithResult("chmod 755 $MODULE_PATH/$filename").isSuccess
|
||||||
|
}
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Log.e(TAG, "Failed to create module", e)
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun removeMagiskModule(): Boolean = withContext(Dispatchers.IO) {
|
||||||
|
try {
|
||||||
|
runCmdWithResult("rm -rf $MODULE_PATH").isSuccess
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Log.e(TAG, "Failed to remove module", e)
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
suspend fun updateMagiskModule(context: Context): Boolean {
|
||||||
|
return removeMagiskModule() && createMagiskModule(context)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -26,13 +26,13 @@ object ScriptGenerator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 日志相关的通用脚本片段
|
// 日志相关的通用脚本片段
|
||||||
private fun generateLogSetup(logFileName: String): String = """
|
private fun generateLogSetup(logFileName: String): String = $$"""
|
||||||
# 日志目录
|
# 日志目录
|
||||||
LOG_DIR="$LOG_DIR"
|
LOG_DIR="$$LOG_DIR"
|
||||||
LOG_FILE="${'$'}LOG_DIR/$logFileName"
|
LOG_FILE="$LOG_DIR/$$logFileName"
|
||||||
|
|
||||||
# 创建日志目录
|
# 创建日志目录
|
||||||
mkdir -p "${'$'}LOG_DIR"
|
mkdir -p "$LOG_DIR"
|
||||||
|
|
||||||
# 获取当前时间
|
# 获取当前时间
|
||||||
get_current_time() {
|
get_current_time() {
|
||||||
@@ -41,11 +41,11 @@ object ScriptGenerator {
|
|||||||
""".trimIndent()
|
""".trimIndent()
|
||||||
|
|
||||||
// 二进制文件检查的通用脚本片段
|
// 二进制文件检查的通用脚本片段
|
||||||
private fun generateBinaryCheck(targetPath: String): String = """
|
private fun generateBinaryCheck(targetPath: String): String = $$"""
|
||||||
# 检查SuSFS二进制文件
|
# 检查SuSFS二进制文件
|
||||||
SUSFS_BIN="$targetPath"
|
SUSFS_BIN="$$targetPath"
|
||||||
if [ ! -f "${'$'}SUSFS_BIN" ]; then
|
if [ ! -f "$SUSFS_BIN" ]; then
|
||||||
echo "$(get_current_time): SuSFS二进制文件未找到: ${'$'}SUSFS_BIN" >> "${'$'}LOG_FILE"
|
echo "$(get_current_time): SuSFS二进制文件未找到: $SUSFS_BIN" >> "$LOG_FILE"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
""".trimIndent()
|
""".trimIndent()
|
||||||
@@ -94,7 +94,7 @@ object ScriptGenerator {
|
|||||||
generateCleanupResidueSection()
|
generateCleanupResidueSection()
|
||||||
}
|
}
|
||||||
|
|
||||||
appendLine("echo \"$(get_current_time): Service脚本执行完成\" >> \"${'$'}LOG_FILE\"")
|
appendLine($$"echo \"$(get_current_time): Service脚本执行完成\" >> \"$LOG_FILE\"")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -112,16 +112,16 @@ object ScriptGenerator {
|
|||||||
private fun StringBuilder.generateLogSettingSection(enableLog: Boolean) {
|
private fun StringBuilder.generateLogSettingSection(enableLog: Boolean) {
|
||||||
appendLine("# 设置日志启用状态")
|
appendLine("# 设置日志启用状态")
|
||||||
val logValue = if (enableLog) 1 else 0
|
val logValue = if (enableLog) 1 else 0
|
||||||
appendLine("\"${'$'}SUSFS_BIN\" enable_log $logValue")
|
appendLine($$"\"$SUSFS_BIN\" enable_log $$logValue")
|
||||||
appendLine("echo \"$(get_current_time): 日志功能设置为: ${if (enableLog) "启用" else "禁用"}\" >> \"${'$'}LOG_FILE\"")
|
appendLine($$"echo \"$(get_current_time): 日志功能设置为: $${if (enableLog) "启用" else "禁用"}\" >> \"$LOG_FILE\"")
|
||||||
appendLine()
|
appendLine()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun StringBuilder.generateAvcLogSpoofingSection(enableAvcLogSpoofing: Boolean) {
|
private fun StringBuilder.generateAvcLogSpoofingSection(enableAvcLogSpoofing: Boolean) {
|
||||||
appendLine("# 设置AVC日志欺骗状态")
|
appendLine("# 设置AVC日志欺骗状态")
|
||||||
val avcLogValue = if (enableAvcLogSpoofing) 1 else 0
|
val avcLogValue = if (enableAvcLogSpoofing) 1 else 0
|
||||||
appendLine("\"${'$'}SUSFS_BIN\" enable_avc_log_spoofing $avcLogValue")
|
appendLine($$"\"$SUSFS_BIN\" enable_avc_log_spoofing $$avcLogValue")
|
||||||
appendLine("echo \"$(get_current_time): AVC日志欺骗功能设置为: ${if (enableAvcLogSpoofing) "启用" else "禁用"}\" >> \"${'$'}LOG_FILE\"")
|
appendLine($$"echo \"$(get_current_time): AVC日志欺骗功能设置为: $${if (enableAvcLogSpoofing) "启用" else "禁用"}\" >> \"$LOG_FILE\"")
|
||||||
appendLine()
|
appendLine()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -129,8 +129,8 @@ object ScriptGenerator {
|
|||||||
if (susPaths.isNotEmpty()) {
|
if (susPaths.isNotEmpty()) {
|
||||||
appendLine("# 添加SUS路径")
|
appendLine("# 添加SUS路径")
|
||||||
susPaths.forEach { path ->
|
susPaths.forEach { path ->
|
||||||
appendLine("\"${'$'}SUSFS_BIN\" add_sus_path '$path'")
|
appendLine($$"\"$SUSFS_BIN\" add_sus_path '$$path'")
|
||||||
appendLine("echo \"$(get_current_time): 添加SUS路径: $path\" >> \"${'$'}LOG_FILE\"")
|
appendLine($$"echo \"$(get_current_time): 添加SUS路径: $$path\" >> \"$LOG_FILE\"")
|
||||||
}
|
}
|
||||||
appendLine()
|
appendLine()
|
||||||
}
|
}
|
||||||
@@ -140,8 +140,8 @@ object ScriptGenerator {
|
|||||||
if (susLoopPaths.isNotEmpty()) {
|
if (susLoopPaths.isNotEmpty()) {
|
||||||
appendLine("# 添加SUS循环路径")
|
appendLine("# 添加SUS循环路径")
|
||||||
susLoopPaths.forEach { path ->
|
susLoopPaths.forEach { path ->
|
||||||
appendLine("\"${'$'}SUSFS_BIN\" add_sus_path_loop '$path'")
|
appendLine($$"\"$SUSFS_BIN\" add_sus_path_loop '$$path'")
|
||||||
appendLine("echo \"$(get_current_time): 添加SUS循环路径: $path\" >> \"${'$'}LOG_FILE\"")
|
appendLine($$"echo \"$(get_current_time): 添加SUS循环路径: $$path\" >> \"$LOG_FILE\"")
|
||||||
}
|
}
|
||||||
appendLine()
|
appendLine()
|
||||||
}
|
}
|
||||||
@@ -156,8 +156,8 @@ object ScriptGenerator {
|
|||||||
if (addKstatPaths.isNotEmpty()) {
|
if (addKstatPaths.isNotEmpty()) {
|
||||||
appendLine("# 添加Kstat路径")
|
appendLine("# 添加Kstat路径")
|
||||||
addKstatPaths.forEach { path ->
|
addKstatPaths.forEach { path ->
|
||||||
appendLine("\"${'$'}SUSFS_BIN\" add_sus_kstat '$path'")
|
appendLine($$"\"$SUSFS_BIN\" add_sus_kstat '$$path'")
|
||||||
appendLine("echo \"$(get_current_time): 添加Kstat路径: $path\" >> \"${'$'}LOG_FILE\"")
|
appendLine($$"echo \"$(get_current_time): 添加Kstat路径: $$path\" >> \"$LOG_FILE\"")
|
||||||
}
|
}
|
||||||
appendLine()
|
appendLine()
|
||||||
}
|
}
|
||||||
@@ -171,11 +171,11 @@ object ScriptGenerator {
|
|||||||
val path = parts[0]
|
val path = parts[0]
|
||||||
val params = parts.drop(1).joinToString("' '", "'", "'")
|
val params = parts.drop(1).joinToString("' '", "'", "'")
|
||||||
appendLine()
|
appendLine()
|
||||||
appendLine("\"${'$'}SUSFS_BIN\" add_sus_kstat_statically '$path' $params")
|
appendLine($$"\"$SUSFS_BIN\" add_sus_kstat_statically '$$path' $$params")
|
||||||
appendLine("echo \"$(get_current_time): 添加Kstat静态配置: $path\" >> \"${'$'}LOG_FILE\"")
|
appendLine($$"echo \"$(get_current_time): 添加Kstat静态配置: $$path\" >> \"$LOG_FILE\"")
|
||||||
appendLine()
|
appendLine()
|
||||||
appendLine("\"${'$'}SUSFS_BIN\" update_sus_kstat '$path'")
|
appendLine($$"\"$SUSFS_BIN\" update_sus_kstat '$$path'")
|
||||||
appendLine("echo \"$(get_current_time): 更新Kstat配置: $path\" >> \"${'$'}LOG_FILE\"")
|
appendLine($$"echo \"$(get_current_time): 更新Kstat配置: $$path\" >> \"$LOG_FILE\"")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
appendLine()
|
appendLine()
|
||||||
@@ -185,8 +185,8 @@ object ScriptGenerator {
|
|||||||
private fun StringBuilder.generateUnameSection(config: SuSFSManager.ModuleConfig) {
|
private fun StringBuilder.generateUnameSection(config: SuSFSManager.ModuleConfig) {
|
||||||
if (!config.executeInPostFsData && (config.unameValue != DEFAULT_UNAME || config.buildTimeValue != DEFAULT_BUILD_TIME)) {
|
if (!config.executeInPostFsData && (config.unameValue != DEFAULT_UNAME || config.buildTimeValue != DEFAULT_BUILD_TIME)) {
|
||||||
appendLine("# 设置uname和构建时间")
|
appendLine("# 设置uname和构建时间")
|
||||||
appendLine("\"${'$'}SUSFS_BIN\" set_uname '${config.unameValue}' '${config.buildTimeValue}'")
|
appendLine($$"\"$SUSFS_BIN\" set_uname '$${config.unameValue}' '$${config.buildTimeValue}'")
|
||||||
appendLine("echo \"$(get_current_time): 设置uname为: ${config.unameValue}, 构建时间为: ${config.buildTimeValue}\" >> \"${'$'}LOG_FILE\"")
|
appendLine($$"echo \"$(get_current_time): 设置uname为: $${config.unameValue}, 构建时间为: $${config.buildTimeValue}\" >> \"$LOG_FILE\"")
|
||||||
appendLine()
|
appendLine()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -194,44 +194,44 @@ object ScriptGenerator {
|
|||||||
private fun StringBuilder.generateHideBlSection() {
|
private fun StringBuilder.generateHideBlSection() {
|
||||||
appendLine("# 隐藏BL 来自 Shamiko 脚本")
|
appendLine("# 隐藏BL 来自 Shamiko 脚本")
|
||||||
appendLine(
|
appendLine(
|
||||||
"""
|
$$"""
|
||||||
RESETPROP_BIN="/data/adb/ksu/bin/resetprop"
|
RESETPROP_BIN="/data/adb/ksu/bin/resetprop"
|
||||||
|
|
||||||
check_reset_prop() {
|
check_reset_prop() {
|
||||||
local NAME=$1
|
local NAME=$1
|
||||||
local EXPECTED=$2
|
local EXPECTED=$2
|
||||||
local VALUE=$("${'$'}RESETPROP_BIN" ${'$'}NAME)
|
local VALUE=$("$RESETPROP_BIN" $NAME)
|
||||||
[ -z ${'$'}VALUE ] || [ ${'$'}VALUE = ${'$'}EXPECTED ] || "${'$'}RESETPROP_BIN" ${'$'}NAME ${'$'}EXPECTED
|
[ -z $VALUE ] || [ $VALUE = $EXPECTED ] || "$RESETPROP_BIN" $NAME $EXPECTED
|
||||||
}
|
}
|
||||||
|
|
||||||
check_missing_prop() {
|
check_missing_prop() {
|
||||||
local NAME=$1
|
local NAME=$1
|
||||||
local EXPECTED=$2
|
local EXPECTED=$2
|
||||||
local VALUE=$("${'$'}RESETPROP_BIN" ${'$'}NAME)
|
local VALUE=$("$RESETPROP_BIN" $NAME)
|
||||||
[ -z ${'$'}VALUE ] && "${'$'}RESETPROP_BIN" ${'$'}NAME ${'$'}EXPECTED
|
[ -z $VALUE ] && "$RESETPROP_BIN" $NAME $EXPECTED
|
||||||
}
|
}
|
||||||
|
|
||||||
check_missing_match_prop() {
|
check_missing_match_prop() {
|
||||||
local NAME=$1
|
local NAME=$1
|
||||||
local EXPECTED=$2
|
local EXPECTED=$2
|
||||||
local VALUE=$("${'$'}RESETPROP_BIN" ${'$'}NAME)
|
local VALUE=$("$RESETPROP_BIN" $NAME)
|
||||||
[ -z ${'$'}VALUE ] || [ ${'$'}VALUE = ${'$'}EXPECTED ] || "${'$'}RESETPROP_BIN" ${'$'}NAME ${'$'}EXPECTED
|
[ -z $VALUE ] || [ $VALUE = $EXPECTED ] || "$RESETPROP_BIN" $NAME $EXPECTED
|
||||||
[ -z ${'$'}VALUE ] && "${'$'}RESETPROP_BIN" ${'$'}NAME ${'$'}EXPECTED
|
[ -z $VALUE ] && "$RESETPROP_BIN" $NAME $EXPECTED
|
||||||
}
|
}
|
||||||
|
|
||||||
contains_reset_prop() {
|
contains_reset_prop() {
|
||||||
local NAME=$1
|
local NAME=$1
|
||||||
local CONTAINS=$2
|
local CONTAINS=$2
|
||||||
local NEWVAL=$3
|
local NEWVAL=$3
|
||||||
case "$("${'$'}RESETPROP_BIN" ${'$'}NAME)" in
|
case "$("$RESETPROP_BIN" $NAME)" in
|
||||||
*"${'$'}CONTAINS"*) "${'$'}RESETPROP_BIN" ${'$'}NAME ${'$'}NEWVAL ;;
|
*"$CONTAINS"*) "$RESETPROP_BIN" $NAME $NEWVAL ;;
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
""".trimIndent())
|
""".trimIndent())
|
||||||
appendLine()
|
appendLine()
|
||||||
appendLine("sleep 30")
|
appendLine("sleep 30")
|
||||||
appendLine()
|
appendLine()
|
||||||
appendLine("\"${'$'}RESETPROP_BIN\" -w sys.boot_completed 0")
|
appendLine($$"\"$RESETPROP_BIN\" -w sys.boot_completed 0")
|
||||||
|
|
||||||
// 添加所有系统属性重置
|
// 添加所有系统属性重置
|
||||||
val systemProps = listOf(
|
val systemProps = listOf(
|
||||||
@@ -292,27 +292,28 @@ object ScriptGenerator {
|
|||||||
// 清理残留脚本生成
|
// 清理残留脚本生成
|
||||||
private fun StringBuilder.generateCleanupResidueSection() {
|
private fun StringBuilder.generateCleanupResidueSection() {
|
||||||
appendLine("# 清理工具残留文件")
|
appendLine("# 清理工具残留文件")
|
||||||
appendLine("echo \"$(get_current_time): 开始清理工具残留\" >> \"${'$'}LOG_FILE\"")
|
appendLine($$"echo \"$(get_current_time): 开始清理工具残留\" >> \"$LOG_FILE\"")
|
||||||
appendLine()
|
appendLine()
|
||||||
|
|
||||||
// 定义清理函数
|
// 定义清理函数
|
||||||
appendLine("""
|
appendLine(
|
||||||
|
$$"""
|
||||||
cleanup_path() {
|
cleanup_path() {
|
||||||
local path="$1"
|
local path="$1"
|
||||||
local desc="$2"
|
local desc="$2"
|
||||||
local current="$3"
|
local current="$3"
|
||||||
local total="$4"
|
local total="$4"
|
||||||
|
|
||||||
if [ -n "${'$'}desc" ]; then
|
if [ -n "$desc" ]; then
|
||||||
echo "$(get_current_time): [${'$'}current/${'$'}total] 清理: ${'$'}path (${'$'}desc)" >> "${'$'}LOG_FILE"
|
echo "$(get_current_time): [$current/$total] 清理: $path ($desc)" >> "$LOG_FILE"
|
||||||
else
|
else
|
||||||
echo "$(get_current_time): [${'$'}current/${'$'}total] 清理: ${'$'}path" >> "${'$'}LOG_FILE"
|
echo "$(get_current_time): [$current/$total] 清理: $path" >> "$LOG_FILE"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if rm -rf "${'$'}path" 2>/dev/null; then
|
if rm -rf "$path" 2>/dev/null; then
|
||||||
echo "$(get_current_time): ✓ 成功清理: ${'$'}path" >> "${'$'}LOG_FILE"
|
echo "$(get_current_time): ✓ 成功清理: $path" >> "$LOG_FILE"
|
||||||
else
|
else
|
||||||
echo "$(get_current_time): ✗ 清理失败或不存在: ${'$'}path" >> "${'$'}LOG_FILE"
|
echo "$(get_current_time): ✗ 清理失败或不存在: $path" >> "$LOG_FILE"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
""".trimIndent())
|
""".trimIndent())
|
||||||
@@ -360,11 +361,11 @@ object ScriptGenerator {
|
|||||||
|
|
||||||
cleanupPaths.forEachIndexed { index, (path, desc) ->
|
cleanupPaths.forEachIndexed { index, (path, desc) ->
|
||||||
val current = index + 1
|
val current = index + 1
|
||||||
appendLine("cleanup_path '$path' '$desc' $current \$TOTAL")
|
appendLine($$"cleanup_path '$$path' '$$desc' $$current $TOTAL")
|
||||||
}
|
}
|
||||||
|
|
||||||
appendLine()
|
appendLine()
|
||||||
appendLine("echo \"$(get_current_time): 工具残留清理完成\" >> \"${'$'}LOG_FILE\"")
|
appendLine($$"echo \"$(get_current_time): 工具残留清理完成\" >> \"$LOG_FILE\"")
|
||||||
appendLine()
|
appendLine()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -381,14 +382,14 @@ object ScriptGenerator {
|
|||||||
appendLine()
|
appendLine()
|
||||||
appendLine(generateBinaryCheck(config.targetPath))
|
appendLine(generateBinaryCheck(config.targetPath))
|
||||||
appendLine()
|
appendLine()
|
||||||
appendLine("echo \"$(get_current_time): Post-FS-Data脚本开始执行\" >> \"${'$'}LOG_FILE\"")
|
appendLine($$"echo \"$(get_current_time): Post-FS-Data脚本开始执行\" >> \"$LOG_FILE\"")
|
||||||
appendLine()
|
appendLine()
|
||||||
|
|
||||||
// 设置uname和构建时间 - 只有在选择在post-fs-data中执行时才执行
|
// 设置uname和构建时间 - 只有在选择在post-fs-data中执行时才执行
|
||||||
if (config.executeInPostFsData && (config.unameValue != DEFAULT_UNAME || config.buildTimeValue != DEFAULT_BUILD_TIME)) {
|
if (config.executeInPostFsData && (config.unameValue != DEFAULT_UNAME || config.buildTimeValue != DEFAULT_BUILD_TIME)) {
|
||||||
appendLine("# 设置uname和构建时间")
|
appendLine("# 设置uname和构建时间")
|
||||||
appendLine("\"${'$'}SUSFS_BIN\" set_uname '${config.unameValue}' '${config.buildTimeValue}'")
|
appendLine($$"\"$SUSFS_BIN\" set_uname '$${config.unameValue}' '$${config.buildTimeValue}'")
|
||||||
appendLine("echo \"$(get_current_time): 设置uname为: ${config.unameValue}, 构建时间为: ${config.buildTimeValue}\" >> \"${'$'}LOG_FILE\"")
|
appendLine($$"echo \"$(get_current_time): 设置uname为: $${config.unameValue}, 构建时间为: $${config.buildTimeValue}\" >> \"$LOG_FILE\"")
|
||||||
appendLine()
|
appendLine()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -397,7 +398,7 @@ object ScriptGenerator {
|
|||||||
// 添加AVC日志欺骗设置
|
// 添加AVC日志欺骗设置
|
||||||
generateAvcLogSpoofingSection(config.enableAvcLogSpoofing)
|
generateAvcLogSpoofingSection(config.enableAvcLogSpoofing)
|
||||||
|
|
||||||
appendLine("echo \"$(get_current_time): Post-FS-Data脚本执行完成\" >> \"${'$'}LOG_FILE\"")
|
appendLine($$"echo \"$(get_current_time): Post-FS-Data脚本执行完成\" >> \"$LOG_FILE\"")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -405,8 +406,8 @@ object ScriptGenerator {
|
|||||||
private fun StringBuilder.generateUmountZygoteIsoServiceSection(umountForZygoteIsoService: Boolean) {
|
private fun StringBuilder.generateUmountZygoteIsoServiceSection(umountForZygoteIsoService: Boolean) {
|
||||||
appendLine("# 设置Zygote隔离服务卸载状态")
|
appendLine("# 设置Zygote隔离服务卸载状态")
|
||||||
val umountValue = if (umountForZygoteIsoService) 1 else 0
|
val umountValue = if (umountForZygoteIsoService) 1 else 0
|
||||||
appendLine("\"${'$'}SUSFS_BIN\" umount_for_zygote_iso_service $umountValue")
|
appendLine($$"\"$SUSFS_BIN\" umount_for_zygote_iso_service $$umountValue")
|
||||||
appendLine("echo \"$(get_current_time): Zygote隔离服务卸载设置为: ${if (umountForZygoteIsoService) "启用" else "禁用"}\" >> \"${'$'}LOG_FILE\"")
|
appendLine($$"echo \"$(get_current_time): Zygote隔离服务卸载设置为: $${if (umountForZygoteIsoService) "启用" else "禁用"}\" >> \"$LOG_FILE\"")
|
||||||
appendLine()
|
appendLine()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -421,7 +422,7 @@ object ScriptGenerator {
|
|||||||
appendLine()
|
appendLine()
|
||||||
appendLine(generateLogSetup("susfs_post_mount.log"))
|
appendLine(generateLogSetup("susfs_post_mount.log"))
|
||||||
appendLine()
|
appendLine()
|
||||||
appendLine("echo \"$(get_current_time): Post-Mount脚本开始执行\" >> \"${'$'}LOG_FILE\"")
|
appendLine($$"echo \"$(get_current_time): Post-Mount脚本开始执行\" >> \"$LOG_FILE\"")
|
||||||
appendLine()
|
appendLine()
|
||||||
appendLine(generateBinaryCheck(config.targetPath))
|
appendLine(generateBinaryCheck(config.targetPath))
|
||||||
appendLine()
|
appendLine()
|
||||||
@@ -430,8 +431,8 @@ object ScriptGenerator {
|
|||||||
if (config.susMounts.isNotEmpty()) {
|
if (config.susMounts.isNotEmpty()) {
|
||||||
appendLine("# 添加SUS挂载")
|
appendLine("# 添加SUS挂载")
|
||||||
config.susMounts.forEach { mount ->
|
config.susMounts.forEach { mount ->
|
||||||
appendLine("\"${'$'}SUSFS_BIN\" add_sus_mount '$mount'")
|
appendLine($$"\"$SUSFS_BIN\" add_sus_mount '$$mount'")
|
||||||
appendLine("echo \"$(get_current_time): 添加SUS挂载: $mount\" >> \"${'$'}LOG_FILE\"")
|
appendLine($$"echo \"$(get_current_time): 添加SUS挂载: $$mount\" >> \"$LOG_FILE\"")
|
||||||
}
|
}
|
||||||
appendLine()
|
appendLine()
|
||||||
}
|
}
|
||||||
@@ -444,14 +445,14 @@ object ScriptGenerator {
|
|||||||
if (parts.size == 2) {
|
if (parts.size == 2) {
|
||||||
val path = parts[0]
|
val path = parts[0]
|
||||||
val mode = parts[1]
|
val mode = parts[1]
|
||||||
appendLine("\"${'$'}SUSFS_BIN\" add_try_umount '$path' $mode")
|
appendLine($$"\"$SUSFS_BIN\" add_try_umount '$$path' $$mode")
|
||||||
appendLine("echo \"$(get_current_time): 添加尝试卸载: $path (模式: $mode)\" >> \"${'$'}LOG_FILE\"")
|
appendLine($$"echo \"$(get_current_time): 添加尝试卸载: $$path (模式: $$mode)\" >> \"$LOG_FILE\"")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
appendLine()
|
appendLine()
|
||||||
}
|
}
|
||||||
|
|
||||||
appendLine("echo \"$(get_current_time): Post-Mount脚本执行完成\" >> \"${'$'}LOG_FILE\"")
|
appendLine($$"echo \"$(get_current_time): Post-Mount脚本执行完成\" >> \"$LOG_FILE\"")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -467,7 +468,7 @@ object ScriptGenerator {
|
|||||||
appendLine()
|
appendLine()
|
||||||
appendLine(generateLogSetup("susfs_boot_completed.log"))
|
appendLine(generateLogSetup("susfs_boot_completed.log"))
|
||||||
appendLine()
|
appendLine()
|
||||||
appendLine("echo \"$(get_current_time): Boot-Completed脚本开始执行\" >> \"${'$'}LOG_FILE\"")
|
appendLine($$"echo \"$(get_current_time): Boot-Completed脚本开始执行\" >> \"$LOG_FILE\"")
|
||||||
appendLine()
|
appendLine()
|
||||||
appendLine(generateBinaryCheck(config.targetPath))
|
appendLine(generateBinaryCheck(config.targetPath))
|
||||||
appendLine()
|
appendLine()
|
||||||
@@ -475,8 +476,8 @@ object ScriptGenerator {
|
|||||||
// SUS挂载隐藏控制
|
// SUS挂载隐藏控制
|
||||||
val hideValue = if (config.hideSusMountsForAllProcs) 1 else 0
|
val hideValue = if (config.hideSusMountsForAllProcs) 1 else 0
|
||||||
appendLine("# 设置SUS挂载隐藏控制")
|
appendLine("# 设置SUS挂载隐藏控制")
|
||||||
appendLine("\"${'$'}SUSFS_BIN\" hide_sus_mnts_for_all_procs $hideValue")
|
appendLine($$"\"$SUSFS_BIN\" hide_sus_mnts_for_all_procs $$hideValue")
|
||||||
appendLine("echo \"$(get_current_time): SUS挂载隐藏控制设置为: ${if (config.hideSusMountsForAllProcs) "对所有进程隐藏" else "仅对非KSU进程隐藏"}\" >> \"${'$'}LOG_FILE\"")
|
appendLine($$"echo \"$(get_current_time): SUS挂载隐藏控制设置为: $${if (config.hideSusMountsForAllProcs) "对所有进程隐藏" else "仅对非KSU进程隐藏"}\" >> \"$LOG_FILE\"")
|
||||||
appendLine()
|
appendLine()
|
||||||
|
|
||||||
// 路径设置和SUS路径设置
|
// 路径设置和SUS路径设置
|
||||||
@@ -499,7 +500,7 @@ object ScriptGenerator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
appendLine("echo \"$(get_current_time): Boot-Completed脚本执行完成\" >> \"${'$'}LOG_FILE\"")
|
appendLine($$"echo \"$(get_current_time): Boot-Completed脚本执行完成\" >> \"$LOG_FILE\"")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -507,8 +508,8 @@ object ScriptGenerator {
|
|||||||
if (susMaps.isNotEmpty()) {
|
if (susMaps.isNotEmpty()) {
|
||||||
appendLine("# 添加SUS映射")
|
appendLine("# 添加SUS映射")
|
||||||
susMaps.forEach { map ->
|
susMaps.forEach { map ->
|
||||||
appendLine("\"${'$'}SUSFS_BIN\" add_sus_map '$map'")
|
appendLine($$"\"$SUSFS_BIN\" add_sus_map '$$map'")
|
||||||
appendLine("echo \"$(get_current_time): 添加SUS映射: $map\" >> \"${'$'}LOG_FILE\"")
|
appendLine($$"echo \"$(get_current_time): 添加SUS映射: $$map\" >> \"$LOG_FILE\"")
|
||||||
}
|
}
|
||||||
appendLine()
|
appendLine()
|
||||||
}
|
}
|
||||||
@@ -521,12 +522,12 @@ object ScriptGenerator {
|
|||||||
appendLine("until [ -d \"/sdcard/Android\" ]; do sleep 1; done")
|
appendLine("until [ -d \"/sdcard/Android\" ]; do sleep 1; done")
|
||||||
appendLine("sleep 60")
|
appendLine("sleep 60")
|
||||||
appendLine()
|
appendLine()
|
||||||
appendLine("\"${'$'}SUSFS_BIN\" set_android_data_root_path '$androidDataPath'")
|
appendLine($$"\"$SUSFS_BIN\" set_android_data_root_path '$$androidDataPath'")
|
||||||
appendLine("echo \"$(get_current_time): Android Data路径设置为: $androidDataPath\" >> \"${'$'}LOG_FILE\"")
|
appendLine($$"echo \"$(get_current_time): Android Data路径设置为: $$androidDataPath\" >> \"$LOG_FILE\"")
|
||||||
appendLine()
|
appendLine()
|
||||||
appendLine("# 设置SD卡路径")
|
appendLine("# 设置SD卡路径")
|
||||||
appendLine("\"${'$'}SUSFS_BIN\" set_sdcard_root_path '$sdcardPath'")
|
appendLine($$"\"$SUSFS_BIN\" set_sdcard_root_path '$$sdcardPath'")
|
||||||
appendLine("echo \"$(get_current_time): SD卡路径设置为: $sdcardPath\" >> \"${'$'}LOG_FILE\"")
|
appendLine($$"echo \"$(get_current_time): SD卡路径设置为: $$sdcardPath\" >> \"$LOG_FILE\"")
|
||||||
appendLine()
|
appendLine()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,8 +5,6 @@
|
|||||||
<string name="home_click_to_install">إضغط للتثبيت</string>
|
<string name="home_click_to_install">إضغط للتثبيت</string>
|
||||||
<string name="home_working">يعمل</string>
|
<string name="home_working">يعمل</string>
|
||||||
<string name="home_working_version">الإصدار: %d</string>
|
<string name="home_working_version">الإصدار: %d</string>
|
||||||
<string name="home_superuser_count">مستخدمين الجذر: %d</string>
|
|
||||||
<string name="home_module_count">الإضافات: %d</string>
|
|
||||||
<string name="home_unsupported">غير مدعوم</string>
|
<string name="home_unsupported">غير مدعوم</string>
|
||||||
<string name="home_unsupported_reason">KernelSU يدعم GKI kernels فقط</string>
|
<string name="home_unsupported_reason">KernelSU يدعم GKI kernels فقط</string>
|
||||||
<string name="home_kernel">إصدار النواة</string>
|
<string name="home_kernel">إصدار النواة</string>
|
||||||
@@ -59,12 +57,8 @@
|
|||||||
<string name="launch_app">تشغيل</string>
|
<string name="launch_app">تشغيل</string>
|
||||||
<string name="profile_default">الإفتراضي</string>
|
<string name="profile_default">الإفتراضي</string>
|
||||||
<string name="profile_template">نموذج</string>
|
<string name="profile_template">نموذج</string>
|
||||||
<string name="profile_namespace_inherited">موروث</string>
|
|
||||||
<string name="profile_namespace_global">عالمي</string>
|
|
||||||
<string name="profile_namespace_individual">فردي</string>
|
|
||||||
<string name="profile_groups">مجموعات</string>
|
<string name="profile_groups">مجموعات</string>
|
||||||
<string name="profile_custom">مُخصّص</string>
|
<string name="profile_custom">مُخصّص</string>
|
||||||
<string name="profile_namespace">تركيب مساحة الاسم</string>
|
|
||||||
<string name="profile_umount_modules">الغاء تحميل الإضافات</string>
|
<string name="profile_umount_modules">الغاء تحميل الإضافات</string>
|
||||||
<string name="failed_to_update_app_profile">فشل تحديث ملف تعريف التطبيق لـ %s</string>
|
<string name="failed_to_update_app_profile">فشل تحديث ملف تعريف التطبيق لـ %s</string>
|
||||||
<string name="profile_selinux_context">سياق SELinux</string>
|
<string name="profile_selinux_context">سياق SELinux</string>
|
||||||
@@ -89,7 +83,6 @@
|
|||||||
<string name="app_profile_template_id_invalid">معرف القالب غير صالح</string>
|
<string name="app_profile_template_id_invalid">معرف القالب غير صالح</string>
|
||||||
<string name="app_profile_template_sync">مزامنة القوالب عبر الإنترنت</string>
|
<string name="app_profile_template_sync">مزامنة القوالب عبر الإنترنت</string>
|
||||||
<string name="app_profile_template_create">إنشاء قالب</string>
|
<string name="app_profile_template_create">إنشاء قالب</string>
|
||||||
<string name="app_profile_template_readonly">للقراءة فقط</string>
|
|
||||||
<string name="app_profile_import_export">استيراد / تصدير</string>
|
<string name="app_profile_import_export">استيراد / تصدير</string>
|
||||||
<string name="app_profile_template_save_failed">فشل في حفظ القالب</string>
|
<string name="app_profile_template_save_failed">فشل في حفظ القالب</string>
|
||||||
<string name="app_profile_template_edit">تحرير القالب</string>
|
<string name="app_profile_template_edit">تحرير القالب</string>
|
||||||
|
|||||||
@@ -1,13 +1,11 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<string name="home">Ana səhifə</string>
|
<string name="home">Ana səhifə</string>
|
||||||
<string name="home_superuser_count">Super istifadəçilər: %d</string>
|
|
||||||
<string name="home_kernel">Nüvə</string>
|
<string name="home_kernel">Nüvə</string>
|
||||||
<string name="home_not_installed">Yüklənmədi</string>
|
<string name="home_not_installed">Yüklənmədi</string>
|
||||||
<string name="home_click_to_install">Yükləmək üçün toxunun</string>
|
<string name="home_click_to_install">Yükləmək üçün toxunun</string>
|
||||||
<string name="home_working">İşləyir</string>
|
<string name="home_working">İşləyir</string>
|
||||||
<string name="home_working_version">Versiya: %d</string>
|
<string name="home_working_version">Versiya: %d</string>
|
||||||
<string name="home_module_count">Modullar: %d</string>
|
|
||||||
<string name="home_unsupported_reason">Hal-hazırda KernelSU yalnız GKI nüvələrini dəstəkləyir</string>
|
<string name="home_unsupported_reason">Hal-hazırda KernelSU yalnız GKI nüvələrini dəstəkləyir</string>
|
||||||
<string name="home_unsupported">Dəstəklənmir</string>
|
<string name="home_unsupported">Dəstəklənmir</string>
|
||||||
<string name="module_install">Yüklə</string>
|
<string name="module_install">Yüklə</string>
|
||||||
@@ -57,10 +55,6 @@
|
|||||||
<string name="profile_name">Profil adı</string>
|
<string name="profile_name">Profil adı</string>
|
||||||
<string name="profile_capabilities">Bacarıqlar</string>
|
<string name="profile_capabilities">Bacarıqlar</string>
|
||||||
<string name="profile_umount_modules">Modulları umount et</string>
|
<string name="profile_umount_modules">Modulları umount et</string>
|
||||||
<string name="profile_namespace_inherited">Miras qalmış</string>
|
|
||||||
<string name="profile_namespace_global">Qlobal</string>
|
|
||||||
<string name="profile_namespace">Bölmənin ad sahəsi</string>
|
|
||||||
<string name="profile_namespace_individual">Fərdi</string>
|
|
||||||
<string name="profile_groups">Qruplar</string>
|
<string name="profile_groups">Qruplar</string>
|
||||||
<string name="settings_umount_modules_default">Defolt olaraq modulları umount et</string>
|
<string name="settings_umount_modules_default">Defolt olaraq modulları umount et</string>
|
||||||
<string name="profile_selinux_context">SELinux konteksi</string>
|
<string name="profile_selinux_context">SELinux konteksi</string>
|
||||||
@@ -96,6 +90,5 @@
|
|||||||
<string name="app_profile_template_save">Yadda saxla</string>
|
<string name="app_profile_template_save">Yadda saxla</string>
|
||||||
<string name="app_profile_template_delete">Sil</string>
|
<string name="app_profile_template_delete">Sil</string>
|
||||||
<string name="app_profile_template_view">Şablonu göstər</string>
|
<string name="app_profile_template_view">Şablonu göstər</string>
|
||||||
<string name="app_profile_template_readonly">Yalnız oxu</string>
|
|
||||||
<string name="app_profile_template_id_exist">Şablon ID-si artıq mövcuddur!</string>
|
<string name="app_profile_template_id_exist">Şablon ID-si artıq mövcuddur!</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -6,7 +6,6 @@
|
|||||||
<string name="module_failed_to_enable">মোডিউল ইনেবল করা যায়নি: %s</string>
|
<string name="module_failed_to_enable">মোডিউল ইনেবল করা যায়নি: %s</string>
|
||||||
<string name="home_click_to_install">ইন্সটল করটে চাপুন</string>
|
<string name="home_click_to_install">ইন্সটল করটে চাপুন</string>
|
||||||
<string name="home_working">কাজ করছে</string>
|
<string name="home_working">কাজ করছে</string>
|
||||||
<string name="home_module_count">মোডিউল: %d</string>
|
|
||||||
<string name="home_unsupported">অমূলক</string>
|
<string name="home_unsupported">অমূলক</string>
|
||||||
<string name="home_kernel">কর্নেল</string>
|
<string name="home_kernel">কর্নেল</string>
|
||||||
<string name="home_manager_version">ম্যানেজার ভারসন</string>
|
<string name="home_manager_version">ম্যানেজার ভারসন</string>
|
||||||
@@ -21,7 +20,6 @@
|
|||||||
<string name="reboot">রিবুট</string>
|
<string name="reboot">রিবুট</string>
|
||||||
<string name="settings">সেটিংস</string>
|
<string name="settings">সেটিংস</string>
|
||||||
<string name="reboot_userspace">সফট রিবুট</string>
|
<string name="reboot_userspace">সফট রিবুট</string>
|
||||||
<string name="profile_namespace_global">গ্লোবাল</string>
|
|
||||||
<string name="profile_groups">গ্রুপস</string>
|
<string name="profile_groups">গ্রুপস</string>
|
||||||
<string name="profile_selinux_context">এসইলিনাক্স কন্টেক্সট</string>
|
<string name="profile_selinux_context">এসইলিনাক্স কন্টেক্সট</string>
|
||||||
<string name="failed_to_update_app_profile">%s এর জন্য অ্যাপ প্রফাইল আপডেট করা যায়নি</string>
|
<string name="failed_to_update_app_profile">%s এর জন্য অ্যাপ প্রফাইল আপডেট করা যায়নি</string>
|
||||||
@@ -32,10 +30,6 @@
|
|||||||
<string name="module_failed_to_disable">মোডিউল ডিসেবল করা যায়নি: %s</string>
|
<string name="module_failed_to_disable">মোডিউল ডিসেবল করা যায়নি: %s</string>
|
||||||
<string name="module_empty">কোনো মোডিউল ইন্সটল করা নেই</string>
|
<string name="module_empty">কোনো মোডিউল ইন্সটল করা নেই</string>
|
||||||
<string name="home_working_version">সংস্করণ: %d</string>
|
<string name="home_working_version">সংস্করণ: %d</string>
|
||||||
<string name="home_superuser_count">সুপার ইউজার: %d</string>
|
|
||||||
<string name="profile_namespace">নেইম স্পেস মাউন্ট</string>
|
|
||||||
<string name="profile_namespace_inherited">ইনহেরিটেড</string>
|
|
||||||
<string name="profile_namespace_individual">ইন্ডিভিজুয়াল</string>
|
|
||||||
<string name="profile_capabilities">ক্যাপাবিলিটিস</string>
|
<string name="profile_capabilities">ক্যাপাবিলিটিস</string>
|
||||||
<string name="profile_umount_modules">আনমাউন্ট মোডিউলস</string>
|
<string name="profile_umount_modules">আনমাউন্ট মোডিউলস</string>
|
||||||
<string name="reboot_recovery">রিকভারিতে বুট</string>
|
<string name="reboot_recovery">রিকভারিতে বুট</string>
|
||||||
|
|||||||
@@ -5,8 +5,6 @@
|
|||||||
<string name="home_click_to_install">ইনস্টল করার জন্য ক্লিক করুন</string>
|
<string name="home_click_to_install">ইনস্টল করার জন্য ক্লিক করুন</string>
|
||||||
<string name="home_working"> ওয়ার্কিং</string>
|
<string name="home_working"> ওয়ার্কিং</string>
|
||||||
<string name="home_working_version">ওয়ার্কিং সংস্করণ: %d</string>
|
<string name="home_working_version">ওয়ার্কিং সংস্করণ: %d</string>
|
||||||
<string name="home_superuser_count">সুপার ইউজার: %d</string>
|
|
||||||
<string name="home_module_count">মডিউল: %d</string>
|
|
||||||
<string name="home_unsupported">অসমর্থিত</string>
|
<string name="home_unsupported">অসমর্থিত</string>
|
||||||
<string name="home_unsupported_reason">KernelSU শুধুমাত্র GKI কার্নেল সমর্থন করে</string>
|
<string name="home_unsupported_reason">KernelSU শুধুমাত্র GKI কার্নেল সমর্থন করে</string>
|
||||||
<string name="home_kernel">কার্নেল</string>
|
<string name="home_kernel">কার্নেল</string>
|
||||||
@@ -52,15 +50,12 @@
|
|||||||
<string name="home_support_content">কার্নেলএসইউ বিনামূল্যে এবং ওপেন সোর্স, এবং সবসময় থাকবে। আপনি সবসময় একটি অনুদান দিয়ে আপনার কৃতজ্ঞতা প্রদর্শন করতে পারেন.</string>
|
<string name="home_support_content">কার্নেলএসইউ বিনামূল্যে এবং ওপেন সোর্স, এবং সবসময় থাকবে। আপনি সবসময় একটি অনুদান দিয়ে আপনার কৃতজ্ঞতা প্রদর্শন করতে পারেন.</string>
|
||||||
<string name="about_source_code"><![CDATA[Bekijk source code op %1$s<br/>আমাদের %2$s চ্যানেল মার্জ করুন]]></string>
|
<string name="about_source_code"><![CDATA[Bekijk source code op %1$s<br/>আমাদের %2$s চ্যানেল মার্জ করুন]]></string>
|
||||||
<string name="profile_name">প্রফাইলের নাম</string>
|
<string name="profile_name">প্রফাইলের নাম</string>
|
||||||
<string name="profile_namespace">নেমস্পেস মাউন্ট</string>
|
|
||||||
<string name="profile_groups">গ্রুপস</string>
|
<string name="profile_groups">গ্রুপস</string>
|
||||||
<string name="profile_capabilities">যোগ্যতা</string>
|
<string name="profile_capabilities">যোগ্যতা</string>
|
||||||
<string name="profile_selinux_context">এসই লিনাক্স কনটেক্সট</string>
|
<string name="profile_selinux_context">এসই লিনাক্স কনটেক্সট</string>
|
||||||
<string name="profile_default">ডিফল্ট</string>
|
<string name="profile_default">ডিফল্ট</string>
|
||||||
<string name="profile_template">টেমপ্লেট</string>
|
<string name="profile_template">টেমপ্লেট</string>
|
||||||
<string name="profile_custom">কাস্টম</string>
|
<string name="profile_custom">কাস্টম</string>
|
||||||
<string name="profile_namespace_global">গ্লোবাল</string>
|
|
||||||
<string name="profile_namespace_individual">আলাদাভাবে</string>
|
|
||||||
<string name="profile_umount_modules">আনমাউন্ট মোডিউল</string>
|
<string name="profile_umount_modules">আনমাউন্ট মোডিউল</string>
|
||||||
<string name="require_kernel_version">ম্যানেজার সঠিকভাবে কাজ করার জন্য বর্তমান KernelSU সংস্করণ %d খুবই কম। অনুগ্রহ করে %d বা উচ্চতর সংস্করণে আপগ্রেড করুন!</string>
|
<string name="require_kernel_version">ম্যানেজার সঠিকভাবে কাজ করার জন্য বর্তমান KernelSU সংস্করণ %d খুবই কম। অনুগ্রহ করে %d বা উচ্চতর সংস্করণে আপগ্রেড করুন!</string>
|
||||||
<string name="save_log">লগ সংরক্ষণ করুন</string>
|
<string name="save_log">লগ সংরক্ষণ করুন</string>
|
||||||
|
|||||||
@@ -1,9 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<string name="profile_namespace">Imenski prostor nosača</string>
|
|
||||||
<string name="profile_namespace_inherited">Naslijeđen</string>
|
|
||||||
<string name="profile_namespace_global">Globalan</string>
|
|
||||||
<string name="profile_namespace_individual">Pojedinačan</string>
|
|
||||||
<string name="profile_groups">Grupe</string>
|
<string name="profile_groups">Grupe</string>
|
||||||
<string name="profile_capabilities">Sposobnosti</string>
|
<string name="profile_capabilities">Sposobnosti</string>
|
||||||
<string name="profile_selinux_context">SELinux kontekst</string>
|
<string name="profile_selinux_context">SELinux kontekst</string>
|
||||||
@@ -24,8 +20,6 @@
|
|||||||
<string name="home">Početna</string>
|
<string name="home">Početna</string>
|
||||||
<string name="home_not_installed">Nije instalirano</string>
|
<string name="home_not_installed">Nije instalirano</string>
|
||||||
<string name="home_click_to_install">Kliknite da instalirate</string>
|
<string name="home_click_to_install">Kliknite da instalirate</string>
|
||||||
<string name="home_superuser_count">Superkorisnici: %d</string>
|
|
||||||
<string name="home_module_count">Module: %d</string>
|
|
||||||
<string name="home_unsupported">Nepodržano</string>
|
<string name="home_unsupported">Nepodržano</string>
|
||||||
<string name="home_unsupported_reason">KernelSU samo podržava GKI kernele sad</string>
|
<string name="home_unsupported_reason">KernelSU samo podržava GKI kernele sad</string>
|
||||||
<string name="home_manager_version">Verzija Upravitelja</string>
|
<string name="home_manager_version">Verzija Upravitelja</string>
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<string name="home_working">Arbejder</string>
|
<string name="home_working">Arbejder</string>
|
||||||
<string name="home_module_count">Moduler: %d</string>
|
|
||||||
<string name="home_unsupported">Ikke understøttet</string>
|
<string name="home_unsupported">Ikke understøttet</string>
|
||||||
<string name="home_kernel">Kernel-version</string>
|
<string name="home_kernel">Kernel-version</string>
|
||||||
<string name="home_unsupported_reason">KernelSU understøtter nu kun GKI-kerner.</string>
|
<string name="home_unsupported_reason">KernelSU understøtter nu kun GKI-kerner.</string>
|
||||||
@@ -35,9 +34,6 @@
|
|||||||
<string name="about_source_code"><![CDATA[View source code at %1$s<br/>Join our %2$s channel]]></string>
|
<string name="about_source_code"><![CDATA[View source code at %1$s<br/>Join our %2$s channel]]></string>
|
||||||
<string name="profile_default">Standard</string>
|
<string name="profile_default">Standard</string>
|
||||||
<string name="profile_template">Skabelon</string>
|
<string name="profile_template">Skabelon</string>
|
||||||
<string name="profile_namespace">Monter namespace</string>
|
|
||||||
<string name="profile_namespace_inherited">Arvet</string>
|
|
||||||
<string name="profile_namespace_global">Global</string>
|
|
||||||
<string name="profile_groups">Grupper</string>
|
<string name="profile_groups">Grupper</string>
|
||||||
<string name="profile_capabilities">Evner</string>
|
<string name="profile_capabilities">Evner</string>
|
||||||
<string name="profile_selinux_context">SELinux-kontext</string>
|
<string name="profile_selinux_context">SELinux-kontext</string>
|
||||||
@@ -55,7 +51,6 @@
|
|||||||
<string name="home_working_version">Version: %d</string>
|
<string name="home_working_version">Version: %d</string>
|
||||||
<string name="home">Hjem</string>
|
<string name="home">Hjem</string>
|
||||||
<string name="home_not_installed">Ikke installeret</string>
|
<string name="home_not_installed">Ikke installeret</string>
|
||||||
<string name="home_superuser_count">Superbrugere: %d</string>
|
|
||||||
<string name="home_fingerprint">Fingeraftryk</string>
|
<string name="home_fingerprint">Fingeraftryk</string>
|
||||||
<string name="selinux_status_unknown">Ukendt</string>
|
<string name="selinux_status_unknown">Ukendt</string>
|
||||||
<string name="module_failed_to_enable">Aktivering af modul fejlede: %s</string>
|
<string name="module_failed_to_enable">Aktivering af modul fejlede: %s</string>
|
||||||
@@ -71,7 +66,6 @@
|
|||||||
<string name="home_support_content">KernelSU er, og vil altid være, gratis og åben kildekode. Du kan dog vise os, at du holder af os, ved at give en donation.</string>
|
<string name="home_support_content">KernelSU er, og vil altid være, gratis og åben kildekode. Du kan dog vise os, at du holder af os, ved at give en donation.</string>
|
||||||
<string name="profile_custom">Brugerdefineret</string>
|
<string name="profile_custom">Brugerdefineret</string>
|
||||||
<string name="profile_name">Profilnavn</string>
|
<string name="profile_name">Profilnavn</string>
|
||||||
<string name="profile_namespace_individual">Individuel</string>
|
|
||||||
<string name="failed_to_update_app_profile">Opdatering af App Profil for %s fejlede</string>
|
<string name="failed_to_update_app_profile">Opdatering af App Profil for %s fejlede</string>
|
||||||
<string name="settings_umount_modules_default_summary">Den globale standardværdi for \"Umount moduler\" i App Profile. Hvis aktiveret, fjernes alle modulændringer til systemet for apps, der ikke har en profil angivet.</string>
|
<string name="settings_umount_modules_default_summary">Den globale standardværdi for \"Umount moduler\" i App Profile. Hvis aktiveret, fjernes alle modulændringer til systemet for apps, der ikke har en profil angivet.</string>
|
||||||
<string name="profile_selinux_domain">Domæne</string>
|
<string name="profile_selinux_domain">Domæne</string>
|
||||||
@@ -96,7 +90,6 @@
|
|||||||
<string name="app_profile_template_save">Gem</string>
|
<string name="app_profile_template_save">Gem</string>
|
||||||
<string name="app_profile_template_delete">Slet</string>
|
<string name="app_profile_template_delete">Slet</string>
|
||||||
<string name="app_profile_template_view">Visningsskabelon</string>
|
<string name="app_profile_template_view">Visningsskabelon</string>
|
||||||
<string name="app_profile_template_readonly">Skrivebeskyttet</string>
|
|
||||||
<string name="app_profile_template_id_exist">Skabelon-ID findes allerede!</string>
|
<string name="app_profile_template_id_exist">Skabelon-ID findes allerede!</string>
|
||||||
<string name="app_profile_import_export">Import/Eksport</string>
|
<string name="app_profile_import_export">Import/Eksport</string>
|
||||||
<string name="app_profile_import_from_clipboard">Importér fra udklipsholder</string>
|
<string name="app_profile_import_from_clipboard">Importér fra udklipsholder</string>
|
||||||
|
|||||||
@@ -7,7 +7,6 @@
|
|||||||
<string name="home_working_version">Version: %d</string>
|
<string name="home_working_version">Version: %d</string>
|
||||||
<string name="superuser">Superuser</string>
|
<string name="superuser">Superuser</string>
|
||||||
<string name="home_click_to_install">Tippe zum Installieren</string>
|
<string name="home_click_to_install">Tippe zum Installieren</string>
|
||||||
<string name="home_superuser_count">Superuser: %d</string>
|
|
||||||
<string name="selinux_status_unknown">Unbekannt</string>
|
<string name="selinux_status_unknown">Unbekannt</string>
|
||||||
<string name="selinux_status_enforcing">Erzwingen</string>
|
<string name="selinux_status_enforcing">Erzwingen</string>
|
||||||
<string name="reboot_bootloader">In den Bootloader-Modus neustarten</string>
|
<string name="reboot_bootloader">In den Bootloader-Modus neustarten</string>
|
||||||
@@ -27,9 +26,6 @@
|
|||||||
<string name="profile_template">Vorlage</string>
|
<string name="profile_template">Vorlage</string>
|
||||||
<string name="profile_custom">Benutzerdefiniert</string>
|
<string name="profile_custom">Benutzerdefiniert</string>
|
||||||
<string name="failed_to_update_app_profile">App-Profilaktualisierung für %s fehlgeschlagen</string>
|
<string name="failed_to_update_app_profile">App-Profilaktualisierung für %s fehlgeschlagen</string>
|
||||||
<string name="profile_namespace_inherited">Geerbt</string>
|
|
||||||
<string name="profile_namespace_global">Global</string>
|
|
||||||
<string name="profile_namespace_individual">Individuell</string>
|
|
||||||
<string name="profile_selinux_domain">Domäne</string>
|
<string name="profile_selinux_domain">Domäne</string>
|
||||||
<string name="module_update">Aktualisieren</string>
|
<string name="module_update">Aktualisieren</string>
|
||||||
<string name="profile_umount_modules_summary">Wenn du diese Option aktivierst, kann KernelSU alle von den Modulen für diese App geänderten Dateien wiederherstellen.</string>
|
<string name="profile_umount_modules_summary">Wenn du diese Option aktivierst, kann KernelSU alle von den Modulen für diese App geänderten Dateien wiederherstellen.</string>
|
||||||
@@ -40,7 +36,6 @@
|
|||||||
<string name="new_version_available">Neue Version %s verfügbar, tippen zum Aktualisieren.</string>
|
<string name="new_version_available">Neue Version %s verfügbar, tippen zum Aktualisieren.</string>
|
||||||
<string name="force_stop_app">Stopp erzwingen</string>
|
<string name="force_stop_app">Stopp erzwingen</string>
|
||||||
<string name="restart_app">Neustarten</string>
|
<string name="restart_app">Neustarten</string>
|
||||||
<string name="home_module_count">Module: %d</string>
|
|
||||||
<string name="home_manager_version">Manager-Version</string>
|
<string name="home_manager_version">Manager-Version</string>
|
||||||
<string name="home_selinux_status">SELinux Status</string>
|
<string name="home_selinux_status">SELinux Status</string>
|
||||||
<string name="selinux_status_disabled">Deaktiviert</string>
|
<string name="selinux_status_disabled">Deaktiviert</string>
|
||||||
@@ -64,7 +59,6 @@
|
|||||||
<string name="reboot_to_apply">Neustarten, damit Änderungen wirksam werden</string>
|
<string name="reboot_to_apply">Neustarten, damit Änderungen wirksam werden</string>
|
||||||
<string name="about_source_code"><![CDATA[Quellcode einsehen unter %1$s<br/>Unserem %2$s-Kanal beitreten]]></string>
|
<string name="about_source_code"><![CDATA[Quellcode einsehen unter %1$s<br/>Unserem %2$s-Kanal beitreten]]></string>
|
||||||
<string name="profile_name">Profilname</string>
|
<string name="profile_name">Profilname</string>
|
||||||
<string name="profile_namespace">Namespace einhängen</string>
|
|
||||||
<string name="profile_groups">Gruppen</string>
|
<string name="profile_groups">Gruppen</string>
|
||||||
<string name="profile_capabilities">Fähigkeiten</string>
|
<string name="profile_capabilities">Fähigkeiten</string>
|
||||||
<string name="profile_umount_modules">Module aushängen</string>
|
<string name="profile_umount_modules">Module aushängen</string>
|
||||||
@@ -89,7 +83,6 @@
|
|||||||
<string name="app_profile_template_id_invalid">Ungültige Vorlagen-ID</string>
|
<string name="app_profile_template_id_invalid">Ungültige Vorlagen-ID</string>
|
||||||
<string name="app_profile_template_sync">Online-Vorlagen synchronisieren</string>
|
<string name="app_profile_template_sync">Online-Vorlagen synchronisieren</string>
|
||||||
<string name="app_profile_template_create">Vorlage erstellen</string>
|
<string name="app_profile_template_create">Vorlage erstellen</string>
|
||||||
<string name="app_profile_template_readonly">Schreibgeschützt</string>
|
|
||||||
<string name="app_profile_import_export">Import/Export</string>
|
<string name="app_profile_import_export">Import/Export</string>
|
||||||
<string name="app_profile_template_save_failed">Schlug beim Speichern der Vorlage fehl</string>
|
<string name="app_profile_template_save_failed">Schlug beim Speichern der Vorlage fehl</string>
|
||||||
<string name="app_profile_template_edit">Vorlage bearbeiten</string>
|
<string name="app_profile_template_edit">Vorlage bearbeiten</string>
|
||||||
|
|||||||
@@ -5,8 +5,6 @@
|
|||||||
<string name="home_click_to_install">Haz clic para instalar</string>
|
<string name="home_click_to_install">Haz clic para instalar</string>
|
||||||
<string name="home_working">Funcionando</string>
|
<string name="home_working">Funcionando</string>
|
||||||
<string name="home_working_version">Versión: %d</string>
|
<string name="home_working_version">Versión: %d</string>
|
||||||
<string name="home_superuser_count">Superusuarios: %d</string>
|
|
||||||
<string name="home_module_count">Módulos: %d</string>
|
|
||||||
<string name="home_unsupported">Sin soporte</string>
|
<string name="home_unsupported">Sin soporte</string>
|
||||||
<string name="home_unsupported_reason">KernelSU solo admite kernels GKI por ahora</string>
|
<string name="home_unsupported_reason">KernelSU solo admite kernels GKI por ahora</string>
|
||||||
<string name="home_kernel">Versión del kernel</string>
|
<string name="home_kernel">Versión del kernel</string>
|
||||||
@@ -56,10 +54,6 @@
|
|||||||
<string name="profile_template">Plantilla</string>
|
<string name="profile_template">Plantilla</string>
|
||||||
<string name="profile_custom">Personalizado</string>
|
<string name="profile_custom">Personalizado</string>
|
||||||
<string name="profile_name">Nombre de perfil</string>
|
<string name="profile_name">Nombre de perfil</string>
|
||||||
<string name="profile_namespace">Montaje del espacio de nombres</string>
|
|
||||||
<string name="profile_namespace_inherited">Heredado</string>
|
|
||||||
<string name="profile_namespace_global">Global</string>
|
|
||||||
<string name="profile_namespace_individual">Individual</string>
|
|
||||||
<string name="profile_groups">Grupos</string>
|
<string name="profile_groups">Grupos</string>
|
||||||
<string name="profile_capabilities">Capacidades</string>
|
<string name="profile_capabilities">Capacidades</string>
|
||||||
<string name="profile_selinux_context">Contexto SELinux</string>
|
<string name="profile_selinux_context">Contexto SELinux</string>
|
||||||
@@ -90,7 +84,6 @@
|
|||||||
<string name="app_profile_template_id_invalid">ID de plantilla no válida</string>
|
<string name="app_profile_template_id_invalid">ID de plantilla no válida</string>
|
||||||
<string name="app_profile_template_sync">Sincronizar plantillas en línea</string>
|
<string name="app_profile_template_sync">Sincronizar plantillas en línea</string>
|
||||||
<string name="app_profile_template_create">Crear plantilla</string>
|
<string name="app_profile_template_create">Crear plantilla</string>
|
||||||
<string name="app_profile_template_readonly">Sólo lectura</string>
|
|
||||||
<string name="app_profile_import_export">Importar/Exportar</string>
|
<string name="app_profile_import_export">Importar/Exportar</string>
|
||||||
<string name="app_profile_template_save_failed">No se ha podido guardar la plantilla</string>
|
<string name="app_profile_template_save_failed">No se ha podido guardar la plantilla</string>
|
||||||
<string name="app_profile_template_edit">Editar plantilla</string>
|
<string name="app_profile_template_edit">Editar plantilla</string>
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<string name="home_working">Töötamine</string>
|
<string name="home_working">Töötamine</string>
|
||||||
<string name="home_working_version">Versioon: %d</string>
|
<string name="home_working_version">Versioon: %d</string>
|
||||||
<string name="home_module_count">Mooduleid: %d</string>
|
|
||||||
<string name="home_kernel">Tuum</string>
|
<string name="home_kernel">Tuum</string>
|
||||||
<string name="home_manager_version">Manageri versioon</string>
|
<string name="home_manager_version">Manageri versioon</string>
|
||||||
<string name="home_fingerprint">Sõrmejälg</string>
|
<string name="home_fingerprint">Sõrmejälg</string>
|
||||||
@@ -19,7 +18,6 @@
|
|||||||
<string name="home_learn_kernelsu">Õpi KernelSUd</string>
|
<string name="home_learn_kernelsu">Õpi KernelSUd</string>
|
||||||
<string name="home_learn_kernelsu_url">https://kernelsu.org/guide/what-is-kernelsu.html</string>
|
<string name="home_learn_kernelsu_url">https://kernelsu.org/guide/what-is-kernelsu.html</string>
|
||||||
<string name="profile_default">Vaikimisi</string>
|
<string name="profile_default">Vaikimisi</string>
|
||||||
<string name="profile_namespace">Haagi nimeruum</string>
|
|
||||||
<string name="profile_umount_modules">Lahtihaagitud moodulid</string>
|
<string name="profile_umount_modules">Lahtihaagitud moodulid</string>
|
||||||
<string name="failed_to_update_app_profile">Rakenduseprofiili uuendamine %s jaoks ebaõnnestus</string>
|
<string name="failed_to_update_app_profile">Rakenduseprofiili uuendamine %s jaoks ebaõnnestus</string>
|
||||||
<string name="settings_umount_modules_default">Haagi moodulid vaikimisi lahti</string>
|
<string name="settings_umount_modules_default">Haagi moodulid vaikimisi lahti</string>
|
||||||
@@ -28,7 +26,6 @@
|
|||||||
<string name="app_profile_template_edit">Muuda malli</string>
|
<string name="app_profile_template_edit">Muuda malli</string>
|
||||||
<string name="settings_profile_template">Rakenduseprofiili mall</string>
|
<string name="settings_profile_template">Rakenduseprofiili mall</string>
|
||||||
<string name="app_profile_template_id">ID</string>
|
<string name="app_profile_template_id">ID</string>
|
||||||
<string name="app_profile_template_readonly">Vaid lugemiseks</string>
|
|
||||||
<string name="app_profile_template_id_exist">Malli ID juba eksisteerib!</string>
|
<string name="app_profile_template_id_exist">Malli ID juba eksisteerib!</string>
|
||||||
<string name="app_profile_export_to_clipboard">Ekspordi lõikelauale</string>
|
<string name="app_profile_export_to_clipboard">Ekspordi lõikelauale</string>
|
||||||
<string name="app_profile_template_sync">Sünkrooni võrgumallid</string>
|
<string name="app_profile_template_sync">Sünkrooni võrgumallid</string>
|
||||||
@@ -37,7 +34,6 @@
|
|||||||
<string name="home_click_to_install">Klõpsa paigaldamiseks</string>
|
<string name="home_click_to_install">Klõpsa paigaldamiseks</string>
|
||||||
<string name="home_not_installed">Pole paigaldatud</string>
|
<string name="home_not_installed">Pole paigaldatud</string>
|
||||||
<string name="home_unsupported">Mittetoetatud</string>
|
<string name="home_unsupported">Mittetoetatud</string>
|
||||||
<string name="home_superuser_count">Superkasutajaid: %d</string>
|
|
||||||
<string name="home_unsupported_reason">KernelSU toetab hetkel vaid GSI tuumasid</string>
|
<string name="home_unsupported_reason">KernelSU toetab hetkel vaid GSI tuumasid</string>
|
||||||
<string name="home_selinux_status">SELinuxi olek</string>
|
<string name="home_selinux_status">SELinuxi olek</string>
|
||||||
<string name="selinux_status_disabled">Keelatud</string>
|
<string name="selinux_status_disabled">Keelatud</string>
|
||||||
@@ -70,9 +66,6 @@
|
|||||||
<string name="about_source_code">Vaata lähtekoodi %1$sis<br/>Liitu meie %2$si kanaliga</string>
|
<string name="about_source_code">Vaata lähtekoodi %1$sis<br/>Liitu meie %2$si kanaliga</string>
|
||||||
<string name="profile_name">Profiili nimi</string>
|
<string name="profile_name">Profiili nimi</string>
|
||||||
<string name="profile_custom">Kohandatud</string>
|
<string name="profile_custom">Kohandatud</string>
|
||||||
<string name="profile_namespace_inherited">Päritud</string>
|
|
||||||
<string name="profile_namespace_global">Globaalne</string>
|
|
||||||
<string name="profile_namespace_individual">Individuaalne</string>
|
|
||||||
<string name="profile_capabilities">Võimekused</string>
|
<string name="profile_capabilities">Võimekused</string>
|
||||||
<string name="app_profile_template_id_invalid">Sobimatu malli ID</string>
|
<string name="app_profile_template_id_invalid">Sobimatu malli ID</string>
|
||||||
<string name="profile_selinux_context">SELinux kontekst</string>
|
<string name="profile_selinux_context">SELinux kontekst</string>
|
||||||
|
|||||||
@@ -5,8 +5,6 @@
|
|||||||
<string name="home_click_to_install">برای نصب ضربه بزنید</string>
|
<string name="home_click_to_install">برای نصب ضربه بزنید</string>
|
||||||
<string name="home_working">به درستی کار میکند</string>
|
<string name="home_working">به درستی کار میکند</string>
|
||||||
<string name="home_working_version">نسخه: %d</string>
|
<string name="home_working_version">نسخه: %d</string>
|
||||||
<string name="home_superuser_count">برنامه های با دسترسی روت: %d</string>
|
|
||||||
<string name="home_module_count">ماژولها: %d</string>
|
|
||||||
<string name="home_unsupported">پشتیبانی نشده</string>
|
<string name="home_unsupported">پشتیبانی نشده</string>
|
||||||
<string name="home_unsupported_reason">کرنل اس یو فقط هسته های gki را پشتیبانی میکند</string>
|
<string name="home_unsupported_reason">کرنل اس یو فقط هسته های gki را پشتیبانی میکند</string>
|
||||||
<string name="home_kernel">هسته</string>
|
<string name="home_kernel">هسته</string>
|
||||||
@@ -58,10 +56,6 @@
|
|||||||
<string name="profile_template">قالب</string>
|
<string name="profile_template">قالب</string>
|
||||||
<string name="profile_custom">شخصی سازی شده</string>
|
<string name="profile_custom">شخصی سازی شده</string>
|
||||||
<string name="profile_name">اسم پروفایل</string>
|
<string name="profile_name">اسم پروفایل</string>
|
||||||
<string name="profile_namespace">Mount namespace</string>
|
|
||||||
<string name="profile_namespace_inherited">اثر گرفته</string>
|
|
||||||
<string name="profile_namespace_global">گلوبال</string>
|
|
||||||
<string name="profile_namespace_individual">تکی</string>
|
|
||||||
<string name="profile_umount_modules">جداکردن ماژول ها</string>
|
<string name="profile_umount_modules">جداکردن ماژول ها</string>
|
||||||
<string name="save_log">ذخیره گزارشها</string>
|
<string name="save_log">ذخیره گزارشها</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -10,7 +10,6 @@
|
|||||||
<string name="home_working">Gumagana</string>
|
<string name="home_working">Gumagana</string>
|
||||||
<string name="home_working_version">Bersyon: %d</string>
|
<string name="home_working_version">Bersyon: %d</string>
|
||||||
<string name="selinux_status_unknown">Hindi matukoy</string>
|
<string name="selinux_status_unknown">Hindi matukoy</string>
|
||||||
<string name="home_module_count">Mga Modyul: %d</string>
|
|
||||||
<string name="home_unsupported">Hindi Suportado</string>
|
<string name="home_unsupported">Hindi Suportado</string>
|
||||||
<string name="home_unsupported_reason">Sinusuportahan lamang ng KernelSU ang mga GKI na kernel</string>
|
<string name="home_unsupported_reason">Sinusuportahan lamang ng KernelSU ang mga GKI na kernel</string>
|
||||||
<string name="module_failed_to_enable">Nabigong paganahin ang module: %s</string>
|
<string name="module_failed_to_enable">Nabigong paganahin ang module: %s</string>
|
||||||
@@ -38,8 +37,6 @@
|
|||||||
<string name="home_support_title">Suportahan Kami</string>
|
<string name="home_support_title">Suportahan Kami</string>
|
||||||
<string name="home_support_content">Ang KernelSU ay, at palaging magiging, libre, at open source. Gayunpaman, maaari mong ipakita sa amin na nagmamalasakit ka sa pamamagitan ng pagbibigay ng donasyon.</string>
|
<string name="home_support_content">Ang KernelSU ay, at palaging magiging, libre, at open source. Gayunpaman, maaari mong ipakita sa amin na nagmamalasakit ka sa pamamagitan ng pagbibigay ng donasyon.</string>
|
||||||
<string name="about_source_code"><![CDATA[Tignan ang source code sa %1$s<br/>Sumali sa aming %2$s channel]]></string>
|
<string name="about_source_code"><![CDATA[Tignan ang source code sa %1$s<br/>Sumali sa aming %2$s channel]]></string>
|
||||||
<string name="profile_namespace">I-mount ang namespace</string>
|
|
||||||
<string name="profile_namespace_individual">Indibidwal</string>
|
|
||||||
<string name="profile_groups">Mga Grupo</string>
|
<string name="profile_groups">Mga Grupo</string>
|
||||||
<string name="profile_capabilities">Mga Kakayanan</string>
|
<string name="profile_capabilities">Mga Kakayanan</string>
|
||||||
<string name="profile_selinux_context">Konteksto ng SELinux</string>
|
<string name="profile_selinux_context">Konteksto ng SELinux</string>
|
||||||
@@ -63,10 +60,8 @@
|
|||||||
<string name="uninstall">I-uninstall</string>
|
<string name="uninstall">I-uninstall</string>
|
||||||
<string name="hide_system_apps">Itago ang mga application ng system</string>
|
<string name="hide_system_apps">Itago ang mga application ng system</string>
|
||||||
<string name="profile_name">Pangalan ng profile</string>
|
<string name="profile_name">Pangalan ng profile</string>
|
||||||
<string name="profile_namespace_inherited">Minana</string>
|
|
||||||
<string name="settings_umount_modules_default_summary">Ang pangkalahatang default na halaga para sa \"Umount modules\" sa Mga Profile ng App. Kung pinagana, aalisin nito ang lahat ng mga pagbabago sa modyul sa system para sa mga aplikasyon na walang hanay ng Profile.</string>
|
<string name="settings_umount_modules_default_summary">Ang pangkalahatang default na halaga para sa \"Umount modules\" sa Mga Profile ng App. Kung pinagana, aalisin nito ang lahat ng mga pagbabago sa modyul sa system para sa mga aplikasyon na walang hanay ng Profile.</string>
|
||||||
<string name="save_log">I-save ang mga Log</string>
|
<string name="save_log">I-save ang mga Log</string>
|
||||||
<string name="home_superuser_count">Mga Superuser: %d</string>
|
|
||||||
<string name="home_kernel">Bersyon ng kernel</string>
|
<string name="home_kernel">Bersyon ng kernel</string>
|
||||||
<string name="home_fingerprint">Fingerprint</string>
|
<string name="home_fingerprint">Fingerprint</string>
|
||||||
<string name="superuser">Superuser</string>
|
<string name="superuser">Superuser</string>
|
||||||
@@ -79,7 +74,6 @@
|
|||||||
<string name="profile_default">Default</string>
|
<string name="profile_default">Default</string>
|
||||||
<string name="profile_template">Template</string>
|
<string name="profile_template">Template</string>
|
||||||
<string name="profile_custom">Pasadya</string>
|
<string name="profile_custom">Pasadya</string>
|
||||||
<string name="profile_namespace_global">Global</string>
|
|
||||||
<string name="settings_umount_modules_default">I-unmount ang mga module bilang default</string>
|
<string name="settings_umount_modules_default">I-unmount ang mga module bilang default</string>
|
||||||
<string name="profile_selinux_domain">Domain</string>
|
<string name="profile_selinux_domain">Domain</string>
|
||||||
<string name="module_update">I-update</string>
|
<string name="module_update">I-update</string>
|
||||||
@@ -96,7 +90,6 @@
|
|||||||
<string name="app_profile_template_save">I-save</string>
|
<string name="app_profile_template_save">I-save</string>
|
||||||
<string name="app_profile_template_delete">Burahin</string>
|
<string name="app_profile_template_delete">Burahin</string>
|
||||||
<string name="app_profile_template_view">Tignan ang template</string>
|
<string name="app_profile_template_view">Tignan ang template</string>
|
||||||
<string name="app_profile_template_readonly">Read only</string>
|
|
||||||
<string name="app_profile_template_id_exist">Umiiral na ang Template ID!</string>
|
<string name="app_profile_template_id_exist">Umiiral na ang Template ID!</string>
|
||||||
<string name="app_profile_import_export">I-import/I-export</string>
|
<string name="app_profile_import_export">I-import/I-export</string>
|
||||||
<string name="app_profile_import_from_clipboard">Mag-import mula sa clipboard</string>
|
<string name="app_profile_import_from_clipboard">Mag-import mula sa clipboard</string>
|
||||||
|
|||||||
@@ -3,8 +3,6 @@
|
|||||||
<string name="home_not_installed">Non installé</string>
|
<string name="home_not_installed">Non installé</string>
|
||||||
<string name="home_working">Fonctionnel</string>
|
<string name="home_working">Fonctionnel</string>
|
||||||
<string name="home_working_version">Version : %d</string>
|
<string name="home_working_version">Version : %d</string>
|
||||||
<string name="home_superuser_count">Super-utilisateurs : %d</string>
|
|
||||||
<string name="home_module_count">Modules : %d</string>
|
|
||||||
<string name="home_unsupported_reason">KernelSU ne prend désormais en charge que les noyaux GKI</string>
|
<string name="home_unsupported_reason">KernelSU ne prend désormais en charge que les noyaux GKI</string>
|
||||||
<string name="home_kernel">Version du noyau</string>
|
<string name="home_kernel">Version du noyau</string>
|
||||||
<string name="home_fingerprint">Empreinte digitale</string>
|
<string name="home_fingerprint">Empreinte digitale</string>
|
||||||
@@ -55,11 +53,7 @@
|
|||||||
<string name="profile_default">Par défaut</string>
|
<string name="profile_default">Par défaut</string>
|
||||||
<string name="profile_custom">Personnalisé</string>
|
<string name="profile_custom">Personnalisé</string>
|
||||||
<string name="profile_name">Nom du profil</string>
|
<string name="profile_name">Nom du profil</string>
|
||||||
<string name="profile_namespace">Espace de noms de montage</string>
|
|
||||||
<string name="profile_namespace_inherited">Hérité</string>
|
|
||||||
<string name="profile_namespace_individual">Individuel</string>
|
|
||||||
<string name="profile_selinux_context">Contexte SELinux</string>
|
<string name="profile_selinux_context">Contexte SELinux</string>
|
||||||
<string name="profile_namespace_global">Global</string>
|
|
||||||
<string name="profile_groups">Groupes</string>
|
<string name="profile_groups">Groupes</string>
|
||||||
<string name="profile_capabilities">Capacités</string>
|
<string name="profile_capabilities">Capacités</string>
|
||||||
<string name="profile_umount_modules">Démonter les modules</string>
|
<string name="profile_umount_modules">Démonter les modules</string>
|
||||||
@@ -89,7 +83,6 @@
|
|||||||
<string name="app_profile_template_id_invalid">ID de modèle invalide</string>
|
<string name="app_profile_template_id_invalid">ID de modèle invalide</string>
|
||||||
<string name="app_profile_template_sync">Synchroniser les modèles en ligne</string>
|
<string name="app_profile_template_sync">Synchroniser les modèles en ligne</string>
|
||||||
<string name="app_profile_template_create">Créer un modèle</string>
|
<string name="app_profile_template_create">Créer un modèle</string>
|
||||||
<string name="app_profile_template_readonly">Lecture seule</string>
|
|
||||||
<string name="app_profile_import_export">Importer/exporter</string>
|
<string name="app_profile_import_export">Importer/exporter</string>
|
||||||
<string name="app_profile_template_save_failed">Échec de l\'enregistrement du modèle</string>
|
<string name="app_profile_template_save_failed">Échec de l\'enregistrement du modèle</string>
|
||||||
<string name="app_profile_template_edit">Modifier le modèle</string>
|
<string name="app_profile_template_edit">Modifier le modèle</string>
|
||||||
|
|||||||
@@ -9,24 +9,19 @@
|
|||||||
<string name="send_log">लॉग भेजे</string>
|
<string name="send_log">लॉग भेजे</string>
|
||||||
<string name="selinux_status_disabled">डिसेबल्ड (बंद)</string>
|
<string name="selinux_status_disabled">डिसेबल्ड (बंद)</string>
|
||||||
<string name="home_support_title">हमें प्रोत्साहन दें</string>
|
<string name="home_support_title">हमें प्रोत्साहन दें</string>
|
||||||
<string name="profile_namespace_inherited">Inherited</string>
|
|
||||||
<string name="module_magisk_conflict">मॉड्यूल बंद कर दिए गए हैं क्योंकि यह मैजिक के साथ टकरा रहे है!</string>
|
<string name="module_magisk_conflict">मॉड्यूल बंद कर दिए गए हैं क्योंकि यह मैजिक के साथ टकरा रहे है!</string>
|
||||||
<string name="module_changelog">क्या बदलाव हुए है</string>
|
<string name="module_changelog">क्या बदलाव हुए है</string>
|
||||||
<string name="selinux_status_permissive">पर्मिसिव</string>
|
<string name="selinux_status_permissive">पर्मिसिव</string>
|
||||||
<string name="reboot_download">डाउनलोड में रिबूट करें</string>
|
<string name="reboot_download">डाउनलोड में रिबूट करें</string>
|
||||||
<string name="settings_umount_modules_default">डिफ़ॉल्ट रूप से मॉड्यूल अनमाउन्ट करें</string>
|
<string name="settings_umount_modules_default">डिफ़ॉल्ट रूप से मॉड्यूल अनमाउन्ट करें</string>
|
||||||
<string name="profile_umount_modules_summary">इस विकल्प को चालू करने से KernelSU को इस एप्लिकेशन के लिए मॉड्यूल द्वारा किसी भी मोडिफाइड फ़ाइल को रिस्टोर करें।</string>
|
<string name="profile_umount_modules_summary">इस विकल्प को चालू करने से KernelSU को इस एप्लिकेशन के लिए मॉड्यूल द्वारा किसी भी मोडिफाइड फ़ाइल को रिस्टोर करें।</string>
|
||||||
<string name="profile_namespace_individual">Individual</string>
|
|
||||||
<string name="module_failed_to_enable">%s मॉड्यूल चालू करने में विफल</string>
|
<string name="module_failed_to_enable">%s मॉड्यूल चालू करने में विफल</string>
|
||||||
<string name="force_stop_app">जबर्दस्ती बंद करें</string>
|
<string name="force_stop_app">जबर्दस्ती बंद करें</string>
|
||||||
<string name="reboot_edl">EDL मोड में रिबूट करें</string>
|
<string name="reboot_edl">EDL मोड में रिबूट करें</string>
|
||||||
<string name="restart_app">फिर से चालू करें</string>
|
<string name="restart_app">फिर से चालू करें</string>
|
||||||
<string name="profile_capabilities">क्षमताएं</string>
|
<string name="profile_capabilities">क्षमताएं</string>
|
||||||
<string name="home_superuser_count">सुपरयूजर : %d</string>
|
|
||||||
<string name="module_start_downloading">%s की डाउनलोडिंग स्टार्ट करें</string>
|
<string name="module_start_downloading">%s की डाउनलोडिंग स्टार्ट करें</string>
|
||||||
<string name="profile_namespace_global">Global</string>
|
|
||||||
<string name="settings_umount_modules_default_summary">ऐप प्रोफाइल में \"अनमाउंट मॉड्यूल\" के लिए ग्लोबल डिफ़ॉल्ट वैल्यू। यदि चालू किया गया है, तो यह एप्लीकेशंस के लिऐ सिस्टम के सभी मॉड्यूल मोडिफिकेशन को हटा देगा जिनकी प्रोफ़ाइल सेट नहीं है।</string>
|
<string name="settings_umount_modules_default_summary">ऐप प्रोफाइल में \"अनमाउंट मॉड्यूल\" के लिए ग्लोबल डिफ़ॉल्ट वैल्यू। यदि चालू किया गया है, तो यह एप्लीकेशंस के लिऐ सिस्टम के सभी मॉड्यूल मोडिफिकेशन को हटा देगा जिनकी प्रोफ़ाइल सेट नहीं है।</string>
|
||||||
<string name="home_module_count">मॉड्यूल्स : %d</string>
|
|
||||||
<string name="selinux_status_enforcing">एनफोर्सिंग</string>
|
<string name="selinux_status_enforcing">एनफोर्सिंग</string>
|
||||||
<string name="profile_selinux_context">SELinux context</string>
|
<string name="profile_selinux_context">SELinux context</string>
|
||||||
<string name="home_fingerprint">फिंगरप्रिंट</string>
|
<string name="home_fingerprint">फिंगरप्रिंट</string>
|
||||||
@@ -39,7 +34,6 @@
|
|||||||
<string name="profile_name">प्रोफाइल का नाम</string>
|
<string name="profile_name">प्रोफाइल का नाम</string>
|
||||||
<string name="home_support_content">KernelSU मुफ़्त और ओपन सोर्स और हमेशा रहेगा। हालाँकि आप दान देकर हमें दिखा सकते हैं कि आप संरक्षण करते हैं।</string>
|
<string name="home_support_content">KernelSU मुफ़्त और ओपन सोर्स और हमेशा रहेगा। हालाँकि आप दान देकर हमें दिखा सकते हैं कि आप संरक्षण करते हैं।</string>
|
||||||
<string name="uninstall">अनइंस्टॉल करें</string>
|
<string name="uninstall">अनइंस्टॉल करें</string>
|
||||||
<string name="profile_namespace">Namspace माउंट करें</string>
|
|
||||||
<string name="module_install">इंस्टाल करें</string>
|
<string name="module_install">इंस्टाल करें</string>
|
||||||
<string name="home_click_to_install">इंस्टाल करने के लिए क्लिक करें</string>
|
<string name="home_click_to_install">इंस्टाल करने के लिए क्लिक करें</string>
|
||||||
<string name="profile_selinux_rules">नियम</string>
|
<string name="profile_selinux_rules">नियम</string>
|
||||||
|
|||||||
@@ -11,8 +11,6 @@
|
|||||||
<string name="home_working_version">Verzija: %d</string>
|
<string name="home_working_version">Verzija: %d</string>
|
||||||
<string name="home_click_to_install">Kliknite da instalirate</string>
|
<string name="home_click_to_install">Kliknite da instalirate</string>
|
||||||
<string name="home_working">Radi</string>
|
<string name="home_working">Radi</string>
|
||||||
<string name="home_superuser_count">Superkorisnici: %d</string>
|
|
||||||
<string name="home_module_count">Moduli: %d</string>
|
|
||||||
<string name="home_unsupported">Nepodržano</string>
|
<string name="home_unsupported">Nepodržano</string>
|
||||||
<string name="home_unsupported_reason">KernelSU sada samo podržava GKI kernele</string>
|
<string name="home_unsupported_reason">KernelSU sada samo podržava GKI kernele</string>
|
||||||
<string name="home_kernel">Verzija kernela</string>
|
<string name="home_kernel">Verzija kernela</string>
|
||||||
@@ -56,11 +54,7 @@
|
|||||||
<string name="profile_template">Šablon</string>
|
<string name="profile_template">Šablon</string>
|
||||||
<string name="profile_custom">Prilagođeno</string>
|
<string name="profile_custom">Prilagođeno</string>
|
||||||
<string name="profile_name">Naziv profila</string>
|
<string name="profile_name">Naziv profila</string>
|
||||||
<string name="profile_namespace_inherited">Naslijeđen</string>
|
|
||||||
<string name="profile_namespace">Imenski prostor nosača</string>
|
|
||||||
<string name="failed_to_update_app_profile">Ažuriranje Profila Aplikacije za %s nije uspjelo</string>
|
<string name="failed_to_update_app_profile">Ažuriranje Profila Aplikacije za %s nije uspjelo</string>
|
||||||
<string name="profile_namespace_global">Globalan</string>
|
|
||||||
<string name="profile_namespace_individual">Pojedinačan</string>
|
|
||||||
<string name="profile_umount_modules">Umount module</string>
|
<string name="profile_umount_modules">Umount module</string>
|
||||||
<string name="profile_groups">Grupe</string>
|
<string name="profile_groups">Grupe</string>
|
||||||
<string name="profile_capabilities">Sposobnosti</string>
|
<string name="profile_capabilities">Sposobnosti</string>
|
||||||
@@ -94,7 +88,6 @@
|
|||||||
<string name="app_profile_template_save">Spremi</string>
|
<string name="app_profile_template_save">Spremi</string>
|
||||||
<string name="app_profile_template_delete">Izbriši</string>
|
<string name="app_profile_template_delete">Izbriši</string>
|
||||||
<string name="app_profile_template_view">Prikaži predložak</string>
|
<string name="app_profile_template_view">Prikaži predložak</string>
|
||||||
<string name="app_profile_template_readonly">Samo za čitanje</string>
|
|
||||||
<string name="app_profile_template_id_exist">ID predloška već postoji!</string>
|
<string name="app_profile_template_id_exist">ID predloška već postoji!</string>
|
||||||
<string name="app_profile_import_export">Uvoz/Izvoz</string>
|
<string name="app_profile_import_export">Uvoz/Izvoz</string>
|
||||||
<string name="app_profile_import_from_clipboard">Uvezi iz međuspremnika</string>
|
<string name="app_profile_import_from_clipboard">Uvezi iz međuspremnika</string>
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<string name="home_working">Működik</string>
|
<string name="home_working">Működik</string>
|
||||||
<string name="home_working_version">Verzió: %d</string>
|
<string name="home_working_version">Verzió: %d</string>
|
||||||
<string name="home_module_count">Modulok: %d</string>
|
|
||||||
<string name="home_unsupported_reason">A KernelSU jelenleg csak GKI kerneleket támogat</string>
|
<string name="home_unsupported_reason">A KernelSU jelenleg csak GKI kerneleket támogat</string>
|
||||||
<string name="home_kernel">Kernel</string>
|
<string name="home_kernel">Kernel</string>
|
||||||
<string name="home_manager_version">Alkalmazás verziója</string>
|
<string name="home_manager_version">Alkalmazás verziója</string>
|
||||||
@@ -27,10 +26,7 @@
|
|||||||
<string name="profile_template">Sablon</string>
|
<string name="profile_template">Sablon</string>
|
||||||
<string name="profile_custom">Egyedi</string>
|
<string name="profile_custom">Egyedi</string>
|
||||||
<string name="profile_name">Profil neve</string>
|
<string name="profile_name">Profil neve</string>
|
||||||
<string name="profile_namespace">Névtér csatlakoztatása</string>
|
|
||||||
<string name="profile_namespace_inherited">Örökölt</string>
|
|
||||||
<string name="home_learn_kernelsu_url">https://kernelsu.org/guide/what-is-kernelsu.html</string>
|
<string name="home_learn_kernelsu_url">https://kernelsu.org/guide/what-is-kernelsu.html</string>
|
||||||
<string name="profile_namespace_individual">Különálló</string>
|
|
||||||
<string name="profile_groups">Csoportok</string>
|
<string name="profile_groups">Csoportok</string>
|
||||||
<string name="profile_capabilities">Jogosultságok</string>
|
<string name="profile_capabilities">Jogosultságok</string>
|
||||||
<string name="profile_selinux_context">SELinux kontextus</string>
|
<string name="profile_selinux_context">SELinux kontextus</string>
|
||||||
@@ -47,7 +43,6 @@
|
|||||||
<string name="home">Kezdőlap</string>
|
<string name="home">Kezdőlap</string>
|
||||||
<string name="home_not_installed">Nincs telepítve</string>
|
<string name="home_not_installed">Nincs telepítve</string>
|
||||||
<string name="home_click_to_install">Kattintson a telepítéshez</string>
|
<string name="home_click_to_install">Kattintson a telepítéshez</string>
|
||||||
<string name="home_superuser_count">Engedélyezett alkalmazások: %d</string>
|
|
||||||
<string name="home_unsupported">Nem támogatott</string>
|
<string name="home_unsupported">Nem támogatott</string>
|
||||||
<string name="home_selinux_status">SELinux állapot</string>
|
<string name="home_selinux_status">SELinux állapot</string>
|
||||||
<string name="selinux_status_enforcing">Kényszerített</string>
|
<string name="selinux_status_enforcing">Kényszerített</string>
|
||||||
@@ -71,7 +66,6 @@
|
|||||||
<string name="send_log">Naplók küldése</string>
|
<string name="send_log">Naplók küldése</string>
|
||||||
<string name="reboot_to_apply">Indítsa újra a készüléket a változások érvényesítéséhez</string>
|
<string name="reboot_to_apply">Indítsa újra a készüléket a változások érvényesítéséhez</string>
|
||||||
<string name="home_support_content">A KernelSU ingyenes, nyílt forráskódú és mindig is az lesz. Ön azonban adományozással megmutathatja, hogy törődik a projekttel.</string>
|
<string name="home_support_content">A KernelSU ingyenes, nyílt forráskódú és mindig is az lesz. Ön azonban adományozással megmutathatja, hogy törődik a projekttel.</string>
|
||||||
<string name="profile_namespace_global">Globális</string>
|
|
||||||
<string name="profile_umount_modules">Modulok leválasztása</string>
|
<string name="profile_umount_modules">Modulok leválasztása</string>
|
||||||
<string name="failed_to_update_app_profile">Nem sikerült frissíteni az App Profilt ehhez: %s</string>
|
<string name="failed_to_update_app_profile">Nem sikerült frissíteni az App Profilt ehhez: %s</string>
|
||||||
<string name="settings_umount_modules_default_summary">A \"Modulok leválasztása\" globális alapértelmezett értéke az App Profile-ban. Ha engedélyezve van, eltávolít minden modulmódosítást a rendszerből azon alkalmazások esetében, amelyeknek nincs profilja beállítva.</string>
|
<string name="settings_umount_modules_default_summary">A \"Modulok leválasztása\" globális alapértelmezett értéke az App Profile-ban. Ha engedélyezve van, eltávolít minden modulmódosítást a rendszerből azon alkalmazások esetében, amelyeknek nincs profilja beállítva.</string>
|
||||||
@@ -89,7 +83,6 @@
|
|||||||
<string name="app_profile_template_id_invalid">Hibás sablon ID</string>
|
<string name="app_profile_template_id_invalid">Hibás sablon ID</string>
|
||||||
<string name="app_profile_template_sync">Online sablonok szinkronizálása</string>
|
<string name="app_profile_template_sync">Online sablonok szinkronizálása</string>
|
||||||
<string name="app_profile_template_create">Sablon készítése</string>
|
<string name="app_profile_template_create">Sablon készítése</string>
|
||||||
<string name="app_profile_template_readonly">Csak olvasható</string>
|
|
||||||
<string name="app_profile_import_export">Import/Export</string>
|
<string name="app_profile_import_export">Import/Export</string>
|
||||||
<string name="app_profile_template_save_failed">A sablon mentése sikertelen</string>
|
<string name="app_profile_template_save_failed">A sablon mentése sikertelen</string>
|
||||||
<string name="app_profile_template_edit">Sablon szerkesztése</string>
|
<string name="app_profile_template_edit">Sablon szerkesztése</string>
|
||||||
|
|||||||
@@ -5,8 +5,6 @@
|
|||||||
<string name="home_click_to_install">Klik untuk menginstal</string>
|
<string name="home_click_to_install">Klik untuk menginstal</string>
|
||||||
<string name="home_working">Berfungsi</string>
|
<string name="home_working">Berfungsi</string>
|
||||||
<string name="home_working_version">Versi: %d</string>
|
<string name="home_working_version">Versi: %d</string>
|
||||||
<string name="home_superuser_count">SuperUser: %d</string>
|
|
||||||
<string name="home_module_count">Modul: %d</string>
|
|
||||||
<string name="home_unsupported">Tidak didukung</string>
|
<string name="home_unsupported">Tidak didukung</string>
|
||||||
<string name="home_unsupported_reason">KernelSU saat ini hanya mendukung kernel GKI.</string>
|
<string name="home_unsupported_reason">KernelSU saat ini hanya mendukung kernel GKI.</string>
|
||||||
<string name="home_kernel">Versi kernel</string>
|
<string name="home_kernel">Versi kernel</string>
|
||||||
@@ -56,10 +54,6 @@
|
|||||||
<string name="profile_template">Templat</string>
|
<string name="profile_template">Templat</string>
|
||||||
<string name="profile_custom">Khusus</string>
|
<string name="profile_custom">Khusus</string>
|
||||||
<string name="profile_name">Nama profil</string>
|
<string name="profile_name">Nama profil</string>
|
||||||
<string name="profile_namespace">Gunakan Namespace</string>
|
|
||||||
<string name="profile_namespace_inherited">Diwariskan</string>
|
|
||||||
<string name="profile_namespace_global">Universal</string>
|
|
||||||
<string name="profile_namespace_individual">Individual</string>
|
|
||||||
<string name="profile_groups">Kelompok</string>
|
<string name="profile_groups">Kelompok</string>
|
||||||
<string name="profile_capabilities">Kemampuan</string>
|
<string name="profile_capabilities">Kemampuan</string>
|
||||||
<string name="profile_selinux_context">Konteks SELinux</string>
|
<string name="profile_selinux_context">Konteks SELinux</string>
|
||||||
@@ -101,7 +95,6 @@
|
|||||||
<string name="app_profile_template_delete">Hapus</string>
|
<string name="app_profile_template_delete">Hapus</string>
|
||||||
<string name="app_profile_template_import_empty">Papan klip kosong!</string>
|
<string name="app_profile_template_import_empty">Papan klip kosong!</string>
|
||||||
<string name="app_profile_template_view">Lihat templat</string>
|
<string name="app_profile_template_view">Lihat templat</string>
|
||||||
<string name="app_profile_template_readonly">readonly</string>
|
|
||||||
<string name="enable_web_debugging">Debugging WebView</string>
|
<string name="enable_web_debugging">Debugging WebView</string>
|
||||||
<string name="enable_web_debugging_summary">Dapat digunakan untuk mendebug antarmuka web (WebUI). Harap aktifkan hanya saat diperlukan.</string>
|
<string name="enable_web_debugging_summary">Dapat digunakan untuk mendebug antarmuka web (WebUI). Harap aktifkan hanya saat diperlukan.</string>
|
||||||
<string name="select_file_tip">%1$s image partisi terekomendasi</string>
|
<string name="select_file_tip">%1$s image partisi terekomendasi</string>
|
||||||
|
|||||||
@@ -5,8 +5,6 @@
|
|||||||
<string name="home_click_to_install">Clicca per installare</string>
|
<string name="home_click_to_install">Clicca per installare</string>
|
||||||
<string name="home_working">In esecuzione</string>
|
<string name="home_working">In esecuzione</string>
|
||||||
<string name="home_working_version">Versione: %d</string>
|
<string name="home_working_version">Versione: %d</string>
|
||||||
<string name="home_superuser_count">Applicazioni con accesso root: %d</string>
|
|
||||||
<string name="home_module_count">Moduli installati: %d</string>
|
|
||||||
<string name="home_unsupported">Non supportato</string>
|
<string name="home_unsupported">Non supportato</string>
|
||||||
<string name="home_unsupported_reason">KernelSU ora supporta solo i kernel GKI</string>
|
<string name="home_unsupported_reason">KernelSU ora supporta solo i kernel GKI</string>
|
||||||
<string name="home_kernel">Kernel</string>
|
<string name="home_kernel">Kernel</string>
|
||||||
@@ -52,11 +50,7 @@
|
|||||||
<string name="home_support_content">KernelSU è, e sempre sarà, gratuito e open source. Puoi comunque mostrarci il tuo apprezzamento facendo una donazione.</string>
|
<string name="home_support_content">KernelSU è, e sempre sarà, gratuito e open source. Puoi comunque mostrarci il tuo apprezzamento facendo una donazione.</string>
|
||||||
<string name="about_source_code"><![CDATA[Visualizza il codice sorgente su %1$s<br/>Unisciti al nostro canale %2$s]]></string>
|
<string name="about_source_code"><![CDATA[Visualizza il codice sorgente su %1$s<br/>Unisciti al nostro canale %2$s]]></string>
|
||||||
<string name="profile_name">Nome profilo</string>
|
<string name="profile_name">Nome profilo</string>
|
||||||
<string name="profile_namespace">Spazio dei nomi del mount</string>
|
|
||||||
<string name="profile_namespace_global">Globale</string>
|
|
||||||
<string name="profile_groups">Gruppi</string>
|
<string name="profile_groups">Gruppi</string>
|
||||||
<string name="profile_namespace_inherited">Ereditato</string>
|
|
||||||
<string name="profile_namespace_individual">Individuale</string>
|
|
||||||
<string name="profile_default">Predefinito</string>
|
<string name="profile_default">Predefinito</string>
|
||||||
<string name="profile_custom">Personalizzato</string>
|
<string name="profile_custom">Personalizzato</string>
|
||||||
<string name="profile_template">Modello</string>
|
<string name="profile_template">Modello</string>
|
||||||
@@ -85,7 +79,6 @@
|
|||||||
<string name="app_profile_template_id_invalid">Identificativo modello non valido</string>
|
<string name="app_profile_template_id_invalid">Identificativo modello non valido</string>
|
||||||
<string name="app_profile_template_name">Nome</string>
|
<string name="app_profile_template_name">Nome</string>
|
||||||
<string name="app_profile_template_view">Visualizza modello</string>
|
<string name="app_profile_template_view">Visualizza modello</string>
|
||||||
<string name="app_profile_template_readonly">Sola lettura</string>
|
|
||||||
<string name="app_profile_template_id_exist">L\'identificatore del modello è già in uso!</string>
|
<string name="app_profile_template_id_exist">L\'identificatore del modello è già in uso!</string>
|
||||||
<string name="app_profile_import_export">Importa/Esporta</string>
|
<string name="app_profile_import_export">Importa/Esporta</string>
|
||||||
<string name="app_profile_import_from_clipboard">Importa dagli appunti</string>
|
<string name="app_profile_import_from_clipboard">Importa dagli appunti</string>
|
||||||
|
|||||||
@@ -9,24 +9,19 @@
|
|||||||
<string name="send_log">שלח לוג</string>
|
<string name="send_log">שלח לוג</string>
|
||||||
<string name="selinux_status_disabled">מושבת</string>
|
<string name="selinux_status_disabled">מושבת</string>
|
||||||
<string name="home_support_title">תמכו בנו</string>
|
<string name="home_support_title">תמכו בנו</string>
|
||||||
<string name="profile_namespace_inherited">ירושה</string>
|
|
||||||
<string name="module_magisk_conflict">מודולים מושבתים מכיוון שהם מתנגשים עם זה של Magisk!</string>
|
<string name="module_magisk_conflict">מודולים מושבתים מכיוון שהם מתנגשים עם זה של Magisk!</string>
|
||||||
<string name="module_changelog">יומן שינויים</string>
|
<string name="module_changelog">יומן שינויים</string>
|
||||||
<string name="selinux_status_permissive">התרים</string>
|
<string name="selinux_status_permissive">התרים</string>
|
||||||
<string name="reboot_download">הפעלה מחדש למצב הורדה</string>
|
<string name="reboot_download">הפעלה מחדש למצב הורדה</string>
|
||||||
<string name="settings_umount_modules_default">טעינת מודולים כברירת מחדל</string>
|
<string name="settings_umount_modules_default">טעינת מודולים כברירת מחדל</string>
|
||||||
<string name="profile_umount_modules_summary">הפעלת אפשרות זו תאפשר ל-KernelSU לשחזר קבצים שהשתנו על ידי המודולים עבור יישום זה.</string>
|
<string name="profile_umount_modules_summary">הפעלת אפשרות זו תאפשר ל-KernelSU לשחזר קבצים שהשתנו על ידי המודולים עבור יישום זה.</string>
|
||||||
<string name="profile_namespace_individual">אישי</string>
|
|
||||||
<string name="module_failed_to_enable">הפעלת המודל נכשלה: %s</string>
|
<string name="module_failed_to_enable">הפעלת המודל נכשלה: %s</string>
|
||||||
<string name="force_stop_app">עצירה בכח</string>
|
<string name="force_stop_app">עצירה בכח</string>
|
||||||
<string name="reboot_edl">הפעלה מחדש למצב EDL</string>
|
<string name="reboot_edl">הפעלה מחדש למצב EDL</string>
|
||||||
<string name="restart_app">איתחול</string>
|
<string name="restart_app">איתחול</string>
|
||||||
<string name="profile_capabilities">יכולת</string>
|
<string name="profile_capabilities">יכולת</string>
|
||||||
<string name="home_superuser_count">משתמשי על: %d</string>
|
|
||||||
<string name="module_start_downloading">מפעיל מודל: %s</string>
|
<string name="module_start_downloading">מפעיל מודל: %s</string>
|
||||||
<string name="profile_namespace_global">גלובלי</string>
|
|
||||||
<string name="settings_umount_modules_default_summary">ערך ברירת המחדל הגלובלי עבור \"טעינת מודולים\" בפרופילי אפליקציה. אם מופעל, זה יסיר את כל שינויי המודול למערכת עבור יישומים שאין להם ערכת פרופיל.</string>
|
<string name="settings_umount_modules_default_summary">ערך ברירת המחדל הגלובלי עבור \"טעינת מודולים\" בפרופילי אפליקציה. אם מופעל, זה יסיר את כל שינויי המודול למערכת עבור יישומים שאין להם ערכת פרופיל.</string>
|
||||||
<string name="home_module_count">מודלים:%d</string>
|
|
||||||
<string name="selinux_status_enforcing">אכיפה</string>
|
<string name="selinux_status_enforcing">אכיפה</string>
|
||||||
<string name="profile_selinux_context">הקשר SELinux</string>
|
<string name="profile_selinux_context">הקשר SELinux</string>
|
||||||
<string name="home_fingerprint">טביעת אצבע</string>
|
<string name="home_fingerprint">טביעת אצבע</string>
|
||||||
@@ -39,7 +34,6 @@
|
|||||||
<string name="profile_name">שם פרופיל</string>
|
<string name="profile_name">שם פרופיל</string>
|
||||||
<string name="home_support_content">KernelSU הוא, ותמיד יהיה, חינמי וקוד פתוח. עם זאת, תוכל להראות לנו שאכפת לך על ידי תרומה.</string>
|
<string name="home_support_content">KernelSU הוא, ותמיד יהיה, חינמי וקוד פתוח. עם זאת, תוכל להראות לנו שאכפת לך על ידי תרומה.</string>
|
||||||
<string name="uninstall">הסרה</string>
|
<string name="uninstall">הסרה</string>
|
||||||
<string name="profile_namespace">טעינת מרחב שמות</string>
|
|
||||||
<string name="module_install">התקנה</string>
|
<string name="module_install">התקנה</string>
|
||||||
<string name="home_click_to_install">לחץ להתקנה</string>
|
<string name="home_click_to_install">לחץ להתקנה</string>
|
||||||
<string name="profile_selinux_rules">כללים</string>
|
<string name="profile_selinux_rules">כללים</string>
|
||||||
|
|||||||
@@ -5,8 +5,6 @@
|
|||||||
<string name="home_click_to_install">タップでインストール</string>
|
<string name="home_click_to_install">タップでインストール</string>
|
||||||
<string name="home_working">動作中</string>
|
<string name="home_working">動作中</string>
|
||||||
<string name="home_working_version">バージョン: %d</string>
|
<string name="home_working_version">バージョン: %d</string>
|
||||||
<string name="home_superuser_count">スーパーユーザー: %d</string>
|
|
||||||
<string name="home_module_count">モジュール: %d</string>
|
|
||||||
<string name="home_unsupported">非対応</string>
|
<string name="home_unsupported">非対応</string>
|
||||||
<string name="home_unsupported_reason">現在、 KernelSU は GKI カーネルにのみ対応しています</string>
|
<string name="home_unsupported_reason">現在、 KernelSU は GKI カーネルにのみ対応しています</string>
|
||||||
<string name="home_kernel">カーネル</string>
|
<string name="home_kernel">カーネル</string>
|
||||||
@@ -56,10 +54,6 @@
|
|||||||
<string name="profile_template">テンプレート</string>
|
<string name="profile_template">テンプレート</string>
|
||||||
<string name="profile_custom">カスタム</string>
|
<string name="profile_custom">カスタム</string>
|
||||||
<string name="profile_name">プロファイル名</string>
|
<string name="profile_name">プロファイル名</string>
|
||||||
<string name="profile_namespace">名前空間のマウント</string>
|
|
||||||
<string name="profile_namespace_inherited">継承</string>
|
|
||||||
<string name="profile_namespace_global">共通</string>
|
|
||||||
<string name="profile_namespace_individual">分離</string>
|
|
||||||
<string name="profile_umount_modules">モジュールのアンマウント</string>
|
<string name="profile_umount_modules">モジュールのアンマウント</string>
|
||||||
<string name="profile_groups">グループ</string>
|
<string name="profile_groups">グループ</string>
|
||||||
<string name="profile_selinux_context">SELinux コンテキスト</string>
|
<string name="profile_selinux_context">SELinux コンテキスト</string>
|
||||||
@@ -90,7 +84,6 @@
|
|||||||
<string name="app_profile_template_id_invalid">無効なテンプレート ID</string>
|
<string name="app_profile_template_id_invalid">無効なテンプレート ID</string>
|
||||||
<string name="app_profile_template_sync">オンラインテンプレートの同期</string>
|
<string name="app_profile_template_sync">オンラインテンプレートの同期</string>
|
||||||
<string name="app_profile_template_create">テンプレートの作成</string>
|
<string name="app_profile_template_create">テンプレートの作成</string>
|
||||||
<string name="app_profile_template_readonly">読み取り専用</string>
|
|
||||||
<string name="app_profile_import_export">インポート/エクスポート</string>
|
<string name="app_profile_import_export">インポート/エクスポート</string>
|
||||||
<string name="app_profile_template_save_failed">テンプレートの保存に失敗しました</string>
|
<string name="app_profile_template_save_failed">テンプレートの保存に失敗しました</string>
|
||||||
<string name="app_profile_template_edit">テンプレートの編集</string>
|
<string name="app_profile_template_edit">テンプレートの編集</string>
|
||||||
|
|||||||
@@ -8,22 +8,17 @@
|
|||||||
<string name="profile_umount_modules">Umount ಮಾಡ್ಯೂಲ್ಗಳು</string>
|
<string name="profile_umount_modules">Umount ಮಾಡ್ಯೂಲ್ಗಳು</string>
|
||||||
<string name="send_log">ಲಾಗ್ ಕಳುಹಿಸಿ</string>
|
<string name="send_log">ಲಾಗ್ ಕಳುಹಿಸಿ</string>
|
||||||
<string name="home_support_title">ನಮ್ಮನ್ನು ಬೆಂಬಲಿಸಿ</string>
|
<string name="home_support_title">ನಮ್ಮನ್ನು ಬೆಂಬಲಿಸಿ</string>
|
||||||
<string name="profile_namespace_inherited">ಪಿತ್ರಾರ್ಜಿತ</string>
|
|
||||||
<string name="module_magisk_conflict">ಮಾಡ್ಯೂಲ್ಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ ಏಕೆಂದರೆ ಇದು ಮ್ಯಾಜಿಸ್ಕ್ನೊಂದಿಗೆ ಸಂಘರ್ಷವಾಗಿದೆ!</string>
|
<string name="module_magisk_conflict">ಮಾಡ್ಯೂಲ್ಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ ಏಕೆಂದರೆ ಇದು ಮ್ಯಾಜಿಸ್ಕ್ನೊಂದಿಗೆ ಸಂಘರ್ಷವಾಗಿದೆ!</string>
|
||||||
<string name="module_changelog">ಚೇಂಜ್ಲಾಗ್</string>
|
<string name="module_changelog">ಚೇಂಜ್ಲಾಗ್</string>
|
||||||
<string name="selinux_status_permissive">Permissive</string>
|
<string name="selinux_status_permissive">Permissive</string>
|
||||||
<string name="settings_umount_modules_default">ಡೀಫಾಲ್ಟ್ ಆಗಿ Umount ಮಾಡ್ಯೂಲ್</string>
|
<string name="settings_umount_modules_default">ಡೀಫಾಲ್ಟ್ ಆಗಿ Umount ಮಾಡ್ಯೂಲ್</string>
|
||||||
<string name="profile_umount_modules_summary">ಈ ಆಯ್ಕೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುವುದರಿಂದ ಈ ಅಪ್ಲಿಕೇಶನ್ಗಾಗಿ ಮಾಡ್ಯೂಲ್ಗಳ ಮೂಲಕ ಯಾವುದೇ ಮಾರ್ಪಡಿಸಿದ ಫೈಲ್ಗಳನ್ನು ಮರುಸ್ಥಾಪಿಸಲು KernelSU ಗೆ ಅನುಮತಿಸುತ್ತದೆ.</string>
|
<string name="profile_umount_modules_summary">ಈ ಆಯ್ಕೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುವುದರಿಂದ ಈ ಅಪ್ಲಿಕೇಶನ್ಗಾಗಿ ಮಾಡ್ಯೂಲ್ಗಳ ಮೂಲಕ ಯಾವುದೇ ಮಾರ್ಪಡಿಸಿದ ಫೈಲ್ಗಳನ್ನು ಮರುಸ್ಥಾಪಿಸಲು KernelSU ಗೆ ಅನುಮತಿಸುತ್ತದೆ.</string>
|
||||||
<string name="profile_namespace_individual">ವೈಯಕ್ತಿಕ</string>
|
|
||||||
<string name="module_failed_to_enable">ಮಾಡ್ಯೂಲ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು ವಿಫಲವಾಗಿದೆ: %s</string>
|
<string name="module_failed_to_enable">ಮಾಡ್ಯೂಲ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು ವಿಫಲವಾಗಿದೆ: %s</string>
|
||||||
<string name="force_stop_app">ಫೋರ್ಸ್ ಸ್ಟಾಪ್</string>
|
<string name="force_stop_app">ಫೋರ್ಸ್ ಸ್ಟಾಪ್</string>
|
||||||
<string name="reboot_edl">EDL ಗೆ ರೀಬೂಟ್</string>
|
<string name="reboot_edl">EDL ಗೆ ರೀಬೂಟ್</string>
|
||||||
<string name="profile_capabilities">ಸಾಮರ್ಥ್ಯಗಳು</string>
|
<string name="profile_capabilities">ಸಾಮರ್ಥ್ಯಗಳು</string>
|
||||||
<string name="home_superuser_count">ಸೂಪರ್ಯೂಸರ್ಗಳು: %d</string>
|
|
||||||
<string name="module_start_downloading">ಡೌನ್ಲೋಡ್ ಮಾಡುವುದನ್ನು ಪ್ರಾರಂಭಿಸಿ: %s</string>
|
<string name="module_start_downloading">ಡೌನ್ಲೋಡ್ ಮಾಡುವುದನ್ನು ಪ್ರಾರಂಭಿಸಿ: %s</string>
|
||||||
<string name="profile_namespace_global">ಜಾಗತಿಕ</string>
|
|
||||||
<string name="settings_umount_modules_default_summary">ಅಪ್ಲಿಕೇಶನ್ ಪ್ರೊಫೈಲ್ಗಳಲ್ಲಿ \"Umount ಮಾಡ್ಯೂಲ್\" ಗಾಗಿ ಜಾಗತಿಕ ಡೀಫಾಲ್ಟ್ ಮೌಲ್ಯ. ಸಕ್ರಿಯಗೊಳಿಸಿದರೆ, ಪ್ರೊಫೈಲ್ ಸೆಟ್ ಅನ್ನು ಹೊಂದಿರದ ಅಪ್ಲಿಕೇಶನ್ಗಳಿಗಾಗಿ ಸಿಸ್ಟಮ್ಗೆ ಎಲ್ಲಾ ಮಾಡ್ಯೂಲ್ ಮಾರ್ಪಾಡುಗಳನ್ನು ಇದು ತೆಗೆದುಹಾಕುತ್ತದೆ.</string>
|
<string name="settings_umount_modules_default_summary">ಅಪ್ಲಿಕೇಶನ್ ಪ್ರೊಫೈಲ್ಗಳಲ್ಲಿ \"Umount ಮಾಡ್ಯೂಲ್\" ಗಾಗಿ ಜಾಗತಿಕ ಡೀಫಾಲ್ಟ್ ಮೌಲ್ಯ. ಸಕ್ರಿಯಗೊಳಿಸಿದರೆ, ಪ್ರೊಫೈಲ್ ಸೆಟ್ ಅನ್ನು ಹೊಂದಿರದ ಅಪ್ಲಿಕೇಶನ್ಗಳಿಗಾಗಿ ಸಿಸ್ಟಮ್ಗೆ ಎಲ್ಲಾ ಮಾಡ್ಯೂಲ್ ಮಾರ್ಪಾಡುಗಳನ್ನು ಇದು ತೆಗೆದುಹಾಕುತ್ತದೆ.</string>
|
||||||
<string name="home_module_count">ಮಾಡ್ಯೂಲ್ಗಳು: %d</string>
|
|
||||||
<string name="profile_selinux_context">SELinux ಸಂದರ್ಭ</string>
|
<string name="profile_selinux_context">SELinux ಸಂದರ್ಭ</string>
|
||||||
<string name="profile_default">ಡೀಫಾಲ್ಟ್</string>
|
<string name="profile_default">ಡೀಫಾಲ್ಟ್</string>
|
||||||
<string name="launch_app">ಲಾಂಚ್</string>
|
<string name="launch_app">ಲಾಂಚ್</string>
|
||||||
@@ -33,7 +28,6 @@
|
|||||||
<string name="profile_name">ಪ್ರೊಫೈಲ್ ಹೆಸರು</string>
|
<string name="profile_name">ಪ್ರೊಫೈಲ್ ಹೆಸರು</string>
|
||||||
<string name="home_support_content">KernelSU ಉಚಿತ ಮತ್ತು ಮುಕ್ತ ಮೂಲವಾಗಿದೆ ಮತ್ತು ಯಾವಾಗಲೂ ಇರುತ್ತದೆ. ಆದಾಗ್ಯೂ ನೀವು ದೇಣಿಗೆ ನೀಡುವ ಮೂಲಕ ನೀವು ಕಾಳಜಿ ವಹಿಸುತ್ತೀರಿ ಎಂದು ನಮಗೆ ತೋರಿಸಬಹುದು.</string>
|
<string name="home_support_content">KernelSU ಉಚಿತ ಮತ್ತು ಮುಕ್ತ ಮೂಲವಾಗಿದೆ ಮತ್ತು ಯಾವಾಗಲೂ ಇರುತ್ತದೆ. ಆದಾಗ್ಯೂ ನೀವು ದೇಣಿಗೆ ನೀಡುವ ಮೂಲಕ ನೀವು ಕಾಳಜಿ ವಹಿಸುತ್ತೀರಿ ಎಂದು ನಮಗೆ ತೋರಿಸಬಹುದು.</string>
|
||||||
<string name="uninstall">ಅನ್ಇನ್ಸ್ಟಾಲ್</string>
|
<string name="uninstall">ಅನ್ಇನ್ಸ್ಟಾಲ್</string>
|
||||||
<string name="profile_namespace">ಮೌಂಟ್ ನೇಮ್ಸ್ಪೇಸ್</string>
|
|
||||||
<string name="profile_selinux_rules">ನಿಯಮಗಳು</string>
|
<string name="profile_selinux_rules">ನಿಯಮಗಳು</string>
|
||||||
<string name="profile_groups">ಗುಂಪುಗಳು</string>
|
<string name="profile_groups">ಗುಂಪುಗಳು</string>
|
||||||
<string name="module">ಮಾಡ್ಯೂಲ್</string>
|
<string name="module">ಮಾಡ್ಯೂಲ್</string>
|
||||||
|
|||||||
@@ -5,8 +5,6 @@
|
|||||||
<string name="home_click_to_install">이 곳을 눌러 설치하기</string>
|
<string name="home_click_to_install">이 곳을 눌러 설치하기</string>
|
||||||
<string name="home_working">작동 중</string>
|
<string name="home_working">작동 중</string>
|
||||||
<string name="home_working_version">버전: %d</string>
|
<string name="home_working_version">버전: %d</string>
|
||||||
<string name="home_superuser_count">슈퍼유저: %d개</string>
|
|
||||||
<string name="home_module_count">모듈: %d개</string>
|
|
||||||
<string name="home_unsupported">지원되지 않음</string>
|
<string name="home_unsupported">지원되지 않음</string>
|
||||||
<string name="home_unsupported_reason">KernelSU는 현재 GKI 커널만 지원합니다.</string>
|
<string name="home_unsupported_reason">KernelSU는 현재 GKI 커널만 지원합니다.</string>
|
||||||
<string name="home_kernel">커널 버전</string>
|
<string name="home_kernel">커널 버전</string>
|
||||||
@@ -61,10 +59,6 @@
|
|||||||
<string name="profile_custom">사용자 지정</string>
|
<string name="profile_custom">사용자 지정</string>
|
||||||
<string name="profile_template">템플릿</string>
|
<string name="profile_template">템플릿</string>
|
||||||
<string name="profile_name">프로필 이름</string>
|
<string name="profile_name">프로필 이름</string>
|
||||||
<string name="profile_namespace">마운트할 네임스페이스</string>
|
|
||||||
<string name="profile_namespace_inherited">상속</string>
|
|
||||||
<string name="profile_namespace_global">전역</string>
|
|
||||||
<string name="profile_namespace_individual">개별</string>
|
|
||||||
<string name="profile_groups">사용자 그룹</string>
|
<string name="profile_groups">사용자 그룹</string>
|
||||||
<string name="profile_umount_modules">모듈 마운트 해제</string>
|
<string name="profile_umount_modules">모듈 마운트 해제</string>
|
||||||
<string name="profile_selinux_context">SELinux 컨텍스트</string>
|
<string name="profile_selinux_context">SELinux 컨텍스트</string>
|
||||||
@@ -106,7 +100,6 @@
|
|||||||
<string name="app_profile_template_description">설명</string>
|
<string name="app_profile_template_description">설명</string>
|
||||||
<string name="app_profile_template_save">저장</string>
|
<string name="app_profile_template_save">저장</string>
|
||||||
<string name="app_profile_template_delete">삭제</string>
|
<string name="app_profile_template_delete">삭제</string>
|
||||||
<string name="app_profile_template_readonly">읽기 전용</string>
|
|
||||||
<string name="app_profile_template_id_exist">템플릿 ID가 이미 존재합니다!</string>
|
<string name="app_profile_template_id_exist">템플릿 ID가 이미 존재합니다!</string>
|
||||||
<string name="app_profile_import_export">불러오기/내보내기</string>
|
<string name="app_profile_import_export">불러오기/내보내기</string>
|
||||||
<string name="app_profile_import_from_clipboard">클립보드에서 불러오기</string>
|
<string name="app_profile_import_from_clipboard">클립보드에서 불러오기</string>
|
||||||
|
|||||||
@@ -35,10 +35,6 @@
|
|||||||
<string name="profile_template">Šablonas</string>
|
<string name="profile_template">Šablonas</string>
|
||||||
<string name="profile_custom">Pasirinktinis</string>
|
<string name="profile_custom">Pasirinktinis</string>
|
||||||
<string name="profile_name">Profilio pavadinimas</string>
|
<string name="profile_name">Profilio pavadinimas</string>
|
||||||
<string name="profile_namespace">Prijungti vardų erdvę</string>
|
|
||||||
<string name="profile_namespace_inherited">Paveldėtas</string>
|
|
||||||
<string name="profile_namespace_global">Globalus</string>
|
|
||||||
<string name="profile_namespace_individual">Individualus</string>
|
|
||||||
<string name="profile_groups">Grupės</string>
|
<string name="profile_groups">Grupės</string>
|
||||||
<string name="profile_capabilities">Galimybės</string>
|
<string name="profile_capabilities">Galimybės</string>
|
||||||
<string name="profile_selinux_context">SELinux kontekstas</string>
|
<string name="profile_selinux_context">SELinux kontekstas</string>
|
||||||
@@ -60,10 +56,8 @@
|
|||||||
<string name="home_unsupported_reason">KernelSU dabar palaiko tik GKI branduolius</string>
|
<string name="home_unsupported_reason">KernelSU dabar palaiko tik GKI branduolius</string>
|
||||||
<string name="home_click_to_install">Spustelėkite norėdami įdiegti</string>
|
<string name="home_click_to_install">Spustelėkite norėdami įdiegti</string>
|
||||||
<string name="home_working">Veikia</string>
|
<string name="home_working">Veikia</string>
|
||||||
<string name="home_superuser_count">Supernaudotojai: %d</string>
|
|
||||||
<string name="home_working_version">Versija: %d</string>
|
<string name="home_working_version">Versija: %d</string>
|
||||||
<string name="home_unsupported">Nepalaikoma</string>
|
<string name="home_unsupported">Nepalaikoma</string>
|
||||||
<string name="home_module_count">Moduliai: %d</string>
|
|
||||||
<string name="home_manager_version">Tvarkyklės versija</string>
|
<string name="home_manager_version">Tvarkyklės versija</string>
|
||||||
<string name="home_kernel">Branduolys</string>
|
<string name="home_kernel">Branduolys</string>
|
||||||
<string name="home_selinux_status">SELinux statusas</string>
|
<string name="home_selinux_status">SELinux statusas</string>
|
||||||
|
|||||||
@@ -14,8 +14,6 @@
|
|||||||
<string name="home_click_to_install">Noklikšķiniet, lai uzstādītu</string>
|
<string name="home_click_to_install">Noklikšķiniet, lai uzstādītu</string>
|
||||||
<string name="home_working">Darbojas</string>
|
<string name="home_working">Darbojas</string>
|
||||||
<string name="home_working_version">Versija: %d</string>
|
<string name="home_working_version">Versija: %d</string>
|
||||||
<string name="home_superuser_count">Superlietotāji: %d</string>
|
|
||||||
<string name="home_module_count">Moduļi: %d</string>
|
|
||||||
<string name="home_unsupported">Neatbalstīts</string>
|
<string name="home_unsupported">Neatbalstīts</string>
|
||||||
<string name="home_unsupported_reason">KernelSU pagaidām atbalsta tikai GKI kodolus</string>
|
<string name="home_unsupported_reason">KernelSU pagaidām atbalsta tikai GKI kodolus</string>
|
||||||
<string name="home_kernel">Kodols</string>
|
<string name="home_kernel">Kodols</string>
|
||||||
@@ -56,8 +54,6 @@
|
|||||||
<string name="profile_template">Veidne</string>
|
<string name="profile_template">Veidne</string>
|
||||||
<string name="profile_custom">Pielāgots</string>
|
<string name="profile_custom">Pielāgots</string>
|
||||||
<string name="profile_name">Profila vārds</string>
|
<string name="profile_name">Profila vārds</string>
|
||||||
<string name="profile_namespace">Mount nosaukumvieta</string>
|
|
||||||
<string name="profile_namespace_individual">Individuāls</string>
|
|
||||||
<string name="profile_capabilities">Iespējas</string>
|
<string name="profile_capabilities">Iespējas</string>
|
||||||
<string name="profile_selinux_context">SELinux konteksts</string>
|
<string name="profile_selinux_context">SELinux konteksts</string>
|
||||||
<string name="profile_umount_modules">Atvienot moduļus</string>
|
<string name="profile_umount_modules">Atvienot moduļus</string>
|
||||||
@@ -83,7 +79,6 @@
|
|||||||
<string name="app_profile_template_save">Saglabāt</string>
|
<string name="app_profile_template_save">Saglabāt</string>
|
||||||
<string name="app_profile_template_delete">Dzēst</string>
|
<string name="app_profile_template_delete">Dzēst</string>
|
||||||
<string name="app_profile_template_view">Skatīt veidni</string>
|
<string name="app_profile_template_view">Skatīt veidni</string>
|
||||||
<string name="app_profile_template_readonly">tikai lasīt</string>
|
|
||||||
<string name="app_profile_import_export">Importēt/Eksportēt</string>
|
<string name="app_profile_import_export">Importēt/Eksportēt</string>
|
||||||
<string name="app_profile_template_export_empty">Nevar atrast vietējo eksportējamo veidni!</string>
|
<string name="app_profile_template_export_empty">Nevar atrast vietējo eksportējamo veidni!</string>
|
||||||
<string name="app_profile_template_save_failed">Neizdevās saglabāt veidni</string>
|
<string name="app_profile_template_save_failed">Neizdevās saglabāt veidni</string>
|
||||||
@@ -98,12 +93,10 @@
|
|||||||
<string name="module_magisk_conflict">Moduļi nav pieejami dēļ konflikta ar Magisk!</string>
|
<string name="module_magisk_conflict">Moduļi nav pieejami dēļ konflikta ar Magisk!</string>
|
||||||
<string name="home_support_content">KernelSU ir un vienmēr būs bezmaksas un atvērtā koda. Tomēr jūs varat parādīt mums, ka jums rūp, veicot ziedojumu.</string>
|
<string name="home_support_content">KernelSU ir un vienmēr būs bezmaksas un atvērtā koda. Tomēr jūs varat parādīt mums, ka jums rūp, veicot ziedojumu.</string>
|
||||||
<string name="profile_groups">Grupas</string>
|
<string name="profile_groups">Grupas</string>
|
||||||
<string name="profile_namespace_global">Globāli</string>
|
|
||||||
<string name="require_kernel_version">Pašreizējā KernelSU versija %d ir pārāk zema, lai pārvaldnieks darbotos pareizi. Lūdzu, atjauniniet uz versiju %d vai jaunāku!</string>
|
<string name="require_kernel_version">Pašreizējā KernelSU versija %d ir pārāk zema, lai pārvaldnieks darbotos pareizi. Lūdzu, atjauniniet uz versiju %d vai jaunāku!</string>
|
||||||
<string name="enable_web_debugging">Iespējot WebView atkļūdošanu</string>
|
<string name="enable_web_debugging">Iespējot WebView atkļūdošanu</string>
|
||||||
<string name="select_file_tip">Ieteicams %1$s nodalījuma attēls</string>
|
<string name="select_file_tip">Ieteicams %1$s nodalījuma attēls</string>
|
||||||
<string name="install_next">Nākamais</string>
|
<string name="install_next">Nākamais</string>
|
||||||
<string name="profile_namespace_inherited">Mantots</string>
|
|
||||||
<string name="select_file">Izvēlieties failu</string>
|
<string name="select_file">Izvēlieties failu</string>
|
||||||
<string name="install_inactive_slot">Instalēt neaktīvajā slotā (pēc OTA)</string>
|
<string name="install_inactive_slot">Instalēt neaktīvajā slotā (pēc OTA)</string>
|
||||||
<string name="install_inactive_slot_warning">Pēc restartēšanas jūsu ierīce tiks **PIESPIESTI** palaista pašreizējā neaktīvajā slotā!
|
<string name="install_inactive_slot_warning">Pēc restartēšanas jūsu ierīce tiks **PIESPIESTI** palaista pašreizējā neaktīvajā slotā!
|
||||||
|
|||||||
@@ -5,8 +5,6 @@
|
|||||||
<string name="home_click_to_install">इंस्टॉल साठी क्लिक करा</string>
|
<string name="home_click_to_install">इंस्टॉल साठी क्लिक करा</string>
|
||||||
<string name="home_working">कार्यरत</string>
|
<string name="home_working">कार्यरत</string>
|
||||||
<string name="home_working_version">आवृत्ती: %d</string>
|
<string name="home_working_version">आवृत्ती: %d</string>
|
||||||
<string name="home_module_count">मॉड्यूल्स: %d</string>
|
|
||||||
<string name="home_superuser_count">सुपरयूझर: %d</string>
|
|
||||||
<string name="home_unsupported">असमर्थित</string>
|
<string name="home_unsupported">असमर्थित</string>
|
||||||
<string name="home_unsupported_reason">KernelSU आता फक्त GKI कर्नलचे समर्थन करते</string>
|
<string name="home_unsupported_reason">KernelSU आता फक्त GKI कर्नलचे समर्थन करते</string>
|
||||||
<string name="home_kernel">कर्नल</string>
|
<string name="home_kernel">कर्नल</string>
|
||||||
@@ -51,15 +49,11 @@
|
|||||||
<string name="home_support_content">KernelSU विनामूल्य आणि मुक्त स्रोत आहे, आणि नेहमीच असेल. तथापि, देणगी देऊन तुम्ही आम्हाला दाखवू शकता की तुमची काळजी आहे.</string>
|
<string name="home_support_content">KernelSU विनामूल्य आणि मुक्त स्रोत आहे, आणि नेहमीच असेल. तथापि, देणगी देऊन तुम्ही आम्हाला दाखवू शकता की तुमची काळजी आहे.</string>
|
||||||
<string name="home_support_title">आम्हाला पाठिंबा द्या</string>
|
<string name="home_support_title">आम्हाला पाठिंबा द्या</string>
|
||||||
<string name="profile_custom">कस्टम</string>
|
<string name="profile_custom">कस्टम</string>
|
||||||
<string name="profile_namespace">माउंट नेमस्पेस</string>
|
|
||||||
<string name="profile_default">डीफॉल्ट</string>
|
<string name="profile_default">डीफॉल्ट</string>
|
||||||
<string name="profile_template">साचा</string>
|
<string name="profile_template">साचा</string>
|
||||||
<string name="profile_namespace_individual">वैयक्तिक</string>
|
|
||||||
<string name="profile_capabilities">क्षमता</string>
|
<string name="profile_capabilities">क्षमता</string>
|
||||||
<string name="about_source_code">%1$s वर स्रोत कोड पहा<br/>आमच्या %2$s चॅनेलमध्ये सामील व्हा</string>
|
<string name="about_source_code">%1$s वर स्रोत कोड पहा<br/>आमच्या %2$s चॅनेलमध्ये सामील व्हा</string>
|
||||||
<string name="profile_name">प्रोफाइल नाव</string>
|
<string name="profile_name">प्रोफाइल नाव</string>
|
||||||
<string name="profile_namespace_inherited">इनहेरीटेड</string>
|
|
||||||
<string name="profile_namespace_global">जागतिक</string>
|
|
||||||
<string name="profile_groups">गट</string>
|
<string name="profile_groups">गट</string>
|
||||||
<string name="profile_selinux_context">SELinux संदर्भ</string>
|
<string name="profile_selinux_context">SELinux संदर्भ</string>
|
||||||
<string name="profile_umount_modules">उमाउंट मॉड्यूल्स</string>
|
<string name="profile_umount_modules">उमाउंट मॉड्यूल्स</string>
|
||||||
|
|||||||
@@ -6,8 +6,6 @@
|
|||||||
<string name="reboot_download">Reboot ke Download</string>
|
<string name="reboot_download">Reboot ke Download</string>
|
||||||
<string name="module_failed_to_enable">Modul tidak berjaya diaktifkan: %s</string>
|
<string name="module_failed_to_enable">Modul tidak berjaya diaktifkan: %s</string>
|
||||||
<string name="reboot_edl">Reboot ke EDL</string>
|
<string name="reboot_edl">Reboot ke EDL</string>
|
||||||
<string name="home_superuser_count">Superusers: %d</string>
|
|
||||||
<string name="home_module_count">Modul: %d</string>
|
|
||||||
<string name="selinux_status_enforcing">Enforcing</string>
|
<string name="selinux_status_enforcing">Enforcing</string>
|
||||||
<string name="home_fingerprint">Cap Jari</string>
|
<string name="home_fingerprint">Cap Jari</string>
|
||||||
<string name="reboot_recovery">Reboot ke Recovery</string>
|
<string name="reboot_recovery">Reboot ke Recovery</string>
|
||||||
|
|||||||
@@ -5,8 +5,6 @@
|
|||||||
<string name="home_click_to_install">Klik om te installeren</string>
|
<string name="home_click_to_install">Klik om te installeren</string>
|
||||||
<string name="home_working">Werkend</string>
|
<string name="home_working">Werkend</string>
|
||||||
<string name="home_working_version">Versie: %d</string>
|
<string name="home_working_version">Versie: %d</string>
|
||||||
<string name="home_superuser_count">Supergebruikers: %d</string>
|
|
||||||
<string name="home_module_count">Modules: %d</string>
|
|
||||||
<string name="home_unsupported">Niet ondersteund</string>
|
<string name="home_unsupported">Niet ondersteund</string>
|
||||||
<string name="home_unsupported_reason">KernelSU ondersteunt alleen GKI kernels</string>
|
<string name="home_unsupported_reason">KernelSU ondersteunt alleen GKI kernels</string>
|
||||||
<string name="home_kernel">Kernel version</string>
|
<string name="home_kernel">Kernel version</string>
|
||||||
@@ -56,10 +54,6 @@
|
|||||||
<string name="profile_template">Sjabloon</string>
|
<string name="profile_template">Sjabloon</string>
|
||||||
<string name="profile_custom">Aangepast</string>
|
<string name="profile_custom">Aangepast</string>
|
||||||
<string name="profile_name">Profiel naam</string>
|
<string name="profile_name">Profiel naam</string>
|
||||||
<string name="profile_namespace">Koppel naamruimte</string>
|
|
||||||
<string name="profile_namespace_inherited">Overgenomen</string>
|
|
||||||
<string name="profile_namespace_global">Globaal</string>
|
|
||||||
<string name="profile_namespace_individual">Individuëel</string>
|
|
||||||
<string name="profile_groups">Groepen</string>
|
<string name="profile_groups">Groepen</string>
|
||||||
<string name="profile_capabilities">Mogelijkheden</string>
|
<string name="profile_capabilities">Mogelijkheden</string>
|
||||||
<string name="profile_selinux_context">SELinux context</string>
|
<string name="profile_selinux_context">SELinux context</string>
|
||||||
@@ -91,7 +85,6 @@
|
|||||||
<string name="app_profile_template_description">Beschrijving</string>
|
<string name="app_profile_template_description">Beschrijving</string>
|
||||||
<string name="settings_profile_template_summary">Beheer lokale en online sjabloon van app-profiel.</string>
|
<string name="settings_profile_template_summary">Beheer lokale en online sjabloon van app-profiel.</string>
|
||||||
<string name="app_profile_template_delete">Verwijderen</string>
|
<string name="app_profile_template_delete">Verwijderen</string>
|
||||||
<string name="app_profile_template_readonly">Alleen lezen</string>
|
|
||||||
<string name="app_profile_template_id_exist">Sjabloon ID bestaat al!</string>
|
<string name="app_profile_template_id_exist">Sjabloon ID bestaat al!</string>
|
||||||
<string name="app_profile_template_sync">Synchroniseer online-sjablonen</string>
|
<string name="app_profile_template_sync">Synchroniseer online-sjablonen</string>
|
||||||
<string name="app_profile_template_save_failed">Mislukt naar opslaan sjabloon</string>
|
<string name="app_profile_template_save_failed">Mislukt naar opslaan sjabloon</string>
|
||||||
|
|||||||
@@ -6,8 +6,6 @@
|
|||||||
<string name="home_click_to_install">Kliknij, aby zainstalować</string>
|
<string name="home_click_to_install">Kliknij, aby zainstalować</string>
|
||||||
<string name="home_working">Działa</string>
|
<string name="home_working">Działa</string>
|
||||||
<string name="home_working_version">Wersja: %d</string>
|
<string name="home_working_version">Wersja: %d</string>
|
||||||
<string name="home_superuser_count">Superużytkownicy: %d</string>
|
|
||||||
<string name="home_module_count">Moduły: %d</string>
|
|
||||||
<string name="home_unsupported">Nieobsługiwany</string>
|
<string name="home_unsupported">Nieobsługiwany</string>
|
||||||
<string name="home_unsupported_reason">KernelSU obsługuje obecnie tylko jądra GKI.</string>
|
<string name="home_unsupported_reason">KernelSU obsługuje obecnie tylko jądra GKI.</string>
|
||||||
<string name="home_kernel">Wersja jądra</string>
|
<string name="home_kernel">Wersja jądra</string>
|
||||||
@@ -57,10 +55,6 @@
|
|||||||
<string name="profile_template">Szablon</string>
|
<string name="profile_template">Szablon</string>
|
||||||
<string name="profile_custom">Własny</string>
|
<string name="profile_custom">Własny</string>
|
||||||
<string name="profile_name">Nazwa profilu</string>
|
<string name="profile_name">Nazwa profilu</string>
|
||||||
<string name="profile_namespace">Przestrzeń nazw montowania</string>
|
|
||||||
<string name="profile_namespace_inherited">Odziedziczona</string>
|
|
||||||
<string name="profile_namespace_global">Globalna</string>
|
|
||||||
<string name="profile_namespace_individual">Indywidualna</string>
|
|
||||||
<string name="profile_groups">Grupy</string>
|
<string name="profile_groups">Grupy</string>
|
||||||
<string name="profile_capabilities">Uprawnienia</string>
|
<string name="profile_capabilities">Uprawnienia</string>
|
||||||
<string name="profile_selinux_context">Kontekst SELinux</string>
|
<string name="profile_selinux_context">Kontekst SELinux</string>
|
||||||
@@ -98,7 +92,6 @@
|
|||||||
<string name="app_profile_template_description">Opis</string>
|
<string name="app_profile_template_description">Opis</string>
|
||||||
<string name="app_profile_template_save">Zapisz</string>
|
<string name="app_profile_template_save">Zapisz</string>
|
||||||
<string name="app_profile_template_delete">Usuń</string>
|
<string name="app_profile_template_delete">Usuń</string>
|
||||||
<string name="app_profile_template_readonly">Tylko do odczytu</string>
|
|
||||||
<string name="app_profile_import_export">Importuj/Eksportuj</string>
|
<string name="app_profile_import_export">Importuj/Eksportuj</string>
|
||||||
<string name="app_profile_import_from_clipboard">Importuj ze schowka</string>
|
<string name="app_profile_import_from_clipboard">Importuj ze schowka</string>
|
||||||
<string name="app_profile_export_to_clipboard">Eksportuj do schowka</string>
|
<string name="app_profile_export_to_clipboard">Eksportuj do schowka</string>
|
||||||
|
|||||||
@@ -5,8 +5,6 @@
|
|||||||
<string name="home_click_to_install">Clique para instalar</string>
|
<string name="home_click_to_install">Clique para instalar</string>
|
||||||
<string name="home_working">Em execução</string>
|
<string name="home_working">Em execução</string>
|
||||||
<string name="home_working_version">Versão: %d</string>
|
<string name="home_working_version">Versão: %d</string>
|
||||||
<string name="home_superuser_count">SuperUsuários: %d</string>
|
|
||||||
<string name="home_module_count">Módulos: %d</string>
|
|
||||||
<string name="home_unsupported">Sem suporte</string>
|
<string name="home_unsupported">Sem suporte</string>
|
||||||
<string name="home_unsupported_reason">KernelSU suporta apenas kernels GKI agora</string>
|
<string name="home_unsupported_reason">KernelSU suporta apenas kernels GKI agora</string>
|
||||||
<string name="home_kernel">Versão do kernel</string>
|
<string name="home_kernel">Versão do kernel</string>
|
||||||
@@ -56,10 +54,6 @@
|
|||||||
<string name="profile_template">Modelo</string>
|
<string name="profile_template">Modelo</string>
|
||||||
<string name="profile_custom">Personalizado</string>
|
<string name="profile_custom">Personalizado</string>
|
||||||
<string name="profile_name">Nome do perfil</string>
|
<string name="profile_name">Nome do perfil</string>
|
||||||
<string name="profile_namespace">Montar namespace</string>
|
|
||||||
<string name="profile_namespace_inherited">Herdado</string>
|
|
||||||
<string name="profile_namespace_global">Global</string>
|
|
||||||
<string name="profile_namespace_individual">Individual</string>
|
|
||||||
<string name="profile_groups">Grupos</string>
|
<string name="profile_groups">Grupos</string>
|
||||||
<string name="profile_capabilities">Capacidades</string>
|
<string name="profile_capabilities">Capacidades</string>
|
||||||
<string name="profile_selinux_context">Contexto do SELinux</string>
|
<string name="profile_selinux_context">Contexto do SELinux</string>
|
||||||
@@ -90,7 +84,6 @@
|
|||||||
<string name="app_profile_template_id_invalid">ID do modelo inválido</string>
|
<string name="app_profile_template_id_invalid">ID do modelo inválido</string>
|
||||||
<string name="app_profile_template_sync">Sincronizar modelos online</string>
|
<string name="app_profile_template_sync">Sincronizar modelos online</string>
|
||||||
<string name="app_profile_template_create">Criar modelo</string>
|
<string name="app_profile_template_create">Criar modelo</string>
|
||||||
<string name="app_profile_template_readonly">Somente leitura</string>
|
|
||||||
<string name="app_profile_import_export">Importar/Exportar</string>
|
<string name="app_profile_import_export">Importar/Exportar</string>
|
||||||
<string name="app_profile_template_save_failed">Falha ao salvar o modelo</string>
|
<string name="app_profile_template_save_failed">Falha ao salvar o modelo</string>
|
||||||
<string name="app_profile_template_edit">Editar modelo</string>
|
<string name="app_profile_template_edit">Editar modelo</string>
|
||||||
|
|||||||
@@ -4,8 +4,6 @@
|
|||||||
<string name="home">Início</string>
|
<string name="home">Início</string>
|
||||||
<string name="home_click_to_install">Clique para instalar</string>
|
<string name="home_click_to_install">Clique para instalar</string>
|
||||||
<string name="home_working">Funcionando</string>
|
<string name="home_working">Funcionando</string>
|
||||||
<string name="home_superuser_count">Super Usuário: %d</string>
|
|
||||||
<string name="home_module_count">Módulos: %d</string>
|
|
||||||
<string name="home_working_version">Versão: %d</string>
|
<string name="home_working_version">Versão: %d</string>
|
||||||
<string name="home_kernel">Kernel</string>
|
<string name="home_kernel">Kernel</string>
|
||||||
<string name="install">Instalar</string>
|
<string name="install">Instalar</string>
|
||||||
@@ -45,14 +43,10 @@
|
|||||||
<string name="home_click_to_learn_kernelsu">Aprenda a instalar o KernelSU e usar os módulos</string>
|
<string name="home_click_to_learn_kernelsu">Aprenda a instalar o KernelSU e usar os módulos</string>
|
||||||
<string name="home_support_content">O KernelSU é, e sempre será, gratuito e de código aberto. No entanto, você pode nos mostrar que se importa fazendo uma doação.</string>
|
<string name="home_support_content">O KernelSU é, e sempre será, gratuito e de código aberto. No entanto, você pode nos mostrar que se importa fazendo uma doação.</string>
|
||||||
<string name="about_source_code">Veja o código-fonte em %1$s<br/>Junte-se ao nosso canal %2$s</string>
|
<string name="about_source_code">Veja o código-fonte em %1$s<br/>Junte-se ao nosso canal %2$s</string>
|
||||||
<string name="profile_namespace_individual">Individual</string>
|
|
||||||
<string name="profile_namespace_global">Global</string>
|
|
||||||
<string name="profile_namespace_inherited">Herdado</string>
|
|
||||||
<string name="profile_default">Padrão</string>
|
<string name="profile_default">Padrão</string>
|
||||||
<string name="profile_template">Modelo</string>
|
<string name="profile_template">Modelo</string>
|
||||||
<string name="profile_custom">Personalizado</string>
|
<string name="profile_custom">Personalizado</string>
|
||||||
<string name="profile_name">Nome do perfil</string>
|
<string name="profile_name">Nome do perfil</string>
|
||||||
<string name="profile_namespace">Montar namespace</string>
|
|
||||||
<string name="safe_mode">Modo de segurança</string>
|
<string name="safe_mode">Modo de segurança</string>
|
||||||
<string name="reboot_to_apply">Reinicie para entrar em vigor</string>
|
<string name="reboot_to_apply">Reinicie para entrar em vigor</string>
|
||||||
<string name="home_learn_kernelsu">Aprender KernelSU</string>
|
<string name="home_learn_kernelsu">Aprender KernelSU</string>
|
||||||
|
|||||||
@@ -5,8 +5,6 @@
|
|||||||
<string name="home_click_to_install">Click pentru a instala</string>
|
<string name="home_click_to_install">Click pentru a instala</string>
|
||||||
<string name="home_working">Funcționează</string>
|
<string name="home_working">Funcționează</string>
|
||||||
<string name="home_working_version">Versiune: %d</string>
|
<string name="home_working_version">Versiune: %d</string>
|
||||||
<string name="home_superuser_count">Super-utilizatori: %d</string>
|
|
||||||
<string name="home_module_count">Module: %d</string>
|
|
||||||
<string name="home_unsupported">Necompatibil</string>
|
<string name="home_unsupported">Necompatibil</string>
|
||||||
<string name="home_unsupported_reason">KernelSU suportă doar nuclee GKI acum</string>
|
<string name="home_unsupported_reason">KernelSU suportă doar nuclee GKI acum</string>
|
||||||
<string name="home_kernel">Nucleu</string>
|
<string name="home_kernel">Nucleu</string>
|
||||||
@@ -55,10 +53,6 @@
|
|||||||
<string name="profile_template">Șablon</string>
|
<string name="profile_template">Șablon</string>
|
||||||
<string name="profile_custom">Personalizat</string>
|
<string name="profile_custom">Personalizat</string>
|
||||||
<string name="profile_name">Nume profil</string>
|
<string name="profile_name">Nume profil</string>
|
||||||
<string name="profile_namespace">Montare spațiu de nume</string>
|
|
||||||
<string name="profile_namespace_inherited">Moștenit</string>
|
|
||||||
<string name="profile_namespace_global">Global</string>
|
|
||||||
<string name="profile_namespace_individual">Individual</string>
|
|
||||||
<string name="profile_groups">Grupuri</string>
|
<string name="profile_groups">Grupuri</string>
|
||||||
<string name="profile_capabilities">Capabilități</string>
|
<string name="profile_capabilities">Capabilități</string>
|
||||||
<string name="profile_selinux_context">Context SELinux</string>
|
<string name="profile_selinux_context">Context SELinux</string>
|
||||||
@@ -89,7 +83,6 @@
|
|||||||
<string name="app_profile_template_id_invalid">ID șablon nevalid</string>
|
<string name="app_profile_template_id_invalid">ID șablon nevalid</string>
|
||||||
<string name="app_profile_template_sync">Sincronizează șabloanele online</string>
|
<string name="app_profile_template_sync">Sincronizează șabloanele online</string>
|
||||||
<string name="app_profile_template_create">Creează un șablon</string>
|
<string name="app_profile_template_create">Creează un șablon</string>
|
||||||
<string name="app_profile_template_readonly">doar citire</string>
|
|
||||||
<string name="app_profile_import_export">Import/Export</string>
|
<string name="app_profile_import_export">Import/Export</string>
|
||||||
<string name="app_profile_template_save_failed">Nu s-a salvat șablonul</string>
|
<string name="app_profile_template_save_failed">Nu s-a salvat șablonul</string>
|
||||||
<string name="app_profile_template_edit">Editează șablonul</string>
|
<string name="app_profile_template_edit">Editează șablonul</string>
|
||||||
|
|||||||
@@ -5,9 +5,7 @@
|
|||||||
<string name="home_click_to_install">Нажмите, чтобы установить</string>
|
<string name="home_click_to_install">Нажмите, чтобы установить</string>
|
||||||
<string name="home_working">Работает</string>
|
<string name="home_working">Работает</string>
|
||||||
<string name="home_working_version">Версия: %d</string>
|
<string name="home_working_version">Версия: %d</string>
|
||||||
<string name="home_superuser_count">Суперпользователи: %d</string>
|
|
||||||
<!--Don't translate this string!-->
|
<!--Don't translate this string!-->
|
||||||
<string name="home_module_count">Модули: %d</string>
|
|
||||||
<string name="home_unsupported">Не поддерживается</string>
|
<string name="home_unsupported">Не поддерживается</string>
|
||||||
<string name="home_unsupported_reason">KernelSU поддерживает только GKI ядра.</string>
|
<string name="home_unsupported_reason">KernelSU поддерживает только GKI ядра.</string>
|
||||||
<string name="home_kernel">Версия ядра</string>
|
<string name="home_kernel">Версия ядра</string>
|
||||||
@@ -59,10 +57,6 @@
|
|||||||
<string name="profile_template">Шаблон</string>
|
<string name="profile_template">Шаблон</string>
|
||||||
<string name="profile_custom">Пользовательский</string>
|
<string name="profile_custom">Пользовательский</string>
|
||||||
<string name="profile_name">Название профиля</string>
|
<string name="profile_name">Название профиля</string>
|
||||||
<string name="profile_namespace">Монтировать пространство имен</string>
|
|
||||||
<string name="profile_namespace_inherited">Унаследованный</string>
|
|
||||||
<string name="profile_namespace_global">Глобальный</string>
|
|
||||||
<string name="profile_namespace_individual">Индивидуальный</string>
|
|
||||||
<string name="profile_groups">Группы</string>
|
<string name="profile_groups">Группы</string>
|
||||||
<string name="profile_capabilities">Возможности</string>
|
<string name="profile_capabilities">Возможности</string>
|
||||||
<string name="profile_selinux_context">Контекст SELinux</string>
|
<string name="profile_selinux_context">Контекст SELinux</string>
|
||||||
@@ -93,7 +87,6 @@
|
|||||||
<string name="app_profile_template_id_invalid">Неверный ID шаблона</string>
|
<string name="app_profile_template_id_invalid">Неверный ID шаблона</string>
|
||||||
<string name="app_profile_template_sync">Синхронизировать онлайн-шаблоны</string>
|
<string name="app_profile_template_sync">Синхронизировать онлайн-шаблоны</string>
|
||||||
<string name="app_profile_template_create">Создать шаблон</string>
|
<string name="app_profile_template_create">Создать шаблон</string>
|
||||||
<string name="app_profile_template_readonly">Только чтение</string>
|
|
||||||
<string name="app_profile_import_export">Импорт/Экспорт</string>
|
<string name="app_profile_import_export">Импорт/Экспорт</string>
|
||||||
<string name="app_profile_template_save_failed">Не удалось сохранить шаблон</string>
|
<string name="app_profile_template_save_failed">Не удалось сохранить шаблон</string>
|
||||||
<string name="app_profile_template_edit">Редактирование шаблона</string>
|
<string name="app_profile_template_edit">Редактирование шаблона</string>
|
||||||
|
|||||||
@@ -3,7 +3,6 @@
|
|||||||
<string name="home_click_to_install">Klikni za namestitev</string>
|
<string name="home_click_to_install">Klikni za namestitev</string>
|
||||||
<string name="home_working">V obdelavi</string>
|
<string name="home_working">V obdelavi</string>
|
||||||
<string name="home_working_version">Verzija: %d</string>
|
<string name="home_working_version">Verzija: %d</string>
|
||||||
<string name="home_superuser_count">Superuporabniki: %d</string>
|
|
||||||
<string name="home_unsupported_reason">KernelSU podpira samo GKI kernele</string>
|
<string name="home_unsupported_reason">KernelSU podpira samo GKI kernele</string>
|
||||||
<string name="home_kernel">Kernel</string>
|
<string name="home_kernel">Kernel</string>
|
||||||
<string name="home_manager_version">Verzija upravitelja</string>
|
<string name="home_manager_version">Verzija upravitelja</string>
|
||||||
@@ -32,10 +31,6 @@
|
|||||||
<string name="about_source_code">Glej odprto kodo na %1$s<br/>Pridružite se našem %2$s kanalu</string>
|
<string name="about_source_code">Glej odprto kodo na %1$s<br/>Pridružite se našem %2$s kanalu</string>
|
||||||
<string name="profile_default">Privzeto</string>
|
<string name="profile_default">Privzeto</string>
|
||||||
<string name="profile_template">Predloga</string>
|
<string name="profile_template">Predloga</string>
|
||||||
<string name="profile_namespace">Imenski prostor vmestitve</string>
|
|
||||||
<string name="profile_namespace_inherited">Podedovano</string>
|
|
||||||
<string name="profile_namespace_global">Globalno</string>
|
|
||||||
<string name="profile_namespace_individual">Pozameznik</string>
|
|
||||||
<string name="profile_capabilities">Zmožnosti</string>
|
<string name="profile_capabilities">Zmožnosti</string>
|
||||||
<string name="profile_umount_modules">Izvrzi module</string>
|
<string name="profile_umount_modules">Izvrzi module</string>
|
||||||
<string name="settings_umount_modules_default">Po privzetem izvrzi module</string>
|
<string name="settings_umount_modules_default">Po privzetem izvrzi module</string>
|
||||||
@@ -47,7 +42,6 @@
|
|||||||
<string name="module_changelog">Dnevnik sprememb</string>
|
<string name="module_changelog">Dnevnik sprememb</string>
|
||||||
<string name="settings_profile_template">Predloga za aplikacijski profil</string>
|
<string name="settings_profile_template">Predloga za aplikacijski profil</string>
|
||||||
<string name="home">Domov</string>
|
<string name="home">Domov</string>
|
||||||
<string name="home_module_count">Moduli: %d</string>
|
|
||||||
<string name="home_unsupported">Ne podpira</string>
|
<string name="home_unsupported">Ne podpira</string>
|
||||||
<string name="superuser">SuperUporabnik</string>
|
<string name="superuser">SuperUporabnik</string>
|
||||||
<string name="module_failed_to_enable">Napaka pri omogočanju modula: %s</string>
|
<string name="module_failed_to_enable">Napaka pri omogočanju modula: %s</string>
|
||||||
@@ -86,7 +80,6 @@
|
|||||||
<string name="app_profile_template_description">Opis</string>
|
<string name="app_profile_template_description">Opis</string>
|
||||||
<string name="app_profile_template_save">Shrani</string>
|
<string name="app_profile_template_save">Shrani</string>
|
||||||
<string name="app_profile_template_delete">Odstrani</string>
|
<string name="app_profile_template_delete">Odstrani</string>
|
||||||
<string name="app_profile_template_readonly">le za branje</string>
|
|
||||||
<string name="app_profile_template_id_exist">id predloge že obstaja!</string>
|
<string name="app_profile_template_id_exist">id predloge že obstaja!</string>
|
||||||
<string name="app_profile_import_from_clipboard">Uvoz iz odložišča</string>
|
<string name="app_profile_import_from_clipboard">Uvoz iz odložišča</string>
|
||||||
<string name="app_profile_export_to_clipboard">Izvoz v odložišče</string>
|
<string name="app_profile_export_to_clipboard">Izvoz v odložišče</string>
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<string name="home_superuser_count">Superkorisnici</string>
|
|
||||||
<string name="home_module_count">Moduli: %d</string>
|
|
||||||
<string name="home_click_to_install">Додирните да бисте инсталирали</string>
|
<string name="home_click_to_install">Додирните да бисте инсталирали</string>
|
||||||
<string name="home">Почетна</string>
|
<string name="home">Почетна</string>
|
||||||
<string name="home_not_installed">Није инсталирано</string>
|
<string name="home_not_installed">Није инсталирано</string>
|
||||||
|
|||||||
@@ -15,7 +15,5 @@
|
|||||||
<string name="home_click_to_install">ఇన్స్టాల్ చేయడానికి క్లిక్ చేయండి</string>
|
<string name="home_click_to_install">ఇన్స్టాల్ చేయడానికి క్లిక్ చేయండి</string>
|
||||||
<string name="home_working">పని చేస్తోంది</string>
|
<string name="home_working">పని చేస్తోంది</string>
|
||||||
<string name="home_working_version">వెర్షన్: %d</string>
|
<string name="home_working_version">వెర్షన్: %d</string>
|
||||||
<string name="home_superuser_count">సూపర్యూజర్లు: %d</string>
|
|
||||||
<string name="home_module_count">మాడ్యూల్స్: %d</string>
|
|
||||||
<string name="save_log">లాగ్లు సేవ్ చేయండి</string>
|
<string name="save_log">లాగ్లు సేవ్ చేయండి</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -6,8 +6,6 @@
|
|||||||
<string name="home_working">กำลังทำงาน</string>
|
<string name="home_working">กำลังทำงาน</string>
|
||||||
<string name="home_working_version">เวอร์ชัน: %d</string>
|
<string name="home_working_version">เวอร์ชัน: %d</string>
|
||||||
<string name="home_manager_version">เวอร์ชันตัวจัดการ</string>
|
<string name="home_manager_version">เวอร์ชันตัวจัดการ</string>
|
||||||
<string name="home_superuser_count">สิทธิ์ผู้ใช้ขั้นสูง: %d</string>
|
|
||||||
<string name="home_module_count">โมดูล: %d</string>
|
|
||||||
<string name="home_unsupported">ไม่รองรับ</string>
|
<string name="home_unsupported">ไม่รองรับ</string>
|
||||||
<string name="selinux_status_enforcing">Enforcing</string>
|
<string name="selinux_status_enforcing">Enforcing</string>
|
||||||
<string name="reboot_recovery">รีบูตเข้าสู่โหมดกู้คืน</string>
|
<string name="reboot_recovery">รีบูตเข้าสู่โหมดกู้คืน</string>
|
||||||
@@ -55,10 +53,6 @@
|
|||||||
<string name="profile_default">ค่าเริ่มต้น</string>
|
<string name="profile_default">ค่าเริ่มต้น</string>
|
||||||
<string name="profile_template">เทมเพลต</string>
|
<string name="profile_template">เทมเพลต</string>
|
||||||
<string name="profile_name">ชื่อโปรไฟล์</string>
|
<string name="profile_name">ชื่อโปรไฟล์</string>
|
||||||
<string name="profile_namespace">Mount เนมสเปซ</string>
|
|
||||||
<string name="profile_namespace_global">ทั่วไป</string>
|
|
||||||
<string name="profile_namespace_inherited">สืบทอด</string>
|
|
||||||
<string name="profile_namespace_individual">ส่วนบุคคล</string>
|
|
||||||
<string name="profile_groups">หมวดหมู่</string>
|
<string name="profile_groups">หมวดหมู่</string>
|
||||||
<string name="profile_capabilities">ความสามารถของแอป</string>
|
<string name="profile_capabilities">ความสามารถของแอป</string>
|
||||||
<string name="profile_umount_modules_summary">การเปิดใช้งานตัวเลือกนี้จะทำให้ KernelSU สามารถกู้คืนไฟล์ที่แก้ไขโดยโมดูลสำหรับแอปนี้ได้</string>
|
<string name="profile_umount_modules_summary">การเปิดใช้งานตัวเลือกนี้จะทำให้ KernelSU สามารถกู้คืนไฟล์ที่แก้ไขโดยโมดูลสำหรับแอปนี้ได้</string>
|
||||||
@@ -88,7 +82,6 @@
|
|||||||
<string name="app_profile_template_id_invalid">ไอดีเทมเพลตไม่ถูกต้อง</string>
|
<string name="app_profile_template_id_invalid">ไอดีเทมเพลตไม่ถูกต้อง</string>
|
||||||
<string name="app_profile_template_sync">ซิงค์เทมเพลตออนไลน์</string>
|
<string name="app_profile_template_sync">ซิงค์เทมเพลตออนไลน์</string>
|
||||||
<string name="app_profile_template_create">สร้างเทมเพลต</string>
|
<string name="app_profile_template_create">สร้างเทมเพลต</string>
|
||||||
<string name="app_profile_template_readonly">อ่านเท่านั้น</string>
|
|
||||||
<string name="app_profile_import_export">นำเข้า/ส่งออก</string>
|
<string name="app_profile_import_export">นำเข้า/ส่งออก</string>
|
||||||
<string name="app_profile_template_save_failed">ไม่สามารถบันทึกเทมเพลต</string>
|
<string name="app_profile_template_save_failed">ไม่สามารถบันทึกเทมเพลต</string>
|
||||||
<string name="app_profile_template_edit">แก้ไขเทมเพลต</string>
|
<string name="app_profile_template_edit">แก้ไขเทมเพลต</string>
|
||||||
|
|||||||
@@ -6,8 +6,6 @@
|
|||||||
<string name="home_click_to_install">Kurmak için tıklayın</string>
|
<string name="home_click_to_install">Kurmak için tıklayın</string>
|
||||||
<string name="home_working">Çalışıyor</string>
|
<string name="home_working">Çalışıyor</string>
|
||||||
<string name="home_working_version">Sürüm: %d</string>
|
<string name="home_working_version">Sürüm: %d</string>
|
||||||
<string name="home_superuser_count">Süper kullanıcılar: %d</string>
|
|
||||||
<string name="home_module_count">Modüller: %d</string>
|
|
||||||
<string name="home_unsupported">Desteklenmiyor</string>
|
<string name="home_unsupported">Desteklenmiyor</string>
|
||||||
<string name="home_unsupported_reason">KernelSU şimdilik sadece GKI çekirdeklerini destekliyor</string>
|
<string name="home_unsupported_reason">KernelSU şimdilik sadece GKI çekirdeklerini destekliyor</string>
|
||||||
<string name="home_kernel">Çekirdek Versiyonu</string>
|
<string name="home_kernel">Çekirdek Versiyonu</string>
|
||||||
@@ -57,10 +55,6 @@
|
|||||||
<string name="profile_template">Şablon</string>
|
<string name="profile_template">Şablon</string>
|
||||||
<string name="profile_custom">Özel</string>
|
<string name="profile_custom">Özel</string>
|
||||||
<string name="profile_name">Profil adı</string>
|
<string name="profile_name">Profil adı</string>
|
||||||
<string name="profile_namespace">Ad alanını bağla</string>
|
|
||||||
<string name="profile_namespace_inherited">Kalıtsal</string>
|
|
||||||
<string name="profile_namespace_global">Küresel</string>
|
|
||||||
<string name="profile_namespace_individual">Bireysel</string>
|
|
||||||
<string name="profile_groups">Gruplar</string>
|
<string name="profile_groups">Gruplar</string>
|
||||||
<string name="profile_capabilities">Yetkinlikler</string>
|
<string name="profile_capabilities">Yetkinlikler</string>
|
||||||
<string name="profile_selinux_context">SELinux içeriği</string>
|
<string name="profile_selinux_context">SELinux içeriği</string>
|
||||||
@@ -92,7 +86,6 @@
|
|||||||
<string name="app_profile_template_save">Kaydet</string>
|
<string name="app_profile_template_save">Kaydet</string>
|
||||||
<string name="app_profile_template_delete">Sil</string>
|
<string name="app_profile_template_delete">Sil</string>
|
||||||
<string name="app_profile_template_view">Şablonu görüntüle</string>
|
<string name="app_profile_template_view">Şablonu görüntüle</string>
|
||||||
<string name="app_profile_template_readonly">Salt okunur</string>
|
|
||||||
<string name="app_profile_template_id_exist">Şablon kimliği zaten var!</string>
|
<string name="app_profile_template_id_exist">Şablon kimliği zaten var!</string>
|
||||||
<string name="app_profile_import_export">İçe aktar/Dışa aktar</string>
|
<string name="app_profile_import_export">İçe aktar/Dışa aktar</string>
|
||||||
<string name="app_profile_import_from_clipboard">Panodan içe aktar</string>
|
<string name="app_profile_import_from_clipboard">Panodan içe aktar</string>
|
||||||
|
|||||||
@@ -5,8 +5,6 @@
|
|||||||
<string name="home_click_to_install">Натисніть щоб встановити</string>
|
<string name="home_click_to_install">Натисніть щоб встановити</string>
|
||||||
<string name="home_working">Працює</string>
|
<string name="home_working">Працює</string>
|
||||||
<string name="home_working_version">Версія: %d</string>
|
<string name="home_working_version">Версія: %d</string>
|
||||||
<string name="home_superuser_count">Суперкористувачі: %d</string>
|
|
||||||
<string name="home_module_count">Модулі: %d</string>
|
|
||||||
<string name="home_unsupported">Не підтримується</string>
|
<string name="home_unsupported">Не підтримується</string>
|
||||||
<string name="home_unsupported_reason">KernelSU зараз підтримує лише ядра GKI.</string>
|
<string name="home_unsupported_reason">KernelSU зараз підтримує лише ядра GKI.</string>
|
||||||
<string name="home_kernel">Версія ядра</string>
|
<string name="home_kernel">Версія ядра</string>
|
||||||
@@ -56,10 +54,6 @@
|
|||||||
<string name="profile_template">Шаблон</string>
|
<string name="profile_template">Шаблон</string>
|
||||||
<string name="profile_custom">Власний</string>
|
<string name="profile_custom">Власний</string>
|
||||||
<string name="profile_name">Назва профілю</string>
|
<string name="profile_name">Назва профілю</string>
|
||||||
<string name="profile_namespace">Змонтувати простір імен</string>
|
|
||||||
<string name="profile_namespace_inherited">Наслідуваний</string>
|
|
||||||
<string name="profile_namespace_global">Глобальний</string>
|
|
||||||
<string name="profile_namespace_individual">Індивідуальний</string>
|
|
||||||
<string name="profile_groups">Групи</string>
|
<string name="profile_groups">Групи</string>
|
||||||
<string name="profile_capabilities">Можливості</string>
|
<string name="profile_capabilities">Можливості</string>
|
||||||
<string name="profile_selinux_context">Контекст SELinux</string>
|
<string name="profile_selinux_context">Контекст SELinux</string>
|
||||||
@@ -90,7 +84,6 @@
|
|||||||
<string name="app_profile_template_id_invalid">Недійсний ідентифікатор шаблону</string>
|
<string name="app_profile_template_id_invalid">Недійсний ідентифікатор шаблону</string>
|
||||||
<string name="app_profile_template_sync">Синхронізувати мережеві шаблони</string>
|
<string name="app_profile_template_sync">Синхронізувати мережеві шаблони</string>
|
||||||
<string name="app_profile_template_create">Створити шаблон</string>
|
<string name="app_profile_template_create">Створити шаблон</string>
|
||||||
<string name="app_profile_template_readonly">Тільки для читання</string>
|
|
||||||
<string name="app_profile_import_export">Імпорт/Експорт</string>
|
<string name="app_profile_import_export">Імпорт/Експорт</string>
|
||||||
<string name="app_profile_template_save_failed">Помилка при збереженні шаблону</string>
|
<string name="app_profile_template_save_failed">Помилка при збереженні шаблону</string>
|
||||||
<string name="app_profile_template_edit">Редагувати шаблон</string>
|
<string name="app_profile_template_edit">Редагувати шаблон</string>
|
||||||
|
|||||||
@@ -63,19 +63,13 @@
|
|||||||
<string name="safe_mode">Chế độ an toàn</string>
|
<string name="safe_mode">Chế độ an toàn</string>
|
||||||
<string name="reboot_to_apply">Khởi động lại để có hiệu lực</string>
|
<string name="reboot_to_apply">Khởi động lại để có hiệu lực</string>
|
||||||
<string name="home_learn_kernelsu_url">https://kernelsu.org/guide/what-is-kernelsu.html</string>
|
<string name="home_learn_kernelsu_url">https://kernelsu.org/guide/what-is-kernelsu.html</string>
|
||||||
<string name="home_superuser_count">Superusers: %d</string>
|
|
||||||
<string name="home_module_count">Modules: %d</string>
|
|
||||||
<string name="profile_selinux_domain">Tên miền</string>
|
<string name="profile_selinux_domain">Tên miền</string>
|
||||||
<string name="profile_selinux_rules">Quy tắc</string>
|
<string name="profile_selinux_rules">Quy tắc</string>
|
||||||
<string name="launch_app">Khởi chạy</string>
|
<string name="launch_app">Khởi chạy</string>
|
||||||
<string name="restart_app">Khởi động lại</string>
|
<string name="restart_app">Khởi động lại</string>
|
||||||
<string name="profile_namespace">Không gian tên</string>
|
|
||||||
<string name="profile_capabilities">Tính tương thích</string>
|
<string name="profile_capabilities">Tính tương thích</string>
|
||||||
<string name="failed_to_update_sepolicy">Cập nhật quy tắc SELinux cho %s thất bại</string>
|
<string name="failed_to_update_sepolicy">Cập nhật quy tắc SELinux cho %s thất bại</string>
|
||||||
<string name="force_stop_app">Buộc dừng</string>
|
<string name="force_stop_app">Buộc dừng</string>
|
||||||
<string name="profile_namespace_inherited">Thừa hưởng</string>
|
|
||||||
<string name="profile_namespace_global">Toàn cục</string>
|
|
||||||
<string name="profile_namespace_individual">Riêng biệt</string>
|
|
||||||
<string name="profile_selinux_context">Bối cảnh SELinux</string>
|
<string name="profile_selinux_context">Bối cảnh SELinux</string>
|
||||||
<string name="profile_umount_modules">Umount modules</string>
|
<string name="profile_umount_modules">Umount modules</string>
|
||||||
<string name="require_kernel_version">Phiên bản KernelSU hiện tại %d quá thấp để trình quản lý hoạt động bình thường. Vui lòng cập nhật lên phiên bản %d hoặc cao hơn!</string>
|
<string name="require_kernel_version">Phiên bản KernelSU hiện tại %d quá thấp để trình quản lý hoạt động bình thường. Vui lòng cập nhật lên phiên bản %d hoặc cao hơn!</string>
|
||||||
@@ -100,7 +94,6 @@
|
|||||||
<string name="app_profile_template_delete">Xóa</string>
|
<string name="app_profile_template_delete">Xóa</string>
|
||||||
<string name="app_profile_template_import_empty">Bộ nhớ tạm đang trống!</string>
|
<string name="app_profile_template_import_empty">Bộ nhớ tạm đang trống!</string>
|
||||||
<string name="app_profile_template_view">Xem mẫu</string>
|
<string name="app_profile_template_view">Xem mẫu</string>
|
||||||
<string name="app_profile_template_readonly">Chỉ đọc</string>
|
|
||||||
<string name="app_profile_template_id">ID</string>
|
<string name="app_profile_template_id">ID</string>
|
||||||
<string name="enable_web_debugging">Gỡ lỗi WebView</string>
|
<string name="enable_web_debugging">Gỡ lỗi WebView</string>
|
||||||
<string name="enable_web_debugging_summary">Có thể sử dụng để gỡ lỗi WebUI. Vui lòng chỉ bật khi cần thiết.</string>
|
<string name="enable_web_debugging_summary">Có thể sử dụng để gỡ lỗi WebUI. Vui lòng chỉ bật khi cần thiết.</string>
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
<string name="home_click_to_install">点击安装</string>
|
<string name="home_click_to_install">点击安装</string>
|
||||||
<string name="home_working">工作中</string>
|
<string name="home_working">工作中</string>
|
||||||
<string name="home_working_version">版本:%d</string>
|
<string name="home_working_version">版本:%d</string>
|
||||||
<string name="home_superuser_count">超级用户数:%d</string>
|
|
||||||
<string name="home_unsupported">不支持</string>
|
<string name="home_unsupported">不支持</string>
|
||||||
<string name="home_unsupported_reason">内核上未检测到 KernelSU 驱动程序,内核错误?</string>
|
<string name="home_unsupported_reason">内核上未检测到 KernelSU 驱动程序,内核错误?</string>
|
||||||
<string name="home_kernel">内核版本</string>
|
<string name="home_kernel">内核版本</string>
|
||||||
@@ -47,7 +46,6 @@
|
|||||||
<string name="safe_mode">安全模式</string>
|
<string name="safe_mode">安全模式</string>
|
||||||
<string name="reboot_to_apply">重启生效</string>
|
<string name="reboot_to_apply">重启生效</string>
|
||||||
<string name="module_magisk_conflict">因与 Magisk 有冲突,所有模块不可用!</string>
|
<string name="module_magisk_conflict">因与 Magisk 有冲突,所有模块不可用!</string>
|
||||||
<string name="home_module_count">模块数:%d</string>
|
|
||||||
<string name="home_learn_kernelsu">了解 KernelSU</string>
|
<string name="home_learn_kernelsu">了解 KernelSU</string>
|
||||||
<string name="home_learn_kernelsu_url">https://kernelsu.org/zh_CN/guide/what-is-kernelsu.html</string>
|
<string name="home_learn_kernelsu_url">https://kernelsu.org/zh_CN/guide/what-is-kernelsu.html</string>
|
||||||
<string name="home_click_to_learn_kernelsu">了解如何安装 KernelSU 以及如何开发模块</string>
|
<string name="home_click_to_learn_kernelsu">了解如何安装 KernelSU 以及如何开发模块</string>
|
||||||
@@ -58,10 +56,6 @@
|
|||||||
<string name="profile_template">模版</string>
|
<string name="profile_template">模版</string>
|
||||||
<string name="profile_custom">自定义</string>
|
<string name="profile_custom">自定义</string>
|
||||||
<string name="profile_name">名称</string>
|
<string name="profile_name">名称</string>
|
||||||
<string name="profile_namespace">命名空间</string>
|
|
||||||
<string name="profile_namespace_inherited">继承</string>
|
|
||||||
<string name="profile_namespace_global">全局</string>
|
|
||||||
<string name="profile_namespace_individual">私有</string>
|
|
||||||
<string name="profile_groups">组</string>
|
<string name="profile_groups">组</string>
|
||||||
<string name="profile_capabilities">权能</string>
|
<string name="profile_capabilities">权能</string>
|
||||||
<string name="profile_selinux_context">SELinux</string>
|
<string name="profile_selinux_context">SELinux</string>
|
||||||
@@ -94,7 +88,6 @@
|
|||||||
<string name="app_profile_template_save">保存</string>
|
<string name="app_profile_template_save">保存</string>
|
||||||
<string name="app_profile_template_delete">删除</string>
|
<string name="app_profile_template_delete">删除</string>
|
||||||
<string name="app_profile_template_view">查看模版</string>
|
<string name="app_profile_template_view">查看模版</string>
|
||||||
<string name="app_profile_template_readonly">只读</string>
|
|
||||||
<string name="app_profile_template_id_exist">模版 ID 已存在!</string>
|
<string name="app_profile_template_id_exist">模版 ID 已存在!</string>
|
||||||
<string name="app_profile_import_export">导入/导出</string>
|
<string name="app_profile_import_export">导入/导出</string>
|
||||||
<string name="app_profile_import_from_clipboard">从剪切板导入</string>
|
<string name="app_profile_import_from_clipboard">从剪切板导入</string>
|
||||||
@@ -193,7 +186,6 @@
|
|||||||
<string name="log_viewer_search">搜索</string>
|
<string name="log_viewer_search">搜索</string>
|
||||||
<string name="log_viewer_clear_logs">清空日志</string>
|
<string name="log_viewer_clear_logs">清空日志</string>
|
||||||
<string name="log_viewer_clear_logs_confirm">确定要清空选中的日志文件吗?此操作无法撤销。</string>
|
<string name="log_viewer_clear_logs_confirm">确定要清空选中的日志文件吗?此操作无法撤销。</string>
|
||||||
<string name="log_viewer_logs_cleared">日志清空成功</string>
|
|
||||||
<string name="log_viewer_filter_type">按类型筛选</string>
|
<string name="log_viewer_filter_type">按类型筛选</string>
|
||||||
<string name="log_viewer_all_types">所有类型</string>
|
<string name="log_viewer_all_types">所有类型</string>
|
||||||
<string name="log_viewer_showing_entries">显示 %1$d / %2$d 条记录</string>
|
<string name="log_viewer_showing_entries">显示 %1$d / %2$d 条记录</string>
|
||||||
@@ -202,7 +194,6 @@
|
|||||||
<string name="log_viewer_refresh">刷新</string>
|
<string name="log_viewer_refresh">刷新</string>
|
||||||
<string name="log_viewer_raw_log">原始日志</string>
|
<string name="log_viewer_raw_log">原始日志</string>
|
||||||
<string name="log_viewer_search_placeholder">按 UID、命令或详情搜索…</string>
|
<string name="log_viewer_search_placeholder">按 UID、命令或详情搜索…</string>
|
||||||
<string name="log_viewer_clear_search">清除搜索</string>
|
|
||||||
<string name="log_viewer_view_logs">查看 KernelSU 超级用户访问日志</string>
|
<string name="log_viewer_view_logs">查看 KernelSU 超级用户访问日志</string>
|
||||||
<string name="log_viewer_exclude_subtypes">排除子类型</string>
|
<string name="log_viewer_exclude_subtypes">排除子类型</string>
|
||||||
<string name="log_viewer_exclude_current_app">当前应用</string>
|
<string name="log_viewer_exclude_current_app">当前应用</string>
|
||||||
@@ -220,7 +211,6 @@
|
|||||||
<string name="enable_dynamic_manager">启用动态管理器</string>
|
<string name="enable_dynamic_manager">启用动态管理器</string>
|
||||||
<string name="signature_size">动态管理器签名大小</string>
|
<string name="signature_size">动态管理器签名大小</string>
|
||||||
<string name="signature_hash">动态管理器签名哈希</string>
|
<string name="signature_hash">动态管理器签名哈希</string>
|
||||||
<string name="hash_must_be_64_chars">哈希必须是 64 个 16 进制字符</string>
|
|
||||||
<string name="dynamic_manager_set_success">动态管理器配置设置成功</string>
|
<string name="dynamic_manager_set_success">动态管理器配置设置成功</string>
|
||||||
<string name="dynamic_manager_set_failed">设置动态管理器配置失败</string>
|
<string name="dynamic_manager_set_failed">设置动态管理器配置失败</string>
|
||||||
<string name="invalid_sign_config">无效的管理器配置</string>
|
<string name="invalid_sign_config">无效的管理器配置</string>
|
||||||
@@ -238,14 +228,12 @@
|
|||||||
<string name="clean_runtime_environment_failed">运行环境清理失败</string>
|
<string name="clean_runtime_environment_failed">运行环境清理失败</string>
|
||||||
<!-- umount Manager -->
|
<!-- umount Manager -->
|
||||||
<string name="umount_path_manager">Umount 路径管理</string>
|
<string name="umount_path_manager">Umount 路径管理</string>
|
||||||
<string name="umount_path_manager_summary">管理内核卸载路径</string>
|
|
||||||
<string name="umount_path_restart_notice">添加或删除路径后需要重启设备才能生效。系统会在下次启动时应用新的配置。</string>
|
<string name="umount_path_restart_notice">添加或删除路径后需要重启设备才能生效。系统会在下次启动时应用新的配置。</string>
|
||||||
<string name="add_umount_path">添加 Umount 路径</string>
|
<string name="add_umount_path">添加 Umount 路径</string>
|
||||||
<string name="mount_path">挂载路径</string>
|
<string name="mount_path">挂载路径</string>
|
||||||
<string name="umount_flags">卸载标志</string>
|
<string name="umount_flags">卸载标志</string>
|
||||||
<string name="umount_flags_hint">0=正常卸载, 8=MNT_DETACH, -1=自动</string>
|
<string name="umount_flags_hint">0=正常卸载, 8=MNT_DETACH, -1=自动</string>
|
||||||
<string name="flags">标志</string>
|
<string name="flags">标志</string>
|
||||||
<string name="default_entry">默认条目</string>
|
|
||||||
<string name="confirm_delete">确认删除</string>
|
<string name="confirm_delete">确认删除</string>
|
||||||
<string name="confirm_delete_umount_path">确定要删除路径 %s 吗?</string>
|
<string name="confirm_delete_umount_path">确定要删除路径 %s 吗?</string>
|
||||||
<string name="umount_path_added">路径已添加,重启后生效</string>
|
<string name="umount_path_added">路径已添加,重启后生效</string>
|
||||||
@@ -260,9 +248,6 @@
|
|||||||
<!-- Personalization Settings -->
|
<!-- Personalization Settings -->
|
||||||
<string name="personalization">个性化</string>
|
<string name="personalization">个性化</string>
|
||||||
<string name="personalization_summary">自定义应用外观和主题</string>
|
<string name="personalization_summary">自定义应用外观和主题</string>
|
||||||
<string name="theme_settings">主题设置</string>
|
|
||||||
<string name="theme_mode">主题模式</string>
|
|
||||||
<string name="theme_mode_summary">选择应用的显示主题</string>
|
|
||||||
<!-- Kernel Flash Progress Related -->
|
<!-- Kernel Flash Progress Related -->
|
||||||
<string name="horizon_flash_complete">刷入完成</string>
|
<string name="horizon_flash_complete">刷入完成</string>
|
||||||
<string name="horizon_preparing">准备中…</string>
|
<string name="horizon_preparing">准备中…</string>
|
||||||
@@ -284,20 +269,14 @@
|
|||||||
<string name="horizon_copy_failed">复制失败</string>
|
<string name="horizon_copy_failed">复制失败</string>
|
||||||
<string name="horizon_unknown_error">未知错误</string>
|
<string name="horizon_unknown_error">未知错误</string>
|
||||||
<string name="flash_failed_message">刷入失败</string>
|
<string name="flash_failed_message">刷入失败</string>
|
||||||
<string name="Lkm_install_methods">LKM 修复/安装</string>
|
|
||||||
<string name="GKI_install_methods">刷入 AnyKernel3</string>
|
|
||||||
<string name="kernel_version_log">内核版本:%1$s</string>
|
<string name="kernel_version_log">内核版本:%1$s</string>
|
||||||
<string name="tool_version_log">使用的修补工具:%1$s</string>
|
<string name="tool_version_log">使用的修补工具:%1$s</string>
|
||||||
<string name="configuration">配置</string>
|
|
||||||
<string name="app_settings">应用程序设置</string>
|
|
||||||
<string name="tools">工具</string>
|
<string name="tools">工具</string>
|
||||||
<string name="root_required">需要root权限</string>
|
<string name="root_required">需要root权限</string>
|
||||||
<string name="kpm_patch_options">KPM 补丁</string>
|
<string name="kpm_patch_options">KPM 补丁</string>
|
||||||
<string name="kpm_patch_description">用于添加额外的KPM功能</string>
|
<string name="kpm_patch_description">用于添加额外的KPM功能</string>
|
||||||
<string name="enable_kpm_patch">KPM 补丁</string>
|
<string name="enable_kpm_patch">KPM 补丁</string>
|
||||||
<string name="kpm_patch_switch_description">在刷入前对内核镜像应用KPM补丁</string>
|
|
||||||
<string name="enable_kpm_undo_patch">KPM 撤销补丁</string>
|
<string name="enable_kpm_undo_patch">KPM 撤销补丁</string>
|
||||||
<string name="kpm_undo_patch_switch_description">撤销之前应用的KPM补丁</string>
|
|
||||||
<string name="kpm_patch_enabled">KPM 补丁已启用</string>
|
<string name="kpm_patch_enabled">KPM 补丁已启用</string>
|
||||||
<string name="kpm_undo_patch_enabled">KPM 撤销补丁已启用</string>
|
<string name="kpm_undo_patch_enabled">KPM 撤销补丁已启用</string>
|
||||||
<string name="kpm_patch_mode">KPM 补丁模式</string>
|
<string name="kpm_patch_mode">KPM 补丁模式</string>
|
||||||
@@ -315,7 +294,6 @@
|
|||||||
<string name="kpm_undo_patch_failed">KPM 撤销补丁失败</string>
|
<string name="kpm_undo_patch_failed">KPM 撤销补丁失败</string>
|
||||||
<string name="kpm_patch_operation_failed">KPM 补丁操作失败: %s</string>
|
<string name="kpm_patch_operation_failed">KPM 补丁操作失败: %s</string>
|
||||||
<string name="kpm_follow_kernel_file">跟随内核</string>
|
<string name="kpm_follow_kernel_file">跟随内核</string>
|
||||||
<string name="kpm_follow_kernel_description">原样使用内核,不进行任何KPM修改</string>
|
|
||||||
<string name="kernel_flashing">内核刷入</string>
|
<string name="kernel_flashing">内核刷入</string>
|
||||||
<string name="horizon_kernel">AnyKernel3 内核</string>
|
<string name="horizon_kernel">AnyKernel3 内核</string>
|
||||||
<string name="horizon_kernel_summary">刷入AnyKernel3格式的内核zip包</string>
|
<string name="horizon_kernel_summary">刷入AnyKernel3格式的内核zip包</string>
|
||||||
@@ -331,18 +309,11 @@
|
|||||||
<string name="kpm_install_failed">kpm 模块加载失败</string>
|
<string name="kpm_install_failed">kpm 模块加载失败</string>
|
||||||
<string name="kpm_args">参数</string>
|
<string name="kpm_args">参数</string>
|
||||||
<string name="kpm_control">执行</string>
|
<string name="kpm_control">执行</string>
|
||||||
<string name="home_kpm_version">KPM 版本</string>
|
|
||||||
<string name="close_notice">关闭</string>
|
<string name="close_notice">关闭</string>
|
||||||
<string name="kernel_module_notice">以下内核模块功能由 KernelPatch 开发,并经过修改后加入了 SukiSU Ultra 的内核模块功能</string>
|
<string name="kernel_module_notice">以下内核模块功能由 KernelPatch 开发,并经过修改后加入了 SukiSU Ultra 的内核模块功能</string>
|
||||||
<string name="home_ContributionCard_kernelsu">SukiSU Ultra 期待</string>
|
|
||||||
<string name="kpm_control_success">成功</string>
|
<string name="kpm_control_success">成功</string>
|
||||||
<string name="kpm_control_failed">失败</string>
|
<string name="kpm_control_failed">失败</string>
|
||||||
<string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra 在未来将是 KSU 的相对独立分支,但我们仍然感谢官方 KernelSU 和 MKSU 等的贡献!</string>
|
|
||||||
<string name="not_supported">不支持</string>
|
<string name="not_supported">不支持</string>
|
||||||
<string name="supported">支持</string>
|
|
||||||
<string name="kernel_patched">内核未修补</string>
|
|
||||||
<string name="kernel_not_enabled">内核未配置</string>
|
|
||||||
<string name="custom_settings">自定义设置</string>
|
|
||||||
<string name="kpm_install_mode">KPM 安装</string>
|
<string name="kpm_install_mode">KPM 安装</string>
|
||||||
<string name="kpm_install_mode_load">加载</string>
|
<string name="kpm_install_mode_load">加载</string>
|
||||||
<string name="kpm_install_mode_embed">嵌入</string>
|
<string name="kpm_install_mode_embed">嵌入</string>
|
||||||
@@ -381,22 +352,17 @@
|
|||||||
<string name="susfs_config_description">配置说明</string>
|
<string name="susfs_config_description">配置说明</string>
|
||||||
<string name="susfs_config_description_text">此功能允许您自定义 SuSFS 的 uname 值和构建时间伪装。输入您想要设置的值,点击应用即可生效</string>
|
<string name="susfs_config_description_text">此功能允许您自定义 SuSFS 的 uname 值和构建时间伪装。输入您想要设置的值,点击应用即可生效</string>
|
||||||
<string name="susfs_uname_label">Uname 值</string>
|
<string name="susfs_uname_label">Uname 值</string>
|
||||||
<string name="susfs_uname_placeholder">请输入自定义 uname 值</string>
|
|
||||||
<string name="susfs_build_time_label">构建时间伪装</string>
|
<string name="susfs_build_time_label">构建时间伪装</string>
|
||||||
<string name="susfs_build_time_placeholder">请输入构建时间伪装值</string>
|
|
||||||
<string name="susfs_current_value">当前值: %s</string>
|
<string name="susfs_current_value">当前值: %s</string>
|
||||||
<string name="susfs_current_build_time">当前构建时间: %s</string>
|
<string name="susfs_current_build_time">当前构建时间: %s</string>
|
||||||
<string name="susfs_reset_to_default">重置为默认值</string>
|
|
||||||
<string name="susfs_apply">应用</string>
|
<string name="susfs_apply">应用</string>
|
||||||
<!-- SuSFS Reset Confirmation -->
|
<!-- SuSFS Reset Confirmation -->
|
||||||
<string name="susfs_reset_confirm_title">确认重置</string>
|
<string name="susfs_reset_confirm_title">确认重置</string>
|
||||||
<!-- 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>
|
||||||
<string name="susfs_command_error">执行 SuSFS 命令时出错: %s</string>
|
|
||||||
<string name="susfs_uname_set_success" formatted="false">SuSFS 内核名称和构建时间设置成功: %s, %s</string>
|
<string name="susfs_uname_set_success" formatted="false">SuSFS 内核名称和构建时间设置成功: %s, %s</string>
|
||||||
<!-- SuSFS Settings Item -->
|
<!-- SuSFS Settings Item -->
|
||||||
<string name="susfs_config_setting_title">SuSFS 配置</string>
|
|
||||||
<!-- 开机自启动相关 -->
|
<!-- 开机自启动相关 -->
|
||||||
<string name="susfs_autostart_title">开机自启动</string>
|
<string name="susfs_autostart_title">开机自启动</string>
|
||||||
<string name="susfs_autostart_description">重启时自动应用所有非默认配置</string>
|
<string name="susfs_autostart_description">重启时自动应用所有非默认配置</string>
|
||||||
@@ -420,7 +386,6 @@
|
|||||||
<string name="susfs_path_not_found_error">路径未找到错误</string>
|
<string name="susfs_path_not_found_error">路径未找到错误</string>
|
||||||
<string name="susfs_path_label">路径</string>
|
<string name="susfs_path_label">路径</string>
|
||||||
<string name="susfs_mount_path_label">挂载路径</string>
|
<string name="susfs_mount_path_label">挂载路径</string>
|
||||||
<string name="susfs_path_placeholder">例如: /system/addon.d</string>
|
|
||||||
<string name="susfs_no_paths_configured">暂无 SuS 路径配置</string>
|
<string name="susfs_no_paths_configured">暂无 SuS 路径配置</string>
|
||||||
<string name="susfs_no_mounts_configured">暂无 SuS 挂载配置</string>
|
<string name="susfs_no_mounts_configured">暂无 SuS 挂载配置</string>
|
||||||
<string name="susfs_no_umounts_configured">暂无尝试卸载配置</string>
|
<string name="susfs_no_umounts_configured">暂无尝试卸载配置</string>
|
||||||
@@ -445,8 +410,6 @@
|
|||||||
<!-- 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>
|
||||||
<string name="susfs_sdcard_path_label">SDCard 路径</string>
|
<string name="susfs_sdcard_path_label">SDCard 路径</string>
|
||||||
<string name="susfs_set_android_data_path">设置 Android Data 路径</string>
|
|
||||||
<string name="susfs_set_sdcard_path">设置 SDCard 路径</string>
|
|
||||||
<!-- SuSFS Enabled Features -->
|
<!-- SuSFS Enabled Features -->
|
||||||
<string name="susfs_enabled_features_description">显示当前 SuSFS 启用的功能状态</string>
|
<string name="susfs_enabled_features_description">显示当前 SuSFS 启用的功能状态</string>
|
||||||
<string name="susfs_no_features_found">未找到功能状态信息</string>
|
<string name="susfs_no_features_found">未找到功能状态信息</string>
|
||||||
@@ -460,12 +423,9 @@
|
|||||||
<string name="spoof_cmdline_feature_label">欺骗 Cmdline/Bootconfig</string>
|
<string name="spoof_cmdline_feature_label">欺骗 Cmdline/Bootconfig</string>
|
||||||
<string name="open_redirect_feature_label">开放重定向支持</string>
|
<string name="open_redirect_feature_label">开放重定向支持</string>
|
||||||
<string name="enable_log_feature_label">日志记录支持</string>
|
<string name="enable_log_feature_label">日志记录支持</string>
|
||||||
<string name="auto_default_mount_feature_label">自动默认挂载</string>
|
|
||||||
<string name="auto_bind_mount_feature_label">自动绑定挂载</string>
|
|
||||||
<string name="auto_try_umount_bind_feature_label">自动尝试卸载绑定挂载</string>
|
<string name="auto_try_umount_bind_feature_label">自动尝试卸载绑定挂载</string>
|
||||||
<string name="hide_symbols_feature_label">隐藏 KSU SuSFS 符号</string>
|
<string name="hide_symbols_feature_label">隐藏 KSU SuSFS 符号</string>
|
||||||
<string name="sus_kstat_feature_label">SuS Kstat 支持</string>
|
<string name="sus_kstat_feature_label">SuS Kstat 支持</string>
|
||||||
<string name="sus_su_feature_label">SuS SU 模式切换功能</string>
|
|
||||||
<!-- 可切换状态 -->
|
<!-- 可切换状态 -->
|
||||||
<string name="susfs_feature_configurable">可配置的 SuSFS 功能</string>
|
<string name="susfs_feature_configurable">可配置的 SuSFS 功能</string>
|
||||||
<string name="susfs_enable_log_label">SuSFS 启用日志</string>
|
<string name="susfs_enable_log_label">SuSFS 启用日志</string>
|
||||||
@@ -477,8 +437,6 @@
|
|||||||
<string name="susfs_current_execution_location">当前执行位置:%s</string>
|
<string name="susfs_current_execution_location">当前执行位置:%s</string>
|
||||||
<string name="susfs_execution_location_service">Service</string>
|
<string name="susfs_execution_location_service">Service</string>
|
||||||
<string name="susfs_execution_location_post_fs_data">Post-FS-Data</string>
|
<string name="susfs_execution_location_post_fs_data">Post-FS-Data</string>
|
||||||
<string name="susfs_execution_location_service_description">在系统服务启动后执行</string>
|
|
||||||
<string name="susfs_execution_location_post_fs_data_description">在文件系统挂载后但系统完全启动前执行,可能会导致循环重启</string>
|
|
||||||
<string name="susfs_slot_info_title">槽位信息</string>
|
<string name="susfs_slot_info_title">槽位信息</string>
|
||||||
<string name="susfs_slot_info_description">查看当前启动槽位信息并复制数值</string>
|
<string name="susfs_slot_info_description">查看当前启动槽位信息并复制数值</string>
|
||||||
<string name="susfs_current_active_slot">当前活动槽位:%s</string>
|
<string name="susfs_current_active_slot">当前活动槽位:%s</string>
|
||||||
@@ -572,10 +530,7 @@
|
|||||||
<string name="app_paths_section">应用路径</string>
|
<string name="app_paths_section">应用路径</string>
|
||||||
<string name="other_paths_section">其他路径</string>
|
<string name="other_paths_section">其他路径</string>
|
||||||
<string name="add_custom_path">其他</string>
|
<string name="add_custom_path">其他</string>
|
||||||
<string name="add_app_path">应用</string>
|
|
||||||
<string name="susfs_add_app_path">添加应用路径</string>
|
<string name="susfs_add_app_path">添加应用路径</string>
|
||||||
<string name="susfs_version_mismatch">SuSFS 库版本不匹配,内核:%1$s vs 管理器:%2$s,建议更新内核或管理器</string>
|
|
||||||
<string name="warning">警告</string>
|
|
||||||
<string name="search_apps">搜索应用</string>
|
<string name="search_apps">搜索应用</string>
|
||||||
<string name="selected_apps_count">%1$d 个已选应用</string>
|
<string name="selected_apps_count">%1$d 个已选应用</string>
|
||||||
<string name="already_added_apps_count">%1$d 个已添加应用</string>
|
<string name="already_added_apps_count">%1$d 个已添加应用</string>
|
||||||
@@ -592,7 +547,6 @@
|
|||||||
<string name="susfs_reset_loop_paths_title">重置循环路径</string>
|
<string name="susfs_reset_loop_paths_title">重置循环路径</string>
|
||||||
<string name="susfs_reset_loop_paths_message">确定要清空所有 SuS 循环路径吗?此操作无法撤销。</string>
|
<string name="susfs_reset_loop_paths_message">确定要清空所有 SuS 循环路径吗?此操作无法撤销。</string>
|
||||||
<string name="susfs_loop_path_label">循环路径</string>
|
<string name="susfs_loop_path_label">循环路径</string>
|
||||||
<string name="susfs_loop_path_placeholder">/data/example/path</string>
|
|
||||||
<string name="susfs_loop_path_restriction_warning">注意:只有不在 /storage/ 和 /sdcard/ 内的路径才能通过循环路径添加。</string>
|
<string name="susfs_loop_path_restriction_warning">注意:只有不在 /storage/ 和 /sdcard/ 内的路径才能通过循环路径添加。</string>
|
||||||
<string name="susfs_loop_path_invalid_location">错误:循环路径不能位于 /storage/ 或 /sdcard/ 目录内</string>
|
<string name="susfs_loop_path_invalid_location">错误:循环路径不能位于 /storage/ 或 /sdcard/ 目录内</string>
|
||||||
<string name="loop_paths_section">循环路径</string>
|
<string name="loop_paths_section">循环路径</string>
|
||||||
@@ -604,11 +558,9 @@
|
|||||||
<string name="avc_log_spoofing_enabled">AVC 日志欺骗已启用</string>
|
<string name="avc_log_spoofing_enabled">AVC 日志欺骗已启用</string>
|
||||||
<string name="avc_log_spoofing_disabled">AVC 日志欺骗已禁用</string>
|
<string name="avc_log_spoofing_disabled">AVC 日志欺骗已禁用</string>
|
||||||
<string name="avc_log_spoofing_description">禁用: 禁用在内核 AVC 日志中欺骗 \'su\' 的 sus tcontext。\n启用: 启用在内核 AVC 日志中将 \'su\' 的 sus tcontext 欺骗为 \'kernel\'</string>
|
<string name="avc_log_spoofing_description">禁用: 禁用在内核 AVC 日志中欺骗 \'su\' 的 sus tcontext。\n启用: 启用在内核 AVC 日志中将 \'su\' 的 sus tcontext 欺骗为 \'kernel\'</string>
|
||||||
<string name="avc_log_spoofing_warning">重要提示:\n- 内核中默认设置为 \'0\'\n- 启用此功能有时会使开发人员在调试权限或 SELinux 问题时难以识别原因,因此建议用户在调试时禁用此功能。</string>
|
|
||||||
<!-- SUS Map related strings -->
|
<!-- SUS Map related strings -->
|
||||||
<string name="susfs_tab_sus_maps">SUS映射</string>
|
<string name="susfs_tab_sus_maps">SUS映射</string>
|
||||||
<string name="susfs_sus_map_label">库文件路径</string>
|
<string name="susfs_sus_map_label">库文件路径</string>
|
||||||
<string name="susfs_sus_map_placeholder">/data/adb/modules/my_module/zygisk/arm64-v8a.so</string>
|
|
||||||
<string name="susfs_add_sus_map">添加SUS映射</string>
|
<string name="susfs_add_sus_map">添加SUS映射</string>
|
||||||
<string name="susfs_edit_sus_map">编辑SUS映射</string>
|
<string name="susfs_edit_sus_map">编辑SUS映射</string>
|
||||||
<string name="susfs_sus_map_added_success">SUS映射添加成功: %1$s</string>
|
<string name="susfs_sus_map_added_success">SUS映射添加成功: %1$s</string>
|
||||||
|
|||||||
@@ -5,8 +5,6 @@
|
|||||||
<string name="home_click_to_install">按一下以安裝</string>
|
<string name="home_click_to_install">按一下以安裝</string>
|
||||||
<string name="home_working">運作中</string>
|
<string name="home_working">運作中</string>
|
||||||
<string name="home_working_version">KernelSU 版本:%d</string>
|
<string name="home_working_version">KernelSU 版本:%d</string>
|
||||||
<string name="home_superuser_count">超級使用者:%d 個</string>
|
|
||||||
<string name="home_module_count">已安裝模組:%d 個</string>
|
|
||||||
<string name="home_unsupported">不支援</string>
|
<string name="home_unsupported">不支援</string>
|
||||||
<string name="home_unsupported_reason">KernelSU 現在僅支援 GKI 核心</string>
|
<string name="home_unsupported_reason">KernelSU 現在僅支援 GKI 核心</string>
|
||||||
<string name="home_kernel">核心</string>
|
<string name="home_kernel">核心</string>
|
||||||
@@ -54,8 +52,6 @@
|
|||||||
<string name="profile_default">預設</string>
|
<string name="profile_default">預設</string>
|
||||||
<string name="profile_name">設定檔名稱</string>
|
<string name="profile_name">設定檔名稱</string>
|
||||||
<string name="profile_template">範本</string>
|
<string name="profile_template">範本</string>
|
||||||
<string name="profile_namespace_inherited">繼承</string>
|
|
||||||
<string name="profile_namespace_global">全域</string>
|
|
||||||
<string name="profile_capabilities">功能</string>
|
<string name="profile_capabilities">功能</string>
|
||||||
<string name="profile_umount_modules">卸載模組</string>
|
<string name="profile_umount_modules">卸載模組</string>
|
||||||
<string name="failed_to_update_app_profile">無法更新 %s 應用程式設定檔</string>
|
<string name="failed_to_update_app_profile">無法更新 %s 應用程式設定檔</string>
|
||||||
@@ -66,8 +62,6 @@
|
|||||||
<string name="profile_selinux_domain">網域</string>
|
<string name="profile_selinux_domain">網域</string>
|
||||||
<string name="module_update">更新</string>
|
<string name="module_update">更新</string>
|
||||||
<string name="profile_custom">自訂</string>
|
<string name="profile_custom">自訂</string>
|
||||||
<string name="profile_namespace">掛載命名空間</string>
|
|
||||||
<string name="profile_namespace_individual">個人</string>
|
|
||||||
<string name="profile_groups">群組</string>
|
<string name="profile_groups">群組</string>
|
||||||
<string name="profile_selinux_context">SELinux 環境</string>
|
<string name="profile_selinux_context">SELinux 環境</string>
|
||||||
<string name="settings_umount_modules_default">預設解除安裝模組</string>
|
<string name="settings_umount_modules_default">預設解除安裝模組</string>
|
||||||
@@ -89,7 +83,6 @@
|
|||||||
<string name="app_profile_template_id_invalid">模板 ID 無效</string>
|
<string name="app_profile_template_id_invalid">模板 ID 無效</string>
|
||||||
<string name="app_profile_template_sync">同步在線規則</string>
|
<string name="app_profile_template_sync">同步在線規則</string>
|
||||||
<string name="app_profile_template_create">創建模板</string>
|
<string name="app_profile_template_create">創建模板</string>
|
||||||
<string name="app_profile_template_readonly">只讀</string>
|
|
||||||
<string name="app_profile_import_export">匯出 / 匯入</string>
|
<string name="app_profile_import_export">匯出 / 匯入</string>
|
||||||
<string name="app_profile_template_save_failed">模板儲存失敗</string>
|
<string name="app_profile_template_save_failed">模板儲存失敗</string>
|
||||||
<string name="app_profile_template_edit">編輯模板</string>
|
<string name="app_profile_template_edit">編輯模板</string>
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
<string name="home_click_to_install">點選開始安裝</string>
|
<string name="home_click_to_install">點選開始安裝</string>
|
||||||
<string name="home_working">已開始運作</string>
|
<string name="home_working">已開始運作</string>
|
||||||
<string name="home_working_version">版本:%d</string>
|
<string name="home_working_version">版本:%d</string>
|
||||||
<string name="home_superuser_count">授權:%d 個應用程式</string>
|
|
||||||
<string name="home_unsupported">未受支援</string>
|
<string name="home_unsupported">未受支援</string>
|
||||||
<string name="home_unsupported_reason">KernelSU 目前僅支援 GKI 核心</string>
|
<string name="home_unsupported_reason">KernelSU 目前僅支援 GKI 核心</string>
|
||||||
<string name="home_kernel">核心版本</string>
|
<string name="home_kernel">核心版本</string>
|
||||||
@@ -44,7 +43,6 @@
|
|||||||
<string name="safe_mode">安全模式</string>
|
<string name="safe_mode">安全模式</string>
|
||||||
<string name="reboot_to_apply">將在重新啟動時生效</string>
|
<string name="reboot_to_apply">將在重新啟動時生效</string>
|
||||||
<string name="module_magisk_conflict">與 Magisk 發生衝突,無法使用模組功能!</string>
|
<string name="module_magisk_conflict">與 Magisk 發生衝突,無法使用模組功能!</string>
|
||||||
<string name="home_module_count">掛載:%d 個模組</string>
|
|
||||||
<string name="home_learn_kernelsu">深入瞭解 KernelSU</string>
|
<string name="home_learn_kernelsu">深入瞭解 KernelSU</string>
|
||||||
<string name="home_learn_kernelsu_url">https://kernelsu.org/zh_TW/guide/what-is-kernelsu.html</string>
|
<string name="home_learn_kernelsu_url">https://kernelsu.org/zh_TW/guide/what-is-kernelsu.html</string>
|
||||||
<string name="home_click_to_learn_kernelsu">知曉安裝、使用 KernelSU 本體與其模組功能的方法</string>
|
<string name="home_click_to_learn_kernelsu">知曉安裝、使用 KernelSU 本體與其模組功能的方法</string>
|
||||||
@@ -65,10 +63,6 @@
|
|||||||
<string name="restart_app">重新執行</string>
|
<string name="restart_app">重新執行</string>
|
||||||
<string name="profile_template">範本</string>
|
<string name="profile_template">範本</string>
|
||||||
<string name="profile_name">Profile 名稱</string>
|
<string name="profile_name">Profile 名稱</string>
|
||||||
<string name="profile_namespace">命名空間掛載</string>
|
|
||||||
<string name="profile_namespace_inherited">繼承</string>
|
|
||||||
<string name="profile_namespace_global">全域</string>
|
|
||||||
<string name="profile_namespace_individual">個體</string>
|
|
||||||
<string name="profile_groups">群組</string>
|
<string name="profile_groups">群組</string>
|
||||||
<string name="profile_selinux_context">SELinux 上下文</string>
|
<string name="profile_selinux_context">SELinux 上下文</string>
|
||||||
<string name="profile_selinux_domain">定域</string>
|
<string name="profile_selinux_domain">定域</string>
|
||||||
@@ -93,7 +87,6 @@
|
|||||||
<string name="module_changelog_failed">無法取得更新說明:%s</string>
|
<string name="module_changelog_failed">無法取得更新說明:%s</string>
|
||||||
<string name="app_profile_template_name">名稱</string>
|
<string name="app_profile_template_name">名稱</string>
|
||||||
<string name="app_profile_template_sync">同步線上範本</string>
|
<string name="app_profile_template_sync">同步線上範本</string>
|
||||||
<string name="app_profile_template_readonly">唯讀</string>
|
|
||||||
<string name="app_profile_import_export">匯入/匯出</string>
|
<string name="app_profile_import_export">匯入/匯出</string>
|
||||||
<string name="app_profile_template_save_failed">無法儲存範本</string>
|
<string name="app_profile_template_save_failed">無法儲存範本</string>
|
||||||
<string name="app_profile_template_description">說明</string>
|
<string name="app_profile_template_description">說明</string>
|
||||||
|
|||||||
@@ -6,8 +6,6 @@
|
|||||||
<string name="home_click_to_install">Click to install</string>
|
<string name="home_click_to_install">Click to install</string>
|
||||||
<string name="home_working">Working</string>
|
<string name="home_working">Working</string>
|
||||||
<string name="home_working_version">Version: %d</string>
|
<string name="home_working_version">Version: %d</string>
|
||||||
<string name="home_superuser_count">Superusers: %d</string>
|
|
||||||
<string name="home_module_count">Modules: %d</string>
|
|
||||||
<string name="home_unsupported">Unsupported</string>
|
<string name="home_unsupported">Unsupported</string>
|
||||||
<string name="home_unsupported_reason">No KernelSU driver detected on your kernel, wrong kernel?</string>
|
<string name="home_unsupported_reason">No KernelSU driver detected on your kernel, wrong kernel?</string>
|
||||||
<string name="home_kernel">Kernel version</string>
|
<string name="home_kernel">Kernel version</string>
|
||||||
@@ -62,10 +60,6 @@
|
|||||||
<string name="profile_template">Template</string>
|
<string name="profile_template">Template</string>
|
||||||
<string name="profile_custom">Custom</string>
|
<string name="profile_custom">Custom</string>
|
||||||
<string name="profile_name">Profile name</string>
|
<string name="profile_name">Profile name</string>
|
||||||
<string name="profile_namespace">Mount namespace</string>
|
|
||||||
<string name="profile_namespace_inherited">Inherited</string>
|
|
||||||
<string name="profile_namespace_global">Global</string>
|
|
||||||
<string name="profile_namespace_individual">Individual</string>
|
|
||||||
<string name="profile_groups">Groups</string>
|
<string name="profile_groups">Groups</string>
|
||||||
<string name="profile_capabilities">Capabilities</string>
|
<string name="profile_capabilities">Capabilities</string>
|
||||||
<string name="profile_selinux_context">SELinux context</string>
|
<string name="profile_selinux_context">SELinux context</string>
|
||||||
@@ -98,7 +92,6 @@
|
|||||||
<string name="app_profile_template_save">Save</string>
|
<string name="app_profile_template_save">Save</string>
|
||||||
<string name="app_profile_template_delete">Delete</string>
|
<string name="app_profile_template_delete">Delete</string>
|
||||||
<string name="app_profile_template_view">View template</string>
|
<string name="app_profile_template_view">View template</string>
|
||||||
<string name="app_profile_template_readonly">Read only</string>
|
|
||||||
<string name="app_profile_template_id_exist">Template ID already exists!</string>
|
<string name="app_profile_template_id_exist">Template ID already exists!</string>
|
||||||
<string name="app_profile_import_export">Import/Export</string>
|
<string name="app_profile_import_export">Import/Export</string>
|
||||||
<string name="app_profile_import_from_clipboard">Import from clipboard</string>
|
<string name="app_profile_import_from_clipboard">Import from clipboard</string>
|
||||||
@@ -198,7 +191,6 @@
|
|||||||
<string name="log_viewer_search">Search</string>
|
<string name="log_viewer_search">Search</string>
|
||||||
<string name="log_viewer_clear_logs">Clear Logs</string>
|
<string name="log_viewer_clear_logs">Clear Logs</string>
|
||||||
<string name="log_viewer_clear_logs_confirm">Are you sure you want to clear the selected log file? This action cannot be undone.</string>
|
<string name="log_viewer_clear_logs_confirm">Are you sure you want to clear the selected log file? This action cannot be undone.</string>
|
||||||
<string name="log_viewer_logs_cleared">Logs cleared successfully</string>
|
|
||||||
<string name="log_viewer_filter_type">Filter by Type</string>
|
<string name="log_viewer_filter_type">Filter by Type</string>
|
||||||
<string name="log_viewer_all_types">All Types</string>
|
<string name="log_viewer_all_types">All Types</string>
|
||||||
<string name="log_viewer_showing_entries">Showing %1$d of %2$d entries</string>
|
<string name="log_viewer_showing_entries">Showing %1$d of %2$d entries</string>
|
||||||
@@ -207,7 +199,6 @@
|
|||||||
<string name="log_viewer_refresh">Refresh</string>
|
<string name="log_viewer_refresh">Refresh</string>
|
||||||
<string name="log_viewer_raw_log">Raw Log</string>
|
<string name="log_viewer_raw_log">Raw Log</string>
|
||||||
<string name="log_viewer_search_placeholder">Search by UID, command, or details…</string>
|
<string name="log_viewer_search_placeholder">Search by UID, command, or details…</string>
|
||||||
<string name="log_viewer_clear_search">Clear search</string>
|
|
||||||
<string name="log_viewer_view_logs">View KernelSU superuser access logs</string>
|
<string name="log_viewer_view_logs">View KernelSU superuser access logs</string>
|
||||||
<string name="log_viewer_exclude_subtypes">Exclude sub-types</string>
|
<string name="log_viewer_exclude_subtypes">Exclude sub-types</string>
|
||||||
<string name="log_viewer_exclude_current_app">Current App</string>
|
<string name="log_viewer_exclude_current_app">Current App</string>
|
||||||
@@ -225,7 +216,6 @@
|
|||||||
<string name="enable_dynamic_manager">Enable Dynamic Manager</string>
|
<string name="enable_dynamic_manager">Enable Dynamic Manager</string>
|
||||||
<string name="signature_size">Dynamic Manager Signature Size</string>
|
<string name="signature_size">Dynamic Manager Signature Size</string>
|
||||||
<string name="signature_hash">Dynamic Manager Signature Hash</string>
|
<string name="signature_hash">Dynamic Manager Signature Hash</string>
|
||||||
<string name="hash_must_be_64_chars">Hash must be 64 hexadecimal characters</string>
|
|
||||||
<string name="dynamic_manager_set_success">Dynamic Manager configuration set successfully</string>
|
<string name="dynamic_manager_set_success">Dynamic Manager configuration set successfully</string>
|
||||||
<string name="dynamic_manager_set_failed">Failed to set dynamic Manager configuration</string>
|
<string name="dynamic_manager_set_failed">Failed to set dynamic Manager configuration</string>
|
||||||
<string name="invalid_sign_config">Invalid Manager configuration</string>
|
<string name="invalid_sign_config">Invalid Manager configuration</string>
|
||||||
@@ -244,14 +234,12 @@
|
|||||||
<string name="clean_runtime_environment_failed">Failed to clean runtime environment</string>
|
<string name="clean_runtime_environment_failed">Failed to clean runtime environment</string>
|
||||||
<!-- umount Manager -->
|
<!-- umount Manager -->
|
||||||
<string name="umount_path_manager">Umount Path Management</string>
|
<string name="umount_path_manager">Umount Path Management</string>
|
||||||
<string name="umount_path_manager_summary">Manage kernel unmount paths</string>
|
|
||||||
<string name="umount_path_restart_notice">A reboot is required for changes to take effect. The system will apply the new configuration on the next boot.</string>
|
<string name="umount_path_restart_notice">A reboot is required for changes to take effect. The system will apply the new configuration on the next boot.</string>
|
||||||
<string name="add_umount_path">Add Umount Path</string>
|
<string name="add_umount_path">Add Umount Path</string>
|
||||||
<string name="mount_path">Mount Path</string>
|
<string name="mount_path">Mount Path</string>
|
||||||
<string name="umount_flags">Unmount Flags</string>
|
<string name="umount_flags">Unmount Flags</string>
|
||||||
<string name="umount_flags_hint">0=Normal unmount, 8=MNT_DETACH, -1=Auto</string>
|
<string name="umount_flags_hint">0=Normal unmount, 8=MNT_DETACH, -1=Auto</string>
|
||||||
<string name="flags">Flags</string>
|
<string name="flags">Flags</string>
|
||||||
<string name="default_entry">Default Entry</string>
|
|
||||||
<string name="confirm_delete">Confirm Delete</string>
|
<string name="confirm_delete">Confirm Delete</string>
|
||||||
<string name="confirm_delete_umount_path">Are you sure you want to delete the path %s?</string>
|
<string name="confirm_delete_umount_path">Are you sure you want to delete the path %s?</string>
|
||||||
<string name="umount_path_added">Path added, will take effect after reboot</string>
|
<string name="umount_path_added">Path added, will take effect after reboot</string>
|
||||||
@@ -267,9 +255,6 @@
|
|||||||
<!-- Personalization Settings -->
|
<!-- Personalization Settings -->
|
||||||
<string name="personalization">Personalization</string>
|
<string name="personalization">Personalization</string>
|
||||||
<string name="personalization_summary">Customize the app\'s appearance and theme</string>
|
<string name="personalization_summary">Customize the app\'s appearance and theme</string>
|
||||||
<string name="theme_settings">Theme Settings</string>
|
|
||||||
<string name="theme_mode">Theme Mode</string>
|
|
||||||
<string name="theme_mode_summary">Select the app\'s display theme</string>
|
|
||||||
<!-- Kernel Flash Progress Related -->
|
<!-- Kernel Flash Progress Related -->
|
||||||
<string name="horizon_flash_complete">Flash Complete</string>
|
<string name="horizon_flash_complete">Flash Complete</string>
|
||||||
<string name="horizon_preparing">Preparing…</string>
|
<string name="horizon_preparing">Preparing…</string>
|
||||||
@@ -291,20 +276,14 @@
|
|||||||
<string name="horizon_copy_failed">Copy failed</string>
|
<string name="horizon_copy_failed">Copy failed</string>
|
||||||
<string name="horizon_unknown_error">Unknown error</string>
|
<string name="horizon_unknown_error">Unknown error</string>
|
||||||
<string name="flash_failed_message">Flash failed</string>
|
<string name="flash_failed_message">Flash failed</string>
|
||||||
<string name="Lkm_install_methods">LKM repair/installation</string>
|
|
||||||
<string name="GKI_install_methods">Flashing AnyKernel3</string>
|
|
||||||
<string name="kernel_version_log">Kernel version:%1$s</string>
|
<string name="kernel_version_log">Kernel version:%1$s</string>
|
||||||
<string name="tool_version_log">Using the patching tool:%1$s</string>
|
<string name="tool_version_log">Using the patching tool:%1$s</string>
|
||||||
<string name="configuration">Configure</string>
|
|
||||||
<string name="app_settings">Application Settings</string>
|
|
||||||
<string name="tools">Tools</string>
|
<string name="tools">Tools</string>
|
||||||
<string name="root_required">Requires root privileges</string>
|
<string name="root_required">Requires root privileges</string>
|
||||||
<string name="kpm_patch_options">KPM Patch</string>
|
<string name="kpm_patch_options">KPM Patch</string>
|
||||||
<string name="kpm_patch_description">For adding additional KPM features</string>
|
<string name="kpm_patch_description">For adding additional KPM features</string>
|
||||||
<string name="enable_kpm_patch">KPM Patch</string>
|
<string name="enable_kpm_patch">KPM Patch</string>
|
||||||
<string name="kpm_patch_switch_description">Apply KPM patch to kernel image before flashing</string>
|
|
||||||
<string name="enable_kpm_undo_patch">KPM Undo Patch</string>
|
<string name="enable_kpm_undo_patch">KPM Undo Patch</string>
|
||||||
<string name="kpm_undo_patch_switch_description">Undo previously applied KPM patch</string>
|
|
||||||
<string name="kpm_patch_enabled">KPM patch enabled</string>
|
<string name="kpm_patch_enabled">KPM patch enabled</string>
|
||||||
<string name="kpm_undo_patch_enabled">KPM undo patch enabled</string>
|
<string name="kpm_undo_patch_enabled">KPM undo patch enabled</string>
|
||||||
<string name="kpm_patch_mode">KPM Patch Mode</string>
|
<string name="kpm_patch_mode">KPM Patch Mode</string>
|
||||||
@@ -322,7 +301,6 @@
|
|||||||
<string name="kpm_undo_patch_failed">KPM undo patch failed</string>
|
<string name="kpm_undo_patch_failed">KPM undo patch failed</string>
|
||||||
<string name="kpm_patch_operation_failed">KPM patch operation failed: %s</string>
|
<string name="kpm_patch_operation_failed">KPM patch operation failed: %s</string>
|
||||||
<string name="kpm_follow_kernel_file">Follow Kernel</string>
|
<string name="kpm_follow_kernel_file">Follow Kernel</string>
|
||||||
<string name="kpm_follow_kernel_description">Use kernel as-is without any KPM modifications</string>
|
|
||||||
<string name="kernel_flashing">Kernel Flashing</string>
|
<string name="kernel_flashing">Kernel Flashing</string>
|
||||||
<string name="horizon_kernel">AnyKernel3 Kernel</string>
|
<string name="horizon_kernel">AnyKernel3 Kernel</string>
|
||||||
<string name="horizon_kernel_summary">Flash AnyKernel3 format kernel zip</string>
|
<string name="horizon_kernel_summary">Flash AnyKernel3 format kernel zip</string>
|
||||||
@@ -339,18 +317,11 @@
|
|||||||
<string name="kpm_install_failed">Load of kpm module failed</string>
|
<string name="kpm_install_failed">Load of kpm module failed</string>
|
||||||
<string name="kpm_args">Parameters</string>
|
<string name="kpm_args">Parameters</string>
|
||||||
<string name="kpm_control">Execute</string>
|
<string name="kpm_control">Execute</string>
|
||||||
<string name="home_kpm_version">KPM Version</string>
|
|
||||||
<string name="close_notice">Close</string>
|
<string name="close_notice">Close</string>
|
||||||
<string name="kernel_module_notice">The following kernel module functions were developed by KernelPatch and modified to include the kernel module functions of SukiSU Ultra</string>
|
<string name="kernel_module_notice">The following kernel module functions were developed by KernelPatch and modified to include the kernel module functions of SukiSU Ultra</string>
|
||||||
<string name="home_ContributionCard_kernelsu">SukiSU Ultra Look forward to</string>
|
|
||||||
<string name="kpm_control_success">Success</string>
|
<string name="kpm_control_success">Success</string>
|
||||||
<string name="kpm_control_failed">Failed</string>
|
<string name="kpm_control_failed">Failed</string>
|
||||||
<string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra will be a relatively independent branch of KSU in the future, but we still appreciate the official KernelSU and MKSU etc. for their contributions!</string>
|
|
||||||
<string name="not_supported">Unsupported</string>
|
<string name="not_supported">Unsupported</string>
|
||||||
<string name="supported">Supported</string>
|
|
||||||
<string name="kernel_patched">Kernel not patched</string>
|
|
||||||
<string name="kernel_not_enabled">Kernel not configured</string>
|
|
||||||
<string name="custom_settings">Custom settings</string>
|
|
||||||
<string name="kpm_install_mode">KPM Install</string>
|
<string name="kpm_install_mode">KPM Install</string>
|
||||||
<string name="kpm_install_mode_load">Load</string>
|
<string name="kpm_install_mode_load">Load</string>
|
||||||
<string name="kpm_install_mode_embed">Embed</string>
|
<string name="kpm_install_mode_embed">Embed</string>
|
||||||
@@ -389,22 +360,17 @@
|
|||||||
<string name="susfs_config_description">Configuration Description</string>
|
<string name="susfs_config_description">Configuration Description</string>
|
||||||
<string name="susfs_config_description_text">This feature allows you to customize the SuSFS uname value and build time spoofing. Enter the values you want to set and click Apply to take effect</string>
|
<string name="susfs_config_description_text">This feature allows you to customize the SuSFS uname value and build time spoofing. Enter the values you want to set and click Apply to take effect</string>
|
||||||
<string name="susfs_uname_label">Uname Value</string>
|
<string name="susfs_uname_label">Uname Value</string>
|
||||||
<string name="susfs_uname_placeholder">Please enter custom uname value</string>
|
|
||||||
<string name="susfs_build_time_label">Build Time Spoofing</string>
|
<string name="susfs_build_time_label">Build Time Spoofing</string>
|
||||||
<string name="susfs_build_time_placeholder">Please enter build time spoofing value</string>
|
|
||||||
<string name="susfs_current_value">Current value: %s</string>
|
<string name="susfs_current_value">Current value: %s</string>
|
||||||
<string name="susfs_current_build_time">Current build time: %s</string>
|
<string name="susfs_current_build_time">Current build time: %s</string>
|
||||||
<string name="susfs_reset_to_default">Reset to Default</string>
|
|
||||||
<string name="susfs_apply">Apply</string>
|
<string name="susfs_apply">Apply</string>
|
||||||
<!-- SuSFS Reset Confirmation -->
|
<!-- SuSFS Reset Confirmation -->
|
||||||
<string name="susfs_reset_confirm_title">Confirm Reset</string>
|
<string name="susfs_reset_confirm_title">Confirm Reset</string>
|
||||||
<!-- 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>
|
||||||
<string name="susfs_command_error">Error executing SuSFS command: %s</string>
|
|
||||||
<string name="susfs_uname_set_success" formatted="false">SuSFS uname and build time set successfully: %s, %s</string>
|
<string name="susfs_uname_set_success" formatted="false">SuSFS uname and build time set successfully: %s, %s</string>
|
||||||
<!-- SuSFS Settings Item -->
|
<!-- SuSFS Settings Item -->
|
||||||
<string name="susfs_config_setting_title">SuSFS Configuration</string>
|
|
||||||
<!-- 开机自启动相关 -->
|
<!-- 开机自启动相关 -->
|
||||||
<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>
|
||||||
@@ -428,7 +394,6 @@
|
|||||||
<string name="susfs_path_not_found_error">Path not found error</string>
|
<string name="susfs_path_not_found_error">Path not found error</string>
|
||||||
<string name="susfs_path_label">Path</string>
|
<string name="susfs_path_label">Path</string>
|
||||||
<string name="susfs_mount_path_label">Mount Path</string>
|
<string name="susfs_mount_path_label">Mount Path</string>
|
||||||
<string name="susfs_path_placeholder">e.g.: /system/addon.d</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_mounts_configured">No SUS mounts configured</string>
|
<string name="susfs_no_mounts_configured">No SUS mounts configured</string>
|
||||||
<string name="susfs_no_umounts_configured">No try umount configured</string>
|
<string name="susfs_no_umounts_configured">No try umount configured</string>
|
||||||
@@ -452,8 +417,6 @@
|
|||||||
<!-- 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>
|
||||||
<string name="susfs_sdcard_path_label">SD Card Path</string>
|
<string name="susfs_sdcard_path_label">SD Card Path</string>
|
||||||
<string name="susfs_set_android_data_path">Set Android Data Path</string>
|
|
||||||
<string name="susfs_set_sdcard_path">Set SD Card Path</string>
|
|
||||||
<!-- SuSFS Enabled Features -->
|
<!-- SuSFS Enabled Features -->
|
||||||
<string name="susfs_enabled_features_description">Display current SuSFS enabled features status</string>
|
<string name="susfs_enabled_features_description">Display current SuSFS enabled features status</string>
|
||||||
<string name="susfs_no_features_found">No feature status information found</string>
|
<string name="susfs_no_features_found">No feature status information found</string>
|
||||||
@@ -467,12 +430,9 @@
|
|||||||
<string name="spoof_cmdline_feature_label">Spoof Cmdline/Bootconfig</string>
|
<string name="spoof_cmdline_feature_label">Spoof Cmdline/Bootconfig</string>
|
||||||
<string name="open_redirect_feature_label">Open Redirect Support</string>
|
<string name="open_redirect_feature_label">Open Redirect Support</string>
|
||||||
<string name="enable_log_feature_label">Logging Support</string>
|
<string name="enable_log_feature_label">Logging Support</string>
|
||||||
<string name="auto_default_mount_feature_label">Auto Default Mount</string>
|
|
||||||
<string name="auto_bind_mount_feature_label">Auto Bind Mount</string>
|
|
||||||
<string name="auto_try_umount_bind_feature_label">Auto Try Umount Bind Mount</string>
|
<string name="auto_try_umount_bind_feature_label">Auto Try Umount Bind Mount</string>
|
||||||
<string name="hide_symbols_feature_label">Hide KSU SUSFS Symbols</string>
|
<string name="hide_symbols_feature_label">Hide KSU SUSFS Symbols</string>
|
||||||
<string name="sus_kstat_feature_label">SUS Kstat Support</string>
|
<string name="sus_kstat_feature_label">SUS Kstat Support</string>
|
||||||
<string name="sus_su_feature_label">SUS SU mode switching function</string>
|
|
||||||
<!-- 可切换状态 -->
|
<!-- 可切换状态 -->
|
||||||
<string name="susfs_feature_configurable">Configurable SuSFS Features</string>
|
<string name="susfs_feature_configurable">Configurable SuSFS Features</string>
|
||||||
<string name="susfs_enable_log_label">SuSFS Enable Log</string>
|
<string name="susfs_enable_log_label">SuSFS Enable Log</string>
|
||||||
@@ -484,8 +444,6 @@
|
|||||||
<string name="susfs_current_execution_location">Current execution location: %s</string>
|
<string name="susfs_current_execution_location">Current execution location: %s</string>
|
||||||
<string name="susfs_execution_location_service">Service</string>
|
<string name="susfs_execution_location_service">Service</string>
|
||||||
<string name="susfs_execution_location_post_fs_data">Post-FS-Data</string>
|
<string name="susfs_execution_location_post_fs_data">Post-FS-Data</string>
|
||||||
<string name="susfs_execution_location_service_description">Execute after system services start</string>
|
|
||||||
<string name="susfs_execution_location_post_fs_data_description">Execute after file system is mounted but before system is fully booted,May cause a boot loop</string>
|
|
||||||
<string name="susfs_slot_info_title">Slot Information</string>
|
<string name="susfs_slot_info_title">Slot Information</string>
|
||||||
<string name="susfs_slot_info_description">View current boot slot information and copy values</string>
|
<string name="susfs_slot_info_description">View current boot slot information and copy values</string>
|
||||||
<string name="susfs_current_active_slot">Current Active Slot: %s</string>
|
<string name="susfs_current_active_slot">Current Active Slot: %s</string>
|
||||||
@@ -579,10 +537,7 @@
|
|||||||
<string name="app_paths_section">Application Path</string>
|
<string name="app_paths_section">Application Path</string>
|
||||||
<string name="other_paths_section">Other paths</string>
|
<string name="other_paths_section">Other paths</string>
|
||||||
<string name="add_custom_path">Other</string>
|
<string name="add_custom_path">Other</string>
|
||||||
<string name="add_app_path">App</string>
|
|
||||||
<string name="susfs_add_app_path">Add App Path</string>
|
<string name="susfs_add_app_path">Add App Path</string>
|
||||||
<string name="susfs_version_mismatch">SuSFS library version mismatch, kernel: %1$s vs manager: %2$s, It is recommended to update the kernel or manager</string>
|
|
||||||
<string name="warning">Warning</string>
|
|
||||||
<string name="search_apps">Search Apps</string>
|
<string name="search_apps">Search Apps</string>
|
||||||
<string name="selected_apps_count">%1$d apps selected</string>
|
<string name="selected_apps_count">%1$d apps selected</string>
|
||||||
<string name="already_added_apps_count">%1$d apps already added</string>
|
<string name="already_added_apps_count">%1$d apps already added</string>
|
||||||
@@ -599,7 +554,6 @@
|
|||||||
<string name="susfs_reset_loop_paths_title">Reset Loop Paths</string>
|
<string name="susfs_reset_loop_paths_title">Reset Loop Paths</string>
|
||||||
<string name="susfs_reset_loop_paths_message">Are you sure you want to clear all SUS loop paths? This action cannot be undone</string>
|
<string name="susfs_reset_loop_paths_message">Are you sure you want to clear all SUS loop paths? This action cannot be undone</string>
|
||||||
<string name="susfs_loop_path_label">Loop Path</string>
|
<string name="susfs_loop_path_label">Loop Path</string>
|
||||||
<string name="susfs_loop_path_placeholder">/data/example/path</string>
|
|
||||||
<string name="susfs_loop_path_restriction_warning">Note: Only paths NOT inside /storage/ and /sdcard/ can be added via loop paths</string>
|
<string name="susfs_loop_path_restriction_warning">Note: Only paths NOT inside /storage/ and /sdcard/ can be added via loop paths</string>
|
||||||
<string name="susfs_loop_path_invalid_location">Error: Loop paths cannot be inside /storage/ or /sdcard/ directories</string>
|
<string name="susfs_loop_path_invalid_location">Error: Loop paths cannot be inside /storage/ or /sdcard/ directories</string>
|
||||||
<string name="loop_paths_section">Loop Paths</string>
|
<string name="loop_paths_section">Loop Paths</string>
|
||||||
@@ -611,11 +565,9 @@
|
|||||||
<string name="avc_log_spoofing_enabled">AVC log spoofing has been enabled</string>
|
<string name="avc_log_spoofing_enabled">AVC log spoofing has been enabled</string>
|
||||||
<string name="avc_log_spoofing_disabled">AVC log spoofing has been disabled</string>
|
<string name="avc_log_spoofing_disabled">AVC log spoofing has been disabled</string>
|
||||||
<string name="avc_log_spoofing_description">Disabled: Disable spoofing the sus tcontext of \'su\' shown in avc log in kernel\nEnabled: Enable spoofing the sus tcontext of \'su\' with \'kernel\' shown in avc log in kernel</string>
|
<string name="avc_log_spoofing_description">Disabled: Disable spoofing the sus tcontext of \'su\' shown in avc log in kernel\nEnabled: Enable spoofing the sus tcontext of \'su\' with \'kernel\' shown in avc log in kernel</string>
|
||||||
<string name="avc_log_spoofing_warning">Important Note:\n- It is set to \'0\' by default in kernel\n- Enabling this will sometimes make developers hard to identify the cause when they are debugging with some permission or SELinux issue, so users are advised to disable this when doing</string>
|
|
||||||
<!-- SUS Map related strings -->
|
<!-- SUS Map related strings -->
|
||||||
<string name="susfs_tab_sus_maps">SUS Maps</string>
|
<string name="susfs_tab_sus_maps">SUS Maps</string>
|
||||||
<string name="susfs_sus_map_label">Library Path</string>
|
<string name="susfs_sus_map_label">Library Path</string>
|
||||||
<string name="susfs_sus_map_placeholder">/data/adb/modules/my_module/zygisk/arm64-v8a.so</string>
|
|
||||||
<string name="susfs_add_sus_map">Add SUS Map</string>
|
<string name="susfs_add_sus_map">Add SUS Map</string>
|
||||||
<string name="susfs_edit_sus_map">Edit SUS Map</string>
|
<string name="susfs_edit_sus_map">Edit SUS Map</string>
|
||||||
<string name="susfs_sus_map_added_success">SUS map added successfully: %1$s</string>
|
<string name="susfs_sus_map_added_success">SUS map added successfully: %1$s</string>
|
||||||
|
|||||||
Reference in New Issue
Block a user