summaryrefslogtreecommitdiffhomepage
path: root/android
diff options
context:
space:
mode:
Diffstat (limited to 'android')
-rw-r--r--android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/DaemonInstance.kt16
-rw-r--r--android/service/src/main/kotlin/net/mullvad/mullvadvpn/service/FileResourceExtractor.kt23
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()
+ }
+}