summaryrefslogtreecommitdiffhomepage
path: root/android/app
diff options
context:
space:
mode:
authorAlbin <albin@mullvad.net>2023-09-21 18:38:18 +0200
committerAlbin <albin@mullvad.net>2023-09-21 18:38:18 +0200
commit90ef9de13c92551b93db174d7e5f57842f99ca2b (patch)
tree1daf46b3cf9c384d775a4071fc1bdddca90e043d /android/app
parent2b2dbded60ba1e03112781dc6a04705e08286805 (diff)
parent62d94a20959e9692b0caea7a7910a0116a907190 (diff)
downloadmullvadvpn-90ef9de13c92551b93db174d7e5f57842f99ca2b.tar.xz
mullvadvpn-90ef9de13c92551b93db174d7e5f57842f99ca2b.zip
Merge branch 'improve-gradle-variant-configuration-droid-18'
Diffstat (limited to 'android/app')
-rw-r--r--android/app/build.gradle.kts168
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/component/NotificationBanner.kt15
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/AccountScreen.kt5
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/SettingsScreen.kt6
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/constant/BuildConstant.kt5
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/fragment/ConnectFragment.kt6
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/fragment/PrivacyDisclaimerFragment.kt4
-rw-r--r--android/app/src/main/kotlin/net/mullvad/mullvadvpn/util/StringExtensions.kt10
8 files changed, 145 insertions, 74 deletions
diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts
index b1b1b5616a..6c61206afe 100644
--- a/android/app/build.gradle.kts
+++ b/android/app/build.gradle.kts
@@ -1,7 +1,8 @@
import com.android.build.gradle.internal.cxx.configure.gradleLocalProperties
import com.android.build.gradle.internal.tasks.factory.dependsOn
import java.io.FileInputStream
-import java.util.Properties
+import java.util.*
+import org.gradle.configurationcache.extensions.capitalized
plugins {
id(Dependencies.Plugin.androidApplicationId)
@@ -47,23 +48,18 @@ android {
if (keystorePropertiesFile.exists()) {
signingConfigs {
- create("release") {
+ create(SigningConfigs.RELEASE) {
storeFile = file("$credentialsPath/app-keys.jks")
storePassword = keystoreProperties.getProperty("storePassword")
keyAlias = keystoreProperties.getProperty("keyAlias")
keyPassword = keystoreProperties.getProperty("keyPassword")
}
}
-
- buildTypes {
- getByName("release") {
- signingConfig = signingConfigs.getByName("release")
- }
- }
}
buildTypes {
- getByName("release") {
+ getByName(BuildTypes.RELEASE) {
+ signingConfig = signingConfigs.findByName(SigningConfigs.RELEASE)
isMinifyEnabled = true
isShrinkResources = true
proguardFiles(
@@ -71,40 +67,51 @@ android {
"proguard-rules.pro"
)
}
-
- create("fdroid") {
- initWith(buildTypes.getByName("release"))
- isMinifyEnabled = true
- isShrinkResources = true
+ create(BuildTypes.FDROID) {
+ initWith(buildTypes.getByName(BuildTypes.RELEASE))
signingConfig = null
- matchingFallbacks += "release"
+ matchingFallbacks += BuildTypes.RELEASE
+ }
+ create(BuildTypes.LEAK_CANARY) {
+ initWith(buildTypes.getByName(BuildTypes.DEBUG))
+ applicationIdSuffix = ".leakcanary"
+ matchingFallbacks += BuildTypes.DEBUG
}
+ }
- create("leakCanary") {
- initWith(buildTypes.getByName("debug"))
- matchingFallbacks += "debug"
+ flavorDimensions += FlavorDimensions.BILLING
+ flavorDimensions += FlavorDimensions.INFRASTRUCTURE
+
+ productFlavors {
+ create(Flavors.OSS) {
+ dimension = FlavorDimensions.BILLING
+ isDefault = true
+ }
+ create(Flavors.PLAY) { dimension = FlavorDimensions.BILLING }
+ create(Flavors.PROD) {
+ dimension = FlavorDimensions.INFRASTRUCTURE
+ isDefault = true
+ }
+ create(Flavors.DEVMOLE) {
+ dimension = FlavorDimensions.INFRASTRUCTURE
+ applicationId = "net.mullvad.mullvadvpn.devmole"
}
}
sourceSets {
getByName("main") {
- val changelogDir = gradleLocalProperties(rootProject.projectDir).getOrDefault(
- "OVERRIDE_CHANGELOG_DIR",
- defaultChangeLogAssetsDirectory
- )
+ val changelogDir =
+ gradleLocalProperties(rootProject.projectDir)
+ .getOrDefault("OVERRIDE_CHANGELOG_DIR", defaultChangeLogAssetsDirectory)
assets.srcDirs(extraAssetsDirectory, changelogDir)
jniLibs.srcDirs(extraJniDirectory)
}
}
- buildFeatures {
- compose = true
- }
+ buildFeatures { compose = true }
- composeOptions {
- kotlinCompilerExtensionVersion = Versions.kotlinCompilerExtensionVersion
- }
+ composeOptions { kotlinCompilerExtensionVersion = Versions.kotlinCompilerExtensionVersion }
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
@@ -114,12 +121,13 @@ android {
kotlinOptions {
allWarningsAsErrors = false
jvmTarget = Versions.jvmTarget
- freeCompilerArgs = listOf(
- "-opt-in=kotlinx.coroutines.ExperimentalCoroutinesApi",
- "-opt-in=kotlinx.coroutines.ObsoleteCoroutinesApi",
- // Opt-in option for Koin annotation of KoinComponent.
- "-opt-in=kotlin.RequiresOptIn"
- )
+ freeCompilerArgs =
+ listOf(
+ "-opt-in=kotlinx.coroutines.ExperimentalCoroutinesApi",
+ "-opt-in=kotlinx.coroutines.ObsoleteCoroutinesApi",
+ // Opt-in option for Koin annotation of KoinComponent.
+ "-opt-in=kotlin.RequiresOptIn"
+ )
}
tasks.withType<com.android.build.gradle.tasks.MergeSourceSetFolders> {
@@ -143,29 +151,29 @@ android {
packaging {
jniLibs.useLegacyPackaging = true
resources {
- pickFirsts += setOf(
- // Fixes packaging error caused by: androidx.compose.ui:ui-test-junit4
- "META-INF/AL2.0",
- "META-INF/LGPL2.1",
- // Fixes packaging error caused by: jetified-junit-*
- "META-INF/LICENSE.md",
- "META-INF/LICENSE-notice.md"
- )
+ pickFirsts +=
+ setOf(
+ // Fixes packaging error caused by: androidx.compose.ui:ui-test-junit4
+ "META-INF/AL2.0",
+ "META-INF/LGPL2.1",
+ // Fixes packaging error caused by: jetified-junit-*
+ "META-INF/LICENSE.md",
+ "META-INF/LICENSE-notice.md"
+ )
}
}
applicationVariants.configureEach {
- val alwaysShowChangelog = gradleLocalProperties(rootProject.projectDir)
- .getProperty("ALWAYS_SHOW_CHANGELOG") ?: "false"
+ val alwaysShowChangelog =
+ gradleLocalProperties(rootProject.projectDir).getProperty("ALWAYS_SHOW_CHANGELOG")
+ ?: "false"
- buildConfigField(
- "boolean",
- "ALWAYS_SHOW_CHANGELOG",
- alwaysShowChangelog
- )
+ buildConfigField("boolean", "ALWAYS_SHOW_CHANGELOG", alwaysShowChangelog)
- val enableInAppVersionNotifications = gradleLocalProperties(rootProject.projectDir)
- .getProperty("ENABLE_IN_APP_VERSION_NOTIFICATIONS") ?: "true"
+ val enableInAppVersionNotifications =
+ gradleLocalProperties(rootProject.projectDir)
+ .getProperty("ENABLE_IN_APP_VERSION_NOTIFICATIONS")
+ ?: "true"
buildConfigField(
"boolean",
@@ -174,9 +182,63 @@ android {
)
}
+ applicationVariants.all {
+ val artifactSuffix = buildString {
+ productFlavors.getOrNull(0)?.name?.let { billingFlavorName ->
+ if (billingFlavorName != Flavors.OSS) {
+ append(".$billingFlavorName")
+ }
+ }
+
+ productFlavors.getOrNull(1)?.name?.let { infrastructureFlavorName ->
+ if (infrastructureFlavorName != Flavors.PROD) {
+ append(".$infrastructureFlavorName")
+ }
+ }
+
+ if (buildType.name != BuildTypes.RELEASE) {
+ append(".${buildType.name}")
+ }
+ }
+
+ val variantName = name
+ val capitalizedVariantName = variantName.capitalized()
+ val artifactName = "MullvadVPN-${versionName}${artifactSuffix}"
+
+ tasks.register<Copy>("create${capitalizedVariantName}DistApk") {
+ from(packageApplicationProvider)
+ into("${rootDir.parent}/dist")
+ include { it.name.endsWith(".apk") }
+ rename { "$artifactName.apk" }
+ }
+
+ val createDistBundle =
+ tasks.register<Copy>("create${capitalizedVariantName}DistBundle") {
+ from("$buildDir/outputs/bundle/$variantName")
+ into("${rootDir.parent}/dist")
+ include { it.name.endsWith(".aab") }
+ rename { "$artifactName.aab" }
+ }
+
+ createDistBundle.dependsOn("bundle$capitalizedVariantName")
+ }
+
project.tasks.preBuild.dependsOn("ensureJniDirectoryExist")
}
+androidComponents {
+ beforeVariants { variantBuilder ->
+ variantBuilder.enable =
+ variantBuilder.let { currentVariant ->
+ val enabledVariants =
+ enabledVariantTriples.map { (billing, infra, buildType) ->
+ billing + infra.capitalized() + buildType.capitalized()
+ }
+ enabledVariants.contains(currentVariant.name)
+ }
+ }
+}
+
configure<org.owasp.dependencycheck.gradle.extension.DependencyCheckExtension> {
// Skip the lintClassPath configuration, which relies on many dependencies that has been flagged
// to have CVEs, as it's related to the lint tooling rather than the project's compilation class
@@ -212,9 +274,7 @@ afterEvaluate {
}
}
-play {
- serviceAccountCredentials.set(file("play-api-key.json"))
-}
+play { serviceAccountCredentials.set(file("play-api-key.json")) }
configurations.all {
resolutionStrategy {
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/component/NotificationBanner.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/component/NotificationBanner.kt
index 04fff334c3..4e638d56b2 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/component/NotificationBanner.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/component/NotificationBanner.kt
@@ -24,13 +24,12 @@ import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.tooling.preview.Preview
import androidx.constraintlayout.compose.ConstraintLayout
import androidx.constraintlayout.compose.Dimension
-import net.mullvad.mullvadvpn.BuildConfig
import net.mullvad.mullvadvpn.R
import net.mullvad.mullvadvpn.compose.extensions.getExpiryQuantityString
import net.mullvad.mullvadvpn.compose.state.ConnectNotificationState
import net.mullvad.mullvadvpn.compose.test.NOTIFICATION_BANNER
import net.mullvad.mullvadvpn.compose.util.rememberPrevious
-import net.mullvad.mullvadvpn.lib.common.constant.BuildTypes
+import net.mullvad.mullvadvpn.constant.IS_PLAY_BUILD
import net.mullvad.mullvadvpn.lib.common.util.getErrorNotificationResources
import net.mullvad.mullvadvpn.lib.theme.AppTheme
import net.mullvad.mullvadvpn.lib.theme.Dimens
@@ -122,10 +121,10 @@ private fun ShowNotification(
versionInfoNotification(
versionInfo = connectNotificationState.versionInfo,
onClickUpdateVersion =
- if (BuildConfig.BUILD_TYPE != BuildTypes.RELEASE) {
- onClickUpdateVersion
- } else {
+ if (IS_PLAY_BUILD) {
null
+ } else {
+ onClickUpdateVersion
}
)
}
@@ -133,10 +132,10 @@ private fun ShowNotification(
accountExpiryNotification(
expiry = connectNotificationState.expiry,
onClickShowAccount =
- if (BuildConfig.BUILD_TYPE != BuildTypes.RELEASE) {
- onClickShowAccount
- } else {
+ if (IS_PLAY_BUILD) {
null
+ } else {
+ onClickShowAccount
}
)
}
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/AccountScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/AccountScreen.kt
index cf8af6fc07..c84804d955 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/AccountScreen.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/AccountScreen.kt
@@ -26,7 +26,6 @@ import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.flow.asSharedFlow
import me.onebone.toolbar.ScrollStrategy
import me.onebone.toolbar.rememberCollapsingToolbarScaffoldState
-import net.mullvad.mullvadvpn.BuildConfig
import net.mullvad.mullvadvpn.R
import net.mullvad.mullvadvpn.compose.button.ActionButton
import net.mullvad.mullvadvpn.compose.component.CollapsingToolbarScaffold
@@ -36,7 +35,7 @@ import net.mullvad.mullvadvpn.compose.component.InformationView
import net.mullvad.mullvadvpn.compose.component.MissingPolicy
import net.mullvad.mullvadvpn.compose.component.drawVerticalScrollbar
import net.mullvad.mullvadvpn.compose.state.AccountUiState
-import net.mullvad.mullvadvpn.lib.common.constant.BuildTypes
+import net.mullvad.mullvadvpn.constant.IS_PLAY_BUILD
import net.mullvad.mullvadvpn.lib.common.util.capitalizeFirstCharOfEachWord
import net.mullvad.mullvadvpn.lib.common.util.openAccountPageInBrowser
import net.mullvad.mullvadvpn.lib.theme.Dimens
@@ -158,7 +157,7 @@ fun AccountScreen(
Spacer(modifier = Modifier.weight(1f))
- if (BuildConfig.BUILD_TYPE != BuildTypes.RELEASE) {
+ if (IS_PLAY_BUILD.not()) {
ActionButton(
text = stringResource(id = R.string.manage_account),
onClick = onManageAccountClick,
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/SettingsScreen.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/SettingsScreen.kt
index a9c3aa5ea9..ef5250424a 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/SettingsScreen.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/compose/screen/SettingsScreen.kt
@@ -39,9 +39,9 @@ import net.mullvad.mullvadvpn.compose.extensions.itemWithDivider
import net.mullvad.mullvadvpn.compose.state.SettingsUiState
import net.mullvad.mullvadvpn.compose.test.LAZY_LIST_TEST_TAG
import net.mullvad.mullvadvpn.lib.common.constant.BuildTypes
-import net.mullvad.mullvadvpn.lib.common.util.appendHideNavOnReleaseBuild
import net.mullvad.mullvadvpn.lib.common.util.openLink
import net.mullvad.mullvadvpn.lib.theme.Dimens
+import net.mullvad.mullvadvpn.util.appendHideNavOnPlayBuild
@OptIn(ExperimentalMaterial3Api::class)
@Preview
@@ -132,7 +132,7 @@ fun SettingsScreen(
Uri.parse(
context.resources
.getString(R.string.download_url)
- .appendHideNavOnReleaseBuild()
+ .appendHideNavOnPlayBuild()
)
)
},
@@ -208,7 +208,7 @@ fun SettingsScreen(
Uri.parse(
context.resources
.getString(R.string.privacy_policy_url)
- .appendHideNavOnReleaseBuild()
+ .appendHideNavOnPlayBuild()
)
)
}
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/constant/BuildConstant.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/constant/BuildConstant.kt
new file mode 100644
index 0000000000..db76afc769
--- /dev/null
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/constant/BuildConstant.kt
@@ -0,0 +1,5 @@
+package net.mullvad.mullvadvpn.constant
+
+import net.mullvad.mullvadvpn.BuildConfig
+
+const val IS_PLAY_BUILD = BuildConfig.FLAVOR_billing == "play"
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/fragment/ConnectFragment.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/fragment/ConnectFragment.kt
index 7592be144b..b32f162761 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/fragment/ConnectFragment.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/fragment/ConnectFragment.kt
@@ -10,10 +10,10 @@ import androidx.compose.runtime.collectAsState
import androidx.compose.ui.platform.ComposeView
import net.mullvad.mullvadvpn.R
import net.mullvad.mullvadvpn.compose.screen.ConnectScreen
-import net.mullvad.mullvadvpn.lib.common.util.appendHideNavOnReleaseBuild
import net.mullvad.mullvadvpn.lib.theme.AppTheme
import net.mullvad.mullvadvpn.ui.MainActivity
import net.mullvad.mullvadvpn.ui.NavigationBarPainter
+import net.mullvad.mullvadvpn.util.appendHideNavOnPlayBuild
import net.mullvad.mullvadvpn.viewmodel.ConnectViewModel
import org.koin.androidx.viewmodel.ext.android.viewModel
@@ -58,9 +58,7 @@ class ConnectFragment : BaseFragment(), NavigationBarPainter {
Intent(
Intent.ACTION_VIEW,
Uri.parse(
- requireContext()
- .getString(R.string.download_url)
- .appendHideNavOnReleaseBuild()
+ requireContext().getString(R.string.download_url).appendHideNavOnPlayBuild()
)
)
.apply { flags = Intent.FLAG_ACTIVITY_NEW_TASK }
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/fragment/PrivacyDisclaimerFragment.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/fragment/PrivacyDisclaimerFragment.kt
index 464395d2d8..4b500d3f58 100644
--- a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/fragment/PrivacyDisclaimerFragment.kt
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/ui/fragment/PrivacyDisclaimerFragment.kt
@@ -10,12 +10,12 @@ import androidx.compose.ui.platform.ComposeView
import androidx.fragment.app.Fragment
import net.mullvad.mullvadvpn.R
import net.mullvad.mullvadvpn.compose.screen.PrivacyDisclaimerScreen
-import net.mullvad.mullvadvpn.lib.common.util.appendHideNavOnReleaseBuild
import net.mullvad.mullvadvpn.lib.endpoint.getApiEndpointConfigurationExtras
import net.mullvad.mullvadvpn.lib.theme.AppTheme
import net.mullvad.mullvadvpn.ui.MainActivity
import net.mullvad.mullvadvpn.ui.NavigationBarPainter
import net.mullvad.mullvadvpn.ui.StatusBarPainter
+import net.mullvad.mullvadvpn.util.appendHideNavOnPlayBuild
import net.mullvad.mullvadvpn.viewmodel.PrivacyDisclaimerViewModel
import org.koin.android.ext.android.inject
@@ -51,7 +51,7 @@ class PrivacyDisclaimerFragment : Fragment(), StatusBarPainter, NavigationBarPai
val privacyPolicyUrlIntent =
Intent(
Intent.ACTION_VIEW,
- Uri.parse(getString(R.string.privacy_policy_url).appendHideNavOnReleaseBuild())
+ Uri.parse(getString(R.string.privacy_policy_url).appendHideNavOnPlayBuild())
)
context?.startActivity(privacyPolicyUrlIntent)
}
diff --git a/android/app/src/main/kotlin/net/mullvad/mullvadvpn/util/StringExtensions.kt b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/util/StringExtensions.kt
new file mode 100644
index 0000000000..4214aac209
--- /dev/null
+++ b/android/app/src/main/kotlin/net/mullvad/mullvadvpn/util/StringExtensions.kt
@@ -0,0 +1,10 @@
+package net.mullvad.mullvadvpn.util
+
+import net.mullvad.mullvadvpn.constant.IS_PLAY_BUILD
+
+fun String.appendHideNavOnPlayBuild(): String =
+ if (IS_PLAY_BUILD) {
+ "$this?hide_nav"
+ } else {
+ this
+ }