diff --git a/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/components/LocalSocketNatInfo.kt b/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/components/LocalSocketNatInfo.kt new file mode 100644 index 00000000..be9650ed --- /dev/null +++ b/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/components/LocalSocketNatInfo.kt @@ -0,0 +1,21 @@ +package com.utun.chat.ui.components + +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.res.stringResource +import com.utun.chat.R +import com.utun.chat.data.LocalSocketState + +/** Результат детектора для рабочего сокета; порт TCP остаётся нулевым. */ +@Composable +fun LocalSocketNatInfo(socket: LocalSocketState) { + val source = if (socket.natSource == 2) " · STUN" else "" + Text(stringResource(socket.natLabelRes) + source, + style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant) + if (socket.externalIp.isNotEmpty()) { + val ip = if (socket.externalIp.contains(':')) "[${socket.externalIp}]" else socket.externalIp + Text(stringResource(R.string.socket_external_address, "$ip:${socket.externalPort}"), + style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant) + } +} diff --git a/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/screens/MemberListScreen.kt b/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/screens/MemberListScreen.kt index ab8d6e4b..a0aa2f9e 100644 --- a/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/screens/MemberListScreen.kt +++ b/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/screens/MemberListScreen.kt @@ -47,6 +47,7 @@ import com.utun.chat.data.MemberDetail import com.utun.chat.data.MemberLinks import com.utun.chat.data.LinkStatus import com.utun.chat.data.LocalSocketState +import com.utun.chat.ui.components.LocalSocketNatInfo import com.utun.chat.ui.components.PortableRadioIcon import com.utun.chat.ui.components.RadioSpeakerIcon import com.utun.chat.viewmodel.ChatViewModel @@ -427,6 +428,7 @@ private fun MemberDetailCard( color = MaterialTheme.colorScheme.onSurface ) } + LocalSocketNatInfo(sk) } } } else { diff --git a/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/screens/SettingsScreen.kt b/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/screens/SettingsScreen.kt index 675a7556..d06abeac 100644 --- a/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/screens/SettingsScreen.kt +++ b/tools/chatgui-android/app/src/main/java/com/utun/chat/ui/screens/SettingsScreen.kt @@ -41,6 +41,7 @@ import com.utun.chat.data.MicrophonePermission import com.utun.chat.data.LogManager import com.utun.chat.data.ServerEntry import com.utun.chat.data.LocalSocketState +import com.utun.chat.ui.components.LocalSocketNatInfo import com.utun.chat.data.VoiceSettings import com.utun.chat.headless.HeadlessService import com.utun.chat.ui.components.BatteryOptimizationSetting @@ -380,6 +381,7 @@ private fun DeveloperSettingsTab(vm: ChatViewModel, onDirty: (Boolean) -> Unit, } Text(s.ifName, style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant, modifier = Modifier.fillMaxWidth()) + LocalSocketNatInfo(s) } } }