summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-12-03 15:13:51 +0000
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-12-04 12:17:24 +0000
commitcf7f1c4fb77b7f37f06425a18676b2e778f4f7f2 (patch)
tree3405d5da5d3127334c91fc3f714bb8471327f4e7
parent3086b675415bddcd22b60004d6abd1ab762c4980 (diff)
downloadmullvadvpn-cf7f1c4fb77b7f37f06425a18676b2e778f4f7f2.tar.xz
mullvadvpn-cf7f1c4fb77b7f37f06425a18676b2e778f4f7f2.zip
Notify connectivity changes to the offline monitor
-rw-r--r--android/src/main/kotlin/net/mullvad/talpid/ConnectivityListener.kt9
-rw-r--r--talpid-core/src/offline/android.rs25
2 files changed, 32 insertions, 2 deletions
diff --git a/android/src/main/kotlin/net/mullvad/talpid/ConnectivityListener.kt b/android/src/main/kotlin/net/mullvad/talpid/ConnectivityListener.kt
index 369d61b813..f0b6e2e923 100644
--- a/android/src/main/kotlin/net/mullvad/talpid/ConnectivityListener.kt
+++ b/android/src/main/kotlin/net/mullvad/talpid/ConnectivityListener.kt
@@ -10,7 +10,13 @@ import android.net.NetworkInfo.DetailedState
class ConnectivityListener : BroadcastReceiver() {
var isConnected = true
- private set
+ private set(value) {
+ field = value
+
+ if (senderAddress != 0L) {
+ notifyConnectivityChange(value, senderAddress)
+ }
+ }
var senderAddress = 0L
@@ -57,5 +63,6 @@ class ConnectivityListener : BroadcastReceiver() {
senderAddress = 0L
}
+ private external fun notifyConnectivityChange(isConnected: Boolean, senderAddress: Long)
private external fun destroySender(senderAddress: Long)
}
diff --git a/talpid-core/src/offline/android.rs b/talpid-core/src/offline/android.rs
index 5f21e143e8..1ab34de87c 100644
--- a/talpid-core/src/offline/android.rs
+++ b/talpid-core/src/offline/android.rs
@@ -1,6 +1,10 @@
use crate::tunnel_state_machine::TunnelCommand;
use futures::sync::mpsc::UnboundedSender;
-use jnix::jni::{objects::JObject, sys::jlong, JNIEnv};
+use jnix::jni::{
+ objects::JObject,
+ sys::{jboolean, jlong, JNI_FALSE},
+ JNIEnv,
+};
use std::sync::Weak;
#[derive(err_derive::Error, Debug)]
@@ -15,6 +19,25 @@ impl MonitorHandle {
}
}
+/// Entry point for Android Java code to notify the connectivity status.
+#[no_mangle]
+#[allow(non_snake_case)]
+pub extern "system" fn Java_net_mullvad_talpid_ConnectivityListener_notifyConnectivityChange(
+ _: JNIEnv<'_>,
+ _: JObject<'_>,
+ is_connected: jboolean,
+ sender_address: jlong,
+) {
+ let sender_ref = Box::leak(unsafe { get_sender_from_address(sender_address) });
+ let tunnel_command = TunnelCommand::IsOffline(is_connected == JNI_FALSE);
+
+ if let Some(sender) = sender_ref.upgrade() {
+ if sender.unbounded_send(tunnel_command).is_err() {
+ log::warn!("Failed to send offline change event");
+ }
+ }
+}
+
/// Entry point for Android Java code to return ownership of the sender reference.
#[no_mangle]
#[allow(non_snake_case)]