summaryrefslogtreecommitdiffhomepage
path: root/android/src
diff options
context:
space:
mode:
Diffstat (limited to 'android/src')
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectFragment.kt30
1 files changed, 29 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 4a853b2f7b..b288ecfdbc 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectFragment.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectFragment.kt
@@ -7,7 +7,10 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.Job
+import android.app.Activity
import android.content.Context
+import android.content.Intent
+import android.net.VpnService
import android.os.Bundle
import android.os.Handler
import android.support.v4.app.Fragment
@@ -24,7 +27,10 @@ class ConnectFragment : Fragment() {
private lateinit var notificationBanner: NotificationBanner
private lateinit var status: ConnectionStatus
+ private lateinit var parentActivity: MainActivity
+
private var daemon = CompletableDeferred<MullvadDaemon>()
+ private var vpnPermission = CompletableDeferred<Unit>()
private var generateWireguardKeyJob = generateWireguardKey()
@@ -36,7 +42,8 @@ class ConnectFragment : Fragment() {
override fun onAttach(context: Context) {
super.onAttach(context)
- waitForDaemonJob = waitForDaemon((context as MainActivity).asyncDaemon)
+ parentActivity = context as MainActivity
+ waitForDaemonJob = waitForDaemon(parentActivity.asyncDaemon)
}
override fun onCreateView(
@@ -75,6 +82,12 @@ class ConnectFragment : Fragment() {
super.onDestroyView()
}
+ override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
+ if (resultCode == Activity.RESULT_OK) {
+ vpnPermission.complete(Unit)
+ }
+ }
+
private fun waitForDaemon(asyncDaemon: Deferred<MullvadDaemon>) =
GlobalScope.launch(Dispatchers.Default) {
daemon.complete(asyncDaemon.await())
@@ -97,11 +110,26 @@ class ConnectFragment : Fragment() {
}
}
+ private fun requestVpnPermission() {
+ val intent = VpnService.prepare(parentActivity)
+
+ vpnPermission = CompletableDeferred<Unit>()
+
+ if (intent != null) {
+ startActivityForResult(intent, 0)
+ } else {
+ onActivityResult(0, Activity.RESULT_OK, null)
+ }
+ }
+
private fun connect() {
updateViewToPreConnecting()
activeAction?.cancel()
+ requestVpnPermission()
+
activeAction = GlobalScope.launch(Dispatchers.Default) {
+ vpnPermission.await()
generateWireguardKeyJob.join()
daemon.await().connect()
}