diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-12-03 15:13:51 +0000 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-12-04 12:17:24 +0000 |
| commit | cf7f1c4fb77b7f37f06425a18676b2e778f4f7f2 (patch) | |
| tree | 3405d5da5d3127334c91fc3f714bb8471327f4e7 | |
| parent | 3086b675415bddcd22b60004d6abd1ab762c4980 (diff) | |
| download | mullvadvpn-cf7f1c4fb77b7f37f06425a18676b2e778f4f7f2.tar.xz mullvadvpn-cf7f1c4fb77b7f37f06425a18676b2e778f4f7f2.zip | |
Notify connectivity changes to the offline monitor
| -rw-r--r-- | android/src/main/kotlin/net/mullvad/talpid/ConnectivityListener.kt | 9 | ||||
| -rw-r--r-- | talpid-core/src/offline/android.rs | 25 |
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)] |
