summaryrefslogtreecommitdiffhomepage
path: root/android/src/main
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2021-04-23 09:40:12 -0300
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2021-04-23 09:40:12 -0300
commit112b98f92ceb4fb5c0bb6d1e2b88853c62f48d23 (patch)
treefdf83fd71cafcaf1cb8425e5edee3b1e71ca2b5b /android/src/main
parent218d6f677eaa1dd0d635158fa69e56df9299e8ad (diff)
parent2aab5be44160da8f7bb15ef9847438a4f8005d2a (diff)
downloadmullvadvpn-112b98f92ceb4fb5c0bb6d1e2b88853c62f48d23.tar.xz
mullvadvpn-112b98f92ceb4fb5c0bb6d1e2b88853c62f48d23.zip
Merge branch 'fix-vpn-permission-request'
Diffstat (limited to 'android/src/main')
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ipc/Event.kt3
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/ServiceEndpoint.kt6
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/VpnPermission.kt10
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/MainActivity.kt34
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/ServiceConnection.kt2
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/VpnPermission.kt12
6 files changed, 37 insertions, 30 deletions
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ipc/Event.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ipc/Event.kt
index c48758230d..6a197224ed 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ipc/Event.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ipc/Event.kt
@@ -55,6 +55,9 @@ sealed class Event : Message.EventMessage() {
) : Event()
@Parcelize
+ object VpnPermissionRequest : Event()
+
+ @Parcelize
data class WireGuardKeyStatus(val keyStatus: KeygenEvent?) : Event()
companion object {
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/ServiceEndpoint.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/ServiceEndpoint.kt
index 188f75a0ea..93c7a8a9cf 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/ServiceEndpoint.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/ServiceEndpoint.kt
@@ -109,7 +109,7 @@ class ServiceEndpoint(
synchronized(this) {
listeners.add(listener)
- val initialEvents = listOf(
+ val initialEvents = mutableListOf(
Event.TunnelStateChange(connectionProxy.state),
Event.LoginStatus(accountCache.onLoginStatusChange.latestEvent),
Event.AccountHistory(accountCache.onAccountHistoryChange.latestEvent),
@@ -124,6 +124,10 @@ class ServiceEndpoint(
Event.ListenerReady
)
+ if (vpnPermission.waitingForResponse) {
+ initialEvents.add(Event.VpnPermissionRequest)
+ }
+
initialEvents.forEach { event ->
listener.send(event.message)
}
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/VpnPermission.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/VpnPermission.kt
index 50b5a606d4..b92dab3f98 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/VpnPermission.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/endpoint/VpnPermission.kt
@@ -3,15 +3,20 @@ package net.mullvad.mullvadvpn.service.endpoint
import android.content.Context
import android.content.Intent
import android.net.VpnService
+import net.mullvad.mullvadvpn.ipc.Event
import net.mullvad.mullvadvpn.ipc.Request
import net.mullvad.mullvadvpn.ui.MainActivity
import net.mullvad.mullvadvpn.util.Intermittent
-class VpnPermission(private val context: Context, endpoint: ServiceEndpoint) {
+class VpnPermission(private val context: Context, private val endpoint: ServiceEndpoint) {
private val isGranted = Intermittent<Boolean>()
+ var waitingForResponse = false
+ private set
+
init {
endpoint.dispatcher.registerHandler(Request.VpnPermissionResponse::class) { request ->
+ waitingForResponse = false
isGranted.spawnUpdate(request.isGranted)
}
}
@@ -25,12 +30,13 @@ class VpnPermission(private val context: Context, endpoint: ServiceEndpoint) {
val activityIntent = Intent(context, MainActivity::class.java).apply {
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
- putExtra(MainActivity.KEY_SHOULD_CONNECT, true)
}
isGranted.update(null)
+ waitingForResponse = true
context.startActivity(activityIntent)
+ endpoint.sendEvent(Event.VpnPermissionRequest)
}
return isGranted.await()
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/MainActivity.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/MainActivity.kt
index 26131d9f39..6915edfe9f 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/MainActivity.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/MainActivity.kt
@@ -6,6 +6,7 @@ import android.content.ComponentName
import android.content.Intent
import android.content.pm.ActivityInfo
import android.content.res.Configuration
+import android.net.VpnService
import android.os.Build
import android.os.Bundle
import android.os.IBinder
@@ -21,17 +22,12 @@ import net.mullvad.mullvadvpn.ui.serviceconnection.ServiceConnection
import net.mullvad.talpid.util.EventNotifier
open class MainActivity : FragmentActivity() {
- companion object {
- const val KEY_SHOULD_CONNECT = "should_connect"
- }
-
val problemReport = MullvadProblemReport()
val serviceNotifier = EventNotifier<ServiceConnection?>(null)
private var isUiVisible = false
private var service: MullvadVpnService.LocalBinder? = null
private var serviceConnection: ServiceConnection? = null
- private var shouldConnect = false
private var visibleSecureScreens = HashSet<Fragment>()
private val deviceIsTv by lazy {
@@ -54,16 +50,14 @@ open class MainActivity : FragmentActivity() {
serviceConnection?.onDestroy()
serviceConnection = service?.let { safeService ->
- ServiceConnection(safeService, ::handleNewServiceConnection)
+ ServiceConnection(safeService, ::handleNewServiceConnection).apply {
+ vpnPermission.onRequest = ::requestVpnPermission
+ }
}
if (service == null) {
serviceNotifier.notify(null)
}
-
- if (shouldConnect) {
- tryToConnect()
- }
}
}
@@ -96,11 +90,6 @@ open class MainActivity : FragmentActivity() {
if (savedInstanceState == null) {
addInitialFragment()
}
-
- if (intent.getBooleanExtra(KEY_SHOULD_CONNECT, false)) {
- shouldConnect = true
- tryToConnect()
- }
}
override fun onStart() {
@@ -194,20 +183,15 @@ open class MainActivity : FragmentActivity() {
}
}
- @Suppress("DEPRECATION")
- fun requestVpnPermission(intent: Intent) {
- startActivityForResult(intent, 0)
- }
-
private fun handleNewServiceConnection(connection: ServiceConnection) {
serviceNotifier.notify(connection)
}
- private fun tryToConnect() {
- serviceConnection?.apply {
- connectionProxy.connect()
- shouldConnect = false
- }
+ @Suppress("DEPRECATION")
+ private fun requestVpnPermission() {
+ val intent = VpnService.prepare(this)
+
+ startActivityForResult(intent, 0)
}
private fun addInitialFragment() {
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/ServiceConnection.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/ServiceConnection.kt
index b17db68b34..f25ed2c19c 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/ServiceConnection.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/ServiceConnection.kt
@@ -44,7 +44,7 @@ class ServiceConnection(
parameters = { parametersOf(service.messenger, dispatcher) }
)
val voucherRedeemer = VoucherRedeemer(service.messenger, dispatcher)
- val vpnPermission = VpnPermission(service.messenger)
+ val vpnPermission = VpnPermission(service.messenger, dispatcher)
val appVersionInfoCache = AppVersionInfoCache(dispatcher, settingsListener)
val customDns = CustomDns(service.messenger, settingsListener)
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/VpnPermission.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/VpnPermission.kt
index 7983245eba..30b672364d 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/VpnPermission.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/serviceconnection/VpnPermission.kt
@@ -1,9 +1,19 @@
package net.mullvad.mullvadvpn.ui.serviceconnection
import android.os.Messenger
+import net.mullvad.mullvadvpn.ipc.Event
+import net.mullvad.mullvadvpn.ipc.MessageDispatcher
import net.mullvad.mullvadvpn.ipc.Request
-class VpnPermission(private val connection: Messenger) {
+class VpnPermission(private val connection: Messenger, eventDispatcher: MessageDispatcher<Event>) {
+ var onRequest: (() -> Unit)? = null
+
+ init {
+ eventDispatcher.registerHandler(Event.VpnPermissionRequest::class) { _ ->
+ onRequest?.invoke()
+ }
+ }
+
fun grant(isGranted: Boolean) {
connection.send(Request.VpnPermissionResponse(isGranted).message)
}