blob: db0943a8e74dadce9e8180e6c3fc61793dda1a3e [file]
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package com.flutter.gradle
import com.android.build.api.dsl.ApplicationExtension
import com.android.build.api.dsl.BuildType
import com.android.build.api.dsl.DynamicFeatureExtension
import com.android.build.api.dsl.LibraryExtension
import com.android.build.api.dsl.TestExtension
import org.gradle.api.NamedDomainObjectContainer
import java.io.File
/**
* A wrapper to bypass binary incompatibilities in AGP's CommonExtension between 8.x and 9.x.
* * CRITICAL: Do not import or reference `com.android.build.api.dsl.CommonExtension`
* anywhere in this file, or the compiler may weave the broken type into the bytecode.
*/
class AgpCommonExtensionWrapper(
private val backingExtension: Any
) {
var compileSdk: Int?
get() =
when (backingExtension) {
is ApplicationExtension -> backingExtension.compileSdk
is LibraryExtension -> backingExtension.compileSdk
is DynamicFeatureExtension -> backingExtension.compileSdk
is TestExtension -> backingExtension.compileSdk
else -> throw IllegalArgumentException(unsupportedMessage())
}
set(value) {
when (backingExtension) {
is ApplicationExtension -> backingExtension.compileSdk = value
is LibraryExtension -> backingExtension.compileSdk = value
is DynamicFeatureExtension -> backingExtension.compileSdk = value
is TestExtension -> backingExtension.compileSdk = value
else -> throw IllegalArgumentException(unsupportedMessage())
}
}
var namespace: String?
get() =
when (backingExtension) {
is ApplicationExtension -> backingExtension.namespace
is LibraryExtension -> backingExtension.namespace
is DynamicFeatureExtension -> backingExtension.namespace
is TestExtension -> backingExtension.namespace
else -> throw IllegalArgumentException(unsupportedMessage())
}
set(value) {
when (backingExtension) {
is ApplicationExtension -> backingExtension.namespace = value
is LibraryExtension -> backingExtension.namespace = value
is DynamicFeatureExtension -> backingExtension.namespace = value
is TestExtension -> backingExtension.namespace = value
else -> throw IllegalArgumentException(unsupportedMessage())
}
}
var ndkVersion: String
get() =
when (backingExtension) {
is ApplicationExtension -> backingExtension.ndkVersion
is LibraryExtension -> backingExtension.ndkVersion
is DynamicFeatureExtension -> backingExtension.ndkVersion
is TestExtension -> backingExtension.ndkVersion
else -> throw IllegalArgumentException(unsupportedMessage())
}
set(value) {
when (backingExtension) {
is ApplicationExtension -> backingExtension.ndkVersion = value
is LibraryExtension -> backingExtension.ndkVersion = value
is DynamicFeatureExtension -> backingExtension.ndkVersion = value
is TestExtension -> backingExtension.ndkVersion = value
else -> throw IllegalArgumentException(unsupportedMessage())
}
}
val buildTypes: NamedDomainObjectContainer<out BuildType>
get() =
when (backingExtension) {
is ApplicationExtension -> backingExtension.buildTypes
is LibraryExtension -> backingExtension.buildTypes
is DynamicFeatureExtension -> backingExtension.buildTypes
is TestExtension -> backingExtension.buildTypes
else -> throw IllegalArgumentException(unsupportedMessage())
}
fun getDefaultProguardFile(fileName: String): File =
when (backingExtension) {
is ApplicationExtension -> backingExtension.getDefaultProguardFile(fileName)
is LibraryExtension -> backingExtension.getDefaultProguardFile(fileName)
is DynamicFeatureExtension -> backingExtension.getDefaultProguardFile(fileName)
is TestExtension -> backingExtension.getDefaultProguardFile(fileName)
else -> throw IllegalArgumentException(unsupportedMessage())
}
// Example of wrapping a method rather than a property
fun compileOptions(action: (Any) -> Unit) {
when (backingExtension) {
is ApplicationExtension -> backingExtension.compileOptions { action(this) }
is LibraryExtension -> backingExtension.compileOptions { action(this) }
is DynamicFeatureExtension -> backingExtension.compileOptions { action(this) }
is TestExtension -> backingExtension.compileOptions { action(this) }
else -> throw IllegalArgumentException(unsupportedMessage())
}
}
private fun unsupportedMessage() = "Unsupported Android extension type: ${backingExtension.javaClass.name}"
}