Skip to content

Commit 04c1c50

Browse files
Merge branch 'dev' into fix/ksud-uapi-compat-clean
2 parents f1e0b79 + 7274d63 commit 04c1c50

15 files changed

Lines changed: 2362 additions & 73 deletions

File tree

42.6 KB
Binary file not shown.
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
ref=v1.5.2+_R27
2+
commit=v1.5.2+
3+
abis=arm64-v8a
4+
sha256.arm64-v8a=8b9fa0174ab9bc95910258f935628dfb9b551ae9b5074ba0eb1fa85e06590641
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
package com.abk.kernel.data.model
2+
3+
data class SusfsPathRule(
4+
val path: String = "",
5+
val maxTries: Int? = null,
6+
)
7+
8+
data class SusfsOpenRedirectRule(
9+
val originalPath: String = "",
10+
val redirectedPath: String = "",
11+
val stage: String = "boot_completed",
12+
val uidScheme: Int? = null,
13+
)
14+
15+
data class SusfsKstatEntry(
16+
val path: String = "",
17+
val ino: String = "default",
18+
val dev: String = "default",
19+
val nlink: String = "default",
20+
val size: String = "default",
21+
val atime: String = "0",
22+
val atimeNsec: String = "0",
23+
val mtime: String = "0",
24+
val mtimeNsec: String = "0",
25+
val ctime: String = "0",
26+
val ctimeNsec: String = "0",
27+
val blocks: String = "0",
28+
val blksize: String = "0",
29+
)
30+
31+
data class SusfsPresetOptions(
32+
val hideCustomRomLevel: Int = 0,
33+
val hideVendorSepolicy: Boolean = false,
34+
val hideCompatMatrix: Boolean = false,
35+
val hideGapps: Boolean = false,
36+
val hideRevanced: Boolean = false,
37+
val spoofCmdline: Boolean = false,
38+
val hideLoops: Boolean = true,
39+
val forceHideLsposed: Boolean = false,
40+
val autoTryUmount: Boolean = false,
41+
val skipLegitMounts: Boolean = false,
42+
val emulateVoldAppDataMode: Int = 0,
43+
val umountForZygoteIsoService: Boolean = false,
44+
)
45+
46+
data class SusfsConfig(
47+
val schemaVersion: Int = 1,
48+
val autoReplayEnabled: Boolean = true,
49+
val logEnabled: Boolean = true,
50+
val avcLogSpoofing: Boolean = false,
51+
val hideSusMountsMode: String = "off",
52+
val spoofUnameStage: String = "off",
53+
val unameValue: String = "default",
54+
val buildTimeValue: String = "default",
55+
val sdcardRootPath: String = "/sdcard",
56+
val androidDataRootPath: String = "/sdcard/Android/data",
57+
val pathRules: List<SusfsPathRule> = emptyList(),
58+
val loopPathRules: List<SusfsPathRule> = emptyList(),
59+
val maps: List<String> = emptyList(),
60+
val mounts: List<String> = emptyList(),
61+
val tryUmounts: List<String> = emptyList(),
62+
val legitMounts: List<String> = emptyList(),
63+
val openRedirects: List<SusfsOpenRedirectRule> = emptyList(),
64+
val kstatEntries: List<SusfsKstatEntry> = emptyList(),
65+
val presets: SusfsPresetOptions = SusfsPresetOptions(),
66+
)
67+
68+
data class SusfsSupportMatrix(
69+
val log: Boolean = true,
70+
val hideSusMountsForAll: Boolean = false,
71+
val hideSusMountsForNonSu: Boolean = false,
72+
val susPath: Boolean = true,
73+
val susPathLoop: Boolean = false,
74+
val susMap: Boolean = false,
75+
val susMount: Boolean = false,
76+
val tryUmount: Boolean = false,
77+
val ksudKernelUmountFallback: Boolean = false,
78+
val openRedirect: Boolean = false,
79+
val staticKstat: Boolean = false,
80+
val dynamicKstat: Boolean = false,
81+
val setUname: Boolean = false,
82+
val setCmdlineOrBootconfig: Boolean = false,
83+
val setProcCmdline: Boolean = false,
84+
val sdcardRootPath: Boolean = false,
85+
val androidDataRootPath: Boolean = false,
86+
val avcLogSpoofing: Boolean = false,
87+
val spoofCmdlinePreset: Boolean = false,
88+
val hideVendorSepolicyPreset: Boolean = false,
89+
val hideCompatMatrixPreset: Boolean = false,
90+
val hideGappsPreset: Boolean = false,
91+
val hideRevancedPreset: Boolean = false,
92+
val hideLoopsPreset: Boolean = true,
93+
val autoTryUmountPreset: Boolean = false,
94+
val forceHideLsposedPreset: Boolean = false,
95+
val umountForZygoteIsoService: Boolean = false,
96+
)
97+
98+
data class SusfsRuntimeStatus(
99+
val available: Boolean = false,
100+
val kernelVersion: String = "",
101+
val rawFeatureText: String = "",
102+
val featureFlags: List<String> = emptyList(),
103+
val support: SusfsSupportMatrix = SusfsSupportMatrix(),
104+
val bundledBinaryRef: String = "",
105+
val bundledBinaryVersion: String = "",
106+
val bundledBinaryPublishedAt: String = "",
107+
val bundledBinaryPath: String = "",
108+
val installedBinaryPath: String = "",
109+
val runtimeModuleId: String = "abk-susfs-control",
110+
val runtimeModuleDir: String = "",
111+
val configPath: String = "",
112+
val diagnostics: List<String> = emptyList(),
113+
)

