From 2647fdfee6838eca2228ee6b31393ff6fc90fcff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Kwiecin=CC=81ski?= Date: Sun, 27 Sep 2020 10:24:12 +0200 Subject: [PATCH] Add ability to apply plugin to library module --- .../starter/easylauncher/plugin/AgpUtils.kt | 23 +++ .../easylauncher/plugin/EasyLauncherPlugin.kt | 14 +- .../easylauncher/plugin/EasyLauncherTask.kt | 16 +- .../plugin/EasyLauncherConfigTest.kt | 26 +++ .../easylauncher/plugin/utils/Factories.kt | 34 ++++ sample/example-library/build.gradle | 53 ++++++ .../Icons_doScreenshot(library).png | Bin 0 -> 37034 bytes .../easylauncher/screenshot/IconsTest.kt | 19 ++ .../src/main/AndroidManifest.xml | 12 ++ .../res/drawable/ic_launcher_background.xml | 170 ++++++++++++++++++ .../res/drawable/ic_launcher_foreground.xml | 17 ++ .../src/main/res/mipmap/ic_launcher.xml | 5 + sample/settings.gradle | 1 + 13 files changed, 375 insertions(+), 15 deletions(-) create mode 100644 easylauncher/src/main/kotlin/com/project/starter/easylauncher/plugin/AgpUtils.kt create mode 100644 sample/example-library/build.gradle create mode 100644 sample/example-library/screenshots/Icons_doScreenshot(library).png create mode 100644 sample/example-library/src/androidTest/kotlin/com/starter/easylauncher/screenshot/IconsTest.kt create mode 100644 sample/example-library/src/main/AndroidManifest.xml create mode 100644 sample/example-library/src/main/res/drawable/ic_launcher_background.xml create mode 100644 sample/example-library/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 sample/example-library/src/main/res/mipmap/ic_launcher.xml diff --git a/easylauncher/src/main/kotlin/com/project/starter/easylauncher/plugin/AgpUtils.kt b/easylauncher/src/main/kotlin/com/project/starter/easylauncher/plugin/AgpUtils.kt new file mode 100644 index 00000000..575260b8 --- /dev/null +++ b/easylauncher/src/main/kotlin/com/project/starter/easylauncher/plugin/AgpUtils.kt @@ -0,0 +1,23 @@ +package com.project.starter.easylauncher.plugin + +import com.android.build.gradle.AppExtension +import com.android.build.gradle.LibraryExtension +import com.android.build.gradle.api.BaseVariant +import org.gradle.api.DomainObjectSet +import org.gradle.api.Project + +private val supportedPlugins = listOf( + "com.android.application", + "com.android.library", +) + +internal fun Project.configureSupportedPlugins(block: (DomainObjectSet) -> Unit) { + supportedPlugins.forEach { pluginId -> + pluginManager.withPlugin(pluginId) { block(findVariants()) } + } +} + +internal fun Project.findVariants(): DomainObjectSet = + extensions.findByType(AppExtension::class.java)?.applicationVariants + ?: extensions.findByType(LibraryExtension::class.java)?.libraryVariants + ?: this.objects.domainObjectSet(BaseVariant::class.java) diff --git a/easylauncher/src/main/kotlin/com/project/starter/easylauncher/plugin/EasyLauncherPlugin.kt b/easylauncher/src/main/kotlin/com/project/starter/easylauncher/plugin/EasyLauncherPlugin.kt index ba6d2cb0..980fb48f 100644 --- a/easylauncher/src/main/kotlin/com/project/starter/easylauncher/plugin/EasyLauncherPlugin.kt +++ b/easylauncher/src/main/kotlin/com/project/starter/easylauncher/plugin/EasyLauncherPlugin.kt @@ -1,7 +1,7 @@ package com.project.starter.easylauncher.plugin -import com.android.build.gradle.AppExtension -import com.android.build.gradle.api.ApplicationVariant +import com.android.build.gradle.BaseExtension +import com.android.build.gradle.api.BaseVariant import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.api.tasks.TaskProvider @@ -14,12 +14,12 @@ class EasyLauncherPlugin : Plugin { logger.info("Running gradle version: ${gradle.gradleVersion}") - pluginManager.withPlugin("com.android.application") { - val android = extensions.getByType(AppExtension::class.java) + configureSupportedPlugins { variants -> + val android = extensions.getByType(BaseExtension::class.java) val easyLauncherTasks = mutableListOf>() - android.applicationVariants.configureEach { variant -> + variants.configureEach { variant -> val configs = extension.variants.filter { it.name == variant.name }.takeIf { it.isNotEmpty() } ?: findConfigs(variant, extension.productFlavors, extension.buildTypes) @@ -75,13 +75,13 @@ class EasyLauncherPlugin : Plugin { } private fun findConfigs( - variant: ApplicationVariant, + variant: BaseVariant, ribbonProductFlavors: Iterable, ribbonBuildTypes: Iterable ): List = ribbonProductFlavors.filter { config -> variant.productFlavors.any { config.name == it.name } } + ribbonBuildTypes.filter { it.name == variant.buildType.name } - private fun Project.getGeneratedResDir(variant: ApplicationVariant) = + private fun Project.getGeneratedResDir(variant: BaseVariant) = File(project.buildDir, "generated/easylauncher/res/${variant.name}") } diff --git a/easylauncher/src/main/kotlin/com/project/starter/easylauncher/plugin/EasyLauncherTask.kt b/easylauncher/src/main/kotlin/com/project/starter/easylauncher/plugin/EasyLauncherTask.kt index e840f4f3..d290e594 100644 --- a/easylauncher/src/main/kotlin/com/project/starter/easylauncher/plugin/EasyLauncherTask.kt +++ b/easylauncher/src/main/kotlin/com/project/starter/easylauncher/plugin/EasyLauncherTask.kt @@ -1,7 +1,7 @@ package com.project.starter.easylauncher.plugin -import com.android.build.gradle.AppExtension -import com.android.build.gradle.api.ApplicationVariant +import com.android.build.gradle.BaseExtension +import com.android.build.gradle.api.BaseVariant import com.project.starter.easylauncher.filter.EasyLauncherFilter import com.project.starter.easylauncher.plugin.models.AdaptiveIcon import org.gradle.api.DefaultTask @@ -36,8 +36,8 @@ open class EasyLauncherTask : DefaultTask() { } val taskExecutionTime = measureTimeMillis { - val android = project.extensions.getByType(AppExtension::class.java) - val variant = android.applicationVariants.find { it.name == variantName.get() } + val android = project.extensions.getByType(BaseExtension::class.java) + val variant = project.findVariants().find { it.name == variantName.get() } ?: throw GradleException("invalid variant name ${variantName.get()}") val names = (iconsNames.orNull?.takeIf { it.isNotEmpty() } ?: android.getLauncherIconNames(variant)).toSet() @@ -59,11 +59,11 @@ open class EasyLauncherTask : DefaultTask() { logger.info("task finished in $taskExecutionTime ms") } - private fun ApplicationVariant.getAllSourceSets() = + private fun BaseVariant.getAllSourceSets() = sourceSets.flatMap { sourceSet -> sourceSet.resDirectories } .filterNot { resDirectory -> resDirectory == outputDir.asFile.get() } - private fun ApplicationVariant.processIcon(adaptiveIcon: AdaptiveIcon) { + private fun BaseVariant.processIcon(adaptiveIcon: AdaptiveIcon) { getAllSourceSets().forEach { resDir -> val icons = resDir.getIconFiles(adaptiveIcon.foreground) icons.forEach { iconFile -> @@ -90,11 +90,11 @@ open class EasyLauncherTask : DefaultTask() { } } - private fun AppExtension.getLauncherIconNames(variant: ApplicationVariant) = + private fun BaseExtension.getLauncherIconNames(variant: BaseVariant) = getAndroidManifestFiles(variant) .mapNotNull { manifestFile -> manifestFile.getLauncherIcon() } - private fun AppExtension.getAndroidManifestFiles(variant: ApplicationVariant): Iterable { + private fun BaseExtension.getAndroidManifestFiles(variant: BaseVariant): Iterable { return listOf("main", variant.name, variant.buildType.name, variant.flavorName) .filter { it.isNotEmpty() } .distinct() diff --git a/easylauncher/src/test/kotlin/com/project/starter/easylauncher/plugin/EasyLauncherConfigTest.kt b/easylauncher/src/test/kotlin/com/project/starter/easylauncher/plugin/EasyLauncherConfigTest.kt index beb5aaaa..5517439c 100644 --- a/easylauncher/src/test/kotlin/com/project/starter/easylauncher/plugin/EasyLauncherConfigTest.kt +++ b/easylauncher/src/test/kotlin/com/project/starter/easylauncher/plugin/EasyLauncherConfigTest.kt @@ -2,6 +2,7 @@ package com.project.starter.easylauncher.plugin import com.project.starter.easylauncher.plugin.utils.WithGradleProjectTest import com.project.starter.easylauncher.plugin.utils.buildScript +import com.project.starter.easylauncher.plugin.utils.libraryBuildscript import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test @@ -78,4 +79,29 @@ internal class EasyLauncherConfigTest : WithGradleProjectTest() { runTask("assembleDebug", "--stacktrace") } + + @Test + fun `library config`() { + rootDirectory.resolve("build.gradle").libraryBuildscript( + androidBlock = { + """ + buildTypes { + debug { } + release { } + } + """.trimIndent() + }, + easylauncherBlock = { + """ + buildTypes { + debug { + filters = redRibbonFilter() + } + } + """.trimIndent() + } + ) + + runTask("assembleDebug", "--stacktrace") + } } diff --git a/easylauncher/src/test/kotlin/com/project/starter/easylauncher/plugin/utils/Factories.kt b/easylauncher/src/test/kotlin/com/project/starter/easylauncher/plugin/utils/Factories.kt index 7dff308d..12f415cc 100644 --- a/easylauncher/src/test/kotlin/com/project/starter/easylauncher/plugin/utils/Factories.kt +++ b/easylauncher/src/test/kotlin/com/project/starter/easylauncher/plugin/utils/Factories.kt @@ -37,6 +37,40 @@ fun File.buildScript(androidBlock: () -> String, easylauncherBlock: () -> String writeText(buildScript) } +fun File.libraryBuildscript(androidBlock: () -> String, easylauncherBlock: () -> String = { "" }) { + @Language("groovy") + val buildScript = + """ + plugins { + id 'com.android.library' + id 'com.starter.easylauncher' + } + + repositories { + jcenter() + google() + } + + android { + defaultConfig { + compileSdkVersion 29 + minSdkVersion 23 + } + ${androidBlock()} + } + + easylauncher { + ${easylauncherBlock()} + } + + dependencies { + testImplementation 'junit:junit:4.13' + } + + """.trimIndent() + writeText(buildScript) +} + internal fun vectorFile() = """ + variant.mergedFlavor.applicationIdSuffix = variant.name + if (variant.flavorName == "") { + variant.mergedFlavor.manifestPlaceholders = [appName: "$project.name"] + } else { + variant.mergedFlavor.manifestPlaceholders = [appName: "$variant.flavorName"] + } + } +} +tasks.register("verifyAll") { + android.libraryVariants.configureEach { variant -> + dependsOn("verify${variant.flavorName.capitalize()}DebugAndroidTestScreenshotTest") + } +} +tasks.register("recordAll") { + android.libraryVariants.configureEach { variant -> + dependsOn("record${variant.flavorName.capitalize()}DebugAndroidTestScreenshotTest") + } +} + +tasks.register("installAll") { + android.libraryVariants.configureEach { variant -> + dependsOn("install${variant.name.capitalize()}") + } +} + +tasks.withType(Test).configureEach { + useJUnitPlatform() +} +screenshots { + failureDir = "${buildDir}/failedScreenshots" +} + +dependencies { + implementation project(":adaptive-support") + androidTestImplementation project(":screenshot-test-helpers") +} diff --git a/sample/example-library/screenshots/Icons_doScreenshot(library).png b/sample/example-library/screenshots/Icons_doScreenshot(library).png new file mode 100644 index 0000000000000000000000000000000000000000..0e05f5af675a5283868a4d46ee7cb33d7d4a1f01 GIT binary patch literal 37034 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"library") + } +} diff --git a/sample/example-library/src/main/AndroidManifest.xml b/sample/example-library/src/main/AndroidManifest.xml new file mode 100644 index 00000000..abdc260c --- /dev/null +++ b/sample/example-library/src/main/AndroidManifest.xml @@ -0,0 +1,12 @@ + + + + + + diff --git a/sample/example-library/src/main/res/drawable/ic_launcher_background.xml b/sample/example-library/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 00000000..07d5da9c --- /dev/null +++ b/sample/example-library/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sample/example-library/src/main/res/drawable/ic_launcher_foreground.xml b/sample/example-library/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 00000000..b0cc9f9f --- /dev/null +++ b/sample/example-library/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,17 @@ + + + + + + diff --git a/sample/example-library/src/main/res/mipmap/ic_launcher.xml b/sample/example-library/src/main/res/mipmap/ic_launcher.xml new file mode 100644 index 00000000..6b78462d --- /dev/null +++ b/sample/example-library/src/main/res/mipmap/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/sample/settings.gradle b/sample/settings.gradle index 82de1f7b..ed4f71e0 100644 --- a/sample/settings.gradle +++ b/sample/settings.gradle @@ -3,6 +3,7 @@ include ':example-custom' include ':example-vector' include ':example-scripted' include ':example-activity-alias' +include ':example-library' include ':adaptive-support' include ':screenshot-test-helpers'