diff options
| author | Albin <albin@mullvad.net> | 2023-09-21 18:38:18 +0200 |
|---|---|---|
| committer | Albin <albin@mullvad.net> | 2023-09-21 18:38:18 +0200 |
| commit | 90ef9de13c92551b93db174d7e5f57842f99ca2b (patch) | |
| tree | 1daf46b3cf9c384d775a4071fc1bdddca90e043d /android/app | |
| parent | 2b2dbded60ba1e03112781dc6a04705e08286805 (diff) | |
| parent | 62d94a20959e9692b0caea7a7910a0116a907190 (diff) | |
| download | mullvadvpn-90ef9de13c92551b93db174d7e5f57842f99ca2b.tar.xz mullvadvpn-90ef9de13c92551b93db174d7e5f57842f99ca2b.zip | |
Merge branch 'improve-gradle-variant-configuration-droid-18'
Diffstat (limited to 'android/app')
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 + } |
