// 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 org.gradle.api.Plugin import org.gradle.api.initialization.Settings import org.jetbrains.kotlin.gradle.plugin.extraProperties import java.io.File import java.nio.file.Paths import java.util.Properties private const val FLUTTER_SDK_PATH = "flutterSdkPath" // Integration tests that cover this class include // - packages/flutter_tools/test/integration.shard/android_gradle_daemon_cache_test.dart // - packages/flutter_tools/test/integration.shard/android_plugin_compilesdkversion_mismatch_test.dart // And can be run by following the README in packages/flutter_tools/. /** * This plugin applies the native plugin loader plugin (../scripts/native_plugin_loader.gradle.kts) * and then configures the main project to `include` each of the loaded flutter plugins. */ @Suppress("unused") // This class is used by packages/flutter_tools/gradle/build.gradle.kts. class FlutterAppPluginLoaderPlugin : Plugin { override fun apply(settings: Settings) { val flutterProjectRoot: File = settings.settingsDir.parentFile if (!settings.extraProperties.has(FLUTTER_SDK_PATH)) { val properties = Properties() val localPropertiesFile = File(settings.rootProject.projectDir, "local.properties") localPropertiesFile.inputStream().use { properties.load(it) } settings.extraProperties.set(FLUTTER_SDK_PATH, properties.getProperty("flutter.sdk")) assert( settings.extraProperties.get(FLUTTER_SDK_PATH) != null ) { "flutter.sdk not set in local.properties" } } settings.apply { from( Paths.get( settings.extraProperties.get(FLUTTER_SDK_PATH) as String, "packages", "flutter_tools", "gradle", "src", "main", "scripts", "native_plugin_loader.gradle.kts" ) ) } NativePluginLoaderReflectionBridge .getPlugins(settings.extraProperties, flutterProjectRoot) .forEach { androidPlugin -> val pluginDirectory = File(androidPlugin["path"] as String, "android") check( pluginDirectory.exists() ) { "Plugin directory does not exist: ${pluginDirectory.absolutePath}" } val pluginName = androidPlugin["name"] as String settings.include(":$pluginName") settings.project(":$pluginName").projectDir = pluginDirectory } } }