summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-05-23 13:41:47 -0300
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-05-23 13:41:47 -0300
commitfb9711759ddad7a5b984dda8e65df4effe312500 (patch)
tree8585e22c16e0d97c09f297e5022b52070e1e6380
parent30d55fe3e013e2ef4fa01dce787ac0af781f2450 (diff)
parent08843bd659a3c461ed090e4cc42244f5aa0c75db (diff)
downloadmullvadvpn-fb9711759ddad7a5b984dda8e65df4effe312500.tar.xz
mullvadvpn-fb9711759ddad7a5b984dda8e65df4effe312500.zip
Merge branch 'tunnel-control-on-android'
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectFragment.kt21
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadDaemon.kt2
-rw-r--r--mullvad-jni/src/daemon_interface.rs25
-rw-r--r--mullvad-jni/src/lib.rs26
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>,