1 /* <lambda>null2 * Copyright 2023 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package androidx.baselineprofile.gradle.configuration 18 19 import androidx.baselineprofile.gradle.configuration.attribute.BaselineProfilePluginAgpVersionAttr 20 import androidx.baselineprofile.gradle.configuration.attribute.BaselineProfilePluginVersionAttr 21 import androidx.baselineprofile.gradle.utils.ATTRIBUTE_BASELINE_PROFILE_PLUGIN_VERSION 22 import androidx.baselineprofile.gradle.utils.ATTRIBUTE_TARGET_JVM_ENVIRONMENT 23 import androidx.baselineprofile.gradle.utils.ATTRIBUTE_USAGE_BASELINE_PROFILE 24 import androidx.baselineprofile.gradle.utils.agpVersion 25 import androidx.baselineprofile.gradle.utils.camelCase 26 import com.android.build.api.AndroidPluginVersion 27 import com.android.build.api.attributes.BuildTypeAttr 28 import com.android.build.api.attributes.ProductFlavorAttr 29 import org.gradle.api.Project 30 import org.gradle.api.artifacts.Configuration 31 import org.gradle.api.attributes.AttributeContainer 32 import org.gradle.api.attributes.Usage 33 import org.gradle.api.attributes.java.TargetJvmEnvironment 34 35 /** 36 * Helps creating configurations for the baseline profile plugin, handling the attributes used 37 * between the different modules to exchange artifacts. 38 */ 39 internal class ConfigurationManager(private val project: Project) { 40 41 private fun AttributeContainer.usage(value: String) { 42 attribute(Usage.USAGE_ATTRIBUTE, project.objects.named(Usage::class.java, value)) 43 } 44 45 private fun AttributeContainer.buildType(value: String) { 46 attribute(BuildTypeAttr.ATTRIBUTE, project.objects.named(BuildTypeAttr::class.java, value)) 47 } 48 49 private fun AttributeContainer.targetJvmEnvironment(value: String) { 50 attribute( 51 TargetJvmEnvironment.TARGET_JVM_ENVIRONMENT_ATTRIBUTE, 52 project.objects.named(TargetJvmEnvironment::class.java, value) 53 ) 54 } 55 56 private fun AttributeContainer.agpVersion(value: String) { 57 attribute( 58 BaselineProfilePluginAgpVersionAttr.ATTRIBUTE, 59 project.objects.named(BaselineProfilePluginAgpVersionAttr::class.java, value) 60 ) 61 } 62 63 private fun AttributeContainer.baselineProfilePluginVersion(value: String) { 64 attribute( 65 BaselineProfilePluginVersionAttr.ATTRIBUTE, 66 project.objects.named(BaselineProfilePluginVersionAttr::class.java, value) 67 ) 68 } 69 70 @Suppress("UnstableApiUsage") 71 private fun AttributeContainer.productFlavors(productFlavors: List<Pair<String, String>>) { 72 productFlavors.forEach { (flavorName, flavorValue) -> 73 attribute( 74 ProductFlavorAttr.of(flavorName), 75 project.objects.named(ProductFlavorAttr::class.java, flavorValue) 76 ) 77 } 78 } 79 80 fun maybeCreate( 81 nameParts: List<String>, 82 canBeResolved: Boolean, 83 canBeConsumed: Boolean, 84 extendFromConfigurations: List<Configuration>? = null, 85 buildType: String?, 86 productFlavors: List<Pair<String, String>>?, 87 usage: String? = ATTRIBUTE_USAGE_BASELINE_PROFILE, 88 targetJvmEnvironment: String? = ATTRIBUTE_TARGET_JVM_ENVIRONMENT, 89 bpPluginVersion: String? = ATTRIBUTE_BASELINE_PROFILE_PLUGIN_VERSION, 90 agpVersion: String? = project.agpVersion().versionString() 91 ): Configuration { 92 return project.configurations.maybeCreate(camelCase(*(nameParts.toTypedArray()))).apply { 93 isCanBeResolved = canBeResolved 94 isCanBeConsumed = canBeConsumed 95 96 if (extendFromConfigurations != null) setExtendsFrom(extendFromConfigurations) 97 98 attributes { 99 if (buildType != null) it.buildType(buildType) 100 if (productFlavors != null) it.productFlavors(productFlavors) 101 if (usage != null) it.usage(usage) 102 if (targetJvmEnvironment != null) it.targetJvmEnvironment(targetJvmEnvironment) 103 if (agpVersion != null) it.agpVersion(agpVersion) 104 if (bpPluginVersion != null) it.baselineProfilePluginVersion(bpPluginVersion) 105 } 106 } 107 } 108 109 private fun AndroidPluginVersion.versionString(): String { 110 val preview = 111 if (!previewType.isNullOrBlank()) { 112 "-$previewType$preview" 113 } else { 114 "" 115 } 116 return "$major.$minor.$micro$preview" 117 } 118 } 119