From 330eaee346a61cf93c6c01c988046fd760572b0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=96=E7=95=8C?= Date: Mon, 23 Mar 2026 18:25:49 +0800 Subject: [PATCH] Pass all package names for shared UID connections --- .../io/nekohasekai/sfa/bg/PlatformInterfaceWrapper.kt | 2 +- .../java/io/nekohasekai/sfa/compose/model/Connection.kt | 8 ++++---- .../compose/screen/connections/ConnectionDetailsScreen.kt | 6 +++--- .../sfa/compose/screen/connections/ConnectionItem.kt | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/io/nekohasekai/sfa/bg/PlatformInterfaceWrapper.kt b/app/src/main/java/io/nekohasekai/sfa/bg/PlatformInterfaceWrapper.kt index fa7cea5..7a0be3c 100644 --- a/app/src/main/java/io/nekohasekai/sfa/bg/PlatformInterfaceWrapper.kt +++ b/app/src/main/java/io/nekohasekai/sfa/bg/PlatformInterfaceWrapper.kt @@ -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().iterator())) return owner } catch (e: Exception) { Log.e("PlatformInterface", "getConnectionOwnerUid", e) diff --git a/app/src/main/java/io/nekohasekai/sfa/compose/model/Connection.kt b/app/src/main/java/io/nekohasekai/sfa/compose/model/Connection.kt index c84759e..ee5953a 100644 --- a/app/src/main/java/io/nekohasekai/sfa/compose/model/Connection.kt +++ b/app/src/main/java/io/nekohasekai/sfa/compose/model/Connection.kt @@ -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) { 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 } diff --git a/app/src/main/java/io/nekohasekai/sfa/compose/screen/connections/ConnectionDetailsScreen.kt b/app/src/main/java/io/nekohasekai/sfa/compose/screen/connections/ConnectionDetailsScreen.kt index ef57240..bb7548d 100644 --- a/app/src/main/java/io/nekohasekai/sfa/compose/screen/connections/ConnectionDetailsScreen.kt +++ b/app/src/main/java/io/nekohasekai/sfa/compose/screen/connections/ConnectionDetailsScreen.kt @@ -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, ) } diff --git a/app/src/main/java/io/nekohasekai/sfa/compose/screen/connections/ConnectionItem.kt b/app/src/main/java/io/nekohasekai/sfa/compose/screen/connections/ConnectionItem.kt index 49dc7a0..a525ad5 100644 --- a/app/src/main/java/io/nekohasekai/sfa/compose/screen/connections/ConnectionItem.kt +++ b/app/src/main/java/io/nekohasekai/sfa/compose/screen/connections/ConnectionItem.kt @@ -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) {