summaryrefslogtreecommitdiffhomepage
path: root/android/service/src
diff options
context:
space:
mode:
authorDavid Göransson <david.goransson@mullvad.net>2024-08-30 13:54:11 +0200
committerDavid Göransson <david.goransson@mullvad.net>2024-08-30 13:54:11 +0200
commitb0c1bcc5b49aa83c80dc125980f8ab745008397e (patch)
treeb324a4dfcb01d4206f773390809ec4fc8b3a5b2c /android/service/src
parent2c8d4f1be088c7d55526c5d2dea6e65bc6f94193 (diff)
parent7f1fcf7503b5f0a8556d067dcf6e1bab443c849f (diff)
downloadmullvadvpn-b0c1bcc5b49aa83c80dc125980f8ab745008397e.tar.xz
mullvadvpn-b0c1bcc5b49aa83c80dc125980f8ab745008397e.zip
Merge branch 'managementservicestop-sometimes-crashes-droid-1284'
Diffstat (limited to 'android/service/src')
-rw-r--r--android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/DaemonConfig.kt11
-rw-r--r--android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadDaemon.kt4
-rw-r--r--android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadVpnService.kt68
-rw-r--r--android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/di/ApiEndpointModule.kt19
-rw-r--r--android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/di/VpnServiceModule.kt23
5 files changed, 66 insertions, 59 deletions
diff --git a/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/DaemonConfig.kt b/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/DaemonConfig.kt
new file mode 100644
index 0000000000..06450a1583
--- /dev/null
+++ b/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/DaemonConfig.kt
@@ -0,0 +1,11 @@
+package net.mullvad.mullvadvpn.service
+
+import java.io.File
+import net.mullvad.mullvadvpn.lib.endpoint.ApiEndpointOverride
+
+data class DaemonConfig(
+ val rpcSocket: File,
+ val filesDir: File,
+ val cacheDir: File,
+ val apiEndpointOverride: ApiEndpointOverride?,
+)
diff --git a/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadDaemon.kt b/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadDaemon.kt
index 5bfae14383..d95892305b 100644
--- a/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadDaemon.kt
+++ b/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadDaemon.kt
@@ -1,6 +1,6 @@
package net.mullvad.mullvadvpn.service
-import net.mullvad.mullvadvpn.lib.endpoint.ApiEndpoint
+import net.mullvad.mullvadvpn.lib.endpoint.ApiEndpointOverride
object MullvadDaemon {
init {
@@ -12,7 +12,7 @@ object MullvadDaemon {
rpcSocketPath: String,
filesDirectory: String,
cacheDirectory: String,
- apiEndpoint: ApiEndpoint?,
+ apiEndpointOverride: ApiEndpointOverride?,
)
external fun shutdown()
diff --git a/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadVpnService.kt b/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadVpnService.kt
index 5603392376..2b7833fb8d 100644
--- a/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadVpnService.kt
+++ b/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadVpnService.kt
@@ -11,21 +11,17 @@ import androidx.lifecycle.lifecycleScope
import arrow.atomic.AtomicInt
import co.touchlab.kermit.Logger
import java.io.File
-import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
-import net.mullvad.mullvadvpn.lib.common.constant.GRPC_SOCKET_FILE_NAMED_ARGUMENT
import net.mullvad.mullvadvpn.lib.common.constant.KEY_CONNECT_ACTION
import net.mullvad.mullvadvpn.lib.common.constant.KEY_DISCONNECT_ACTION
import net.mullvad.mullvadvpn.lib.daemon.grpc.ManagementService
-import net.mullvad.mullvadvpn.lib.endpoint.ApiEndpointConfiguration
import net.mullvad.mullvadvpn.lib.endpoint.getApiEndpointConfigurationExtras
import net.mullvad.mullvadvpn.lib.intent.IntentProvider
import net.mullvad.mullvadvpn.lib.model.TunnelState
import net.mullvad.mullvadvpn.lib.shared.ConnectionProxy
-import net.mullvad.mullvadvpn.service.di.apiEndpointModule
import net.mullvad.mullvadvpn.service.di.vpnServiceModule
import net.mullvad.mullvadvpn.service.migration.MigrateSplitTunneling
import net.mullvad.mullvadvpn.service.notifications.ForegroundNotificationManager
@@ -34,7 +30,6 @@ import net.mullvad.mullvadvpn.service.notifications.NotificationManager
import net.mullvad.talpid.TalpidVpnService
import org.koin.android.ext.android.getKoin
import org.koin.core.context.loadKoinModules
-import org.koin.core.qualifier.named
private const val RELAYS_FILE = "relays.json"
@@ -42,12 +37,11 @@ class MullvadVpnService : TalpidVpnService() {
private lateinit var keyguardManager: KeyguardManager
- private lateinit var apiEndpointConfiguration: ApiEndpointConfiguration
private lateinit var managementService: ManagementService
private lateinit var migrateSplitTunneling: MigrateSplitTunneling
private lateinit var intentProvider: IntentProvider
private lateinit var connectionProxy: ConnectionProxy
- private lateinit var rpcSocketFile: File
+ private lateinit var daemonConfig: DaemonConfig
private lateinit var foregroundNotificationHandler: ForegroundNotificationManager
@@ -59,7 +53,7 @@ class MullvadVpnService : TalpidVpnService() {
super.onCreate()
Logger.i("MullvadVpnService: onCreate")
- loadKoinModules(listOf(vpnServiceModule, apiEndpointModule))
+ loadKoinModules(listOf(vpnServiceModule))
with(getKoin()) {
// Needed to create all the notification channels
get<NotificationChannelFactory>()
@@ -70,27 +64,32 @@ class MullvadVpnService : TalpidVpnService() {
ForegroundNotificationManager(this@MullvadVpnService, get())
get<NotificationManager>()
- apiEndpointConfiguration = get()
+ daemonConfig = get()
migrateSplitTunneling = get()
intentProvider = get()
connectionProxy = get()
- rpcSocketFile = get(named(GRPC_SOCKET_FILE_NAMED_ARGUMENT))
}
keyguardManager = getSystemService<KeyguardManager>()!!
- // TODO We should avoid lifecycleScope.launch (current needed due to InetSocketAddress
- // with intent from API)
- lifecycleScope.launch(context = Dispatchers.IO) {
- prepareFiles(this@MullvadVpnService)
- migrateSplitTunneling.migrate()
+ prepareFiles(this@MullvadVpnService)
+ migrateSplitTunneling.migrate()
- Logger.i("Start daemon")
- startDaemon()
+ // If it is a debug build and we have an api override in the intent, use it
+ // This is for injecting hostname and port for our mock api tests
+ val intentApiOverride =
+ intentProvider.getLatestIntent()?.getApiEndpointConfigurationExtras()
+ val updatedConfig =
+ if (BuildConfig.DEBUG && intentApiOverride != null) {
+ daemonConfig.copy(apiEndpointOverride = intentApiOverride)
+ } else {
+ daemonConfig
+ }
+ Logger.i("Start daemon")
+ startDaemon(updatedConfig)
- Logger.i("Start management service")
- managementService.start()
- }
+ Logger.i("Start management service")
+ managementService.start()
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
@@ -147,24 +146,17 @@ class MullvadVpnService : TalpidVpnService() {
}
}
- private fun startDaemon() {
- val apiEndpointConfiguration =
- if (BuildConfig.DEBUG) {
- intentProvider.getLatestIntent()?.getApiEndpointConfigurationExtras()
- ?: apiEndpointConfiguration
- } else {
- apiEndpointConfiguration
- }
-
- MullvadDaemon.initialize(
- vpnService = this@MullvadVpnService,
- rpcSocketPath = rpcSocketFile.absolutePath,
- filesDirectory = filesDir.absolutePath,
- cacheDirectory = cacheDir.absolutePath,
- apiEndpoint = apiEndpointConfiguration.apiEndpoint(),
- )
- Logger.i("MullvadVpnService: Daemon initialized")
- }
+ private fun startDaemon(daemonConfig: DaemonConfig) =
+ with(daemonConfig) {
+ MullvadDaemon.initialize(
+ vpnService = this@MullvadVpnService,
+ rpcSocketPath = rpcSocket.absolutePath,
+ filesDirectory = filesDir.absolutePath,
+ cacheDirectory = cacheDir.absolutePath,
+ apiEndpointOverride = apiEndpointOverride,
+ )
+ Logger.i("MullvadVpnService: Daemon initialized")
+ }
private fun emptyBinder() =
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
diff --git a/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/di/ApiEndpointModule.kt b/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/di/ApiEndpointModule.kt
deleted file mode 100644
index 4d86559bc6..0000000000
--- a/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/di/ApiEndpointModule.kt
+++ /dev/null
@@ -1,19 +0,0 @@
-package net.mullvad.mullvadvpn.service.di
-
-import net.mullvad.mullvadvpn.lib.endpoint.ApiEndpointConfiguration
-import net.mullvad.mullvadvpn.lib.endpoint.CUSTOM_ENDPOINT_HTTPS_PORT
-import net.mullvad.mullvadvpn.lib.endpoint.CustomApiEndpointConfiguration
-import net.mullvad.mullvadvpn.lib.endpoint.DefaultApiEndpointConfiguration
-import net.mullvad.mullvadvpn.service.BuildConfig
-import org.koin.dsl.bind
-import org.koin.dsl.module
-
-val apiEndpointModule = module {
- single {
- if (BuildConfig.FLAVOR_infrastructure != "prod") {
- CustomApiEndpointConfiguration(BuildConfig.API_ENDPOINT, CUSTOM_ENDPOINT_HTTPS_PORT)
- } else {
- DefaultApiEndpointConfiguration()
- }
- } bind ApiEndpointConfiguration::class
-}
diff --git a/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/di/VpnServiceModule.kt b/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/di/VpnServiceModule.kt
index e229e0ed24..9d4636cf07 100644
--- a/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/di/VpnServiceModule.kt
+++ b/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/di/VpnServiceModule.kt
@@ -2,7 +2,13 @@ package net.mullvad.mullvadvpn.service.di
import androidx.core.app.NotificationManagerCompat
import kotlinx.coroutines.MainScope
+import net.mullvad.mullvadvpn.lib.common.constant.CACHE_DIR_NAMED_ARGUMENT
+import net.mullvad.mullvadvpn.lib.common.constant.FILES_DIR_NAMED_ARGUMENT
+import net.mullvad.mullvadvpn.lib.common.constant.GRPC_SOCKET_FILE_NAMED_ARGUMENT
+import net.mullvad.mullvadvpn.lib.endpoint.ApiEndpointOverride
import net.mullvad.mullvadvpn.lib.model.NotificationChannel
+import net.mullvad.mullvadvpn.service.BuildConfig
+import net.mullvad.mullvadvpn.service.DaemonConfig
import net.mullvad.mullvadvpn.service.migration.MigrateSplitTunneling
import net.mullvad.mullvadvpn.service.notifications.NotificationChannelFactory
import net.mullvad.mullvadvpn.service.notifications.NotificationManager
@@ -12,12 +18,15 @@ import net.mullvad.mullvadvpn.service.notifications.tunnelstate.TunnelStateNotif
import org.koin.android.ext.koin.androidContext
import org.koin.core.module.dsl.createdAtStart
import org.koin.core.module.dsl.withOptions
+import org.koin.core.qualifier.named
import org.koin.dsl.bind
import org.koin.dsl.module
val vpnServiceModule = module {
single { NotificationManagerCompat.from(androidContext()) }
single { androidContext().resources }
+ single(named(FILES_DIR_NAMED_ARGUMENT)) { androidContext().filesDir }
+ single(named(CACHE_DIR_NAMED_ARGUMENT)) { androidContext().cacheDir }
single { NotificationChannel.TunnelUpdates } bind NotificationChannel::class
single { NotificationChannel.AccountUpdates } bind NotificationChannel::class
@@ -46,4 +55,18 @@ val vpnServiceModule = module {
}
single { MigrateSplitTunneling(androidContext()) }
+
+ single {
+ DaemonConfig(
+ rpcSocket = get(named(GRPC_SOCKET_FILE_NAMED_ARGUMENT)),
+ filesDir = get(named(FILES_DIR_NAMED_ARGUMENT)),
+ cacheDir = get(named(CACHE_DIR_NAMED_ARGUMENT)),
+ apiEndpointOverride =
+ if (BuildConfig.FLAVOR_infrastructure != "prod") {
+ ApiEndpointOverride(BuildConfig.API_ENDPOINT)
+ } else {
+ null
+ },
+ )
+ }
}