app/src/main/java/com/abk/kernel/ui/screens/RuntimeScreens.kt

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -273,11 +273,6 @@ fun InstalledModulesScreen(
273273
val modules = remember(state.abkRuntimeStatus?.modules, query) {
274274
state.abkRuntimeStatus?.modules.orEmpty()
275275
.filter { it.matchesRuntimeModuleQuery(query) }
276-
.sortedWith(
277-
compareBy<AbkRuntimeModule> { it.typeOrder() }
278-
.thenBy { !it.enabled }
279-
.thenBy { it.displayName().lowercase() }
280-
)
281276
}
282277
val groupedModules = remember(modules) { groupRuntimeModulesForDisplay(modules) }
283278

@@ -1378,13 +1373,6 @@ private fun AbkRuntimeModule.normalizedType(): String =
13781373
private fun AbkRuntimeModule.canUninstallRuntimeModule(): Boolean =
13791374
normalizedType() == "standard" && controllable && !readonly
13801375

1381-
private fun AbkRuntimeModule.typeOrder(): Int = when (normalizedType()) {
1382-
"builtin" -> 0
1383-
"standard" -> 1
1384-
"kpm" -> 2
1385-
else -> 3
1386-
}
1387-
13881376
private data class RuntimeModuleDisplayGroup(
13891377
val groupName: String? = null,
13901378
val groupDescription: String? = null,

app/src/main/java/com/abk/kernel/ui/screens/SettingsScreen.kt

Lines changed: 77 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,11 +114,12 @@ fun SettingsScreen(
114114
var showThemeSettings by rememberSaveable { mutableStateOf(false) }
115115
var showAppProfileTemplates by rememberSaveable { mutableStateOf(false) }
116116
var showManagerTools by rememberSaveable { mutableStateOf(false) }
117+
var showSusfsControl by rememberSaveable { mutableStateOf(false) }
117118
var showAboutPage by rememberSaveable { mutableStateOf(false) }
118119
var showOpenSourceLicenses by rememberSaveable { mutableStateOf(false) }
119120
var showExtensionManagerPage by rememberSaveable { mutableStateOf(false) }
120121
val scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior(rememberTopAppBarState())
121-
val showChildPage = showThemeSettings || showAppProfileTemplates || showManagerTools ||
122+
val showChildPage = showThemeSettings || showAppProfileTemplates || showManagerTools || showSusfsControl ||
122123
showAboutPage || showOpenSourceLicenses || showExtensionManagerPage
123124
val childPageTransition = rememberChildPageOverlayTransition(
124125
visible = showChildPage,
@@ -128,6 +129,7 @@ fun SettingsScreen(
128129

129130
LaunchedEffect(Unit) {
130131
vm.refreshManagerSettings(force = true)
132+
vm.refreshSusfsState(force = true)
131133
}
132134

133135
LaunchedEffect(state.hasNativeManagerPermission) {
@@ -147,6 +149,7 @@ fun SettingsScreen(
147149
showThemeSettings = false
148150
showAppProfileTemplates = false
149151
showManagerTools = false
152+
showSusfsControl = false
150153
showAboutPage = false
151154
showOpenSourceLicenses = false
152155
showExtensionManagerPage = false
@@ -193,13 +196,26 @@ fun SettingsScreen(
193196
childPageBack.resetProgress()
194197
showThemeSettings = false
195198
showAppProfileTemplates = false
199+
showSusfsControl = false
196200
showAboutPage = false
197201
showOpenSourceLicenses = false
198202
showExtensionManagerPage = false
199203
showManagerTools = true
200204
vm.refreshManagerTools(force = true)
201205
}
202206

207+
fun openSusfsControl() {
208+
childPageBack.resetProgress()
209+
showThemeSettings = false
210+
showAppProfileTemplates = false
211+
showManagerTools = false
212+
showAboutPage = false
213+
showOpenSourceLicenses = false
214+
showExtensionManagerPage = false
215+
showSusfsControl = true
216+
vm.refreshSusfsState(force = true)
217+
}
218+
203219
fun openAboutPage() {
204220
childPageBack.resetProgress()
205221
showThemeSettings = false
@@ -304,6 +320,7 @@ fun SettingsScreen(
304320
onOpenThemeSettings = ::openThemeSettings,
305321
onOpenAppProfileTemplates = ::openAppProfileTemplates,
306322
onOpenManagerTools = ::openManagerTools,
323+
onOpenSusfsControl = ::openSusfsControl,
307324
onOpenInstalledModules = onOpenInstalledModules,
308325
onAbout = ::openAboutPage,
309326
onOpenSourceLicenses = ::openOpenSourceLicenses,
@@ -505,6 +522,58 @@ fun SettingsScreen(
505522
}
506523
}
507524

525+
childPageTransition.AnimatedVisibility(
526+
visible = { it && showSusfsControl },
527+
enter = childPageOverlayEnterTransition(state.predictiveBackEnabled, motionScheme),
528+
exit = childPageOverlayExitTransition(state.predictiveBackEnabled, motionScheme),
529+
modifier = childPageModifier
530+
) {
531+
val refreshPresentation = rememberAbkInteractiveRefreshPresentation(loading = state.susfsLoading)
532+
Box(
533+
modifier = Modifier
534+
.fillMaxSize()
535+
.then(childPageBack.backTransformModifier())
536+
) {
537+
SettingsPageBackground(
538+
backgroundUri = state.customBackgroundUri,
539+
backgroundImageEnabled = state.backgroundImageEnabled
540+
)
541+
Scaffold(
542+
containerColor = Color.Transparent,
543+
topBar = {
544+
ExpressiveTopBar(
545+
title = stringResource(R.string.susfs_title),
546+
navigationIcon = {
547+
IconButton(onClick = childPageBack::requestDismiss) {
548+
Icon(Icons.Default.ArrowBack, contentDescription = stringResource(R.string.settings_back))
549+
}
550+
},
551+
actions = {
552+
IconButton(onClick = {
553+
refreshPresentation.beginRefresh()
554+
vm.refreshSusfsState(force = true)
555+
}) {
556+
Icon(Icons.Default.Refresh, contentDescription = stringResource(R.string.refresh))
557+
}
558+
}
559+
)
560+
}
561+
) {
562+
SusfsControlScreen(
563+
padding = it,
564+
state = state,
565+
showRefreshLoading = refreshPresentation.showLoading,
566+
onApply = vm::applySusfsConfig,
567+
onReset = vm::resetSusfsConfig,
568+
onRefresh = {
569+
refreshPresentation.beginRefresh()
570+
vm.refreshSusfsState(force = true)
571+
}
572+
)
573+
}
574+
}
575+
}
576+
508577
childPageTransition.AnimatedVisibility(
509578
visible = { it && showAboutPage },
510579
enter = childPageOverlayEnterTransition(state.predictiveBackEnabled, motionScheme),
@@ -602,6 +671,7 @@ private fun SettingsMainContent(
602671
onOpenThemeSettings: () -> Unit,
603672
onOpenAppProfileTemplates: () -> Unit,
604673
onOpenManagerTools: () -> Unit,
674+
onOpenSusfsControl: () -> Unit,
605675
onOpenInstalledModules: () -> Unit,
606676
onAbout: () -> Unit,
607677
onOpenSourceLicenses: () -> Unit,
@@ -818,6 +888,7 @@ private fun SettingsMainContent(
818888
vm = vm,
819889
onOpenAppProfileTemplates = onOpenAppProfileTemplates,
820890
onOpenManagerTools = onOpenManagerTools,
891+
onOpenSusfsControl = onOpenSusfsControl,
821892
onOpenInstalledModules = onOpenInstalledModules
822893
)
823894

@@ -938,9 +1009,9 @@ private fun ManagerInjectedSettingsGroup(
9381009
vm: MainViewModel,
9391010
onOpenAppProfileTemplates: () -> Unit,
9401011
onOpenManagerTools: () -> Unit,
1012+
onOpenSusfsControl: () -> Unit,
9411013
onOpenInstalledModules: () -> Unit
9421014
) {
943-
if (!state.hasNativeManagerPermission) return
9441015
val hasInjectedSettings = state.managerSettingsItems.isNotEmpty()
9451016
val refreshPresentation = rememberAbkInteractiveRefreshPresentation(loading = state.managerSettingsLoading)
9461017
val showRefreshLoading = refreshPresentation.showLoading
@@ -992,6 +1063,7 @@ private fun ManagerInjectedSettingsGroup(
9921063
when (item.id) {
9931064
"app_profile_templates" -> onOpenAppProfileTemplates()
9941065
"manager_tools" -> onOpenManagerTools()
1066+
"susfs_control" -> onOpenSusfsControl()
9951067
"kpm" -> onOpenInstalledModules()
9961068
}
9971069
}
@@ -1674,6 +1746,7 @@ private fun managerSettingIcon(id: String) = when (id) {
16741746
"selinux_hide" -> Icons.Default.Shield
16751747
"default_umount_modules" -> Icons.Default.FolderDelete
16761748
"webview_debug" -> Icons.Default.Code
1749+
"susfs_control" -> Icons.Default.Extension
16771750
else -> Icons.Default.Settings
16781751
}
16791752

@@ -2532,6 +2605,7 @@ private fun SettingsGroup(title: String, content: @Composable ColumnScope.() ->
25322605
"SukiSU" -> stringResource(R.string.settings_group_backend_desc, "SukiSU")
25332606
"KernelSU" -> stringResource(R.string.settings_group_backend_desc, "KernelSU")
25342607
stringResource(R.string.settings_manager_settings) -> stringResource(R.string.settings_group_manager_settings_desc)
2608+
stringResource(R.string.settings_kernel_capabilities) -> stringResource(R.string.settings_group_kernel_capabilities_desc)
25352609
stringResource(R.string.settings_system_tools) -> stringResource(R.string.settings_group_system_tools_desc)
25362610
stringResource(R.string.settings_allowlist) -> stringResource(R.string.settings_group_allowlist_desc)
25372611
stringResource(R.string.settings_tool_status) -> stringResource(R.string.settings_group_tool_status_desc)
@@ -2555,6 +2629,7 @@ private fun SettingsGroup(title: String, content: @Composable ColumnScope.() ->
25552629
stringResource(R.string.settings_theme) -> Icons.Default.Palette
25562630
"ReSukiSU", "SukiSU", "KernelSU" -> Icons.Default.AdminPanelSettings
25572631
stringResource(R.string.settings_manager_settings) -> Icons.Default.AdminPanelSettings
2632+
stringResource(R.string.settings_kernel_capabilities) -> Icons.Default.Extension
25582633
stringResource(R.string.settings_system_tools) -> Icons.Default.Build
25592634
stringResource(R.string.settings_allowlist) -> Icons.Default.VerifiedUser
25602635
stringResource(R.string.settings_tool_status) -> Icons.Default.Info

0 commit comments

Comments
 (0)