diff -r 000000000000 -r 0a13dcabf7d3 buildSrc/src/main/kotlin/Avdl.kt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildSrc/src/main/kotlin/Avdl.kt Fri Apr 14 14:29:05 2023 -0400
@@ -0,0 +1,166 @@
+/*
+ * AboutOss is a utility library to retrieve and display
+ * opensource licenses in Android applications.
+ *
+ * Copyright (C) 2023 by Frederic-Charles Barthelery.
+ *
+ * This file is part of AboutOss.
+ *
+ * AboutOss is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * AboutOss is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with AboutOss. If not, see .
+ */
+package com.geekorum.build
+
+import com.android.build.gradle.AppPlugin
+import com.android.build.gradle.DynamicFeaturePlugin
+import com.android.build.gradle.LibraryPlugin
+import com.android.build.gradle.TestedExtension
+import com.android.build.gradle.api.TestVariant
+import com.geekorum.gradle.avdl.AvdlExtension
+import com.geekorum.gradle.avdl.providers.flydroid.FlydroidPlugin
+import com.geekorum.gradle.avdl.providers.flydroid.flydroid
+import com.geekorum.gradle.avdl.tasks.LaunchDeviceTask
+import com.geekorum.gradle.avdl.tasks.StopDeviceTask
+import com.geekorum.gradle.avdl.tasks.orderForTask
+import com.geekorum.gradle.avdl.tasks.registerAvdlDevicesTask
+import org.gradle.api.Project
+import org.gradle.api.Task
+import org.gradle.api.provider.Provider
+import org.gradle.api.services.BuildService
+import org.gradle.api.services.BuildServiceParameters
+import org.gradle.api.tasks.TaskContainer
+import org.gradle.api.tasks.TaskProvider
+import org.gradle.kotlin.dsl.*
+
+
+fun Project.configureAvdlDevices(flydroidUrl: String, flydroidKey: String) {
+ apply()
+
+ // as FlydroidPlugin add some repositories to look for dependencies
+ // the repositories set in settings.gradle.kts via dependencyResolutionManagement
+ // are ignored because we are in mode PREFER_PROJECT
+ // to fix that we add the missing repository here too
+ repositories { // this mirror contents in settings.gradle.kts
+ google {
+ content {
+ includeGroupByRegex("""android\.arch\..*""")
+ includeGroupByRegex("""androidx\..*""")
+ includeGroupByRegex("""com\.android\..*""")
+ includeGroupByRegex("""com\.google\..*""")
+ includeGroup("com.crashlytics.sdk.android")
+ includeGroup("io.fabric.sdk.android")
+ includeGroup("org.chromium.net")
+ includeGroup("zipflinger")
+ includeGroup("com.android")
+ }
+ }
+ mavenCentral()
+ // for geekdroid
+ flatDir {
+ dirs("$rootDir/libs")
+ }
+ maven {
+ url = uri("https://jitpack.io")
+ }
+
+ }
+ val oneInstrumentedTestService = gradle.sharedServices.registerIfAbsent(
+ "oneInstrumentedTest", OneInstrumentedTestService::class.java) {
+ maxParallelUsages.set(1)
+ }
+
+ rootProject.serializeInstrumentedTestTask(oneInstrumentedTestService)
+
+ val android = the()
+ configure {
+ devices {
+ android.testVariants.all {
+ register("android-p-${project.path}-$baseName") {
+ setup = flydroid {
+ url = flydroidUrl
+ this.flydroidKey = flydroidKey
+ // android-q images fail, don't manage to start the tests
+ image = "android-p"
+ useTunnel = true
+ }
+ }
+ }
+ }
+ }
+
+ tasks {
+ var lastStopTask: TaskProvider? = null
+ var lastTestTask: TaskProvider? = null
+ android.testVariants.all {
+ val (startTask, stopTask ) =
+ registerAvdlDevicesTaskForVariant(this, listOf("android-p-${project.path}-$baseName"))
+ listOf(startTask, stopTask).forEach {
+ it.configure {
+ usesService(oneInstrumentedTestService)
+ }
+ }
+
+ lastStopTask?.let {
+ startTask.configure {
+ mustRunAfter(it)
+ }
+ }
+ lastTestTask?.let {
+ startTask.configure {
+ mustRunAfter(it)
+ }
+ }
+ lastStopTask = stopTask
+ lastTestTask = connectedInstrumentTestProvider
+ }
+ }
+
+ afterEvaluate {
+ // ensure that launchDeviceTask are run after StopDeviceTask of previous project
+ rootProject.tasks {
+ getByPath(":geekdroid-firebase:launchAvdlDebugAndroidTest")
+ .mustRunAfter(":geekdroid:stopAvdlDebugAndroidTest")
+ }
+ }
+}
+
+private fun TaskContainer.registerAvdlDevicesTaskForVariant(
+ variant: TestVariant, devices: List
+): Pair, TaskProvider> {
+ val tasks =
+ registerAvdlDevicesTask(variant.name, devices)
+ tasks.orderForTask(variant.connectedInstrumentTestProvider)
+ return tasks
+}
+
+
+private fun Project.serializeInstrumentedTestTask(oneInstrumentedTestService: Provider) {
+ fun Project.configureTestTasks() {
+ extensions.configure {
+ testVariants.all {
+ connectedInstrumentTestProvider.configure {
+ usesService(oneInstrumentedTestService)
+ }
+ }
+ }
+ }
+
+ allprojects {
+ val project = this
+ plugins.withType { project.configureTestTasks() }
+ plugins.withType { project.configureTestTasks() }
+ plugins.withType { project.configureTestTasks() }
+ }
+}
+
+abstract class OneInstrumentedTestService : BuildService