summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectActionButton.kt9
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectionStatus.kt9
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/NotificationBanner.kt13
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/ConnectionProxy.kt7
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/LocationInfoCache.kt9
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/model/ActionAfterDisconnect.kt7
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/model/TunnelState.kt2
-rw-r--r--mullvad-jni/src/into_java.rs54
-rw-r--r--mullvad-jni/src/lib.rs3
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, &parameters)
+ env.new_object(&class, &signature, &parameters)
}
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",