diff --git a/android/src/main/java/com/tailscale/ipn/ui/model/IpnState.kt b/android/src/main/java/com/tailscale/ipn/ui/model/IpnState.kt index 5c6ac0e..9922b35 100644 --- a/android/src/main/java/com/tailscale/ipn/ui/model/IpnState.kt +++ b/android/src/main/java/com/tailscale/ipn/ui/model/IpnState.kt @@ -26,6 +26,7 @@ class IpnState { val Addrs: List? = null, val CurAddr: String? = null, val Relay: String? = null, + val PeerRelay: String? = null, val Online: Boolean, val ExitNode: Boolean, val ExitNodeOption: Boolean, diff --git a/android/src/main/java/com/tailscale/ipn/ui/util/ConnectionMode.kt b/android/src/main/java/com/tailscale/ipn/ui/util/ConnectionMode.kt index eb36ea1..ba82b06 100644 --- a/android/src/main/java/com/tailscale/ipn/ui/util/ConnectionMode.kt +++ b/android/src/main/java/com/tailscale/ipn/ui/util/ConnectionMode.kt @@ -17,12 +17,15 @@ sealed class ConnectionMode { class Direct : ConnectionMode() + class PeerRelay : ConnectionMode() + @Composable fun titleString(): String { return when (this) { is NotConnected -> stringResource(id = R.string.not_connected) is Derp -> stringResource(R.string.relayed_connection, relayName) is Direct -> stringResource(R.string.direct_connection) + is PeerRelay -> stringResource(R.string.peer_relayed_connection) } } @@ -31,6 +34,7 @@ sealed class ConnectionMode { is NotConnected -> "NotConnected" is Derp -> "Derp($relayName)" is Direct -> "Direct" + is PeerRelay -> "PeerRelay" } } @@ -38,7 +42,8 @@ sealed class ConnectionMode { return when (this) { is NotConnected -> R.drawable.xmark_circle is Derp -> R.drawable.link_off - is Direct -> R.drawable.link + is Direct -> R.drawable.arrow_right_alt_24px + is PeerRelay -> R.drawable.redo_24px } } @@ -48,6 +53,7 @@ sealed class ConnectionMode { is NotConnected -> MaterialTheme.colorScheme.onPrimary is Derp -> MaterialTheme.colorScheme.error is Direct -> MaterialTheme.colorScheme.on + is PeerRelay -> MaterialTheme.colorScheme.on } } } diff --git a/android/src/main/java/com/tailscale/ipn/ui/viewModel/PingViewModel.kt b/android/src/main/java/com/tailscale/ipn/ui/viewModel/PingViewModel.kt index eedd3d0..79c1f7b 100644 --- a/android/src/main/java/com/tailscale/ipn/ui/viewModel/PingViewModel.kt +++ b/android/src/main/java/com/tailscale/ipn/ui/viewModel/PingViewModel.kt @@ -116,9 +116,12 @@ class PingViewModel : ViewModel() { result.Peer?.let { map -> map[peer.value?.Key]?.let { peerStatus -> val curAddr = peerStatus.CurAddr.orEmpty() + val peerRelay = peerStatus.PeerRelay.orEmpty() val relay = peerStatus.Relay.orEmpty() if (curAddr.isNotEmpty()) { this.connectionMode.set(ConnectionMode.Direct()) + } else if (peerRelay.isNotEmpty()) { + this.connectionMode.set(ConnectionMode.PeerRelay()) } else if (relay.isNotEmpty()) { this.connectionMode.set(ConnectionMode.Derp(relayName = relay.uppercase())) } diff --git a/android/src/main/res/drawable/arrow_right_alt_24px.xml b/android/src/main/res/drawable/arrow_right_alt_24px.xml new file mode 100644 index 0000000..cf8c975 --- /dev/null +++ b/android/src/main/res/drawable/arrow_right_alt_24px.xml @@ -0,0 +1,11 @@ + + + diff --git a/android/src/main/res/drawable/redo_24px.xml b/android/src/main/res/drawable/redo_24px.xml new file mode 100644 index 0000000..d47efe3 --- /dev/null +++ b/android/src/main/res/drawable/redo_24px.xml @@ -0,0 +1,11 @@ + + + diff --git a/android/src/main/res/values/strings.xml b/android/src/main/res/values/strings.xml index 001774a..3e3db05 100644 --- a/android/src/main/res/values/strings.xml +++ b/android/src/main/res/values/strings.xml @@ -303,6 +303,7 @@ Ping Relayed connection (%1$s) Direct connection + Peer relayed connection Pinging %1$s Ping failed An unknown error occurred. Please try again.