manager: Add the ability to get a list of active managers
This commit is contained in:
@@ -118,6 +118,12 @@ object Natives {
|
||||
*/
|
||||
external fun clearDynamicSign(): Boolean
|
||||
|
||||
/**
|
||||
* Get active managers list when dynamic sign is enabled
|
||||
* @return ManagersList object containing active managers, or null if failed or not enabled
|
||||
*/
|
||||
external fun getManagersList(): ManagersList?
|
||||
|
||||
private const val NON_ROOT_DEFAULT_PROFILE_KEY = "$"
|
||||
private const val NOBODY_UID = 9999
|
||||
|
||||
@@ -177,7 +183,6 @@ object Natives {
|
||||
val size: Int = 0,
|
||||
val hash: String = ""
|
||||
) : Parcelable {
|
||||
constructor() : this(0, "")
|
||||
|
||||
fun isValid(): Boolean {
|
||||
return size > 0 && hash.length == 64 && hash.all {
|
||||
@@ -186,6 +191,22 @@ object Natives {
|
||||
}
|
||||
}
|
||||
|
||||
@Immutable
|
||||
@Parcelize
|
||||
@Keep
|
||||
data class ManagersList(
|
||||
val count: Int = 0,
|
||||
val managers: List<ManagerInfo> = emptyList()
|
||||
) : Parcelable
|
||||
|
||||
@Immutable
|
||||
@Parcelize
|
||||
@Keep
|
||||
data class ManagerInfo(
|
||||
val uid: Int = 0,
|
||||
val signatureIndex: Int = 0
|
||||
) : Parcelable
|
||||
|
||||
@Immutable
|
||||
@Parcelize
|
||||
@Keep
|
||||
|
||||
@@ -719,6 +719,32 @@ private fun InfoCard(
|
||||
icon = Icons.Default.SettingsSuggest,
|
||||
)
|
||||
|
||||
// 活跃管理器
|
||||
if (systemInfo.isDynamicSignEnabled && systemInfo.managersList != null) {
|
||||
val signatureMap = systemInfo.managersList.managers.groupBy { it.signatureIndex }
|
||||
|
||||
val managersText = buildString {
|
||||
signatureMap.toSortedMap().forEach { (signatureIndex, managers) ->
|
||||
append(managers.joinToString(", ") { "UID:${it.uid}" })
|
||||
append(" ")
|
||||
append(
|
||||
when (signatureIndex) {
|
||||
1 -> "(${stringResource(R.string.default_signature)})"
|
||||
2 -> "(${stringResource(R.string.dynamic_signature)})"
|
||||
else -> if (signatureIndex >= 0) "(${stringResource(R.string.signature_index, signatureIndex)})" else "(${stringResource(R.string.unknown_signature)})"
|
||||
}
|
||||
)
|
||||
append("; ")
|
||||
}
|
||||
}.trimEnd(' ', ';')
|
||||
|
||||
InfoCardItem(
|
||||
stringResource(R.string.multi_manager_list),
|
||||
managersText.ifEmpty { stringResource(R.string.no_active_manager) },
|
||||
icon = Icons.Default.Group,
|
||||
)
|
||||
}
|
||||
|
||||
InfoCardItem(
|
||||
stringResource(R.string.home_selinux_status),
|
||||
systemInfo.seLinuxStatus,
|
||||
|
||||
@@ -60,7 +60,9 @@ class HomeViewModel : ViewModel() {
|
||||
val susSUMode: String = "",
|
||||
val superuserCount: Int = 0,
|
||||
val moduleCount: Int = 0,
|
||||
val kpmModuleCount: Int = 0
|
||||
val kpmModuleCount: Int = 0,
|
||||
val managersList: Natives.ManagersList? = null,
|
||||
val isDynamicSignEnabled: Boolean = false
|
||||
)
|
||||
|
||||
private val gson = Gson()
|
||||
@@ -242,6 +244,26 @@ class HomeViewModel : ViewModel() {
|
||||
}
|
||||
}
|
||||
|
||||
// 获取动态签名状态和管理器列表
|
||||
val dynamicSignConfig = try {
|
||||
Natives.getDynamicSign()
|
||||
} catch (e: Exception) {
|
||||
Log.w(TAG, "Failed to get dynamic sign config", e)
|
||||
null
|
||||
}
|
||||
|
||||
val isDynamicSignEnabled = dynamicSignConfig?.isValid() == true
|
||||
val managersList = if (isDynamicSignEnabled) {
|
||||
try {
|
||||
Natives.getManagersList()
|
||||
} catch (e: Exception) {
|
||||
Log.w(TAG, "Failed to get managers list", e)
|
||||
null
|
||||
}
|
||||
} else {
|
||||
null
|
||||
}
|
||||
|
||||
systemInfo = SystemInfo(
|
||||
kernelRelease = uname.release,
|
||||
androidVersion = Build.VERSION.RELEASE,
|
||||
@@ -256,7 +278,9 @@ class HomeViewModel : ViewModel() {
|
||||
susSUMode = susSUMode,
|
||||
superuserCount = getSuperuserCount(),
|
||||
moduleCount = getModuleCount(),
|
||||
kpmModuleCount = getKpmModuleCount()
|
||||
kpmModuleCount = getKpmModuleCount(),
|
||||
managersList = managersList,
|
||||
isDynamicSignEnabled = isDynamicSignEnabled
|
||||
)
|
||||
} catch (e: Exception) {
|
||||
Log.e(TAG, "Error fetching system info", e)
|
||||
|
||||
Reference in New Issue
Block a user