summaryrefslogtreecommitdiffhomepage
path: root/android/src
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-05-27 08:24:24 -0300
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-05-27 08:24:24 -0300
commitb8f08c59ab655a2fdc7a71c8abf5895a85758a14 (patch)
treec1233dbefa25db09722e643b32d92a3d3950c402 /android/src
parent513b791fd21fabfa8b9990b34eeb8a1871110a4a (diff)
parentb5243e12d97f084a374de209952a6740ec9c407f (diff)
downloadmullvadvpn-b8f08c59ab655a2fdc7a71c8abf5895a85758a14.tar.xz
mullvadvpn-b8f08c59ab655a2fdc7a71c8abf5895a85758a14.zip
Merge branch 'wireguard-key-generation-on-android'
Diffstat (limited to 'android/src')
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectFragment.kt55
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadDaemon.kt3
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/model/PublicKey.kt3
3 files changed, 54 insertions, 7 deletions
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectFragment.kt
index 11bfabe912..4a853b2f7b 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectFragment.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectFragment.kt
@@ -1,6 +1,7 @@
package net.mullvad.mullvadvpn
import kotlinx.coroutines.launch
+import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.Deferred
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
@@ -23,15 +24,19 @@ class ConnectFragment : Fragment() {
private lateinit var notificationBanner: NotificationBanner
private lateinit var status: ConnectionStatus
- private lateinit var daemon: Deferred<MullvadDaemon>
+ private var daemon = CompletableDeferred<MullvadDaemon>()
+ private var generateWireguardKeyJob = generateWireguardKey()
+
+ private var activeAction: Job? = null
private var attachListenerJob: Job? = null
private var updateViewJob: Job? = null
+ private var waitForDaemonJob: Job? = null
override fun onAttach(context: Context) {
super.onAttach(context)
- daemon = (context as MainActivity).asyncDaemon
+ waitForDaemonJob = waitForDaemon((context as MainActivity).asyncDaemon)
}
override fun onCreateView(
@@ -61,14 +66,20 @@ class ConnectFragment : Fragment() {
return view
}
-
override fun onDestroyView() {
+ waitForDaemonJob?.cancel()
attachListenerJob?.cancel()
detachListener()
+ generateWireguardKeyJob.cancel()
updateViewJob?.cancel()
super.onDestroyView()
}
+ private fun waitForDaemon(asyncDaemon: Deferred<MullvadDaemon>) =
+ GlobalScope.launch(Dispatchers.Default) {
+ daemon.complete(asyncDaemon.await())
+ }
+
private fun attachListener() = GlobalScope.launch(Dispatchers.Default) {
daemon.await().onTunnelStateChange = { state -> updateViewJob = updateView(state) }
}
@@ -77,12 +88,42 @@ class ConnectFragment : Fragment() {
daemon.await().onTunnelStateChange = null
}
- private fun connect() = GlobalScope.launch(Dispatchers.Default) {
- daemon.await().connect()
+ private fun generateWireguardKey() = GlobalScope.launch(Dispatchers.Default) {
+ val daemon = this@ConnectFragment.daemon.await()
+ val key = daemon.getWireguardKey()
+
+ if (key == null) {
+ daemon.generateWireguardKey()
+ }
+ }
+
+ private fun connect() {
+ updateViewToPreConnecting()
+ activeAction?.cancel()
+
+ activeAction = GlobalScope.launch(Dispatchers.Default) {
+ generateWireguardKeyJob.join()
+ daemon.await().connect()
+ }
+ }
+
+ private fun disconnect() {
+ activeAction?.cancel()
+
+ activeAction = GlobalScope.launch(Dispatchers.Default) {
+ daemon.await().disconnect()
+ }
}
- private fun disconnect() = GlobalScope.launch(Dispatchers.Default) {
- daemon.await().disconnect()
+ private fun updateViewToPreConnecting() {
+ val connecting = TunnelStateTransition.Connecting()
+ val disconnected = TunnelStateTransition.Disconnected()
+
+ headerBar.setState(disconnected)
+
+ actionButton.state = connecting
+ notificationBanner.setState(connecting)
+ status.setState(connecting)
}
private fun updateView(state: TunnelStateTransition) = GlobalScope.launch(Dispatchers.Main) {
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadDaemon.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadDaemon.kt
index 80ac09eef2..e9f54769b2 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadDaemon.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadDaemon.kt
@@ -1,6 +1,7 @@
package net.mullvad.mullvadvpn
import net.mullvad.mullvadvpn.model.AccountData
+import net.mullvad.mullvadvpn.model.PublicKey
import net.mullvad.mullvadvpn.model.RelayList
import net.mullvad.mullvadvpn.model.RelaySettingsUpdate
import net.mullvad.mullvadvpn.model.Settings
@@ -16,9 +17,11 @@ class MullvadDaemon {
external fun connect()
external fun disconnect()
+ external fun generateWireguardKey(): Boolean
external fun getAccountData(accountToken: String): AccountData?
external fun getRelayLocations(): RelayList
external fun getSettings(): Settings
+ external fun getWireguardKey(): PublicKey?
external fun setAccount(accountToken: String?)
external fun updateRelaySettings(update: RelaySettingsUpdate)
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/model/PublicKey.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/model/PublicKey.kt
new file mode 100644
index 0000000000..30408c4a9b
--- /dev/null
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/model/PublicKey.kt
@@ -0,0 +1,3 @@
+package net.mullvad.mullvadvpn.model
+
+data class PublicKey(val key: ByteArray)