diff options
9 files changed, 95 insertions, 18 deletions
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectActionButton.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectActionButton.kt index 00ebdd8f64..aaa8032542 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectActionButton.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectActionButton.kt @@ -3,6 +3,7 @@ package net.mullvad.mullvadvpn import android.view.View import android.widget.Button +import net.mullvad.mullvadvpn.model.ActionAfterDisconnect import net.mullvad.mullvadvpn.model.KeygenEvent import net.mullvad.mullvadvpn.model.TunnelState @@ -47,7 +48,13 @@ class ConnectActionButton(val parentView: View) { set(value) { when (value) { is TunnelState.Disconnected -> disconnected() - is TunnelState.Disconnecting -> disconnected() + is TunnelState.Disconnecting -> { + when (value.actionAfterDisconnect) { + is ActionAfterDisconnect.Nothing -> disconnected() + is ActionAfterDisconnect.Block -> connected() + is ActionAfterDisconnect.Reconnect -> connecting() + } + } is TunnelState.Connecting -> connecting() is TunnelState.Connected -> connected() is TunnelState.Blocked -> connected() diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectionStatus.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectionStatus.kt index fda8eee4bc..e783e8e438 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectionStatus.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectionStatus.kt @@ -4,6 +4,7 @@ import android.content.Context import android.view.View import android.widget.TextView +import net.mullvad.mullvadvpn.model.ActionAfterDisconnect import net.mullvad.mullvadvpn.model.TunnelState class ConnectionStatus(val parentView: View, val context: Context) { @@ -16,7 +17,13 @@ class ConnectionStatus(val parentView: View, val context: Context) { fun setState(state: TunnelState) { when (state) { - is TunnelState.Disconnecting -> disconnected() + is TunnelState.Disconnecting -> { + when (state.actionAfterDisconnect) { + is ActionAfterDisconnect.Nothing -> disconnected() + is ActionAfterDisconnect.Block -> connected() + is ActionAfterDisconnect.Reconnect -> connecting() + } + } is TunnelState.Disconnected -> disconnected() is TunnelState.Connecting -> connecting() is TunnelState.Connected -> connected() diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/NotificationBanner.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/NotificationBanner.kt index b90b3aa251..f6e50fd94e 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/NotificationBanner.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/NotificationBanner.kt @@ -3,6 +3,7 @@ package net.mullvad.mullvadvpn import android.widget.TextView import android.view.View +import net.mullvad.mullvadvpn.model.ActionAfterDisconnect import net.mullvad.mullvadvpn.model.KeygenEvent import net.mullvad.mullvadvpn.model.TunnelState @@ -40,8 +41,16 @@ class NotificationBanner(val parentView: View) { } private fun updateBasedOnTunnelState(): Boolean { - when (tunnelState) { - is TunnelState.Disconnecting -> hide() + val state = tunnelState + + when (state) { + is TunnelState.Disconnecting -> { + when (state.actionAfterDisconnect) { + is ActionAfterDisconnect.Nothing -> hide() + is ActionAfterDisconnect.Block -> show(R.string.blocking_internet) + is ActionAfterDisconnect.Reconnect -> show(R.string.blocking_internet) + } + } is TunnelState.Disconnected -> hide() is TunnelState.Connecting -> show(R.string.blocking_internet) is TunnelState.Connected -> hide() diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/ConnectionProxy.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/ConnectionProxy.kt index 8782493b4c..7a3ec1dd9c 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/ConnectionProxy.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/ConnectionProxy.kt @@ -6,6 +6,7 @@ import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.Job import net.mullvad.mullvadvpn.MainActivity +import net.mullvad.mullvadvpn.model.ActionAfterDisconnect import net.mullvad.mullvadvpn.model.TunnelState class ConnectionProxy(val parentActivity: MainActivity) { @@ -34,6 +35,10 @@ class ConnectionProxy(val parentActivity: MainActivity) { } var onUiStateChange: ((TunnelState) -> Unit)? = null + set(value) { + field = value + value?.invoke(uiState) + } fun connect() { uiState = TunnelState.Connecting(null) @@ -50,7 +55,7 @@ class ConnectionProxy(val parentActivity: MainActivity) { } fun disconnect() { - uiState = TunnelState.Disconnecting() + uiState = TunnelState.Disconnecting(ActionAfterDisconnect.Nothing()) cancelActiveAction() activeAction = GlobalScope.launch(Dispatchers.Default) { diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/LocationInfoCache.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/LocationInfoCache.kt index 569f008729..74745118d3 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/LocationInfoCache.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/LocationInfoCache.kt @@ -7,6 +7,7 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.Job +import net.mullvad.mullvadvpn.model.ActionAfterDisconnect import net.mullvad.mullvadvpn.model.GeoIpLocation import net.mullvad.mullvadvpn.model.TunnelState import net.mullvad.mullvadvpn.MullvadDaemon @@ -38,7 +39,13 @@ class LocationInfoCache(val daemon: Deferred<MullvadDaemon>) { location = value.location fetchLocation() } - is TunnelState.Disconnecting -> location = lastKnownRealLocation + is TunnelState.Disconnecting -> { + when (value.actionAfterDisconnect) { + is ActionAfterDisconnect.Nothing -> location = lastKnownRealLocation + is ActionAfterDisconnect.Block -> location = null + is ActionAfterDisconnect.Reconnect -> {} // Leave location unchanged + } + } is TunnelState.Blocked -> location = null } } diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/model/ActionAfterDisconnect.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/model/ActionAfterDisconnect.kt new file mode 100644 index 0000000000..f39ba030fc --- /dev/null +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/model/ActionAfterDisconnect.kt @@ -0,0 +1,7 @@ +package net.mullvad.mullvadvpn.model + +sealed class ActionAfterDisconnect { + class Nothing : ActionAfterDisconnect() + class Block : ActionAfterDisconnect() + class Reconnect : ActionAfterDisconnect() +} diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/model/TunnelState.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/model/TunnelState.kt index 15a698c6f4..b08e75e3e8 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/model/TunnelState.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/model/TunnelState.kt @@ -4,6 +4,6 @@ sealed class TunnelState() { class Disconnected() : TunnelState() class Connecting(val location: GeoIpLocation?) : TunnelState() class Connected(val location: GeoIpLocation?) : TunnelState() - class Disconnecting() : TunnelState() + class Disconnecting(val actionAfterDisconnect: ActionAfterDisconnect) : TunnelState() class Blocked() : TunnelState() } diff --git a/mullvad-jni/src/into_java.rs b/mullvad-jni/src/into_java.rs index fc899bf12e..fd5dbc8427 100644 --- a/mullvad-jni/src/into_java.rs +++ b/mullvad-jni/src/into_java.rs @@ -18,7 +18,7 @@ use mullvad_types::{ }; use std::{fmt::Debug, net::IpAddr}; use talpid_core::tunnel::tun_provider::TunConfig; -use talpid_types::net::wireguard::PublicKey; +use talpid_types::{net::wireguard::PublicKey, tunnel::ActionAfterDisconnect}; pub trait IntoJava<'env> { type JavaType; @@ -495,15 +495,47 @@ impl<'env> IntoJava<'env> for Settings { } } +impl<'env> IntoJava<'env> for ActionAfterDisconnect { + type JavaType = JObject<'env>; + + fn into_java(self, env: &JNIEnv<'env>) -> Self::JavaType { + let variant = match self { + ActionAfterDisconnect::Nothing => "Nothing", + ActionAfterDisconnect::Block => "Block", + ActionAfterDisconnect::Reconnect => "Reconnect", + }; + let class_name = format!( + "net/mullvad/mullvadvpn/model/ActionAfterDisconnect${}", + variant + ); + let class = get_class(&class_name); + + env.new_object(&class, "()V", &[]) + .expect("Failed to create ActionAfterDisconnect sub-class variant Java object") + } +} + impl<'env> IntoJava<'env> for TunnelState { type JavaType = JObject<'env>; fn into_java(self, env: &JNIEnv<'env>) -> Self::JavaType { - let (variant, location) = match self { + let (variant, parameter) = match self { TunnelState::Disconnected => ("Disconnected", None), - TunnelState::Connecting { location, .. } => ("Connecting", Some(location)), - TunnelState::Connected { location, .. } => ("Connected", Some(location)), - TunnelState::Disconnecting(_) => ("Disconnecting", None), + TunnelState::Connecting { location, .. } => ( + "Connecting", + Some((location.into_java(env), "GeoIpLocation")), + ), + TunnelState::Connected { location, .. } => ( + "Connected", + Some((location.into_java(env), "GeoIpLocation")), + ), + TunnelState::Disconnecting(action_after_disconnect) => ( + "Disconnecting", + Some(( + action_after_disconnect.into_java(env), + "ActionAfterDisconnect", + )), + ), TunnelState::Blocked(_) => ("Blocked", None), }; @@ -512,13 +544,13 @@ impl<'env> IntoJava<'env> for TunnelState { variant )); - match location { - Some(location) => { - let location = env.auto_local(location.into_java(env)); - let parameters = [JValue::Object(location.as_obj())]; - let signature = "(Lnet/mullvad/mullvadvpn/model/GeoIpLocation;)V"; + match parameter { + Some((java_object, class_name)) => { + let parameter = env.auto_local(java_object); + let parameters = [JValue::Object(parameter.as_obj())]; + let signature = format!("(Lnet/mullvad/mullvadvpn/model/{};)V", class_name); - env.new_object(&class, signature, ¶meters) + env.new_object(&class, &signature, ¶meters) } None => env.new_object(&class, "()V", &[]), } diff --git a/mullvad-jni/src/lib.rs b/mullvad-jni/src/lib.rs index dfc55010ac..309232774e 100644 --- a/mullvad-jni/src/lib.rs +++ b/mullvad-jni/src/lib.rs @@ -35,6 +35,9 @@ const CLASSES_TO_LOAD: &[&str] = &[ "java/util/ArrayList", "java/util/List", "net/mullvad/mullvadvpn/model/AccountData", + "net/mullvad/mullvadvpn/model/ActionAfterDisconnect$Block", + "net/mullvad/mullvadvpn/model/ActionAfterDisconnect$Nothing", + "net/mullvad/mullvadvpn/model/ActionAfterDisconnect$Reconnect", "net/mullvad/mullvadvpn/model/Constraint$Any", "net/mullvad/mullvadvpn/model/Constraint$Only", "net/mullvad/mullvadvpn/model/GeoIpLocation", |
