1+ import com.android.build.api.variant.BuildConfigField
12import com.android.build.gradle.internal.tasks.factory.dependsOn
23import com.github.triplet.gradle.androidpublisher.ReleaseStatus
34import java.io.FileInputStream
@@ -24,14 +25,13 @@ plugins {
2425 alias(libs.plugins.mullvad.utilities)
2526 alias(libs.plugins.android.application)
2627 alias(libs.plugins.play.publisher)
27- alias(libs.plugins.kotlin.android)
2828 alias(libs.plugins.kotlin.parcelize)
2929 alias(libs.plugins.kotlin.ksp)
3030 alias(libs.plugins.compose)
3131 alias(libs.plugins.baselineprofile)
3232 alias(libs.plugins.mullvad.unit.test)
33+ alias(libs.plugins.rust.android)
3334 id(" de.mannodermaus.android-junit5" )
34- id(" net.mullvad.rust-android" )
3535}
3636
3737val repoRootPath = rootProject.projectDir.absoluteFile.parentFile.absolutePath
@@ -222,69 +222,78 @@ android {
222222 )
223223 }
224224 }
225+ }
226+
227+ androidComponents {
228+ onVariants { variant ->
229+ val mainSources = variant.sources.getByName(" main" )
230+ mainSources.addStaticSourceDirectory(relayListDirectory)
231+ mainSources.addStaticSourceDirectory(changelogAssetsDirectory)
232+ }
225233
226- applicationVariants.configureEach {
227- buildConfigField(
228- " boolean" ,
234+ onVariants {
235+ it.buildConfigFields!! .put(
229236 " ENABLE_IN_APP_VERSION_NOTIFICATIONS" ,
230- getBooleanProperty(" mullvad.app.config.inAppVersionNotifications.enable" ).toString(),
237+ BuildConfigField (
238+ " boolean" ,
239+ getBooleanProperty(" mullvad.app.config.inAppVersionNotifications.enable" ),
240+ " Show in-app version notifications" ,
241+ ),
231242 )
232243 val shouldRequireBundleRelayFile = isReleaseBuild() && ! appVersion.isDev
233- buildConfigField(
234- " Boolean" ,
244+ it.buildConfigFields!! .put(
235245 " REQUIRE_BUNDLED_RELAY_FILE" ,
236- shouldRequireBundleRelayFile.toString(),
246+ BuildConfigField (
247+ " boolean" ,
248+ shouldRequireBundleRelayFile.toString(),
249+ " Whether to require a bundled relay list or not." ,
250+ ),
237251 )
238252 }
253+ onVariants {
254+ val productFlavors = it.productFlavors.map { it.first }
255+ // buildType.name?
256+ val buildType = it.buildType
239257
240- applicationVariants.all {
241258 val artifactSuffix = buildString {
242- productFlavors.getOrNull(0 )?.name?. let { billingFlavorName ->
259+ productFlavors.getOrNull(0 )?.let { billingFlavorName ->
243260 if (billingFlavorName != Flavors .OSS ) {
244261 append(" .$billingFlavorName " )
245262 }
246263 }
247264
248- productFlavors.getOrNull(1 )?.name?. let { infrastructureFlavorName ->
265+ productFlavors.getOrNull(1 )?.let { infrastructureFlavorName ->
249266 if (infrastructureFlavorName != Flavors .PROD ) {
250267 append(" .$infrastructureFlavorName " )
251268 }
252269 }
253270
254- if (buildType.name != BuildTypes .RELEASE ) {
255- append(" .${buildType.name } " )
271+ if (buildType != BuildTypes .RELEASE ) {
272+ append(" .${buildType} " )
256273 }
257274 }
258275
259276 val variantName = name
260277 val capitalizedVariantName = variantName.toString().capitalized()
261- val artifactName = " MullvadVPN-${versionName}${artifactSuffix} "
262-
263- tasks.register<Copy >(" create${capitalizedVariantName} DistApk" ) {
264- from(packageApplicationProvider)
265- into(" ${rootDir.parent} /dist" )
266- include { it.name.endsWith(" .apk" ) }
267- rename { " $artifactName .apk" }
268- }
269-
270- val createDistBundle =
271- tasks.register<Copy >(" create${capitalizedVariantName} DistBundle" ) {
272- from(" ${layout.buildDirectory.get()} /outputs/bundle/$variantName " )
273- into(" ${rootDir.parent} /dist" )
274- include { it.name.endsWith(" .aab" ) }
275- rename { " $artifactName .aab" }
276- }
277-
278- createDistBundle.dependsOn(" bundle$capitalizedVariantName " )
279-
280- // Ensure that we have all the JNI libs before merging them.
281- tasks[" merge${capitalizedVariantName} JniLibFolders" ].apply {
282- // This is required for the merge task to run every time the .so files are updated.
283- // See this comment for more information:
284- // https://github.com/mozilla/rust-android-gradle/issues/118#issuecomment-1569407058
285- inputs.dir(rustJniLibsDir)
286- dependsOn(" cargoBuild" )
287- }
278+ val artifactName = " MullvadVPN-${appVersion.name}${artifactSuffix} "
279+
280+ // TODO How to access packageApplicationProvider?
281+ // Replace with: it.outputProviders.provideApkOutputToTask() ?
282+ // tasks.register<Copy>("create${capitalizedVariantName}DistApk") {
283+ // from(packageApplicationProvider)
284+ // into("${rootDir.parent}/dist")
285+ // include { it.name.endsWith(".apk") }
286+ // rename { "$artifactName.apk" }
287+ // }
288+
289+ // val createDistBundle =
290+ // tasks.register<Copy>("create${capitalizedVariantName}DistBundle") {
291+ // from("${layout.buildDirectory.get()}/outputs/bundle/$variantName")
292+ // into("${rootDir.parent}/dist")
293+ // include { it.name.endsWith(".aab") }
294+ // rename { "$artifactName.aab" }
295+ // }
296+ // createDistBundle.dependsOn("bundle$capitalizedVariantName")
288297
289298 tasks.findByPath(" generate${capitalizedVariantName} BaselineProfile" )?.let {
290299 it.doLast {
@@ -298,12 +307,20 @@ android {
298307 }
299308}
300309
301- junitPlatform {
302- instrumentationTests {
303- version.set(libs.versions.junit5.android.asProvider())
304- includeExtensions.set(true )
310+ // Don't merge the jni lib folders until after the Rust libraries have been built.
311+ tasks
312+ .matching { it.name.matches(Regex (" merge.*JniLibFolders" )) }
313+ .configureEach {
314+ inputs.dir(rustJniLibsDir)
315+ dependsOn(" cargoBuild" )
305316 }
306- }
317+
318+ // junitPlatform {
319+ // instrumentationTests {
320+ // version.set(libs.versions.junit5.android.asProvider())
321+ // includeExtensions.set(true)
322+ // }
323+ // }
307324
308325cargo {
309326 val isReleaseBuild = isReleaseBuild()
0 commit comments