Pass all package names for shared UID connections

This commit is contained in:
世界
2026-03-23 18:25:49 +08:00
parent cf145b5374
commit 330eaee346
4 changed files with 9 additions and 9 deletions

View File

@@ -58,7 +58,7 @@ interface PlatformInterfaceWrapper : PlatformInterface {
val owner = ConnectionOwner()
owner.userId = uid
owner.userName = packages?.firstOrNull() ?: ""
owner.androidPackageName = packages?.firstOrNull() ?: ""
owner.setAndroidPackageNames(StringArray(packages?.toList()?.iterator() ?: emptyList<String>().iterator()))
return owner
} catch (e: Exception) {
Log.e("PlatformInterface", "getConnectionOwnerUid", e)

View File

@@ -6,7 +6,7 @@ import io.nekohasekai.libbox.Connection as LibboxConnection
import io.nekohasekai.libbox.ProcessInfo as LibboxProcessInfo
@Immutable
data class ProcessInfo(val processId: Long, val userId: Int, val userName: String, val processPath: String, val packageName: String) {
data class ProcessInfo(val processId: Long, val userId: Int, val userName: String, val processPath: String, val packageNames: List<String>) {
companion object {
fun from(processInfo: LibboxProcessInfo?): ProcessInfo? {
if (processInfo == null) return null
@@ -15,7 +15,7 @@ data class ProcessInfo(val processId: Long, val userId: Int, val userName: Strin
userId = processInfo.userID,
userName = processInfo.userName ?: "",
processPath = processInfo.processPath ?: "",
packageName = processInfo.packageName ?: "",
packageNames = processInfo.packageNames()?.toList() ?: emptyList(),
)
}
}
@@ -66,7 +66,7 @@ data class Connection(
domain.contains(content, ignoreCase = true) ||
outbound.contains(content, ignoreCase = true) ||
rule.contains(content, ignoreCase = true) ||
processInfo?.packageName?.contains(content, ignoreCase = true) == true
processInfo?.packageNames?.any { it.contains(content, ignoreCase = true) } == true
private fun performSearchType(type: String, value: String): Boolean = when (type) {
"network" -> network.equals(value, ignoreCase = true)
@@ -79,7 +79,7 @@ data class Connection(
"rule" -> rule.contains(value, ignoreCase = true)
"protocol" -> protocolName.equals(value, ignoreCase = true)
"user" -> user.contains(value, ignoreCase = true)
"package" -> processInfo?.packageName?.contains(value, ignoreCase = true) == true
"package" -> processInfo?.packageNames?.any { it.contains(value, ignoreCase = true) } == true
"chain" -> chain.any { it.contains(value, ignoreCase = true) }
else -> false
}

View File

@@ -247,7 +247,7 @@ fun ConnectionDetailsScreen(
}
connection.processInfo?.let { processInfo ->
if (processInfo.packageName.isNotEmpty() ||
if (processInfo.packageNames.isNotEmpty() ||
processInfo.processPath.isNotEmpty() ||
processInfo.processId > 0
) {
@@ -282,10 +282,10 @@ fun ConnectionDetailsScreen(
monospace = true,
)
}
if (processInfo.packageName.isNotEmpty()) {
if (processInfo.packageNames.isNotEmpty()) {
DetailRow(
label = stringResource(R.string.connection_package_name),
value = processInfo.packageName,
value = processInfo.packageNames.joinToString(", "),
monospace = true,
)
}

View File

@@ -82,7 +82,7 @@ private fun rememberAppInfo(packageName: String): AppInfo? {
@Composable
fun ConnectionItem(connection: Connection, onClick: () -> Unit, onClose: () -> Unit, modifier: Modifier = Modifier) {
var showContextMenu by remember { mutableStateOf(false) }
val packageName = connection.processInfo?.packageName?.takeIf { it.isNotEmpty() }
val packageName = connection.processInfo?.packageNames?.firstOrNull()
val appInfo = packageName?.let { rememberAppInfo(it) }
Box(modifier = modifier) {