diff options
Diffstat (limited to 'android')
| -rw-r--r-- | android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/DaemonInstance.kt | 16 | ||||
| -rw-r--r-- | android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/FileResourceExtractor.kt | 23 |
2 files changed, 39 insertions, 0 deletions
diff --git a/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/DaemonInstance.kt b/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/DaemonInstance.kt index 236cdeb84a..8cc292fb95 100644 --- a/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/DaemonInstance.kt +++ b/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/DaemonInstance.kt @@ -1,5 +1,6 @@ package net.mullvad.mullvadvpn.service +import java.io.File import kotlin.properties.Delegates.observable import kotlin.reflect.KClass import kotlin.reflect.safeCast @@ -13,6 +14,8 @@ import kotlinx.coroutines.channels.trySendBlocking import net.mullvad.mullvadvpn.lib.common.util.Intermittent import net.mullvad.mullvadvpn.lib.endpoint.ApiEndpointConfiguration +private const val RELAYS_FILE = "relays.json" + class DaemonInstance(private val vpnService: MullvadVpnService) { sealed class Command { data class Start(val apiEndpointConfiguration: ApiEndpointConfiguration) : Command() @@ -44,6 +47,8 @@ class DaemonInstance(private val vpnService: MullvadVpnService) { GlobalScope.actor(Dispatchers.Default, Channel.UNLIMITED) { var isRunning = true + prepareFiles() + while (isRunning) { val startCommand = waitForCommand(channel, Command.Start::class) ?: break startDaemon(startCommand.apiEndpointConfiguration) @@ -67,6 +72,13 @@ class DaemonInstance(private val vpnService: MullvadVpnService) { } } + private fun prepareFiles() { + val shouldOverwriteRelayList = + lastUpdatedTime() > File(vpnService.filesDir, RELAYS_FILE).lastModified() + + FileResourceExtractor(vpnService).apply { extract(RELAYS_FILE, shouldOverwriteRelayList) } + } + private suspend fun startDaemon(apiEndpointConfiguration: ApiEndpointConfiguration) { val newDaemon = MullvadDaemon(vpnService, apiEndpointConfiguration).apply { @@ -83,4 +95,8 @@ class DaemonInstance(private val vpnService: MullvadVpnService) { private fun stopDaemon() { daemon?.shutdown() } + + private fun lastUpdatedTime(): Long { + return vpnService.run { packageManager.getPackageInfo(packageName, 0).lastUpdateTime } + } } diff --git a/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/FileResourceExtractor.kt b/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/FileResourceExtractor.kt new file mode 100644 index 0000000000..71a05e6743 --- /dev/null +++ b/android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/FileResourceExtractor.kt @@ -0,0 +1,23 @@ +package net.mullvad.mullvadvpn.service + +import android.content.Context +import java.io.File +import java.io.FileOutputStream + +class FileResourceExtractor(val context: Context) { + fun extract(asset: String, force: Boolean = false) { + val destination = File(context.filesDir, asset) + + if (!destination.exists() || force) { + extractFile(asset, destination) + } + } + + private fun extractFile(asset: String, destination: File) { + val destinationStream = FileOutputStream(destination) + + context.assets.open(asset).copyTo(destinationStream) + + destinationStream.close() + } +} |
