Enhance: Bind extension to product flavor for robust type safety

This commit refactors flavor configuration in NiaFlavor.kt. The previous implementation relied on runtime type checks for ApplicationExtension and ApplicationProductFlavor, whereas the updated code leverages generics to explicitly bind the extension (E) to the product flavor (F). This change eliminates unnecessary runtime checks and enhances compile-time type safety. Additionally, the introduction of @JvmName(“configureFlavorsImpl”) resolves JVM signature clashes, streamlining our DSL and improving overall code clarity.
pull/1848/head
Layne Penney 6 months ago
parent 689ef92e41
commit bcdd99efde

@ -1,7 +1,6 @@
package com.google.samples.apps.nowinandroid
import com.android.build.api.dsl.ApplicationExtension
import com.android.build.api.dsl.ApplicationProductFlavor
import com.android.build.api.dsl.CommonExtension
import com.android.build.api.dsl.ProductFlavor
@ -19,11 +18,25 @@ enum class NiaFlavor(val dimension: FlavorDimension, val applicationIdSuffix: St
prod(FlavorDimension.contentType),
}
fun configureFlavors(
commonExtension: CommonExtension<*, *, *, *, *, *>,
fun <E : CommonExtension<*, *, *, F, *, *>, F : ProductFlavor> configureFlavors(
commonExtension: E,
flavorConfigurationBlock: ProductFlavor.(flavor: NiaFlavor) -> Unit = {},
) {
commonExtension.apply {
when (commonExtension) {
is ApplicationExtension -> commonExtension.configureFlavors { nia ->
flavorConfigurationBlock(this, nia)
this.applicationIdSuffix = nia.applicationIdSuffix
}
else -> commonExtension.configureFlavors(flavorConfigurationBlock)
}
}
@JvmName("configureFlavorsImpl")
private inline fun <E : CommonExtension<*, *, *, F, *, *>, F : ProductFlavor> E.configureFlavors(
crossinline flavorConfigurationBlock: F.(flavor: NiaFlavor) -> Unit = {},
) {
apply {
FlavorDimension.values().forEach { flavorDimension ->
flavorDimensions += flavorDimension.name
}
@ -33,11 +46,6 @@ fun configureFlavors(
register(niaFlavor.name) {
dimension = niaFlavor.dimension.name
flavorConfigurationBlock(this, niaFlavor)
if (this@apply is ApplicationExtension && this is ApplicationProductFlavor) {
if (niaFlavor.applicationIdSuffix != null) {
applicationIdSuffix = niaFlavor.applicationIdSuffix
}
}
}
}
}

Loading…
Cancel
Save