diff options
| author | David Lönnhager <david.l@mullvad.net> | 2025-01-29 15:11:39 +0100 |
|---|---|---|
| committer | Jonatan Rhodin <jonatan.rhodin@mullvad.net> | 2025-03-07 11:36:59 +0100 |
| commit | 43cbbb50f9bab8dece273e764d56a2c467032ac0 (patch) | |
| tree | f927960e89b6ac44a82f1739de8ffcb925fd0c83 /talpid-core/src | |
| parent | a6543aa58a0fefaa52a78e87d5ddbd3112c7e0c1 (diff) | |
| download | mullvadvpn-43cbbb50f9bab8dece273e764d56a2c467032ac0.tar.xz mullvadvpn-43cbbb50f9bab8dece273e764d56a2c467032ac0.zip | |
Track IPv6 connectivity on Android
Co-authored-by: Jonatan Rhoidn <jonatan.rhodin@mullvad.net>
Co-authored-by: David Göransson <david.goransson@mullvad.net>
Diffstat (limited to 'talpid-core/src')
| -rw-r--r-- | talpid-core/src/connectivity_listener.rs | 62 |
1 files changed, 36 insertions, 26 deletions
diff --git a/talpid-core/src/connectivity_listener.rs b/talpid-core/src/connectivity_listener.rs index 767673123e..1e6e504f7d 100644 --- a/talpid-core/src/connectivity_listener.rs +++ b/talpid-core/src/connectivity_listener.rs @@ -98,36 +98,41 @@ impl ConnectivityListener { /// Return the current offline/connectivity state pub fn connectivity(&self) -> Connectivity { - self.get_is_connected() - .map(|connected| Connectivity::Status { connected }) - .unwrap_or_else(|error| { - log::error!( - "{}", - error.display_chain_with_msg("Failed to check connectivity status") - ); - Connectivity::PresumeOnline - }) + self.get_is_connected().unwrap_or_else(|error| { + log::error!( + "{}", + error.display_chain_with_msg("Failed to check connectivity status") + ); + Connectivity::PresumeOnline + }) } - fn get_is_connected(&self) -> Result<bool, Error> { + fn get_is_connected(&self) -> Result<Connectivity, Error> { let env = JnixEnv::from( self.jvm .attach_current_thread_as_daemon() .map_err(Error::AttachJvmToThread)?, ); - let is_connected = - env.call_method(self.android_listener.as_obj(), "isConnected", "()Z", &[]); + let is_connected = env.call_method( + self.android_listener.as_obj(), + "isConnected", + "()Lnet/mullvad/talpid/model/Connectivity;", + &[], + ); - match is_connected { - Ok(JValue::Bool(JNI_TRUE)) => Ok(true), - Ok(JValue::Bool(_)) => Ok(false), - value => Err(Error::InvalidMethodResult( - "ConnectivityListener", - "isConnected", - format!("{:?}", value), - )), - } + let is_connected = match is_connected { + Ok(JValue::Object(object)) => object, + value => { + return Err(Error::InvalidMethodResult( + "ConnectivityListener", + "isConnected", + format!("{:?}", value), + )) + } + }; + + Ok(Connectivity::from_java(&env, is_connected)) } /// Return the current DNS servers according to Android @@ -160,9 +165,10 @@ impl ConnectivityListener { #[unsafe(no_mangle)] #[allow(non_snake_case)] pub extern "system" fn Java_net_mullvad_talpid_ConnectivityListener_notifyConnectivityChange( - _: JNIEnv<'_>, - _: JObject<'_>, - connected: jboolean, + _env: JNIEnv<'_>, + _obj: JObject<'_>, + is_ipv4: jboolean, + is_ipv6: jboolean, ) { let Some(tx) = &*CONNECTIVITY_TX.lock().unwrap() else { // No sender has been registered @@ -170,10 +176,14 @@ pub extern "system" fn Java_net_mullvad_talpid_ConnectivityListener_notifyConnec return; }; - let connected = JNI_TRUE == connected; + let is_ipv4 = JNI_TRUE == is_ipv4; + let is_ipv6 = JNI_TRUE == is_ipv6; if tx - .unbounded_send(Connectivity::Status { connected }) + .unbounded_send(Connectivity::Status { + ipv4: is_ipv4, + ipv6: is_ipv6, + }) .is_err() { log::warn!("Failed to send offline change event"); |
