2019-12-20 16:45:12 +01:00
|
|
|
import com.android.build.gradle.api.ApplicationVariant
|
|
|
|
|
2019-02-03 17:49:20 +01:00
|
|
|
/*
|
|
|
|
* Copyright (c) 2012-2016 Arne Schwabe
|
|
|
|
* Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
|
|
|
|
*/
|
|
|
|
|
|
|
|
plugins {
|
2023-09-03 16:40:59 +02:00
|
|
|
alias(libs.plugins.android.application)
|
|
|
|
alias(libs.plugins.kotlin.android)
|
2019-08-02 12:50:57 +02:00
|
|
|
id("checkstyle")
|
2019-02-03 17:49:20 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
android {
|
2023-04-17 14:56:49 +02:00
|
|
|
buildFeatures {
|
|
|
|
aidl = true
|
2024-08-09 14:52:23 +02:00
|
|
|
buildConfig = true
|
2023-04-17 14:56:49 +02:00
|
|
|
}
|
|
|
|
namespace = "de.blinkt.openvpn"
|
2024-07-26 15:30:22 +02:00
|
|
|
compileSdk = 35
|
2023-06-01 00:55:32 +02:00
|
|
|
//compileSdkPreview = "UpsideDownCake"
|
2021-09-27 14:55:37 +02:00
|
|
|
|
2022-10-07 15:20:03 +02:00
|
|
|
// Also update runcoverity.sh
|
2024-08-09 13:54:35 +02:00
|
|
|
ndkVersion = "27.0.12077973"
|
2019-02-03 17:49:20 +01:00
|
|
|
|
|
|
|
defaultConfig {
|
2022-05-04 13:21:26 +02:00
|
|
|
minSdk = 21
|
2024-07-26 15:30:22 +02:00
|
|
|
targetSdk = 35
|
2023-06-01 00:55:32 +02:00
|
|
|
//targetSdkPreview = "UpsideDownCake"
|
2024-08-09 17:13:41 +02:00
|
|
|
versionCode = 208
|
|
|
|
versionName = "0.7.53"
|
2019-02-03 17:49:20 +01:00
|
|
|
externalNativeBuild {
|
|
|
|
cmake {
|
2023-10-11 12:31:10 +02:00
|
|
|
//arguments+= "-DCMAKE_VERBOSE_MAKEFILE=1"
|
2019-02-03 17:49:20 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-02-19 16:08:55 +01:00
|
|
|
|
2023-08-26 18:23:02 +02:00
|
|
|
//testOptions.unitTests.isIncludeAndroidResources = true
|
2020-05-19 00:22:57 +02:00
|
|
|
|
2019-02-03 17:49:20 +01:00
|
|
|
externalNativeBuild {
|
|
|
|
cmake {
|
2021-06-15 16:41:56 +02:00
|
|
|
path = File("${projectDir}/src/main/cpp/CMakeLists.txt")
|
2019-02-03 17:49:20 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
sourceSets {
|
|
|
|
getByName("main") {
|
|
|
|
assets.srcDirs("src/main/assets", "build/ovpnassets")
|
2019-12-20 16:45:12 +01:00
|
|
|
|
2019-02-03 17:49:20 +01:00
|
|
|
}
|
|
|
|
|
2019-08-02 12:50:57 +02:00
|
|
|
create("ui") {
|
|
|
|
}
|
2019-12-20 16:45:12 +01:00
|
|
|
|
2019-08-02 12:50:57 +02:00
|
|
|
create("skeleton") {
|
2019-02-03 17:49:20 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
getByName("debug") {
|
|
|
|
}
|
|
|
|
|
|
|
|
getByName("release") {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
signingConfigs {
|
2019-12-06 20:42:35 +01:00
|
|
|
create("release") {
|
|
|
|
// ~/.gradle/gradle.properties
|
|
|
|
val keystoreFile: String? by project
|
|
|
|
storeFile = keystoreFile?.let { file(it) }
|
|
|
|
val keystorePassword: String? by project
|
|
|
|
storePassword = keystorePassword
|
|
|
|
val keystoreAliasPassword: String? by project
|
|
|
|
keyPassword = keystoreAliasPassword
|
|
|
|
val keystoreAlias: String? by project
|
|
|
|
keyAlias = keystoreAlias
|
2021-10-03 02:29:12 +02:00
|
|
|
enableV1Signing = true
|
|
|
|
enableV2Signing = true
|
2019-12-06 20:42:35 +01:00
|
|
|
}
|
2019-12-11 13:45:44 +01:00
|
|
|
|
2023-06-06 15:21:26 +02:00
|
|
|
create("releaseOvpn2") {
|
|
|
|
// ~/.gradle/gradle.properties
|
|
|
|
val keystoreO2File: String? by project
|
|
|
|
storeFile = keystoreO2File?.let { file(it) }
|
|
|
|
val keystoreO2Password: String? by project
|
|
|
|
storePassword = keystoreO2Password
|
|
|
|
val keystoreO2AliasPassword: String? by project
|
|
|
|
keyPassword = keystoreO2AliasPassword
|
|
|
|
val keystoreO2Alias: String? by project
|
|
|
|
keyAlias = keystoreO2Alias
|
|
|
|
enableV1Signing = true
|
|
|
|
enableV2Signing = true
|
|
|
|
}
|
|
|
|
|
2019-02-03 17:49:20 +01:00
|
|
|
}
|
|
|
|
|
2021-10-03 02:29:12 +02:00
|
|
|
lint {
|
2022-02-04 23:34:29 +01:00
|
|
|
enable += setOf("BackButton", "EasterEgg", "StopShip", "IconExpectedSize", "GradleDynamicVersion", "NewerVersionAvailable")
|
|
|
|
checkOnly += setOf("ImpliedQuantity", "MissingQuantity")
|
|
|
|
disable += setOf("MissingTranslation", "UnsafeNativeCodeLocation")
|
2019-02-03 17:49:20 +01:00
|
|
|
}
|
|
|
|
|
2023-06-06 15:21:26 +02:00
|
|
|
|
2023-05-17 15:32:34 +02:00
|
|
|
flavorDimensions += listOf("implementation", "ovpnimpl")
|
2019-02-03 17:49:20 +01:00
|
|
|
|
|
|
|
productFlavors {
|
2019-08-02 12:50:57 +02:00
|
|
|
create("ui") {
|
2021-09-27 14:55:37 +02:00
|
|
|
dimension = "implementation"
|
2019-08-02 12:50:57 +02:00
|
|
|
}
|
2023-05-17 15:32:34 +02:00
|
|
|
|
2019-08-02 12:50:57 +02:00
|
|
|
create("skeleton") {
|
2021-09-27 14:55:37 +02:00
|
|
|
dimension = "implementation"
|
2023-05-17 15:32:34 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
create("ovpn23")
|
|
|
|
{
|
|
|
|
dimension = "ovpnimpl"
|
|
|
|
buildConfigField("boolean", "openvpn3", "true")
|
|
|
|
}
|
|
|
|
|
|
|
|
create("ovpn2")
|
|
|
|
{
|
|
|
|
dimension = "ovpnimpl"
|
|
|
|
versionNameSuffix = "-o2"
|
2019-08-02 12:50:57 +02:00
|
|
|
buildConfigField("boolean", "openvpn3", "false")
|
2019-02-03 17:49:20 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-06-06 15:21:26 +02:00
|
|
|
buildTypes {
|
|
|
|
getByName("release") {
|
|
|
|
if (project.hasProperty("icsopenvpnDebugSign")) {
|
|
|
|
logger.warn("property icsopenvpnDebugSign set, using debug signing for release")
|
|
|
|
signingConfig = android.signingConfigs.getByName("debug")
|
|
|
|
} else {
|
|
|
|
productFlavors["ovpn23"].signingConfig = signingConfigs.getByName("release")
|
|
|
|
productFlavors["ovpn2"].signingConfig = signingConfigs.getByName("releaseOvpn2")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-02-03 17:49:20 +01:00
|
|
|
compileOptions {
|
2023-06-06 12:56:27 +02:00
|
|
|
targetCompatibility = JavaVersion.VERSION_17
|
|
|
|
sourceCompatibility = JavaVersion.VERSION_17
|
2019-02-03 17:49:20 +01:00
|
|
|
}
|
2019-08-02 12:50:57 +02:00
|
|
|
|
2023-06-06 17:28:59 +02:00
|
|
|
kotlinOptions {
|
|
|
|
jvmTarget = "17"
|
|
|
|
}
|
|
|
|
|
2019-08-02 12:50:57 +02:00
|
|
|
splits {
|
|
|
|
abi {
|
2019-12-06 22:14:56 +01:00
|
|
|
isEnable = true
|
2019-08-02 12:50:57 +02:00
|
|
|
reset()
|
|
|
|
include("x86", "x86_64", "armeabi-v7a", "arm64-v8a")
|
2019-12-06 22:14:56 +01:00
|
|
|
isUniversalApk = true
|
2019-08-02 12:50:57 +02:00
|
|
|
}
|
|
|
|
}
|
2019-12-20 16:45:12 +01:00
|
|
|
|
2023-07-27 12:02:56 +02:00
|
|
|
packaging {
|
|
|
|
jniLibs {
|
|
|
|
useLegacyPackaging = true
|
|
|
|
}
|
|
|
|
}
|
2023-08-02 12:24:08 +02:00
|
|
|
|
2023-07-27 12:02:56 +02:00
|
|
|
bundle {
|
|
|
|
codeTransparency {
|
|
|
|
signing {
|
|
|
|
val keystoreTPFile: String? by project
|
|
|
|
storeFile = keystoreTPFile?.let { file(it) }
|
|
|
|
val keystoreTPPassword: String? by project
|
|
|
|
storePassword = keystoreTPPassword
|
|
|
|
val keystoreTPAliasPassword: String? by project
|
|
|
|
keyPassword = keystoreTPAliasPassword
|
|
|
|
val keystoreTPAlias: String? by project
|
|
|
|
keyAlias = keystoreTPAlias
|
|
|
|
|
|
|
|
if (keystoreTPFile?.isEmpty() ?: true)
|
2023-08-02 12:24:08 +02:00
|
|
|
println("keystoreTPFile not set, disabling transparency signing")
|
2023-07-27 12:02:56 +02:00
|
|
|
if (keystoreTPPassword?.isEmpty() ?: true)
|
2023-08-02 12:24:08 +02:00
|
|
|
println("keystoreTPPassword not set, disabling transparency signing")
|
2023-07-27 12:02:56 +02:00
|
|
|
if (keystoreTPAliasPassword?.isEmpty() ?: true)
|
2023-08-02 12:24:08 +02:00
|
|
|
println("keystoreTPAliasPassword not set, disabling transparency signing")
|
2023-07-27 12:02:56 +02:00
|
|
|
if (keystoreTPAlias?.isEmpty() ?: true)
|
2023-08-02 12:24:08 +02:00
|
|
|
println("keyAlias not set, disabling transparency signing")
|
2023-07-27 12:02:56 +02:00
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2019-12-20 16:45:12 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
var swigcmd = "swig"
|
2022-03-16 11:31:02 +01:00
|
|
|
// Workaround for macOS(arm64) and macOS(intel) since it otherwise does not find swig and
|
|
|
|
// I cannot get the Exec task to respect the PATH environment :(
|
|
|
|
if (file("/opt/homebrew/bin/swig").exists())
|
|
|
|
swigcmd = "/opt/homebrew/bin/swig"
|
|
|
|
else if (file("/usr/local/bin/swig").exists())
|
2019-12-20 16:45:12 +01:00
|
|
|
swigcmd = "/usr/local/bin/swig"
|
|
|
|
|
|
|
|
|
|
|
|
fun registerGenTask(variantName: String, variantDirName: String): File {
|
|
|
|
val baseDir = File(buildDir, "generated/source/ovpn3swig/${variantDirName}")
|
|
|
|
val genDir = File(baseDir, "net/openvpn/ovpn3")
|
|
|
|
|
|
|
|
tasks.register<Exec>("generateOpenVPN3Swig${variantName}")
|
|
|
|
{
|
|
|
|
|
|
|
|
doFirst {
|
|
|
|
mkdir(genDir)
|
|
|
|
}
|
|
|
|
commandLine(listOf(swigcmd, "-outdir", genDir, "-outcurrentdir", "-c++", "-java", "-package", "net.openvpn.ovpn3",
|
|
|
|
"-Isrc/main/cpp/openvpn3/client", "-Isrc/main/cpp/openvpn3/",
|
2022-08-02 01:25:40 +02:00
|
|
|
"-DOPENVPN_PLATFORM_ANDROID",
|
2019-12-20 16:45:12 +01:00
|
|
|
"-o", "${genDir}/ovpncli_wrap.cxx", "-oh", "${genDir}/ovpncli_wrap.h",
|
2021-12-17 11:35:05 +01:00
|
|
|
"src/main/cpp/openvpn3/client/ovpncli.i"))
|
|
|
|
inputs.files( "src/main/cpp/openvpn3/client/ovpncli.i")
|
2021-10-01 19:55:17 +02:00
|
|
|
outputs.dir( genDir)
|
2020-06-03 01:31:23 +02:00
|
|
|
|
2019-12-20 16:45:12 +01:00
|
|
|
}
|
|
|
|
return baseDir
|
2019-02-03 17:49:20 +01:00
|
|
|
}
|
|
|
|
|
2019-12-20 16:45:12 +01:00
|
|
|
android.applicationVariants.all(object : Action<ApplicationVariant> {
|
|
|
|
override fun execute(variant: ApplicationVariant) {
|
|
|
|
val sourceDir = registerGenTask(variant.name, variant.baseName.replace("-", "/"))
|
|
|
|
val task = tasks.named("generateOpenVPN3Swig${variant.name}").get()
|
2020-07-31 13:05:44 +02:00
|
|
|
|
2019-12-20 16:45:12 +01:00
|
|
|
variant.registerJavaGeneratingTask(task, sourceDir)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
|
2019-12-06 14:32:48 +01:00
|
|
|
dependencies {
|
2020-04-23 16:52:58 +02:00
|
|
|
// https://maven.google.com/web/index.html
|
2023-09-03 16:40:59 +02:00
|
|
|
implementation(libs.androidx.annotation)
|
2023-09-03 17:42:01 +02:00
|
|
|
implementation(libs.androidx.core.ktx)
|
2021-10-04 14:26:00 +02:00
|
|
|
|
2023-09-03 17:31:11 +02:00
|
|
|
uiImplementation(libs.android.view.material)
|
2024-07-26 15:30:22 +02:00
|
|
|
uiImplementation(libs.androidx.activity)
|
|
|
|
uiImplementation(libs.androidx.activity.ktx)
|
2023-09-03 17:06:55 +02:00
|
|
|
uiImplementation(libs.androidx.appcompat)
|
|
|
|
uiImplementation(libs.androidx.cardview)
|
2024-07-26 15:26:17 +02:00
|
|
|
uiImplementation(libs.androidx.viewpager2)
|
2023-09-03 17:06:55 +02:00
|
|
|
uiImplementation(libs.androidx.constraintlayout)
|
|
|
|
uiImplementation(libs.androidx.core.ktx)
|
|
|
|
uiImplementation(libs.androidx.fragment.ktx)
|
|
|
|
uiImplementation(libs.androidx.lifecycle.runtime.ktx)
|
|
|
|
uiImplementation(libs.androidx.lifecycle.viewmodel.ktx)
|
|
|
|
uiImplementation(libs.androidx.preference.ktx)
|
|
|
|
uiImplementation(libs.androidx.recyclerview)
|
|
|
|
uiImplementation(libs.androidx.security.crypto)
|
|
|
|
uiImplementation(libs.androidx.webkit)
|
|
|
|
uiImplementation(libs.kotlin)
|
|
|
|
uiImplementation(libs.mpandroidchart)
|
|
|
|
uiImplementation(libs.square.okhttp)
|
2022-05-04 13:21:26 +02:00
|
|
|
|
2023-09-03 17:31:11 +02:00
|
|
|
testImplementation(libs.androidx.test.core)
|
|
|
|
testImplementation(libs.junit)
|
2023-09-03 17:42:01 +02:00
|
|
|
testImplementation(libs.kotlin)
|
2023-09-03 17:31:11 +02:00
|
|
|
testImplementation(libs.mockito.core)
|
|
|
|
testImplementation(libs.robolectric)
|
2019-12-06 14:32:48 +01:00
|
|
|
}
|
2023-09-03 17:06:55 +02:00
|
|
|
|
|
|
|
fun DependencyHandler.uiImplementation(dependencyNotation: Any): Dependency? =
|
|
|
|
add("uiImplementation", dependencyNotation)
|