summaryrefslogtreecommitdiffhomepage
path: root/android
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-05-22 13:26:13 -0300
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-05-22 13:26:13 -0300
commit1d9a3f9c6a3bc536de0a92654d87f982ef2bb219 (patch)
treeebd42c2c07f08dceff370b77b64bcde9b2592c99 /android
parent0f260b311c5cd4e9ee14f93e352910b5a2e1f394 (diff)
parent19364df3fffdeb24d24e0600bf79cd00976822f0 (diff)
downloadmullvadvpn-1d9a3f9c6a3bc536de0a92654d87f982ef2bb219.tar.xz
mullvadvpn-1d9a3f9c6a3bc536de0a92654d87f982ef2bb219.zip
Merge branch 'android-daemon'
Diffstat (limited to 'android')
-rw-r--r--android/build.gradle39
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ApiRootCaFile.kt29
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt27
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadDaemon.kt10
4 files changed, 105 insertions, 0 deletions
diff --git a/android/build.gradle b/android/build.gradle
index 5be82b79d7..d511691624 100644
--- a/android/build.gradle
+++ b/android/build.gradle
@@ -4,6 +4,10 @@ import org.jmailen.gradle.kotlinter.tasks.LintTask
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
+def repoRootPath = projectDir.absoluteFile.parentFile.absolutePath
+def extraAssetsDirectory = "$project.buildDir/extraAssets"
+def extraJniDirectory = "$project.buildDir/extraJni"
+
android {
compileSdkVersion 28
buildToolsVersion '28.0.3'
@@ -22,6 +26,28 @@ android {
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
}
}
+
+ sourceSets {
+ main {
+ assets {
+ srcDirs = files(extraAssetsDirectory)
+ }
+
+ jniLibs {
+ srcDirs = files(extraJniDirectory)
+ }
+ }
+ }
+
+ applicationVariants.all { variant ->
+ variant.mergeAssetsProvider.configure {
+ dependsOn copyApiRootCertificate
+ }
+
+ variant.ndkCompileProvider.configure {
+ dependsOn copyMullvadJni
+ }
+ }
}
repositories {
@@ -33,6 +59,7 @@ dependencies {
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support:recyclerview-v7:28.0.0'
implementation 'org.jetbrains.kotlin:kotlin-stdlib:1.3.21'
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.1.1'
}
buildscript {
@@ -65,3 +92,15 @@ task format(type: FormatTask, group: 'formatting') {
}
lint.dependsOn lintKotlin
+
+task copyMullvadJni(type: Copy) {
+ from "$repoRootPath/target/aarch64-linux-android/debug"
+ include 'libmullvad_jni.so'
+ into "$extraJniDirectory/arm64-v8a"
+}
+
+task copyApiRootCertificate(type: Copy) {
+ from "$repoRootPath/dist-assets"
+ include "api_root_ca.pem"
+ into extraAssetsDirectory
+}
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ApiRootCaFile.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ApiRootCaFile.kt
new file mode 100644
index 0000000000..dc8af32ce2
--- /dev/null
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ApiRootCaFile.kt
@@ -0,0 +1,29 @@
+package net.mullvad.mullvadvpn
+
+import java.io.File
+import java.io.FileOutputStream
+import java.io.InputStream
+
+import android.content.Context
+
+private const val API_ROOT_CA_FILE = "api_root_ca.pem"
+private const val API_ROOT_CA_PATH = "/data/data/net.mullvad.mullvadvpn/api_root_ca.pem"
+
+class ApiRootCaFile {
+ fun extract(context: Context) {
+ if (!File(API_ROOT_CA_PATH).exists()) {
+ extractFile(context, API_ROOT_CA_FILE, API_ROOT_CA_PATH)
+ }
+ }
+
+ private fun extractFile(context: Context, asset: String, destination: String) {
+ val destinationStream = FileOutputStream(destination)
+
+ context
+ .assets
+ .open(asset)
+ .copyTo(destinationStream)
+
+ destinationStream.close()
+ }
+}
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt
index b7b0e8fa8c..b751bf63d9 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt
@@ -1,24 +1,51 @@
package net.mullvad.mullvadvpn
+import kotlinx.coroutines.async
+import kotlinx.coroutines.runBlocking
+import kotlinx.coroutines.CompletableDeferred
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.GlobalScope
+import kotlinx.coroutines.Job
+
import android.os.Bundle
import android.support.v4.app.FragmentActivity
class MainActivity : FragmentActivity() {
+ val activityCreated = CompletableDeferred<Unit>()
+
+ val asyncDaemon = startDaemon()
+ val daemon
+ get() = runBlocking { asyncDaemon.await() }
+
var selectedRelayItemCode: String? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.main)
+ activityCreated.complete(Unit)
+
if (savedInstanceState == null) {
addInitialFragment()
}
}
+ override fun onDestroy() {
+ asyncDaemon.cancel()
+
+ super.onDestroy()
+ }
+
private fun addInitialFragment() {
supportFragmentManager?.beginTransaction()?.apply {
add(R.id.main_fragment, LoginFragment())
commit()
}
}
+
+ private fun startDaemon() = GlobalScope.async(Dispatchers.Default) {
+ activityCreated.await()
+ ApiRootCaFile().extract(this@MainActivity)
+ MullvadDaemon()
+ }
}
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadDaemon.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadDaemon.kt
new file mode 100644
index 0000000000..d5ab845f89
--- /dev/null
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadDaemon.kt
@@ -0,0 +1,10 @@
+package net.mullvad.mullvadvpn
+
+class MullvadDaemon {
+ init {
+ System.loadLibrary("mullvad_jni")
+ initialize()
+ }
+
+ private external fun initialize()
+}