content: // Copyright 2013 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.
  
  import 'package:file/file.dart';
  import 'package:platform/platform.dart';
  
  import 'process_runner.dart';
  import 'repository_package.dart';
  
  const String _gradleWrapperWindows = 'gradlew.bat';
  const String _gradleWrapperNonWindows = 'gradlew';
  
  /// A utility class for interacting with Gradle projects.
  class GradleProject {
    /// Creates an instance that runs commands for [project] with the given
    /// [processRunner].
    GradleProject(
      this.flutterProject, {
      this.processRunner = const ProcessRunner(),
      this.platform = const LocalPlatform(),
    });
  
    /// The directory of a Flutter project to run Gradle commands in.
    final RepositoryPackage flutterProject;
  
    /// The [ProcessRunner] used to run commands. Overridable for testing.
    final ProcessRunner processRunner;
  
    /// The platform that commands are being run on.
    final Platform platform;
  
    /// The project's 'android' directory.
    Directory get androidDirectory =>
        flutterProject.platformDirectory(FlutterPlatform.android);
  
    /// The path to the Gradle wrapper file for the project.
    File get gradleWrapper => androidDirectory.childFile(
        platform.isWindows ? _gradleWrapperWindows : _gradleWrapperNonWindows);
  
    /// Whether or not the project is ready to have Gradle commands run on it
    /// (i.e., whether the `flutter` tool has generated the necessary files).
    bool isConfigured() => gradleWrapper.existsSync();
  
    /// Runs a `gradlew` command with the given parameters.
    Future<int> runCommand(
      String target, {
      List<String> arguments = const <String>[],
    }) =>
        processRunner.runAndStream(
          gradleWrapper.path,
          <String>[target, ...arguments],
          workingDir: androidDirectory,
        );
  }
  