diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-05-23 13:41:47 -0300 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-05-23 13:41:47 -0300 |
| commit | fb9711759ddad7a5b984dda8e65df4effe312500 (patch) | |
| tree | 8585e22c16e0d97c09f297e5022b52070e1e6380 | |
| parent | 30d55fe3e013e2ef4fa01dce787ac0af781f2450 (diff) | |
| parent | 08843bd659a3c461ed090e4cc42244f5aa0c75db (diff) | |
| download | mullvadvpn-fb9711759ddad7a5b984dda8e65df4effe312500.tar.xz mullvadvpn-fb9711759ddad7a5b984dda8e65df4effe312500.zip | |
Merge branch 'tunnel-control-on-android'
| -rw-r--r-- | android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectFragment.kt | 21 | ||||
| -rw-r--r-- | android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadDaemon.kt | 2 | ||||
| -rw-r--r-- | mullvad-jni/src/daemon_interface.rs | 25 | ||||
| -rw-r--r-- | mullvad-jni/src/lib.rs | 26 |
4 files changed, 73 insertions, 1 deletions
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectFragment.kt index bbe43ede29..8d7abfd24e 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectFragment.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectFragment.kt @@ -1,5 +1,11 @@ package net.mullvad.mullvadvpn +import kotlinx.coroutines.launch +import kotlinx.coroutines.Deferred +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope + +import android.content.Context import android.os.Bundle import android.os.Handler import android.support.v4.app.Fragment @@ -15,6 +21,7 @@ class ConnectFragment : Fragment() { private lateinit var status: ConnectionStatus private lateinit var connectHandler: Handler + private lateinit var daemon: Deferred<MullvadDaemon> private var state = ConnectionState.Disconnected set(value) { @@ -26,6 +33,12 @@ class ConnectFragment : Fragment() { field = value } + override fun onAttach(context: Context) { + super.onAttach(context) + + daemon = (context as MainActivity).asyncDaemon + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -60,12 +73,20 @@ class ConnectFragment : Fragment() { private fun connect() { state = ConnectionState.Connecting + GlobalScope.launch(Dispatchers.Default) { + daemon.await().connect() + } + connectHandler.postDelayed(Runnable { connected() }, 1000) } private fun disconnect() { state = ConnectionState.Disconnected + GlobalScope.launch(Dispatchers.Default) { + daemon.await().disconnect() + } + connectHandler.removeCallbacksAndMessages(null) } diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadDaemon.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadDaemon.kt index 6d084e6274..e95a761ba5 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadDaemon.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadDaemon.kt @@ -11,6 +11,8 @@ class MullvadDaemon { initialize() } + external fun connect() + external fun disconnect() external fun getAccountData(accountToken: String): AccountData? external fun getRelayLocations(): RelayList external fun getSettings(): Settings diff --git a/mullvad-jni/src/daemon_interface.rs b/mullvad-jni/src/daemon_interface.rs index 328d0c9093..db14a92373 100644 --- a/mullvad-jni/src/daemon_interface.rs +++ b/mullvad-jni/src/daemon_interface.rs @@ -2,7 +2,7 @@ use futures::{sync::oneshot, Future}; use mullvad_daemon::{DaemonCommandSender, ManagementCommand}; use mullvad_types::{ account::AccountData, relay_constraints::RelaySettingsUpdate, relay_list::RelayList, - settings::Settings, + settings::Settings, states::TargetState, }; #[derive(Debug, err_derive::Error)] @@ -37,6 +37,29 @@ impl DaemonInterface { self.command_sender = Some(sender); } + pub fn connect(&self) -> Result<()> { + let (tx, rx) = oneshot::channel(); + + self.send_command(ManagementCommand::SetTargetState(tx, TargetState::Secured))?; + + rx.wait().map_err(|_| Error::NoResponse)?.unwrap(); + + Ok(()) + } + + pub fn disconnect(&self) -> Result<()> { + let (tx, rx) = oneshot::channel(); + + self.send_command(ManagementCommand::SetTargetState( + tx, + TargetState::Unsecured, + ))?; + + rx.wait().map_err(|_| Error::NoResponse)?.unwrap(); + + Ok(()) + } + pub fn get_account_data(&self, account_token: String) -> Result<AccountData> { let (tx, rx) = oneshot::channel(); diff --git a/mullvad-jni/src/lib.rs b/mullvad-jni/src/lib.rs index 9a7f81a0fc..d5708c9a0a 100644 --- a/mullvad-jni/src/lib.rs +++ b/mullvad-jni/src/lib.rs @@ -160,6 +160,32 @@ fn get_class(name: &str) -> GlobalRef { #[no_mangle] #[allow(non_snake_case)] +pub extern "system" fn Java_net_mullvad_mullvadvpn_MullvadDaemon_connect(_: JNIEnv, _: JObject) { + let daemon = DAEMON_INTERFACE.lock(); + + if let Err(error) = daemon.connect() { + log::error!( + "{}", + error.display_chain_with_msg("Failed to request daemon to connect") + ); + } +} + +#[no_mangle] +#[allow(non_snake_case)] +pub extern "system" fn Java_net_mullvad_mullvadvpn_MullvadDaemon_disconnect(_: JNIEnv, _: JObject) { + let daemon = DAEMON_INTERFACE.lock(); + + if let Err(error) = daemon.disconnect() { + log::error!( + "{}", + error.display_chain_with_msg("Failed to request daemon to disconnect") + ); + } +} + +#[no_mangle] +#[allow(non_snake_case)] pub extern "system" fn Java_net_mullvad_mullvadvpn_MullvadDaemon_getAccountData<'env, 'this>( env: JNIEnv<'env>, _: JObject<'this>, |
