diff options
7 files changed, 59 insertions, 5 deletions
diff --git a/android/app/src/androidTest/kotlin/net/mullvad/mullvadvpn/compose/screen/SelectLocationScreenTest.kt b/android/app/src/androidTest/kotlin/net/mullvad/mullvadvpn/compose/screen/SelectLocationScreenTest.kt index 1dc87cddff..e67e08249e 100644 --- a/android/app/src/androidTest/kotlin/net/mullvad/mullvadvpn/compose/screen/SelectLocationScreenTest.kt +++ b/android/app/src/androidTest/kotlin/net/mullvad/mullvadvpn/compose/screen/SelectLocationScreenTest.kt @@ -8,9 +8,11 @@ import kotlinx.coroutines.flow.MutableSharedFlow import net.mullvad.mullvadvpn.compose.state.SelectLocationUiState import net.mullvad.mullvadvpn.compose.test.CIRCULAR_PROGRESS_INDICATOR import net.mullvad.mullvadvpn.compose.theme.AppTheme +import net.mullvad.mullvadvpn.model.PortRange import net.mullvad.mullvadvpn.model.RelayEndpointData import net.mullvad.mullvadvpn.model.RelayListCity import net.mullvad.mullvadvpn.model.RelayListCountry +import net.mullvad.mullvadvpn.model.WireguardEndpointData import net.mullvad.mullvadvpn.model.WireguardRelayEndpointData import net.mullvad.mullvadvpn.relaylist.RelayList import org.junit.Before @@ -131,10 +133,15 @@ class SelectLocationScreenTest { private val DUMMY_RELAY_COUNTRY_2 = RelayListCountry("Relay Country 2", "RCo2", arrayListOf(DUMMY_RELAY_CITY_2)) + private val DUMMY_WIREGUARD_PORT_RANGES = ArrayList<PortRange>() + private val DUMMY_WIREGUARD_ENDPOINT_DATA = + WireguardEndpointData(DUMMY_WIREGUARD_PORT_RANGES) + private val DUMMY_RELAY_LIST = RelayList( net.mullvad.mullvadvpn.model.RelayList( - arrayListOf(DUMMY_RELAY_COUNTRY_1, DUMMY_RELAY_COUNTRY_2) + arrayListOf(DUMMY_RELAY_COUNTRY_1, DUMMY_RELAY_COUNTRY_2), + DUMMY_WIREGUARD_ENDPOINT_DATA ) ) } diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/model/PortRange.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/model/PortRange.kt new file mode 100644 index 0000000000..376f5ef7a4 --- /dev/null +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/model/PortRange.kt @@ -0,0 +1,6 @@ +package net.mullvad.mullvadvpn.model + +import android.os.Parcelable +import kotlinx.parcelize.Parcelize + +@Parcelize data class PortRange(val from: Int, val to: Int) : Parcelable diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayList.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayList.kt index 2d13dc9322..60d8b6dd35 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayList.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/model/RelayList.kt @@ -3,4 +3,8 @@ package net.mullvad.mullvadvpn.model import android.os.Parcelable import kotlinx.parcelize.Parcelize -@Parcelize data class RelayList(val countries: ArrayList<RelayListCountry>) : Parcelable +@Parcelize +data class RelayList( + val countries: ArrayList<RelayListCountry>, + val wireguardEndpointData: WireguardEndpointData +) : Parcelable diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/model/WireguardEndpointData.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/model/WireguardEndpointData.kt new file mode 100644 index 0000000000..0a21221bb0 --- /dev/null +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/model/WireguardEndpointData.kt @@ -0,0 +1,6 @@ +package net.mullvad.mullvadvpn.model + +import android.os.Parcelable +import kotlinx.parcelize.Parcelize + +@Parcelize data class WireguardEndpointData(val portRanges: ArrayList<PortRange>) : Parcelable diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/RelayListListener.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/RelayListListener.kt index 5d18cca679..46cf492d01 100644 --- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/RelayListListener.kt +++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/RelayListListener.kt @@ -6,6 +6,7 @@ import net.mullvad.mullvadvpn.ipc.EventDispatcher import net.mullvad.mullvadvpn.ipc.Request import net.mullvad.mullvadvpn.model.Constraint import net.mullvad.mullvadvpn.model.LocationConstraint +import net.mullvad.mullvadvpn.model.PortRange import net.mullvad.mullvadvpn.model.RelayConstraints import net.mullvad.mullvadvpn.model.RelaySettings import net.mullvad.mullvadvpn.model.WireguardConstraints @@ -19,6 +20,7 @@ class RelayListListener( ) { private var relayList: RelayList? = null private var relaySettings: RelaySettings? = null + private var portRanges: List<PortRange> = emptyList() var selectedRelayItem: RelayItem? = null private set @@ -59,9 +61,19 @@ class RelayListListener( } } + var onPortRangesChange: ((List<PortRange>) -> Unit)? = null + set(value) { + field = value + + synchronized(this) { value?.invoke(portRanges) } + } + init { eventDispatcher.registerHandler(Event.NewRelayList::class) { event -> - event.relayList?.let { relayLocations -> relayListChanged(RelayList(relayLocations)) } + event.relayList?.let { relayLocations -> + relayListChanged(RelayList(relayLocations)) + onPortRangesChange?.invoke(relayLocations.wireguardEndpointData.portRanges) + } } settingsListener.relaySettingsNotifier.subscribe(this) { newRelaySettings -> diff --git a/mullvad-jni/src/classes.rs b/mullvad-jni/src/classes.rs index 595084dbd6..e7d34f7966 100644 --- a/mullvad-jni/src/classes.rs +++ b/mullvad-jni/src/classes.rs @@ -32,6 +32,7 @@ pub const CLASSES: &[&str] = &[ "net/mullvad/mullvadvpn/model/PublicKey", "net/mullvad/mullvadvpn/model/QuantumResistantState", "net/mullvad/mullvadvpn/model/Port", + "net/mullvad/mullvadvpn/model/PortRange", "net/mullvad/mullvadvpn/model/Relay", "net/mullvad/mullvadvpn/model/RelayConstraints", "net/mullvad/mullvadvpn/model/RelayEndpointData$Bridge", @@ -57,6 +58,7 @@ pub const CLASSES: &[&str] = &[ "net/mullvad/mullvadvpn/model/VoucherSubmissionResult", "net/mullvad/mullvadvpn/model/LoginResult", "net/mullvad/mullvadvpn/model/WireguardConstraints", + "net/mullvad/mullvadvpn/model/WireguardEndpointData", "net/mullvad/mullvadvpn/model/WireguardRelayEndpointData", "net/mullvad/mullvadvpn/service/MullvadDaemon", "net/mullvad/mullvadvpn/service/MullvadVpnService", diff --git a/mullvad-types/src/relay_list.rs b/mullvad-types/src/relay_list.rs index 9e9b77be9d..e2cd8392f5 100644 --- a/mullvad-types/src/relay_list.rs +++ b/mullvad-types/src/relay_list.rs @@ -22,7 +22,6 @@ pub struct RelayList { pub openvpn: OpenVpnEndpointData, #[cfg_attr(target_os = "android", jnix(skip))] pub bridge: BridgeEndpointData, - #[cfg_attr(target_os = "android", jnix(skip))] pub wireguard: WireguardEndpointData, } @@ -118,13 +117,22 @@ pub struct OpenVpnEndpoint { #[derive(Clone, Eq, PartialEq, Hash, Deserialize, Serialize, Debug)] #[cfg_attr(target_os = "android", derive(IntoJava))] #[cfg_attr(target_os = "android", jnix(package = "net.mullvad.mullvadvpn.model"))] -#[cfg_attr(target_os = "android", jnix(skip_all))] +#[serde(rename_all = "snake_case")] pub struct WireguardEndpointData { /// Port to connect to + #[cfg_attr( + target_os = "android", + jnix( + map = "|ranges| ranges.iter().map(|r| PortRange { from: r.0 as i32, to: r.1 as i32 } ).collect::<Vec<PortRange>>()" + ) + )] pub port_ranges: Vec<(u16, u16)>, /// Gateways to be used with the tunnel + #[cfg_attr(target_os = "android", jnix(skip))] pub ipv4_gateway: Ipv4Addr, + #[cfg_attr(target_os = "android", jnix(skip))] pub ipv6_gateway: Ipv6Addr, + #[cfg_attr(target_os = "android", jnix(skip))] pub udp2tcp_ports: Vec<u16>, } @@ -139,6 +147,15 @@ impl Default for WireguardEndpointData { } } +/// Used for jni conversion +#[cfg(target_os = "android")] +#[derive(Clone, Eq, PartialEq, Hash, Debug, IntoJava)] +#[jnix(package = "net.mullvad.mullvadvpn.model")] +struct PortRange { + from: i32, + to: i32, +} + /// Contains data about specific WireGuard endpoints, i.e. their public keys. #[derive(Clone, Eq, PartialEq, Hash, Deserialize, Serialize, Debug)] #[cfg_attr(target_os = "android", derive(IntoJava))] |
