diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-05-22 13:26:13 -0300 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-05-22 13:26:13 -0300 |
| commit | 1d9a3f9c6a3bc536de0a92654d87f982ef2bb219 (patch) | |
| tree | ebd42c2c07f08dceff370b77b64bcde9b2592c99 /android | |
| parent | 0f260b311c5cd4e9ee14f93e352910b5a2e1f394 (diff) | |
| parent | 19364df3fffdeb24d24e0600bf79cd00976822f0 (diff) | |
| download | mullvadvpn-1d9a3f9c6a3bc536de0a92654d87f982ef2bb219.tar.xz mullvadvpn-1d9a3f9c6a3bc536de0a92654d87f982ef2bb219.zip | |
Merge branch 'android-daemon'
Diffstat (limited to 'android')
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() +} |
