manager: hide root related features if kernelsu not available (#2555)

Without KernelSU installed, root-related features did not take any
effect. So, better to hide it.

Improving this pr:
https://github.com/tiann/KernelSU/pull/2483

Also attempt to address this:
https://github.com/tiann/KernelSU/pull/2483#issuecomment-2692048907

Tested-by: Faris <90097027+rsuntk@users.noreply.github.com>

Co-authored-by: Rifat Azad <33044977+rifsxd@users.noreply.github.com>

---------

Signed-off-by: Faris <90097027+rsuntk@users.noreply.github.com>
Co-authored-by: Rifat Azad <33044977+rifsxd@users.noreply.github.com>
This commit is contained in:
Faris
2025-05-03 21:07:47 +07:00
committed by GitHub
parent 1946876626
commit 2d6890ce05
3 changed files with 106 additions and 73 deletions

View File

@@ -0,0 +1,17 @@
package me.weishu.kernelsu.ui.component
import androidx.compose.runtime.Composable
import me.weishu.kernelsu.Natives
import me.weishu.kernelsu.ksuApp
@Composable
fun KsuIsValid(
content: @Composable () -> Unit
) {
val isManager = Natives.becomeManager(ksuApp.packageName)
val ksuVersion = if (isManager) Natives.version else null
if (ksuVersion != null) {
content()
}
}

View File

@@ -39,6 +39,7 @@ import kotlinx.coroutines.withContext
import me.weishu.kernelsu.* import me.weishu.kernelsu.*
import me.weishu.kernelsu.R import me.weishu.kernelsu.R
import me.weishu.kernelsu.ui.component.rememberConfirmDialog import me.weishu.kernelsu.ui.component.rememberConfirmDialog
import me.weishu.kernelsu.ui.component.KsuIsValid
import me.weishu.kernelsu.ui.util.* import me.weishu.kernelsu.ui.util.*
import me.weishu.kernelsu.ui.util.module.LatestVersionInfo import me.weishu.kernelsu.ui.util.module.LatestVersionInfo
@@ -180,6 +181,7 @@ private fun TopBar(
} }
var showDropdown by remember { mutableStateOf(false) } var showDropdown by remember { mutableStateOf(false) }
KsuIsValid() {
IconButton(onClick = { IconButton(onClick = {
showDropdown = true showDropdown = true
}) { }) {
@@ -205,6 +207,7 @@ private fun TopBar(
RebootDropdownItem(id = R.string.reboot_edl, reason = "edl") RebootDropdownItem(id = R.string.reboot_edl, reason = "edl")
} }
} }
}
IconButton(onClick = onSettingsClick) { IconButton(onClick = onSettingsClick) {
Icon( Icon(

View File

@@ -85,6 +85,7 @@ import me.weishu.kernelsu.ui.component.AboutDialog
import me.weishu.kernelsu.ui.component.ConfirmResult import me.weishu.kernelsu.ui.component.ConfirmResult
import me.weishu.kernelsu.ui.component.DialogHandle import me.weishu.kernelsu.ui.component.DialogHandle
import me.weishu.kernelsu.ui.component.SwitchItem import me.weishu.kernelsu.ui.component.SwitchItem
import me.weishu.kernelsu.ui.component.KsuIsValid
import me.weishu.kernelsu.ui.component.rememberConfirmDialog import me.weishu.kernelsu.ui.component.rememberConfirmDialog
import me.weishu.kernelsu.ui.component.rememberCustomDialog import me.weishu.kernelsu.ui.component.rememberCustomDialog
import me.weishu.kernelsu.ui.component.rememberLoadingDialog import me.weishu.kernelsu.ui.component.rememberLoadingDialog
@@ -150,6 +151,7 @@ fun SettingScreen(navigator: DestinationsNavigator) {
} }
val profileTemplate = stringResource(id = R.string.settings_profile_template) val profileTemplate = stringResource(id = R.string.settings_profile_template)
KsuIsValid() {
ListItem( ListItem(
leadingContent = { Icon(Icons.Filled.Fence, profileTemplate) }, leadingContent = { Icon(Icons.Filled.Fence, profileTemplate) },
headlineContent = { Text(profileTemplate) }, headlineContent = { Text(profileTemplate) },
@@ -158,10 +160,13 @@ fun SettingScreen(navigator: DestinationsNavigator) {
navigator.navigate(AppProfileTemplateScreenDestination) navigator.navigate(AppProfileTemplateScreenDestination)
} }
) )
}
var umountChecked by rememberSaveable { var umountChecked by rememberSaveable {
mutableStateOf(Natives.isDefaultUmountModules()) mutableStateOf(Natives.isDefaultUmountModules())
} }
KsuIsValid() {
SwitchItem( SwitchItem(
icon = Icons.Filled.FolderDelete, icon = Icons.Filled.FolderDelete,
title = stringResource(id = R.string.settings_umount_modules_default), title = stringResource(id = R.string.settings_umount_modules_default),
@@ -172,7 +177,9 @@ fun SettingScreen(navigator: DestinationsNavigator) {
umountChecked = it umountChecked = it
} }
} }
}
KsuIsValid() {
if (Natives.version >= Natives.MINIMAL_SUPPORTED_SU_COMPAT) { if (Natives.version >= Natives.MINIMAL_SUPPORTED_SU_COMPAT) {
var isSuDisabled by rememberSaveable { var isSuDisabled by rememberSaveable {
mutableStateOf(!Natives.isSuEnabled()) mutableStateOf(!Natives.isSuEnabled())
@@ -189,6 +196,7 @@ fun SettingScreen(navigator: DestinationsNavigator) {
} }
} }
} }
}
val prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE) val prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE)
var checkUpdate by rememberSaveable { var checkUpdate by rememberSaveable {
@@ -211,6 +219,8 @@ fun SettingScreen(navigator: DestinationsNavigator) {
prefs.getBoolean("enable_web_debugging", false) prefs.getBoolean("enable_web_debugging", false)
) )
} }
KsuIsValid() {
SwitchItem( SwitchItem(
icon = Icons.Filled.DeveloperMode, icon = Icons.Filled.DeveloperMode,
title = stringResource(id = R.string.enable_web_debugging), title = stringResource(id = R.string.enable_web_debugging),
@@ -220,6 +230,7 @@ fun SettingScreen(navigator: DestinationsNavigator) {
prefs.edit().putBoolean("enable_web_debugging", it).apply() prefs.edit().putBoolean("enable_web_debugging", it).apply()
enableWebDebugging = it enableWebDebugging = it
} }
}
var showBottomsheet by remember { mutableStateOf(false) } var showBottomsheet by remember { mutableStateOf(false) }
@@ -332,6 +343,7 @@ fun SettingScreen(navigator: DestinationsNavigator) {
val shrink = stringResource(id = R.string.shrink_sparse_image) val shrink = stringResource(id = R.string.shrink_sparse_image)
val shrinkMessage = stringResource(id = R.string.shrink_sparse_image_message) val shrinkMessage = stringResource(id = R.string.shrink_sparse_image_message)
KsuIsValid() {
ListItem( ListItem(
leadingContent = { leadingContent = {
Icon( Icon(
@@ -351,6 +363,7 @@ fun SettingScreen(navigator: DestinationsNavigator) {
} }
} }
) )
}
val lkmMode = Natives.version >= Natives.MINIMAL_SUPPORTED_KERNEL_LKM && Natives.isLkmMode val lkmMode = Natives.version >= Natives.MINIMAL_SUPPORTED_KERNEL_LKM && Natives.isLkmMode
if (lkmMode) { if (lkmMode) {