diff --git a/packages/flutter_tools/lib/src/android/gradle_errors.dart b/packages/flutter_tools/lib/src/android/gradle_errors.dart index 1cc454af4ee70..77f7f7384666d 100644 --- a/packages/flutter_tools/lib/src/android/gradle_errors.dart +++ b/packages/flutter_tools/lib/src/android/gradle_errors.dart @@ -400,11 +400,7 @@ final outdatedGradleHandler = GradleHandledError( test: _outdatedGradlePattern.hasMatch, handler: ({required String line, required FlutterProject project, required bool usesAndroidX}) async { final File gradleFile = project.android.hostAppGradleFile; - final File gradlePropertiesFile = project.directory - .childDirectory('android') - .childDirectory(utils.gradleDirectoryName) - .childDirectory(utils.gradleWrapperDirectoryName) - .childFile(utils.gradleWrapperPropertiesFilename); + final File gradlePropertiesFile = project.android.gradleWrapperPropertiesFile; globals.printBox( '${globals.logger.terminal.warningMark} Your project needs to upgrade Gradle and the Android Gradle plugin.\n\n' 'To fix this issue, replace the following content:\n' @@ -507,11 +503,7 @@ final incompatibleJavaAndGradleVersionsHandler = GradleHandledError( }, handler: ({required String line, required FlutterProject project, required bool usesAndroidX}) async { - final File gradlePropertiesFile = project.directory - .childDirectory('android') - .childDirectory(utils.gradleDirectoryName) - .childDirectory(utils.gradleWrapperDirectoryName) - .childFile(utils.gradleWrapperPropertiesFilename); + final File gradlePropertiesFile = project.android.gradleWrapperPropertiesFile; // TODO(reidbaker): Replace URL with constant defined in // https://github.com/flutter/flutter/pull/123916. globals.printBox( diff --git a/packages/flutter_tools/lib/src/project.dart b/packages/flutter_tools/lib/src/project.dart index bda763775903b..dc66dc95c525f 100644 --- a/packages/flutter_tools/lib/src/project.dart +++ b/packages/flutter_tools/lib/src/project.dart @@ -645,6 +645,18 @@ class AndroidProject extends FlutterProjectPlatform { return hostAppGradleRoot.childFile('AndroidManifest.xml'); } + /// Gets the Gradle wrapper properties file. + /// + /// This file is located under `gradle/wrapper/gradle-wrapper.properties` + /// in the host app's Gradle root directory. It defines the distribution + /// settings for the Gradle wrapper. + File get gradleWrapperPropertiesFile { + return hostAppGradleRoot + .childDirectory('gradle') + .childDirectory('wrapper') + .childFile('gradle-wrapper.properties'); + } + File get generatedPluginRegistrantFile { return hostAppGradleRoot .childDirectory('app') diff --git a/packages/flutter_tools/test/general.shard/project_test.dart b/packages/flutter_tools/test/general.shard/project_test.dart index 99300f413919b..f798a954bafcd 100644 --- a/packages/flutter_tools/test/general.shard/project_test.dart +++ b/packages/flutter_tools/test/general.shard/project_test.dart @@ -1560,6 +1560,31 @@ plugins { }); }); + group('Android project file getters', () { + _testInMemory( + 'Project.android.gradleWrapperPropertiesFile resolves to gradle/wrapper/gradle-wrapper.properties', + () async { + final Directory tempDir = globals.fs.systemTempDirectory.createTempSync( + 'flutter_project_test.', + ); + final Directory androidDir = tempDir.childDirectory('android') + ..createSync(recursive: true); + + // Create gradle/wrapper/gradle-wrapper.properties inside the fake android dir + final File expected = + androidDir + .childDirectory('gradle') + .childDirectory('wrapper') + .childFile('gradle-wrapper.properties') + ..createSync(recursive: true); + + final FlutterProject project = FlutterProject.fromDirectory(tempDir); + + expect(project.android.gradleWrapperPropertiesFile.path, expected.path); + }, + ); + }); + group('workspaces', () { _testInMemory('fails on invalid pubspec.yaml', () async { final Directory directory = globals.fs.directory('myproject');