diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2021-04-23 09:40:12 -0300 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2021-04-23 09:40:12 -0300 |
| commit | 112b98f92ceb4fb5c0bb6d1e2b88853c62f48d23 (patch) | |
| tree | fdf83fd71cafcaf1cb8425e5edee3b1e71ca2b5b /android/src/main | |
| parent | 218d6f677eaa1dd0d635158fa69e56df9299e8ad (diff) | |
| parent | 2aab5be44160da8f7bb15ef9847438a4f8005d2a (diff) | |
| download | mullvadvpn-112b98f92ceb4fb5c0bb6d1e2b88853c62f48d23.tar.xz mullvadvpn-112b98f92ceb4fb5c0bb6d1e2b88853c62f48d23.zip | |
Merge branch 'fix-vpn-permission-request'
Diffstat (limited to 'android/src/main')
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) } |
