From 1d345dfde287f07727bcebdd4ece40fd38d067ec Mon Sep 17 00:00:00 2001 From: albexk Date: Tue, 17 Sep 2024 20:51:02 +0300 Subject: [PATCH] Add billing module, provide a separate build for Google Play --- client/android/billing/build.gradle.kts | 18 +++++ client/android/build.gradle.kts | 79 ++++++++++++++++--- .../oss/org/amnezia/vpn/BillingProvider.kt | 7 ++ .../play/org/amnezia/vpn/BillingProvider.kt | 7 ++ client/android/settings.gradle.kts | 1 + .../src/org/amnezia/vpn/AmneziaActivity.kt | 1 + 6 files changed, 104 insertions(+), 9 deletions(-) create mode 100644 client/android/billing/build.gradle.kts create mode 100644 client/android/oss/org/amnezia/vpn/BillingProvider.kt create mode 100644 client/android/play/org/amnezia/vpn/BillingProvider.kt diff --git a/client/android/billing/build.gradle.kts b/client/android/billing/build.gradle.kts new file mode 100644 index 000000000..a3bc67658 --- /dev/null +++ b/client/android/billing/build.gradle.kts @@ -0,0 +1,18 @@ +plugins { + id(libs.plugins.android.library.get().pluginId) + id(libs.plugins.kotlin.android.get().pluginId) +} + +kotlin { + jvmToolchain(17) +} + +android { + namespace = "org.amnezia.vpn.billing" +} + +dependencies { + implementation(libs.androidx.core) + implementation(libs.kotlinx.coroutines) + implementation(libs.android.billing) +} diff --git a/client/android/build.gradle.kts b/client/android/build.gradle.kts index 890d8e931..dfc5f1889 100644 --- a/client/android/build.gradle.kts +++ b/client/android/build.gradle.kts @@ -43,14 +43,12 @@ android { ndk.abiFilters += qtTargetAbiList.split(",") } - sourceSets { - getByName("main") { - manifest.srcFile("AndroidManifest.xml") - java.setSrcDirs(listOf("src")) - res.setSrcDirs(listOf("res")) - // androyddeployqt creates the folders below - assets.setSrcDirs(listOf("assets")) - jniLibs.setSrcDirs(listOf("libs")) + signingConfigs { + register("release") { + storeFile = providers.environmentVariable("ANDROID_KEYSTORE_PATH").orNull?.let { file(it) } + storePassword = providers.environmentVariable("ANDROID_KEYSTORE_KEY_PASS").orNull + keyAlias = providers.environmentVariable("ANDROID_KEYSTORE_KEY_ALIAS").orNull + keyPassword = providers.environmentVariable("ANDROID_KEYSTORE_KEY_PASS").orNull } } @@ -60,6 +58,65 @@ android { packaging { resources.excludes += "DebugProbesKt.bin" } + signingConfig = signingConfigs["release"] + } + + create("fdroid") { + initWith(getByName("release")) + signingConfig = null + matchingFallbacks += "release" + } + } + + flavorDimensions += "billing" + + productFlavors { + create("oss") { + dimension = "billing" + } + create("play") { + dimension = "billing" + } + } + + sourceSets { + getByName("main") { + manifest.srcFile("AndroidManifest.xml") + java.setSrcDirs(listOf("src")) + res.setSrcDirs(listOf("res")) + // androyddeployqt creates the folders below + assets.setSrcDirs(listOf("assets")) + jniLibs.setSrcDirs(listOf("libs")) + } + + getByName("oss") { + java.setSrcDirs(listOf("oss")) + } + + getByName("play") { + java.setSrcDirs(listOf("play")) + } + } + + splits { + abi { + isEnable = true + reset() + include(*qtTargetAbiList.split(',').toTypedArray()) + isUniversalApk = false + } + } + + // fix for Qt Creator to allow deploying the application to a device + // to enable this fix, add the line outputBaseName=android-build to local.properties + if (outputBaseName.isNotEmpty()) { + applicationVariants.all { + outputs.map { it as BaseVariantOutputImpl } + .forEach { output -> + if (output.outputFileName.endsWith(".apk")) { + output.outputFileName = "$outputBaseName-${buildType.name}.apk" + } + } } } @@ -85,5 +142,9 @@ dependencies { implementation(libs.google.mlkit) implementation(libs.androidx.datastore) implementation(libs.androidx.biometric) - implementation(libs.android.billing) + + playImplementation(project(":billing")) } + +fun DependencyHandler.playImplementation(dependency: Any): Dependency? = + add("playImplementation", dependency) diff --git a/client/android/oss/org/amnezia/vpn/BillingProvider.kt b/client/android/oss/org/amnezia/vpn/BillingProvider.kt new file mode 100644 index 000000000..802743121 --- /dev/null +++ b/client/android/oss/org/amnezia/vpn/BillingProvider.kt @@ -0,0 +1,7 @@ +package org.amnezia.vpn + +class BillingProvider { + fun type(): String { + return "OSS" + } +} diff --git a/client/android/play/org/amnezia/vpn/BillingProvider.kt b/client/android/play/org/amnezia/vpn/BillingProvider.kt new file mode 100644 index 000000000..4d55c583a --- /dev/null +++ b/client/android/play/org/amnezia/vpn/BillingProvider.kt @@ -0,0 +1,7 @@ +package org.amnezia.vpn + +class BillingProvider { + fun type(): String { + return "PLAY" + } +} diff --git a/client/android/settings.gradle.kts b/client/android/settings.gradle.kts index 0ad70055c..6e12d3d4c 100644 --- a/client/android/settings.gradle.kts +++ b/client/android/settings.gradle.kts @@ -30,6 +30,7 @@ rootProject.buildFileName = "build.gradle.kts" include(":qt") include(":utils") +include(":billing") include(":protocolApi") include(":wireguard") include(":awg") diff --git a/client/android/src/org/amnezia/vpn/AmneziaActivity.kt b/client/android/src/org/amnezia/vpn/AmneziaActivity.kt index dca70ee5c..8d891291d 100644 --- a/client/android/src/org/amnezia/vpn/AmneziaActivity.kt +++ b/client/android/src/org/amnezia/vpn/AmneziaActivity.kt @@ -182,6 +182,7 @@ class AmneziaActivity : QtActivity() { * Activity overloaded methods */ override fun onCreate(savedInstanceState: Bundle?) { + Log.d(TAG, "Billing provider: ${BillingProvider().type()}") super.onCreate(savedInstanceState) Log.d(TAG, "Create Amnezia activity") loadLibs()