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