diff --git a/packages/local_auth/local_auth_android/CHANGELOG.md b/packages/local_auth/local_auth_android/CHANGELOG.md index f0c6a100b30d..52793992ce10 100644 --- a/packages/local_auth/local_auth_android/CHANGELOG.md +++ b/packages/local_auth/local_auth_android/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.6 + +* Updates build files from Groovy to Kotlin. + ## 2.0.5 * Adds platform-specific setup instructions to README. diff --git a/packages/local_auth/local_auth_android/android/build.gradle b/packages/local_auth/local_auth_android/android/build.gradle.kts similarity index 58% rename from packages/local_auth/local_auth_android/android/build.gradle rename to packages/local_auth/local_auth_android/android/build.gradle.kts index 02f2f41c7dfb..cc55f268cb73 100644 --- a/packages/local_auth/local_auth_android/android/build.gradle +++ b/packages/local_auth/local_auth_android/android/build.gradle.kts @@ -1,5 +1,5 @@ -group = 'io.flutter.plugins.localauth' -version = '1.0-SNAPSHOT' +group = "io.flutter.plugins.localauth" +version = "1.0-SNAPSHOT" buildscript { repositories { @@ -8,7 +8,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:8.13.1' + classpath("com.android.tools.build:gradle:8.13.1") } } @@ -19,15 +19,17 @@ rootProject.allprojects { } } -apply plugin: 'com.android.library' +plugins { + id("com.android.library") +} android { namespace = "io.flutter.plugins.localauth" compileSdk = flutter.compileSdkVersion defaultConfig { - minSdkVersion 24 - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + minSdk = 24 + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } compileOptions { @@ -35,21 +37,22 @@ android { targetCompatibility = JavaVersion.VERSION_17 } - lintOptions { + lint { checkAllWarnings = true warningsAsErrors = true - disable 'AndroidGradlePluginVersion', 'InvalidPackage', 'GradleDependency', 'NewerVersionAvailable' + disable.addAll(setOf("AndroidGradlePluginVersion", "InvalidPackage", "GradleDependency", "NewerVersionAvailable")) } - testOptions { - unitTests.includeAndroidResources = true - unitTests.returnDefaultValues = true - unitTests.all { - testLogging { - events "passed", "skipped", "failed", "standardOut", "standardError" - outputs.upToDateWhen {false} - showStandardStreams = true + unitTests { + isIncludeAndroidResources = true + isReturnDefaultValues = true + all { + it.outputs.upToDateWhen { false } + it.testLogging { + events("passed", "skipped", "failed", "standardOut", "standardError") + showStandardStreams = true + } } } } diff --git a/packages/local_auth/local_auth_android/android/settings.gradle b/packages/local_auth/local_auth_android/android/settings.gradle deleted file mode 100644 index dca8c623fdf6..000000000000 --- a/packages/local_auth/local_auth_android/android/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -rootProject.name = 'local_auth' diff --git a/packages/local_auth/local_auth_android/android/settings.gradle.kts b/packages/local_auth/local_auth_android/android/settings.gradle.kts new file mode 100644 index 000000000000..3d731a10b076 --- /dev/null +++ b/packages/local_auth/local_auth_android/android/settings.gradle.kts @@ -0,0 +1 @@ +rootProject.name = "local_auth" diff --git a/packages/local_auth/local_auth_android/pubspec.yaml b/packages/local_auth/local_auth_android/pubspec.yaml index 627e6ed396fb..a9f3e4c08b43 100644 --- a/packages/local_auth/local_auth_android/pubspec.yaml +++ b/packages/local_auth/local_auth_android/pubspec.yaml @@ -2,7 +2,7 @@ name: local_auth_android description: Android implementation of the local_auth plugin. repository: https://github.com/flutter/packages/tree/main/packages/local_auth/local_auth_android issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+local_auth%22 -version: 2.0.5 +version: 2.0.6 environment: sdk: ^3.9.0 diff --git a/script/tool/test/gradle_check_command_test.dart b/script/tool/test/gradle_check_command_test.dart index 7821995c0519..c4fe9345d007 100644 --- a/script/tool/test/gradle_check_command_test.dart +++ b/script/tool/test/gradle_check_command_test.dart @@ -19,6 +19,8 @@ void main() { late Directory packagesDir; const groovyJavaIncompatabilityIndicator = 'build.gradle must set an explicit Java compatibility version.'; + const kotlinJavaIncompatabilityIndicator = + 'build.gradle.kts must set an explicit Java compatibility version.'; setUp(() { final GitDir gitDir; @@ -128,6 +130,101 @@ dependencies { '''); } + /// Writes a fake android/build.gradle.kts file for plugin [package] with the + /// given options. + void writeFakeKotlinPluginBuildGradle( + RepositoryPackage package, { + bool includeLanguageVersion = false, + bool includeSourceCompat = false, + bool includeTargetCompat = false, + bool commentSourceLanguage = false, + bool includeNamespace = true, + bool commentNamespace = false, + bool warningsConfigured = true, + String compileSdk = '36', + bool includeKotlinOptions = true, + bool commentKotlinOptions = false, + bool useDeprecatedJvmTargetStyle = false, + int jvmTargetValue = 17, + int kotlinJvmValue = 17, + }) { + final File buildGradle = package + .platformDirectory(FlutterPlatform.android) + .childFile('build.gradle.kts'); + buildGradle.createSync(recursive: true); + + const warningConfig = ''' + lint { + checkAllWarnings = true + warningsAsErrors = true + disable.addAll(setOf("AndroidGradlePluginVersion", "InvalidPackage", "GradleDependency", "NewerVersionAvailable")) + baseline = file("lint-baseline.xml") + } +'''; + final javaSection = + ''' +java { + toolchain { + ${commentSourceLanguage ? '// ' : ''}languageVersion = JavaLanguageVersion.of(8) + } +} + +'''; + final sourceCompat = + '${commentSourceLanguage ? '// ' : ''}sourceCompatibility = JavaVersion.VERSION_$jvmTargetValue'; + final targetCompat = + '${commentSourceLanguage ? '// ' : ''}targetCompatibility = JavaVersion.VERSION_$jvmTargetValue'; + final namespace = + ' ${commentNamespace ? '// ' : ''}namespace = "$_defaultFakeNamespace"'; + final kotlinJvmTarget = useDeprecatedJvmTargetStyle + ? '$jvmTargetValue' + : 'JavaVersion.VERSION_$kotlinJvmValue.toString()'; + final kotlinConfig = + ''' + ${commentKotlinOptions ? '//' : ''}kotlinOptions { + ${commentKotlinOptions ? '//' : ''}jvmTarget = $kotlinJvmTarget + ${commentKotlinOptions ? '//' : ''}}'''; + + buildGradle.writeAsStringSync(''' +group = "dev.flutter.plugins.fake" +version = "1.0-SNAPSHOT" + +buildscript { + repositories { + google() + mavenCentral() + } +} + +apply plugin: 'com.android.library' + +${includeLanguageVersion ? javaSection : ''} +android { +${includeNamespace ? namespace : ''} + compileSdk = $compileSdk + + defaultConfig { + minSdk = 30 + } +${warningsConfigured ? warningConfig : ''} + compileOptions { + ${includeSourceCompat ? sourceCompat : ''} + ${includeTargetCompat ? targetCompat : ''} + } + ${includeKotlinOptions ? kotlinConfig : ''} + testOptions { + unitTests { + isIncludeAndroidResources = true + } + } +} + +dependencies { + implementation("fake.package:fake:1.0.0") +} +'''); + } + /// Writes a fake android/build.gradle file for an example [package] with the /// given options. // TODO(stuartmorgan): Once all packages are migrated to Kotlin, remove all @@ -542,32 +639,65 @@ flutter { ); }); - test('fails when build.gradle has no java compatibility version', () async { - final RepositoryPackage package = createFakePlugin( - 'a_plugin', - packagesDir, - examples: [], - ); - writeFakeGroovyPluginBuildGradle(package); - writeFakeManifest(package); + test( + 'fails when build.gradle has no java compatibility version - groovy', + () async { + final RepositoryPackage package = createFakePlugin( + 'a_plugin', + packagesDir, + examples: [], + ); + writeFakeGroovyPluginBuildGradle(package); + writeFakeManifest(package); - Error? commandError; - final List output = await runCapturingPrint( - runner, - ['gradle-check'], - errorHandler: (Error e) { - commandError = e; - }, - ); + Error? commandError; + final List output = await runCapturingPrint( + runner, + ['gradle-check'], + errorHandler: (Error e) { + commandError = e; + }, + ); - expect(commandError, isA()); - expect( - output, - containsAllInOrder([ - contains(groovyJavaIncompatabilityIndicator), - ]), - ); - }); + expect(commandError, isA()); + expect( + output, + containsAllInOrder([ + contains(groovyJavaIncompatabilityIndicator), + ]), + ); + }, + ); + + test( + 'fails when build.gradle has no java compatibility version - kotlin', + () async { + final RepositoryPackage package = createFakePlugin( + 'a_plugin', + packagesDir, + examples: [], + ); + writeFakeKotlinPluginBuildGradle(package); + writeFakeManifest(package); + + Error? commandError; + final List output = await runCapturingPrint( + runner, + ['gradle-check'], + errorHandler: (Error e) { + commandError = e; + }, + ); + + expect(commandError, isA()); + expect( + output, + containsAllInOrder([ + contains(kotlinJavaIncompatabilityIndicator), + ]), + ); + }, + ); test( 'fails when sourceCompatibility is provided with out targetCompatibility', @@ -774,7 +904,7 @@ flutter { test('does not require java version in examples - kotlin', () async { const pluginName = 'a_plugin'; final RepositoryPackage package = createFakePlugin(pluginName, packagesDir); - writeFakeGroovyPluginBuildGradle(package, includeLanguageVersion: true); + writeFakeKotlinPluginBuildGradle(package, includeLanguageVersion: true); writeFakeManifest(package); final RepositoryPackage example = package.getExamples().first; writeFakeKotlinExampleBuildGradles(example, pluginName: pluginName); @@ -888,7 +1018,7 @@ flutter { }, ); - test('fails when namespace is missing', () async { + test('fails when namespace is missing - groovy', () async { final RepositoryPackage package = createFakePlugin( 'a_plugin', packagesDir, @@ -919,6 +1049,37 @@ flutter { ); }); + test('fails when namespace is missing - kotlin', () async { + final RepositoryPackage package = createFakePlugin( + 'a_plugin', + packagesDir, + examples: [], + ); + writeFakeKotlinPluginBuildGradle( + package, + includeLanguageVersion: true, + includeNamespace: false, + ); + writeFakeManifest(package); + + Error? commandError; + final List output = await runCapturingPrint( + runner, + ['gradle-check'], + errorHandler: (Error e) { + commandError = e; + }, + ); + + expect(commandError, isA()); + expect( + output, + containsAllInOrder([ + contains('build.gradle.kts must set a "namespace"'), + ]), + ); + }); + test('fails when namespace is missing from example - groovy', () async { const pluginName = 'a_plugin'; final RepositoryPackage package = createFakePlugin(pluginName, packagesDir); @@ -953,7 +1114,7 @@ flutter { test('fails when namespace is missing from example - kotlin', () async { const pluginName = 'a_plugin'; final RepositoryPackage package = createFakePlugin(pluginName, packagesDir); - writeFakeGroovyPluginBuildGradle(package, includeLanguageVersion: true); + writeFakeKotlinPluginBuildGradle(package, includeLanguageVersion: true); writeFakeManifest(package); final RepositoryPackage example = package.getExamples().first; writeFakeKotlinExampleBuildGradles(