// 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 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}" }